Reusable Robolectric helpers for driving Android Bluetooth bonding logic in androidHostTest source sets.
These let a unit test exercise the real AndroidBluetoothRepository.bond() (and any future BLE bonding code) without an emulator and without a production seam. They rely on two Robolectric behaviors (verified against Robolectric 4.16.x):
ShadowBluetoothDevice.createBond calls checkForBluetoothConnectPermission() first, so tests must call grantBluetoothConnectPermission or createBond() throws SecurityException instead of returning a value.
Isolation note: because the device cache is static and survives across tests in the same JVM, give each test a distinct MAC so bond-state cannot bleed between tests.
Reusable Robolectric helpers for driving Android Bluetooth bonding logic in androidHostTest source sets.
These let a unit test exercise the real AndroidBluetoothRepository.bond() (and any future BLE bonding code) without an emulator and without a production seam. They rely on two Robolectric behaviors (verified against Robolectric 4.16.x):
ShadowBluetoothDevice.createBond calls checkForBluetoothConnectPermission() first, so tests must call grantBluetoothConnectPermission or createBond() throws SecurityException instead of returning a value.
Isolation note: because the device cache is static and survives across tests in the same JVM, give each test a distinct MAC so bond-state cannot bleed between tests.
diff --git a/main/ar-rSA/user/nodes.html b/main/ar-rSA/user/nodes.html
index de94beef5d..d083dfe16f 100644
--- a/main/ar-rSA/user/nodes.html
+++ b/main/ar-rSA/user/nodes.html
@@ -1 +1 @@
- Nodes | Meshtastic AndroidSkip to main content
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
الوصف
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Remove
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
عربي
الوصف
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
الوصف
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
آخر ظهور
المسافة
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
الوصف
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Remove
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
عربي
الوصف
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
الوصف
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
آخر ظهور
المسافة
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
Signal Meter — understand what the signal bars mean
diff --git a/main/assets/css/just-the-docs-dark.css.map b/main/assets/css/just-the-docs-dark.css.map
index 5b55960133..b5a909513b 100644
--- a/main/assets/css/just-the-docs-dark.css.map
+++ b/main/assets/css/just-the-docs-dark.css.map
@@ -1 +1 @@
-{"version":3,"sourceRoot":"","sources":["../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/vendor/accessible-pygments/github-light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/vendor/accessible-pygments/github-dark.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/vendor/normalize.scss/normalize.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/base.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/color_schemes/dark.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/support/mixins/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/support/mixins/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/support/_variables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/content.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/navigation.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/labels.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/support/mixins/_buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/search.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/tables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/code.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/utilities/_colors.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/utilities/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/utilities/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/utilities/_lists.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/utilities/_spacing.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/print.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/skiptomain.scss","just-the-docs-dark.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;EAAkB;;;AAClB;EAAgB;EAAiB;AACjC;EAAkB;EAAiB;AACnC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAkB;EAAiB;AACnC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAqB;AACtC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAoB;AACrC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AChFlC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;EAAkB;;;AAClB;EAAa;EAAqB;;;AAClC;EAAgB;EAAgB;EAAqB;AACrD;EAAkB;EAAiB;AACnC;EAAkB;EAAiB;AACnC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAgB;EAAoB;AACpD;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAgB;EAAqB;AACtD;EAAiB;EAAgB;EAAqB;AACtD;EAAiB;EAAgB;EAAmB;EAAqB;AACzE;EAAkB;EAAgB;EAAqB;AACvD;EAAiB;EAAgB;EAAqB;AACtD;EAAiB;EAAgB;EAAmB;EAAqB;AACzE;EAAiB;EAAgB;EAA4B;AAC7D;EAAiB;EAAgB;EAAqB;AACtD;EAAkB;EAAgB;EAAmB;EAAqB;AAC1E;EAAiB;EAAiB;AAClC;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAgB;EAA4B;AAC7D;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAA0B;EAAgB;EAA6B;AACvE;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAiB;AAClC;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AC1FlC;AAEA;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;EAGE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AC1VF;EACE,cCJa;;;ADOf;EACE;;;AAGF;EACE;;AEmBA;EACE;;AClBA;EHHJ;IEyBI;;;;AFnBJ;EACE,aIfiB;EJgBjB;EACA,aIbiB;EJcjB,OIiBY;EJhBZ,kBIYY;EJXZ;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAYE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;EACA,aI1CyB;EJ2CzB,OIjBY;;;AJoBd;EACE;EACA;;;AAGF;EACE,OCzDW;ED0DX;;;AAGF;EACE;EACA,uBInCY;EJoCZ;;AAEA;EACE;;;AAIJ;EACE,aIvEiB;EJwEjB;EACA,aIvEiB;;;AJ0EnB;AAAA;EAEE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,kBInEY;EJoEZ;;;AAIF;EACE;EAGA;EACA;EACA;EACA;;;AK7GF;EACE;EACA;EACA;EACA,kBD4BY;;ADpBV;EEZJ;IAOI;IACA;IACA,ODwFW;ICvFX;IACA;IACA;;;AFAA;EEZJ;IAgBI;IACA,WD+EQ;;;ADpFR;EEQF;IAEI,aD2ES;;;ADrFX;EEQF;IAQI;;;AAOF;EACE;EACA,kBDLQ;;ADpBV;EEuBA;IAKI;IACA,kBDTM;;;ACYR;EACE;;AFjCJ;EEgCE;IAII;;;;AAOV;EACE;;AF5CE;EE2CJ;IAII;IACA,WDyCY;;;;ACrChB;EACE,aDaK;ECZL,gBDYK;EDvDL,eCuDK;EDtDL,cCsDK;;ADlEH;EEoDJ;IFrCI,eCqDG;IDpDH,cCoDG;;;ADpEH;EEoDJ;IAOI,aDSG;ICRH,gBDQG;;;;ACJP;EACE;EACA;;AFlEE;EEgEJ;IAKI;IACA;IACA,QDmBY;;;;ACfhB;AAAA;AAAA;EAGE;;AF9EE;EE2EJ;AAAA;AAAA;IAMI,ODGQ;;;;ACCZ;EACE;;AAEA;EACE;;AFzFA;EEqFJ;IAQI;IACA,aDxBG;ICyBH,gBD7BG;IC8BH;IACA;;;;AAIJ;EACE;EACA,YDbc;ECcd;;AFxGE;EEqGJ;IAMI,QDjBY;ICkBZ,YDlBY;ICmBZ;;;;AAIJ;EACE;EACA;EACA;EACA;EACA,aDrDK;ECsDL,gBDtDK;ECuDL,ODnGY;EDVZ,eCuDK;EDtDL,cCsDK;;ADlEH;EEiHJ;IFlGI,eCqDG;IDpDH,cCoDG;;;AF/BL;EACE;;ACtCA;EEiHJ;IHvEI;IACA,aEhDuB;;;ADKvB;EEiHJ;IAcI,aD/DG;ICgEH,gBDhEG;;;;AC+EP;EACE;EACA;EACA,SDhFK;ECiFL;;;AFnJE;EEuJF;IACE;;;AAIJ;EACE;;;AAQF;EACE;;;AAOF;EACE;EACA;EACA;EACA,aD/GK;ECgHL,gBDhHK;EDvDL,eCuDK;EDtDL,cCsDK;;ADlEH;EE6KJ;IF9JI,eCqDG;IDpDH,cCoDG;;;AFvEL;EACE;;ACEA;EE6KJ;IH3KI;;;ACFA;EE6KJ;IAYI;IACA;;;;AAIJ;EACE,OD5HK;EC6HL,QD7HK;EC8HL,OJ3MW;;;AKCb;EACE,aFEoB;;AEApB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;;AAGF;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;IACA;IACA;;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA,ORTY;EQUZ,kBRfY;EQgBZ;EACA;EACA;EACA;EACA;;ATvCE;ES2BJ;IAeI;IACA;IACA,kBRxBU;IQyBV;;;AAGF;EACE;EACA;;AAEA;EACE,OX/DO;;;AWoEb;EACE;EACA;EACA;EACA,cRIK;;ADlEH;ES0DJ;IAOI,cRGG;IQFH;;;AAGF;EACE;EACA;EACA;EACA,ORzDU;;;AQ6Dd;EACE;EACA;EACA;EACA;EACA;EACA;EACA,kBRjEY;EQkEZ,4BRRc;EQSd,2BRTc;EQUd,YACE;;ATxFA;ES6EJ;IAeI;IACA,ORFmB;IQGnB;;;;AAIJ;EACE;EACA,eRrCK;EQsCL;;AVpFA;EACE;;AClBA;ESkGJ;IV5EI;;;ACtBA;EDOF;IACE;;;ACRA;ESkGJ;IVtFI;;;;AUiGJ;EACE;EACA;;;AAGF;EACE;EACA;;AAEA;EAEE,kBX3Ha;;;AW+HjB;EACE;EACA,aR9DK;EQ+DL,gBR/DK;;ADhEH;ES4HJ;IAMI;IACA;IACA,eRpEG;IQqEH;;;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;;AVxIF;EACE;;ACRA;ES8IF;IVlIE;;;ACZA;EDHF;IACE;;;ACEA;ES8IF;IV5IE;;;AUqJF;EACE,ORtFG;EQuFH,QRvFG;EQwFH,cR1FG;EQ2FH,OXrKS;EWsKT;;AAGF;EACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,ORrJY;EQsJZ;EACA;;AV5LA;EACE;;ACYA;ESyKJ;IVjLI;;;;AU2LJ;EACE;EACA,aRrHK;EQsHL,gBRtHK;EQuHL,cRrHK;EQsHL,aRxHK;EQyHL,ORjKY;EQkKZ;EACA,aR/GO;EQgHP,mBR1KY;;AFrBZ;EACE;;ACEA;ESmLJ;IVjLI;;;ACFA;ESmLJ;IAaI;IACA;IACA,cRlIG;IQmIH;IACA;;;;AAIJ;EACE,YR1IK;;;AQ6IP;EACE;;;AAGF;EACE;;AV1MA;EACE;;ACRA;ESgNJ;IVpMI;;;;AUyMJ;EACE;EACA,ORrJK;EQsJL,QRtJK;EQuJL;EACA,ORnJK;EQoJL,QRpJK;EQqJL,kBRz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BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAQR;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AdhHA;EACE;;ACYA;EcZJ;IfII;;;;AAKF;EACE;;ACEA;EcRJ;IfUI;;;;AAKF;EACE;;ACRA;EcJJ;IfgBI;;;;AAKF;EACE;;AClBA;EcAJ;IfsBI;;;;AAKF;EACE;;AC5BA;EcIJ;If4BI;;;;AAKF;EACE;;ACtCA;EcQJ;IfkCI;IACA,aEhDuB;;;;AFqDzB;EACE;EACA,aEvDuB;;ADKvB;EcYJ;If0CI;;;;AAKF;EACE;EACA,aElEuB;;ADKvB;EcgBJ;IfiDI;;;;AAKF;EACE;EACA,aE7EuB;;ADKvB;EcoBJ;IfwDI;;;;AAKF;EACE;EACA,aExFuB;;ADKvB;EcwBJ;If+DI;;;;Ae3DJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,abxDiB;;;Aa2DnB;EACE,ab1DyB;;;Aa6D3B;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC/EF;EACE;EACA;EACA;;AAGE;EACE;;;ACLN;EACE;EACA;;;AAQA;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AhBlCA;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAaN;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AhB7GA;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AC3JR;EACE;AAAA;AAAA;AAAA;AAAA;AAAA;IAME;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;;;ACvCJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE,OpBXW;EoBYX,kBjBkBY;EiBjBZ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACpBF;EACE,kBlByBY;;;AkBtBd;EACI;EACA;EACA,elB4EY;EkB3EZ;EACA;;AAEA;EACI,OlB8BI;EkB7BJ;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlBoBM;EkBnBN;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBiDY;EkBhDZ;EACA;;AACA;EACE;EACA;EACA,OlBEM;EkBDN;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,elBGY;EkBFZ;EACA;;AAEA;EACI,OlB/CG;EkBgDH;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlBzDK;EkB0DL;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBxBY;EkByBZ;EACA;;AACA;EACE;EACA;EACA,OlB3EK;EkB4EL;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,elBtEY;EkBuEZ;EACA;;AAEA;EACI,OlBhHK;EkBiHL;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlB1HO;EkB2HP;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBjGY;EkBkGZ;EACA;;AACA;EACE;EACA;EACA,OlB5IO;EkB6IP;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE","sourcesContent":["/*\ngenerated by accessible-pygments \nCopyright (c) 2022, Quansight Labs\nLicensed under the BSD license, see LICENSE for details.\n--\ngenerated by Pygments \nCopyright 2006-2025 by the Pygments team.\nLicensed under the BSD license, see LICENSE for details.\n*/\n\n.highlight .hll { background-color: #0969da4a }\n.highlight .c { color: #6E7781 } /* Comment */\n.highlight .err { color: #CF222E } /* Error */\n.highlight .k { color: #CF222E } /* Keyword */\n.highlight .l { color: #953800 } /* Literal */\n.highlight .n { color: #8250DF } /* Name */\n.highlight .o { color: #116329 } /* Operator */\n.highlight .p { color: #24292F } /* Punctuation */\n.highlight .ch { color: #6E7781 } /* Comment.Hashbang */\n.highlight .cm { color: #6E7781 } /* Comment.Multiline */\n.highlight .cp { color: #6E7781 } /* Comment.Preproc */\n.highlight .cpf { color: #6E7781 } /* Comment.PreprocFile */\n.highlight .c1 { color: #6E7781 } /* Comment.Single */\n.highlight .cs { color: #6E7781 } /* Comment.Special */\n.highlight .gd { color: #0550AE } /* Generic.Deleted */\n.highlight .ge { font-style: italic } /* Generic.Emph */\n.highlight .gr { color: #CF222E } /* Generic.Error */\n.highlight .gh { color: #0550AE } /* Generic.Heading */\n.highlight .gs { font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #0550AE } /* Generic.Subheading */\n.highlight .kc { color: #0550AE } /* Keyword.Constant */\n.highlight .kd { color: #CF222E } /* Keyword.Declaration */\n.highlight .kn { color: #CF222E } /* Keyword.Namespace */\n.highlight .kp { color: #CF222E } /* Keyword.Pseudo */\n.highlight .kr { color: #CF222E } /* Keyword.Reserved */\n.highlight .kt { color: #CF222E } /* Keyword.Type */\n.highlight .ld { color: #953800 } /* Literal.Date */\n.highlight .m { color: #953800 } /* Literal.Number */\n.highlight .s { color: #0550AE } /* Literal.String */\n.highlight .na { color: #953800 } /* Name.Attribute */\n.highlight .nb { color: #953800 } /* Name.Builtin */\n.highlight .nc { color: #0550AE } /* Name.Class */\n.highlight .no { color: #0550AE } /* Name.Constant */\n.highlight .nd { color: #953800 } /* Name.Decorator */\n.highlight .ni { color: #116329 } /* Name.Entity */\n.highlight .ne { color: #8250DF } /* Name.Exception */\n.highlight .nf { color: #0550AE } /* Name.Function */\n.highlight .nl { color: #953800 } /* Name.Label */\n.highlight .nn { color: #24292F } /* Name.Namespace */\n.highlight .nx { color: #8250DF } /* Name.Other */\n.highlight .py { color: #0550AE } /* Name.Property */\n.highlight .nt { color: #116329 } /* Name.Tag */\n.highlight .nv { color: #953800 } /* Name.Variable */\n.highlight .ow { color: #8250DF } /* Operator.Word */\n.highlight .pm { color: #24292F } /* Punctuation.Marker */\n.highlight .w { color: #24292F } /* Text.Whitespace */\n.highlight .mb { color: #953800 } /* Literal.Number.Bin */\n.highlight .mf { color: #953800 } /* Literal.Number.Float */\n.highlight .mh { color: #953800 } /* Literal.Number.Hex */\n.highlight .mi { color: #953800 } /* Literal.Number.Integer */\n.highlight .mo { color: #953800 } /* Literal.Number.Oct */\n.highlight .sa { color: #0550AE } /* Literal.String.Affix */\n.highlight .sb { color: #0550AE } /* Literal.String.Backtick */\n.highlight .sc { color: #0550AE } /* Literal.String.Char */\n.highlight .dl { color: #0550AE } /* Literal.String.Delimiter */\n.highlight .sd { color: #0550AE } /* Literal.String.Doc */\n.highlight .s2 { color: #0550AE } /* Literal.String.Double */\n.highlight .se { color: #0550AE } /* Literal.String.Escape */\n.highlight .sh { color: #0550AE } /* Literal.String.Heredoc */\n.highlight .si { color: #0550AE } /* Literal.String.Interpol */\n.highlight .sx { color: #0550AE } /* Literal.String.Other */\n.highlight .sr { color: #0550AE } /* Literal.String.Regex */\n.highlight .s1 { color: #0550AE } /* Literal.String.Single */\n.highlight .ss { color: #0550AE } /* Literal.String.Symbol */\n.highlight .bp { color: #953800 } /* Name.Builtin.Pseudo */\n.highlight .fm { color: #0550AE } /* Name.Function.Magic */\n.highlight .vc { color: #953800 } /* Name.Variable.Class */\n.highlight .vg { color: #953800 } /* Name.Variable.Global */\n.highlight .vi { color: #953800 } /* Name.Variable.Instance */\n.highlight .vm { color: #953800 } /* Name.Variable.Magic */\n.highlight .il { color: #953800 } /* Literal.Number.Integer.Long */\n","/*\ngenerated by accessible-pygments \nCopyright (c) 2022, Quansight Labs\nLicensed under the BSD license, see LICENSE for details.\n--\ngenerated by Pygments \nCopyright 2006-2025 by the Pygments team.\nLicensed under the BSD license, see LICENSE for details.\n*/\n\n.highlight .hll { background-color: #6e7681 }\n.highlight { background: #0d1117; color: #E6EDF3 }\n.highlight .c { color: #8B949E; font-style: italic } /* Comment */\n.highlight .err { color: #F85149 } /* Error */\n.highlight .esc { color: #E6EDF3 } /* Escape */\n.highlight .g { color: #E6EDF3 } /* Generic */\n.highlight .k { color: #FF7B72 } /* Keyword */\n.highlight .l { color: #A5D6FF } /* Literal */\n.highlight .n { color: #E6EDF3 } /* Name */\n.highlight .o { color: #FF7B72; font-weight: bold } /* Operator */\n.highlight .x { color: #E6EDF3 } /* Other */\n.highlight .p { color: #E6EDF3 } /* Punctuation */\n.highlight .ch { color: #8B949E; font-style: italic } /* Comment.Hashbang */\n.highlight .cm { color: #8B949E; font-style: italic } /* Comment.Multiline */\n.highlight .cp { color: #8B949E; font-weight: bold; font-style: italic } /* Comment.Preproc */\n.highlight .cpf { color: #8B949E; font-style: italic } /* Comment.PreprocFile */\n.highlight .c1 { color: #8B949E; font-style: italic } /* Comment.Single */\n.highlight .cs { color: #8B949E; font-weight: bold; font-style: italic } /* Comment.Special */\n.highlight .gd { color: #FFA198; background-color: #490202 } /* Generic.Deleted */\n.highlight .ge { color: #E6EDF3; font-style: italic } /* Generic.Emph */\n.highlight .ges { color: #E6EDF3; font-weight: bold; font-style: italic } /* Generic.EmphStrong */\n.highlight .gr { color: #FFA198 } /* Generic.Error */\n.highlight .gh { color: #79C0FF; font-weight: bold } /* Generic.Heading */\n.highlight .gi { color: #56D364; background-color: #0F5323 } /* Generic.Inserted */\n.highlight .go { color: #8B949E } /* Generic.Output */\n.highlight .gp { color: #8B949E } /* Generic.Prompt */\n.highlight .gs { color: #E6EDF3; font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #79C0FF } /* Generic.Subheading */\n.highlight .gt { color: #FF7B72 } /* Generic.Traceback */\n.highlight .g-Underline { color: #E6EDF3; text-decoration: underline } /* Generic.Underline */\n.highlight .kc { color: #79C0FF } /* Keyword.Constant */\n.highlight .kd { color: #FF7B72 } /* Keyword.Declaration */\n.highlight .kn { color: #FF7B72 } /* Keyword.Namespace */\n.highlight .kp { color: #79C0FF } /* Keyword.Pseudo */\n.highlight .kr { color: #FF7B72 } /* Keyword.Reserved */\n.highlight .kt { color: #FF7B72 } /* Keyword.Type */\n.highlight .ld { color: #79C0FF } /* Literal.Date */\n.highlight .m { color: #A5D6FF } /* Literal.Number */\n.highlight .s { color: #A5D6FF } /* Literal.String */\n.highlight .na { color: #E6EDF3 } /* Name.Attribute */\n.highlight .nb { color: #E6EDF3 } /* Name.Builtin */\n.highlight .nc { color: #F0883E; font-weight: bold } /* Name.Class */\n.highlight .no { color: #79C0FF; font-weight: bold } /* Name.Constant */\n.highlight .nd { color: #D2A8FF; font-weight: bold } /* Name.Decorator */\n.highlight .ni { color: #FFA657 } /* Name.Entity */\n.highlight .ne { color: #F0883E; font-weight: bold } /* Name.Exception */\n.highlight .nf { color: #D2A8FF; font-weight: bold } /* Name.Function */\n.highlight .nl { color: #79C0FF; font-weight: bold } /* Name.Label */\n.highlight .nn { color: #FF7B72 } /* Name.Namespace */\n.highlight .nx { color: #E6EDF3 } /* Name.Other */\n.highlight .py { color: #79C0FF } /* Name.Property */\n.highlight .nt { color: #7EE787 } /* Name.Tag */\n.highlight .nv { color: #79C0FF } /* Name.Variable */\n.highlight .ow { color: #FF7B72; font-weight: bold } /* Operator.Word */\n.highlight .pm { color: #E6EDF3 } /* Punctuation.Marker */\n.highlight .w { color: #6E7681 } /* Text.Whitespace */\n.highlight .mb { color: #A5D6FF } /* Literal.Number.Bin */\n.highlight .mf { color: #A5D6FF } /* Literal.Number.Float */\n.highlight .mh { color: #A5D6FF } /* Literal.Number.Hex */\n.highlight .mi { color: #A5D6FF } /* Literal.Number.Integer */\n.highlight .mo { color: #A5D6FF } /* Literal.Number.Oct */\n.highlight .sa { color: #79C0FF } /* Literal.String.Affix */\n.highlight .sb { color: #A5D6FF } /* Literal.String.Backtick */\n.highlight .sc { color: #A5D6FF } /* Literal.String.Char */\n.highlight .dl { color: #79C0FF } /* Literal.String.Delimiter */\n.highlight .sd { color: #A5D6FF } /* Literal.String.Doc */\n.highlight .s2 { color: #A5D6FF } /* Literal.String.Double */\n.highlight .se { color: #79C0FF } /* Literal.String.Escape */\n.highlight .sh { color: #79C0FF } /* Literal.String.Heredoc */\n.highlight .si { color: #A5D6FF } /* Literal.String.Interpol */\n.highlight .sx { color: #A5D6FF } /* Literal.String.Other */\n.highlight .sr { color: #79C0FF } /* Literal.String.Regex */\n.highlight .s1 { color: #A5D6FF } /* Literal.String.Single */\n.highlight .ss { color: #A5D6FF } /* Literal.String.Symbol */\n.highlight .bp { color: #E6EDF3 } /* Name.Builtin.Pseudo */\n.highlight .fm { color: #D2A8FF; font-weight: bold } /* Name.Function.Magic */\n.highlight .vc { color: #79C0FF } /* Name.Variable.Class */\n.highlight .vg { color: #79C0FF } /* Name.Variable.Global */\n.highlight .vi { color: #79C0FF } /* Name.Variable.Instance */\n.highlight .vm { color: #79C0FF } /* Name.Variable.Magic */\n.highlight .il { color: #A5D6FF } /* Literal.Number.Integer.Long */\n","/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput {\n /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect {\n /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// Base element style overrides\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\n:root {\n color-scheme: $color-scheme;\n}\n\n* {\n box-sizing: border-box;\n}\n\nhtml {\n scroll-behavior: smooth;\n\n @include fs-4;\n}\n\nbody {\n font-family: $body-font-family;\n font-size: inherit;\n line-height: $body-line-height;\n color: $body-text-color;\n background-color: $body-background-color;\n overflow-wrap: break-word;\n}\n\nol,\nul,\ndl,\npre,\naddress,\nblockquote,\ntable,\ndiv,\nhr,\nform,\nfieldset,\nnoscript .table-wrapper {\n margin-top: 0;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n#toctitle {\n margin-top: 0;\n margin-bottom: 1em;\n font-weight: 500;\n line-height: $body-heading-line-height;\n color: $body-heading-color;\n}\n\np {\n margin-top: 1em;\n margin-bottom: 1em;\n}\n\na {\n color: $link-color;\n text-decoration: none;\n}\n\na:not([class]) {\n text-decoration: underline;\n text-decoration-color: $border-color;\n text-underline-offset: 2px;\n\n &:hover {\n text-decoration-color: rgba($link-color, 0.45);\n }\n}\n\ncode {\n font-family: $mono-font-family;\n font-size: 0.75em;\n line-height: $body-line-height;\n}\n\nfigure,\npre {\n margin: 0;\n}\n\nli {\n margin: 0.25em 0;\n}\n\nimg {\n max-width: 100%;\n height: auto;\n}\n\nhr {\n height: 1px;\n padding: 0;\n margin: $sp-6 0;\n background-color: $border-color;\n border: 0;\n}\n\n// adds a GitHub-style sidebar to blockquotes\nblockquote {\n margin: 10px 0;\n\n // resets user-agent stylesheets for blockquotes\n margin-block-start: 0;\n margin-inline-start: 0;\n padding-left: 1rem;\n border-left: 3px solid $border-color;\n}\n","$color-scheme: dark;\n$body-background-color: $grey-dk-300;\n$body-heading-color: $grey-lt-000;\n$body-text-color: $grey-lt-300;\n$link-color: lighten($blue-000, 10%);\n$nav-child-link-color: $grey-dk-000;\n$sidebar-color: $grey-dk-300;\n$base-button-color: $grey-dk-250;\n$btn-primary-color: $blue-200;\n$code-background-color: #0d1117; // github-dark bg color\n$code-linenumber-color: #e6edf3; // github-dark line number color\n$feedback-color: darken($sidebar-color, 3%);\n$table-background-color: $grey-dk-250;\n$search-background-color: $grey-dk-250;\n$search-result-preview-color: $grey-lt-300;\n$border-color: $grey-dk-200;\n\n@import \"./vendor/accessible-pygments/github-dark\";\n","@mixin fs-1 {\n & {\n font-size: $font-size-1 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-1-sm !important;\n }\n}\n\n@mixin fs-2 {\n & {\n font-size: $font-size-2 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-3 !important;\n }\n}\n\n@mixin fs-3 {\n & {\n font-size: $font-size-3 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-4 !important;\n }\n}\n\n@mixin fs-4 {\n & {\n font-size: $font-size-4 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-5 !important;\n }\n}\n\n@mixin fs-5 {\n & {\n font-size: $font-size-5 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-6 !important;\n }\n}\n\n@mixin fs-6 {\n & {\n font-size: $font-size-6 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n}\n\n@mixin fs-7 {\n & {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-8 !important;\n }\n}\n\n@mixin fs-8 {\n & {\n font-size: $font-size-8 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-9 !important;\n }\n}\n\n@mixin fs-9 {\n & {\n font-size: $font-size-9 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10 !important;\n }\n}\n\n@mixin fs-10 {\n & {\n font-size: $font-size-10 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10-sm !important;\n }\n}\n","// Media query\n\n// Media query mixin\n// Usage:\n// @include mq(md) {\n// ..medium and up styles\n// }\n@mixin mq($name) {\n // Retrieves the value from the key\n $value: map-get($media-queries, $name);\n\n // If the key exists in the map\n @if $value {\n // Prints a media query based on the value\n @media (min-width: $value) {\n @content;\n }\n } @else {\n @warn \"No value could be retrieved from `#{$media-query}`. Please make sure it is defined in `$media-queries` map.\";\n }\n}\n\n// Responsive container\n\n@mixin container {\n padding-right: $gutter-spacing-sm;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-right: $gutter-spacing;\n padding-left: $gutter-spacing;\n }\n}\n","// Typography\n\n// prettier-ignore\n$body-font-family: system-ui, -apple-system, blinkmacsystemfont, \"Segoe UI\",\n roboto, \"Helvetica Neue\", arial, sans-serif, \"Segoe UI Emoji\" !default;\n$mono-font-family: \"SFMono-Regular\", menlo, consolas, monospace !default;\n$root-font-size: 16px !default; // DEPRECATED: previously base font-size for rems\n$body-line-height: 1.4 !default;\n$content-line-height: 1.6 !default;\n$body-heading-line-height: 1.25 !default;\n\n// Font size\n// `-sm` suffix is the size at the small (and above) media query\n\n$font-size-1: 0.5625rem !default;\n$font-size-1-sm: 0.625rem !default;\n$font-size-2: 0.6875rem !default; // h4 - uppercased!, h6 not uppercased, text-small\n$font-size-3: 0.75rem !default; // h5\n$font-size-4: 0.875rem !default;\n$font-size-5: 1rem !default; // h3\n$font-size-6: 1.125rem !default; // h2\n$font-size-7: 1.5rem !default;\n$font-size-8: 2rem !default; // h1\n$font-size-9: 2.25rem !default;\n$font-size-10: 2.625rem !default;\n$font-size-10-sm: 3rem !default;\n\n// Colors\n\n$white: #fff !default;\n$grey-dk-000: #959396 !default;\n$grey-dk-100: #5c5962 !default;\n$grey-dk-200: #44434d !default;\n$grey-dk-250: #302d36 !default;\n$grey-dk-300: #27262b !default;\n$grey-lt-000: #f5f6fa !default;\n$grey-lt-100: #eeebee !default;\n$grey-lt-200: #ecebed !default;\n$grey-lt-300: #e6e1e8 !default;\n$purple-000: #7253ed !default;\n$purple-100: #5e41d0 !default;\n$purple-200: #4e26af !default;\n$purple-300: #381885 !default;\n$blue-000: #2c84fa !default;\n$blue-100: #2869e6 !default;\n$blue-200: #264caf !default;\n$blue-300: #183385 !default;\n$green-000: #41d693 !default;\n$green-100: #11b584 !default;\n$green-200: #009c7b !default;\n$green-300: #026e57 !default;\n$yellow-000: #ffeb82 !default;\n$yellow-100: #fadf50 !default;\n$yellow-200: #f7d12e !default;\n$yellow-300: #e7af06 !default;\n$red-000: #f77e7e !default;\n$red-100: #f96e65 !default;\n$red-200: #e94c4c !default;\n$red-300: #dd2e2e !default;\n\n// Spacing\n\n$spacing-unit: 1rem; // 1rem == 16px\n\n$spacers: (\n sp-0: 0,\n sp-1: $spacing-unit * 0.25,\n sp-2: $spacing-unit * 0.5,\n sp-3: $spacing-unit * 0.75,\n sp-4: $spacing-unit,\n sp-5: $spacing-unit * 1.5,\n sp-6: $spacing-unit * 2,\n sp-7: $spacing-unit * 2.5,\n sp-8: $spacing-unit * 3,\n sp-9: $spacing-unit * 3.5,\n sp-10: $spacing-unit * 4,\n) !default;\n$sp-1: map-get($spacers, sp-1) !default; // 0.25 rem == 4px\n$sp-2: map-get($spacers, sp-2) !default; // 0.5 rem == 8px\n$sp-3: map-get($spacers, sp-3) !default; // 0.75 rem == 12px\n$sp-4: map-get($spacers, sp-4) !default; // 1 rem == 16px\n$sp-5: map-get($spacers, sp-5) !default; // 1.5 rem == 24px\n$sp-6: map-get($spacers, sp-6) !default; // 2 rem == 32px\n$sp-7: map-get($spacers, sp-7) !default; // 2.5 rem == 40px\n$sp-8: map-get($spacers, sp-8) !default; // 3 rem == 48px\n$sp-9: map-get($spacers, sp-9) !default; // 3.5 rem == 56px\n$sp-10: map-get($spacers, sp-10) !default; // 4 rem == 64px\n\n// Borders\n\n$border: 1px solid !default;\n$border-radius: 4px !default;\n$border-color: $grey-lt-100 !default;\n\n// Grid system\n\n$gutter-spacing: $sp-6 !default;\n$gutter-spacing-sm: $sp-4 !default;\n$nav-width: 16.5rem !default;\n$nav-width-md: 15.5rem !default;\n$nav-list-item-height: $sp-6 !default;\n$nav-list-item-height-sm: $sp-8 !default;\n$nav-list-expander-right: true;\n$content-width: 50rem !default;\n$header-height: 3.75rem !default;\n$search-results-width: $content-width - $nav-width !default;\n$transition-duration: 400ms;\n\n// Media queries in pixels\n\n$media-queries: (\n xs: 20rem,\n sm: 31.25rem,\n md: $content-width,\n lg: $content-width + $nav-width,\n xl: 87.5rem,\n) !default;\n","// The basic two column layout\n\n.side-bar {\n z-index: 0;\n display: flex;\n flex-wrap: wrap;\n background-color: $sidebar-color;\n\n @include mq(md) {\n flex-flow: column nowrap;\n position: fixed;\n width: $nav-width-md;\n height: 100%;\n border-right: $border $border-color;\n align-items: flex-end;\n }\n\n @include mq(lg) {\n width: calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width});\n min-width: $nav-width;\n }\n\n & + .main {\n @include mq(md) {\n margin-left: $nav-width-md;\n }\n\n @include mq(lg) {\n // stylelint-disable function-name-case\n // disable for Max(), we want to use the CSS max() function\n margin-left: Max(\n #{$nav-width},\n calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width})\n );\n // stylelint-enable function-name-case\n }\n\n .main-header {\n display: none;\n background-color: $sidebar-color;\n\n @include mq(md) {\n display: flex;\n background-color: $body-background-color;\n }\n\n &.nav-open {\n display: block;\n\n @include mq(md) {\n display: flex;\n }\n }\n }\n }\n}\n\n.main {\n margin: auto;\n\n @include mq(md) {\n position: relative;\n max-width: $content-width;\n }\n}\n\n.main-content-wrap {\n padding-top: $gutter-spacing-sm;\n padding-bottom: $gutter-spacing-sm;\n\n @include container;\n\n @include mq(md) {\n padding-top: $gutter-spacing;\n padding-bottom: $gutter-spacing;\n }\n}\n\n.main-header {\n z-index: 0;\n border-bottom: $border $border-color;\n\n @include mq(md) {\n display: flex;\n justify-content: space-between;\n height: $header-height;\n }\n}\n\n.site-nav,\n.site-header,\n.site-footer {\n width: 100%;\n\n @include mq(lg) {\n width: $nav-width;\n }\n}\n\n.site-nav {\n display: none;\n\n &.nav-open {\n display: block;\n }\n\n @include mq(md) {\n display: block;\n padding-top: $sp-8;\n padding-bottom: $gutter-spacing-sm;\n overflow-y: auto;\n flex: 1 1 auto;\n }\n}\n\n.site-header {\n display: flex;\n min-height: $header-height;\n align-items: center;\n\n @include mq(md) {\n height: $header-height;\n max-height: $header-height;\n border-bottom: $border $border-color;\n }\n}\n\n.site-title {\n flex-grow: 1;\n display: flex;\n height: 100%;\n align-items: center;\n padding-top: $sp-3;\n padding-bottom: $sp-3;\n color: $body-heading-color;\n\n @include container;\n\n @include fs-6;\n\n @include mq(md) {\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n }\n}\n\n@if variable-exists(logo) {\n .site-logo {\n width: 100%;\n height: 100%;\n background-image: url($logo);\n background-repeat: no-repeat;\n background-position: left center;\n background-size: contain;\n }\n}\n\n.site-button {\n display: flex;\n height: 100%;\n padding: $gutter-spacing-sm;\n align-items: center;\n}\n\n@include mq(md) {\n .site-header .site-button {\n display: none;\n }\n}\n\n.site-title:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n}\n\n.site-button:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n}\n\n.site-footer {\n position: absolute;\n bottom: 0;\n left: 0;\n padding-top: $sp-4;\n padding-bottom: $sp-4;\n\n @include container;\n\n @include fs-2;\n\n @include mq(md) {\n position: static;\n justify-self: end;\n }\n}\n\n.icon {\n width: $sp-5;\n height: $sp-5;\n color: $link-color;\n}\n","@charset \"UTF-8\";\n\n// Styles for rendered markdown in the .main-content container\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity, selector-max-id\n\n.main-content {\n line-height: $content-line-height;\n\n ol,\n ul,\n dl,\n pre,\n address,\n blockquote,\n .table-wrapper {\n margin-top: 0.5em;\n }\n\n a {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n ul,\n ol {\n padding-left: 1.5em;\n }\n\n li {\n .highlight {\n margin-top: $sp-1;\n }\n }\n\n ol {\n list-style-type: none;\n counter-reset: step-counter;\n\n > li {\n position: relative;\n\n &::before {\n position: absolute;\n top: 0.2em;\n left: -1.6em;\n color: $grey-dk-000;\n content: counter(step-counter);\n counter-increment: step-counter;\n @include fs-3;\n\n @include mq(sm) {\n top: 0.11em;\n }\n }\n\n ol {\n counter-reset: sub-counter;\n\n > li {\n &::before {\n content: counter(sub-counter, lower-alpha);\n counter-increment: sub-counter;\n }\n }\n }\n }\n }\n\n ul {\n list-style: none;\n\n > li {\n &::before {\n position: absolute;\n margin-left: -1.4em;\n color: $grey-dk-000;\n content: \"•\";\n }\n }\n }\n\n .task-list-item {\n &::before {\n content: \"\";\n }\n }\n\n .task-list-item-checkbox {\n margin-right: 0.6em;\n margin-left: -1.4em;\n\n // The same margin-left is used above for ul > li::before\n }\n\n hr + * {\n margin-top: 0;\n }\n\n h1:first-of-type {\n margin-top: 0.5em;\n }\n\n dl {\n display: grid;\n grid-template: auto / 10em 1fr;\n }\n\n dt,\n dd {\n margin: 0.25em 0;\n }\n\n dt {\n grid-column: 1;\n font-weight: 500;\n text-align: right;\n\n &::after {\n content: \":\";\n }\n }\n\n dd {\n grid-column: 2;\n margin-bottom: 0;\n margin-left: 1em;\n\n blockquote,\n div,\n dl,\n dt,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n li,\n ol,\n p,\n pre,\n table,\n ul,\n .table-wrapper {\n &:first-child {\n margin-top: 0;\n }\n }\n }\n\n dd,\n ol,\n ul {\n dl:first-child {\n dt:first-child,\n dd:nth-child(2) {\n margin-top: 0;\n }\n }\n }\n\n .anchor-heading {\n position: absolute;\n right: -$sp-4;\n width: $sp-5;\n height: 100%;\n padding-right: $sp-1;\n padding-left: $sp-1;\n overflow: visible;\n\n @include mq(md) {\n right: auto;\n left: -$sp-5;\n }\n\n svg {\n display: inline-block;\n width: 100%;\n height: 100%;\n color: $link-color;\n visibility: hidden;\n }\n }\n\n .anchor-heading:hover,\n .anchor-heading:focus,\n h1:hover > .anchor-heading,\n h2:hover > .anchor-heading,\n h3:hover > .anchor-heading,\n h4:hover > .anchor-heading,\n h5:hover > .anchor-heading,\n h6:hover > .anchor-heading {\n svg {\n visibility: visible;\n }\n }\n\n summary {\n cursor: pointer;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n #toctitle {\n position: relative;\n margin-top: 1.5em;\n margin-bottom: 0.25em;\n\n + table,\n + .table-wrapper,\n + .code-example,\n + .highlighter-rouge,\n + .sectionbody .listingblock {\n margin-top: 1em;\n }\n\n + p:not(.label) {\n margin-top: 0;\n }\n }\n\n > h1:first-child,\n > h2:first-child,\n > h3:first-child,\n > h4:first-child,\n > h5:first-child,\n > h6:first-child,\n > .sect1:first-child > h2,\n > .sect2:first-child > h3,\n > .sect3:first-child > h4,\n > .sect4:first-child > h5,\n > .sect5:first-child > h6 {\n margin-top: $sp-2;\n }\n}\n","// Main nav, breadcrumb, etc...\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity\n\n.nav-list {\n padding: 0;\n margin-top: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n margin: 0;\n\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n\n .nav-list-link {\n display: block;\n min-height: $nav-list-item-height-sm;\n padding-top: $sp-1;\n padding-bottom: $sp-1;\n line-height: #{$nav-list-item-height-sm - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height-sm;\n padding-left: $gutter-spacing-sm;\n } @else {\n padding-right: $gutter-spacing-sm;\n padding-left: $nav-list-item-height-sm;\n }\n\n @include mq(md) {\n min-height: $nav-list-item-height;\n line-height: #{$nav-list-item-height - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height;\n padding-left: $gutter-spacing;\n } @else {\n padding-right: $gutter-spacing;\n padding-left: $nav-list-item-height;\n }\n }\n\n &.external > svg {\n width: $sp-4;\n height: $sp-4;\n vertical-align: text-bottom;\n }\n\n &.active {\n font-weight: 600;\n text-decoration: none;\n }\n\n &:hover,\n &.active {\n color: darken($link-color, 5%);\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n }\n }\n\n .nav-list-expander {\n position: absolute;\n @if $nav-list-expander-right {\n right: 0;\n }\n\n width: $nav-list-item-height-sm;\n height: $nav-list-item-height-sm;\n padding: #{$nav-list-item-height-sm * 0.25};\n color: $link-color;\n\n @include mq(md) {\n width: $nav-list-item-height;\n height: $nav-list-item-height;\n padding: #{$nav-list-item-height * 0.25};\n }\n\n &:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n }\n\n @if $nav-list-expander-right {\n svg {\n transform: rotate(90deg);\n }\n }\n }\n\n > .nav-list {\n display: none;\n padding-left: $sp-3;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n\n .nav-list-link {\n color: $nav-child-link-color;\n }\n\n .nav-list-expander {\n color: $nav-child-link-color;\n }\n }\n }\n\n &.active {\n > .nav-list-expander svg {\n @if $nav-list-expander-right {\n transform: rotate(-90deg);\n } @else {\n transform: rotate(90deg);\n }\n }\n\n > .nav-list {\n display: block;\n }\n }\n }\n}\n\n.nav-category {\n padding: $sp-2 $gutter-spacing-sm;\n font-weight: 600;\n text-align: start;\n text-transform: uppercase;\n border-bottom: $border $border-color;\n @include fs-2;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing;\n margin-top: $gutter-spacing-sm;\n text-align: start;\n\n &:first-child {\n margin-top: 0;\n }\n }\n}\n\n.nav-list.nav-category-list {\n > .nav-list-item {\n margin: 0;\n\n > .nav-list {\n padding: 0;\n\n > .nav-list-item {\n > .nav-list-link {\n color: $link-color;\n }\n\n > .nav-list-expander {\n color: $link-color;\n }\n }\n }\n }\n}\n\n// Aux nav\n\n.aux-nav {\n height: 100%;\n overflow-x: auto;\n @include fs-2;\n\n .aux-nav-list {\n display: flex;\n height: 100%;\n padding: 0;\n margin: 0;\n list-style: none;\n }\n\n .aux-nav-list-item {\n display: inline-block;\n height: 100%;\n padding: 0;\n margin: 0;\n }\n\n @include mq(md) {\n padding-right: $gutter-spacing-sm;\n }\n}\n\n// Breadcrumb nav\n\n.breadcrumb-nav {\n @include mq(md) {\n margin-top: -$sp-4;\n }\n}\n\n.breadcrumb-nav-list {\n padding-left: 0;\n margin-bottom: $sp-3;\n list-style: none;\n}\n\n.breadcrumb-nav-list-item {\n display: table-cell;\n @include fs-2;\n\n &::before {\n display: none;\n }\n\n &::after {\n display: inline-block;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $grey-dk-000;\n content: \"/\";\n }\n\n &:last-child {\n &::after {\n content: \"\";\n }\n }\n}\n","// Typography\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\nh1,\n.text-alpha {\n font-weight: 300;\n\n @include fs-8;\n}\n\nh2,\n.text-beta,\n#toctitle {\n @include fs-6;\n}\n\nh3,\n.text-gamma {\n @include fs-5;\n}\n\nh4,\n.text-delta {\n font-weight: 400;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n\n @include fs-2;\n}\n\nh4 code {\n text-transform: none;\n}\n\nh5,\n.text-epsilon {\n @include fs-3;\n}\n\nh6,\n.text-zeta {\n @include fs-2;\n}\n\n.text-small {\n @include fs-2;\n}\n\n.text-mono {\n font-family: $mono-font-family !important;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n","// Labels (not the form kind)\n\n// this :not() prevents a style clash with Mermaid.js's\n// diagram labels, which also use .label\n// for more, see https://github.com/just-the-docs/just-the-docs/issues/1272\n// and the accompanying PR\n.label:not(g),\n.label-blue:not(g) {\n display: inline-block;\n padding: 0.16em 0.56em;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $white;\n text-transform: uppercase;\n vertical-align: middle;\n background-color: $blue-100;\n border-radius: 12px;\n\n @include fs-2;\n}\n\n.label-green:not(g) {\n background-color: $green-300;\n}\n\n.label-purple:not(g) {\n background-color: $purple-100;\n}\n\n.label-red:not(g) {\n background-color: $red-300;\n}\n\n.label-yellow:not(g) {\n color: $grey-dk-200;\n background-color: $yellow-200;\n}\n","// Buttons and things that look like buttons\n// stylelint-disable color-named\n\n.btn {\n display: inline-block;\n box-sizing: border-box;\n padding: 0.3em 1em;\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n font-weight: 500;\n line-height: 1.5;\n color: $link-color;\n text-decoration: none;\n vertical-align: baseline;\n cursor: pointer;\n background-color: $base-button-color;\n border-width: 0;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n appearance: none;\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: darken($link-color, 2%);\n }\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n text-decoration: none;\n background-color: darken($base-button-color, 1%);\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($base-button-color, 3%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken(#dcdcdc, 5%);\n }\n\n &:disabled,\n &.disabled {\n &,\n &:hover {\n color: rgba(102, 102, 102, 0.5);\n cursor: default;\n background-color: rgba(229, 229, 229, 0.5);\n background-image: none;\n box-shadow: none;\n }\n }\n}\n\n.btn-outline {\n color: $link-color;\n background: transparent;\n box-shadow: inset 0 0 0 2px $grey-lt-300;\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n color: darken($link-color, 4%);\n text-decoration: none;\n background-color: transparent;\n box-shadow: inset 0 0 0 3px $grey-lt-300;\n }\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow:\n inset 0 0 0 2px $grey-dk-100,\n 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: inset 0 0 0 2px $grey-dk-100;\n }\n}\n\n.btn-primary {\n @include btn-color($white, $btn-primary-color);\n}\n\n.btn-purple {\n @include btn-color($white, $purple-100);\n}\n\n.btn-blue {\n @include btn-color($white, $blue-200);\n}\n\n.btn-green {\n @include btn-color($white, $green-300);\n}\n\n.btn-reset {\n background: none;\n border: none;\n margin: 0;\n text-align: inherit;\n font: inherit;\n border-radius: 0;\n appearance: none;\n}\n","// Colored button\n\n@mixin btn-color($fg, $bg) {\n color: $fg;\n background-color: darken($bg, 2%);\n background-image: linear-gradient(lighten($bg, 5%), darken($bg, 2%));\n box-shadow:\n 0 1px 3px rgba(0, 0, 0, 0.25),\n 0 4px 10px rgba(0, 0, 0, 0.12);\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: $fg;\n background-color: darken($bg, 4%);\n background-image: linear-gradient((lighten($bg, 2%), darken($bg, 4%)));\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($bg, 5%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken($bg, 10%);\n }\n}\n","// Search input and autocomplete\n\n.search {\n position: relative;\n z-index: 2;\n flex-grow: 1;\n height: $sp-10;\n padding: $sp-2;\n transition: padding linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: relative !important;\n width: auto !important;\n height: 100% !important;\n padding: 0;\n transition: none;\n }\n}\n\n.search-input-wrap {\n position: relative;\n z-index: 1;\n height: $sp-8;\n overflow: hidden;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n transition: height linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: absolute;\n width: 100%;\n max-width: $search-results-width;\n height: 100% !important;\n border-radius: 0;\n box-shadow: none;\n transition: width ease $transition-duration;\n }\n}\n\n.search-input {\n position: absolute;\n width: 100%;\n height: 100%;\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing-sm + $sp-5};\n font-size: 1rem;\n color: $body-text-color;\n background-color: $search-background-color;\n border-top: 0;\n border-right: 0;\n border-bottom: 0;\n border-left: 0;\n border-radius: 0;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing + $sp-5};\n font-size: 0.875rem;\n background-color: $body-background-color;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n &:focus {\n outline: 2px solid $link-color;\n outline-offset: -2px;\n\n + .search-label .search-icon {\n color: $link-color;\n }\n }\n}\n\n.search-label {\n position: absolute;\n display: flex;\n height: 100%;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-left: $gutter-spacing;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n .search-icon {\n width: #{$sp-4 * 1.2};\n height: #{$sp-4 * 1.2};\n align-self: center;\n color: $grey-dk-000;\n }\n}\n\n.search-results {\n position: absolute;\n left: 0;\n display: none;\n width: 100%;\n max-height: calc(100% - #{$sp-10});\n overflow-y: auto;\n background-color: $search-background-color;\n border-bottom-right-radius: $border-radius;\n border-bottom-left-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n\n @include mq(md) {\n top: 100%;\n width: $search-results-width;\n max-height: calc(100vh - 200%) !important;\n }\n}\n\n.search-results-list {\n padding-left: 0;\n margin-bottom: $sp-1;\n list-style: none;\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n}\n\n.search-results-list-item {\n padding: 0;\n margin: 0;\n}\n\n.search-result {\n display: block;\n padding: $sp-1 $sp-3;\n\n &:hover,\n &.active {\n background-color: $feedback-color;\n }\n}\n\n.search-result-title {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 40%;\n padding-right: $sp-2;\n vertical-align: top;\n }\n}\n\n.search-result-doc {\n display: flex;\n align-items: center;\n word-wrap: break-word;\n\n &.search-result-doc-parent {\n opacity: 0.5;\n @include fs-3;\n\n @include mq(md) {\n @include fs-2;\n }\n }\n\n .search-result-icon {\n width: $sp-4;\n height: $sp-4;\n margin-right: $sp-2;\n color: $link-color;\n flex-shrink: 0;\n }\n\n .search-result-doc-title {\n overflow: auto;\n }\n}\n\n.search-result-section {\n margin-left: #{$sp-4 + $sp-2};\n word-wrap: break-word;\n}\n\n.search-result-rel-url {\n display: block;\n margin-left: #{$sp-4 + $sp-2};\n overflow: hidden;\n color: $search-result-preview-color;\n text-overflow: ellipsis;\n white-space: nowrap;\n @include fs-1;\n}\n\n.search-result-previews {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n padding-left: $sp-4;\n margin-left: $sp-2;\n color: $search-result-preview-color;\n word-wrap: break-word;\n border-left: $border;\n border-left-color: $border-color;\n @include fs-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 60%;\n padding-left: $sp-2;\n margin-left: 0;\n vertical-align: top;\n }\n}\n\n.search-result-preview + .search-result-preview {\n margin-top: $sp-1;\n}\n\n.search-result-highlight {\n font-weight: bold;\n}\n\n.search-no-result {\n padding: $sp-2 $sp-3;\n @include fs-3;\n}\n\n.search-button {\n position: fixed;\n right: $sp-4;\n bottom: $sp-4;\n display: flex;\n width: $sp-9;\n height: $sp-9;\n background-color: $search-background-color;\n border: 1px solid rgba($link-color, 0.3);\n border-radius: #{$sp-9 * 0.5};\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n align-items: center;\n justify-content: center;\n}\n\n.search-overlay {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1;\n width: 0;\n height: 0;\n background-color: rgba(0, 0, 0, 0.3);\n opacity: 0;\n transition:\n opacity ease $transition-duration,\n width 0s $transition-duration,\n height 0s $transition-duration;\n}\n\n.search-active {\n .search {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .search-input-wrap {\n height: $sp-10;\n border-radius: 0;\n\n @include mq(md) {\n width: $search-results-width;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n }\n }\n\n .search-input {\n background-color: $search-background-color;\n\n @include mq(md) {\n padding-left: 2.3rem;\n }\n }\n\n .search-label {\n @include mq(md) {\n padding-left: 0.6rem;\n }\n }\n\n .search-results {\n display: block;\n }\n\n .search-overlay {\n width: 100%;\n height: 100%;\n opacity: 1;\n transition:\n opacity ease $transition-duration,\n width 0s,\n height 0s;\n }\n\n @include mq(md) {\n .main {\n position: fixed;\n right: 0;\n left: 0;\n }\n }\n\n .main-header {\n padding-top: $sp-10;\n\n @include mq(md) {\n padding-top: 0;\n }\n }\n}\n","// Tables\n// stylelint-disable max-nesting-depth, selector-no-type, selector-max-type\n\n.table-wrapper {\n display: block;\n width: 100%;\n max-width: 100%;\n margin-bottom: $sp-5;\n overflow-x: auto;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n}\n\ntable {\n display: table;\n min-width: 100%;\n border-collapse: separate;\n}\n\nth,\ntd {\n min-width: 7.5rem;\n padding: $sp-2 $sp-3;\n background-color: $table-background-color;\n border-bottom: $border rgba($border-color, 0.5);\n border-left: $border $border-color;\n\n @include fs-3;\n\n &:first-of-type {\n border-left: 0;\n }\n}\n\ntbody {\n tr {\n &:last-of-type {\n th,\n td {\n border-bottom: 0;\n }\n\n td {\n padding-bottom: $sp-3;\n }\n }\n }\n}\n\nthead {\n th {\n border-bottom: $border $border-color;\n }\n}\n","// Code and syntax highlighting\n// stylelint-disable selector-no-qualifying-type, declaration-block-semicolon-newline-after,declaration-block-single-line-max-declarations, selector-no-type, selector-max-type, scss/comment-no-empty\n\n// {% raw %}\n\n// This instruction applies to all queues not within 'pre' or 'figure', avoiding 'code' generated by the highlight.\n:not(pre, figure) {\n & > code {\n padding: 0.2em 0.15em;\n font-weight: 400;\n background-color: $code-background-color;\n border: $border $border-color;\n border-radius: $border-radius;\n }\n}\n\n// Avoid appearance of dark border around visited code links in Safari\na:visited code {\n border-color: $border-color;\n}\n\n// Content structure for highlighted code blocks using fences or Liquid\n//\n// ```[LANG]...```, no kramdown line_numbers:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n//\n// ```[LANG]...```, kramdown line_numbers = true:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.rouge-gutter.gl > pre.lineno\n// | td.rouge-code > pre\n//\n// {% highlight LANG %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n//\n// {% highlight LANG linenos %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.gutter.gl > pre.lineno\n// | td.code > pre\n//\n// ----...---- (AsciiDoc)\n// div.listingblock > div.content > pre.rouge.highlight\n//\n// fix_linenos removes the outermost pre when it encloses table.rouge-table\n//\n// See docs/index-test.md for some tests.\n//\n// No kramdown line_numbers: fences and Liquid highlighting look the same.\n// Kramdown line_numbers = true: fences have a wider gutter than with Liquid?\n\n// ```[LANG]...```\n// or in AsciiDoc:\n//\n// ----\n// ...\n// ----\n\n// the code may appear with 3 different types:\n// container \\ case: default case, code with line number, code with html rendering\n// top level: div.highlighter-rouge, figure.highlight, figure.highlight\n// second level: div.highlight, div.table-wrapper, pre.highlight\n// third level: pre.highlight, td.code, absent\n// last level: code, pre, code (optionality)\n// highlighter level: span, span, span\n// the spacing are only in the second level for case 1, 3 and in the third level for case 2\n// in AsciiDoc, there is a parent container that contains optionally a title and the content.\n\n// select top level container\ndiv.highlighter-rouge,\ndiv.listingblock > div.content,\nfigure.highlight {\n margin-top: 0;\n margin-bottom: $sp-3;\n background-color: $code-background-color;\n border-radius: $border-radius;\n box-shadow: none;\n -webkit-overflow-scrolling: touch;\n position: relative;\n padding: 0;\n\n // copy button (or other button)\n // the button appear only when there is a hover on the code or focus on button\n > button {\n width: $sp-3;\n opacity: 0;\n position: absolute;\n top: 0;\n right: 0;\n padding: $sp-3;\n border: none;\n background: none;\n color: $body-text-color;\n box-sizing: content-box;\n\n svg {\n fill: $body-text-color;\n }\n\n &:active {\n text-decoration: none;\n outline: none;\n opacity: 1;\n }\n\n &:focus {\n opacity: 1;\n outline: 2px solid $link-color;\n }\n }\n\n // the button can be seen by doing a simple hover in the code, there is no need to go over the location of the button\n &:hover {\n > button {\n cursor: copy;\n opacity: 1;\n }\n }\n}\n\n// setting the spacing and scrollbar on the second level for the first case\n// remove all space on the second and third level\n// this is a mixin to accommodate for the slightly different structures generated via Markdown vs AsciiDoc\n@mixin scroll-and-spacing($code-div, $pre-select) {\n #{$code-div} {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n\n #{$pre-select},\n code {\n padding: 0;\n margin: 0;\n border: 0;\n }\n}\n\n// for Markdown\ndiv.highlighter-rouge {\n @include scroll-and-spacing(\"div.highlight\", \"pre.highlight\");\n}\n\n// for AsciiDoc. we also need to fix the margins for its parent container.\ndiv.listingblock {\n margin-top: 0;\n margin-bottom: $sp-3;\n\n @include scroll-and-spacing(\"div.content\", \"div.content > pre\");\n}\n\n// {% highlight LANG %}...{% endhighlight %},\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the second level for the thirt case\n// the css rule are apply only to the last code enviroment\n// setting the scroolbar\nfigure.highlight {\n pre,\n :not(pre) > code {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n}\n\n// ```[LANG]...```, kramdown line_numbers = true,\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the thirt level for the second case\n.highlight .table-wrapper {\n padding: $sp-3 0;\n margin: 0;\n border: 0;\n box-shadow: none;\n\n td,\n pre {\n min-width: 0;\n padding: 0;\n background-color: $code-background-color;\n border: 0;\n\n @include fs-2;\n }\n\n td.gl {\n width: 1em;\n padding-right: $sp-3;\n padding-left: $sp-3;\n }\n\n pre {\n margin: 0;\n line-height: 2;\n }\n}\n\n// Code examples: html render of a code\n.code-example,\n.listingblock > .title {\n padding: $sp-3;\n margin-bottom: $sp-3;\n overflow: auto;\n border: 1px solid $border-color;\n border-radius: $border-radius;\n\n + .highlighter-rouge,\n + .sectionbody .listingblock,\n + .content,\n + figure.highlight {\n position: relative;\n margin-top: -$sp-4;\n border-right: 1px solid $border-color;\n border-bottom: 1px solid $border-color;\n border-left: 1px solid $border-color;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n}\n\n// Mermaid diagram code blocks should be left unstyled.\ncode.language-mermaid {\n padding: 0;\n background-color: inherit;\n border: 0;\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight,\npre.highlight {\n background: $code-background-color; // Code Background\n // For Backwards Compatibility Before $code-linenumber-color was added\n @if variable-exists(code-linenumber-color) {\n color: $code-linenumber-color; // Code Line Numbers\n } @else {\n color: $body-text-color; // Code Line Numbers\n }\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight pre {\n background: $code-background-color; // Code Background\n}\n\n// {% endraw %}\n","// Utility classes for colors\n\n// Text colors\n\n.text-grey-dk-000 {\n color: $grey-dk-000 !important;\n}\n\n.text-grey-dk-100 {\n color: $grey-dk-100 !important;\n}\n\n.text-grey-dk-200 {\n color: $grey-dk-200 !important;\n}\n\n.text-grey-dk-250 {\n color: $grey-dk-250 !important;\n}\n\n.text-grey-dk-300 {\n color: $grey-dk-300 !important;\n}\n\n.text-grey-lt-000 {\n color: $grey-lt-000 !important;\n}\n\n.text-grey-lt-100 {\n color: $grey-lt-100 !important;\n}\n\n.text-grey-lt-200 {\n color: $grey-lt-200 !important;\n}\n\n.text-grey-lt-300 {\n color: $grey-lt-300 !important;\n}\n\n.text-blue-000 {\n color: $blue-000 !important;\n}\n\n.text-blue-100 {\n color: $blue-100 !important;\n}\n\n.text-blue-200 {\n color: $blue-200 !important;\n}\n\n.text-blue-300 {\n color: $blue-300 !important;\n}\n\n.text-green-000 {\n color: $green-000 !important;\n}\n\n.text-green-100 {\n color: $green-100 !important;\n}\n\n.text-green-200 {\n color: $green-200 !important;\n}\n\n.text-green-300 {\n color: $green-300 !important;\n}\n\n.text-purple-000 {\n color: $purple-000 !important;\n}\n\n.text-purple-100 {\n color: $purple-100 !important;\n}\n\n.text-purple-200 {\n color: $purple-200 !important;\n}\n\n.text-purple-300 {\n color: $purple-300 !important;\n}\n\n.text-yellow-000 {\n color: $yellow-000 !important;\n}\n\n.text-yellow-100 {\n color: $yellow-100 !important;\n}\n\n.text-yellow-200 {\n color: $yellow-200 !important;\n}\n\n.text-yellow-300 {\n color: $yellow-300 !important;\n}\n\n.text-red-000 {\n color: $red-000 !important;\n}\n\n.text-red-100 {\n color: $red-100 !important;\n}\n\n.text-red-200 {\n color: $red-200 !important;\n}\n\n.text-red-300 {\n color: $red-300 !important;\n}\n\n// Background colors\n\n.bg-grey-dk-000 {\n background-color: $grey-dk-000 !important;\n}\n\n.bg-grey-dk-100 {\n background-color: $grey-dk-100 !important;\n}\n\n.bg-grey-dk-200 {\n background-color: $grey-dk-200 !important;\n}\n\n.bg-grey-dk-250 {\n background-color: $grey-dk-250 !important;\n}\n\n.bg-grey-dk-300 {\n background-color: $grey-dk-300 !important;\n}\n\n.bg-grey-lt-000 {\n background-color: $grey-lt-000 !important;\n}\n\n.bg-grey-lt-100 {\n background-color: $grey-lt-100 !important;\n}\n\n.bg-grey-lt-200 {\n background-color: $grey-lt-200 !important;\n}\n\n.bg-grey-lt-300 {\n background-color: $grey-lt-300 !important;\n}\n\n.bg-blue-000 {\n background-color: $blue-000 !important;\n}\n\n.bg-blue-100 {\n background-color: $blue-100 !important;\n}\n\n.bg-blue-200 {\n background-color: $blue-200 !important;\n}\n\n.bg-blue-300 {\n background-color: $blue-300 !important;\n}\n\n.bg-green-000 {\n background-color: $green-000 !important;\n}\n\n.bg-green-100 {\n background-color: $green-100 !important;\n}\n\n.bg-green-200 {\n background-color: $green-200 !important;\n}\n\n.bg-green-300 {\n background-color: $green-300 !important;\n}\n\n.bg-purple-000 {\n background-color: $purple-000 !important;\n}\n\n.bg-purple-100 {\n background-color: $purple-100 !important;\n}\n\n.bg-purple-200 {\n background-color: $purple-200 !important;\n}\n\n.bg-purple-300 {\n background-color: $purple-300 !important;\n}\n\n.bg-yellow-000 {\n background-color: $yellow-000 !important;\n}\n\n.bg-yellow-100 {\n background-color: $yellow-100 !important;\n}\n\n.bg-yellow-200 {\n background-color: $yellow-200 !important;\n}\n\n.bg-yellow-300 {\n background-color: $yellow-300 !important;\n}\n\n.bg-red-000 {\n background-color: $red-000 !important;\n}\n\n.bg-red-100 {\n background-color: $red-100 !important;\n}\n\n.bg-red-200 {\n background-color: $red-200 !important;\n}\n\n.bg-red-300 {\n background-color: $red-300 !important;\n}\n","// Utility classes for layout\n\n// Display\n\n.d-block {\n display: block !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n// Screenreader-only\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .d-sm-block, .d-md-none, .d-lg-inline\n .d-#{$media-query}-block {\n display: block !important;\n }\n .d-#{$media-query}-flex {\n display: flex !important;\n }\n .d-#{$media-query}-inline {\n display: inline !important;\n }\n .d-#{$media-query}-inline-block {\n display: inline-block !important;\n }\n .d-#{$media-query}-none {\n display: none !important;\n }\n }\n }\n}\n\n// Horizontal alignment\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.flex-justify-start {\n justify-content: flex-start !important;\n}\n\n.flex-justify-end {\n justify-content: flex-end !important;\n}\n\n.flex-justify-between {\n justify-content: space-between !important;\n}\n\n.flex-justify-around {\n justify-content: space-around !important;\n}\n\n// Vertical alignment\n\n.v-align-baseline {\n vertical-align: baseline !important;\n}\n\n.v-align-bottom {\n vertical-align: bottom !important;\n}\n\n.v-align-middle {\n vertical-align: middle !important;\n}\n\n.v-align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.v-align-text-top {\n vertical-align: text-top !important;\n}\n\n.v-align-top {\n vertical-align: top !important;\n}\n","// Utility classes for typography\n\n.fs-1 {\n @include fs-1;\n}\n\n.fs-2 {\n @include fs-2;\n}\n\n.fs-3 {\n @include fs-3;\n}\n\n.fs-4 {\n @include fs-4;\n}\n\n.fs-5 {\n @include fs-5;\n}\n\n.fs-6 {\n @include fs-6;\n}\n\n.fs-7 {\n @include fs-7;\n}\n\n.fs-8 {\n @include fs-8;\n}\n\n.fs-9 {\n @include fs-9;\n}\n\n.fs-10 {\n @include fs-10;\n}\n\n.fw-300 {\n font-weight: 300 !important;\n}\n\n.fw-400 {\n font-weight: 400 !important;\n}\n\n.fw-500 {\n font-weight: 500 !important;\n}\n\n.fw-700 {\n font-weight: 700 !important;\n}\n\n.lh-0 {\n line-height: 0 !important;\n}\n\n.lh-default {\n line-height: $body-line-height;\n}\n\n.lh-tight {\n line-height: $body-heading-line-height;\n}\n\n.ls-5 {\n letter-spacing: 0.05em !important;\n}\n\n.ls-10 {\n letter-spacing: 0.1em !important;\n}\n\n.ls-0 {\n letter-spacing: 0 !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n","// Utility classes for lists\n\n// stylelint-disable selector-max-type\n\n.list-style-none {\n padding: 0 !important;\n margin: 0 !important;\n list-style: none !important;\n\n li {\n &::before {\n display: none !important;\n }\n }\n}\n","// Utility classes for margins and padding\n\n// stylelint-disable block-opening-brace-space-after, block-opening-brace-space-before\n\n// Margin spacer utilities\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-0, .m-1, .m-2...\n .m-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n .mx-#{$scale}-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-sm-0, .m-md-1, .m-lg-2...\n .m-#{$media-query}-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$media-query}-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$media-query}-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$media-query}-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n }\n }\n}\n\n// Padding spacer utilities\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-0, .p-1, .p-2...\n .p-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @include mq($media-query) {\n @for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-sm-0, .p-md-1, .p-lg-2...\n .p-#{$media-query}-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$media-query}-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$media-query}-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n }\n }\n}\n","// stylelint-disable selector-max-specificity, selector-max-id, selector-max-type, selector-no-qualifying-type\n\n@media print {\n .site-footer,\n .site-button,\n #edit-this-page,\n #back-to-top,\n .site-nav,\n .main-header {\n display: none !important;\n }\n\n hr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n }\n\n .side-bar {\n width: 100%;\n height: auto;\n border-right: 0 !important;\n }\n\n .site-header {\n border-bottom: 1px solid $border-color;\n }\n\n .site-title {\n font-size: 1rem !important;\n font-weight: 700 !important;\n }\n\n .text-small {\n font-size: 8pt !important;\n }\n\n pre.highlight {\n border: 1px solid $border-color;\n }\n\n .main {\n max-width: none;\n margin-left: 0;\n }\n}\n","// Skipnav\n// Skip to main content\n\na.skip-to-main {\n left: -999px;\n position: absolute;\n top: auto;\n width: 1px;\n height: 1px;\n overflow: hidden;\n z-index: -999;\n}\n\na.skip-to-main:focus,\na.skip-to-main:active {\n color: $link-color;\n background-color: $body-background-color;\n left: auto;\n top: auto;\n width: 30%;\n height: auto;\n overflow: auto;\n margin: 10px 35%;\n padding: 5px;\n border-radius: 15px;\n border: 4px solid $btn-primary-color;\n text-align: center;\n font-size: 1.2em;\n z-index: 999;\n}\n","\n@import \"./support/support\";\n@import \"./custom/setup\";\n@import \"./color_schemes/light\";\n\n@import \"./color_schemes/dark\";\n\n@import \"./modules\";\ndiv.opaque {\n background-color: $body-background-color;\n}\n\np.tip, blockquote.tip {\n border: 1px $green-300 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $green-300;\n content: \"Tip\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .tip-title {\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.tip-title, blockquote.tip-title {\n border: 1px $green-300 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.tip {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.tip-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.note, blockquote.note {\n border: 1px $blue-300 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $blue-300;\n content: \"Note\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .note-title {\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.note-title, blockquote.note-title {\n border: 1px $blue-300 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.note {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.note-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.warning, blockquote.warning {\n border: 1px $yellow-300 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $yellow-300;\n content: \"Warning\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .warning-title {\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.warning-title, blockquote.warning-title {\n border: 1px $yellow-300 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.warning {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.warning-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n@import \"./custom/custom\";\n\n\n"],"file":"just-the-docs-dark.css"}
\ No newline at end of file
+{"version":3,"sourceRoot":"","sources":["../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/vendor/accessible-pygments/github-light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/vendor/accessible-pygments/github-dark.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/vendor/normalize.scss/normalize.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/base.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/color_schemes/dark.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/support/mixins/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/support/mixins/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/support/_variables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/content.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/navigation.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/labels.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/support/mixins/_buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/search.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/tables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/code.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/utilities/_colors.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/utilities/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/utilities/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/utilities/_lists.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/utilities/_spacing.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/print.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/skiptomain.scss","just-the-docs-dark.scss"],"names":[],"mappings":"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;EACA;EACA,kBD4BY;;ADpBV;EEZJ;IAOI;IACA;IACA,ODwFW;ICvFX;IACA;IACA;;;AFAA;EEZJ;IAgBI;IACA,WD+EQ;;;ADpFR;EEQF;IAEI,aD2ES;;;ADrFX;EEQF;IAQI;;;AAOF;EACE;EACA,kBDLQ;;ADpBV;EEuBA;IAKI;IACA,kBDTM;;;ACYR;EACE;;AFjCJ;EEgCE;IAII;;;;AAOV;EACE;;AF5CE;EE2CJ;IAII;IACA,WDyCY;;;;ACrChB;EACE,aDaK;ECZL,gBDYK;EDvDL,eCuDK;EDtDL,cCsDK;;ADlEH;EEoDJ;IFrCI,eCqDG;IDpDH,cCoDG;;;ADpEH;EEoDJ;IAOI,aDSG;ICRH,gBDQG;;;;ACJP;EACE;EACA;;AFlEE;EEgEJ;IAKI;IACA;IACA,QDmBY;;;;ACfhB;AAAA;AAAA;EAGE;;AF9EE;EE2EJ;AAAA;AAAA;IAMI,ODGQ;;;;ACCZ;EACE;;AAEA;EACE;;AFzFA;EEqFJ;IAQI;IACA,aDxBG;ICyBH,gBD7BG;IC8BH;IACA;;;;AAIJ;EACE;EACA,YDbc;ECcd;;AFxGE;EEqGJ;IAMI,QDjBY;ICkBZ,YDlBY;ICmBZ;;;;AAIJ;EACE;EACA;EACA;EACA;EACA,aDrDK;ECsDL,gBDtDK;ECuDL,ODnGY;EDVZ,eCuDK;EDtDL,cCsDK;;ADlEH;EEiHJ;IFlGI,eCqDG;IDpDH,cCoDG;;;AF/BL;EACE;;ACtCA;EEiHJ;IHvEI;IACA,aEhDuB;;;ADKvB;EEiHJ;IAcI,aD/DG;ICgEH,gBDhEG;;;;AC+EP;EACE;EACA;EACA,SDhFK;ECiFL;;;AFnJE;EEuJF;IACE;;;AAIJ;EACE;;;AAQF;EACE;;;AAOF;EACE;EACA;EACA;EACA,aD/GK;ECgHL,gBDhHK;EDvDL,eCuDK;EDtDL,cCsDK;;ADlEH;EE6KJ;IF9JI,eCqDG;IDpDH,cCoDG;;;AFvEL;EACE;;ACEA;EE6KJ;IH3KI;;;ACFA;EE6KJ;IAYI;IACA;;;;AAIJ;EACE,OD5HK;EC6HL,QD7HK;EC8HL,OJ3MW;;;AKCb;EACE,aFEoB;;AEApB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAIA;EACE,YF+CC;;AE3CL;EACE;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA,OFfM;EEgBN;EACA;;AJ1BN;EACE;;ACRA;EG2BE;IJfF;;;ACZA;EG2BE;IAUI;;;AAIJ;EACE;;AAGE;EACE;EACA;;AAOV;EACE;;AAGE;EACE;EACA;EACA,OF7CM;EE8CN;;AAMJ;EACE;;AAIJ;EACE;EACA;;AAKF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAGF;EACE;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;;AAmBE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AASF;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;;AAKN;EACE;EACA;EACA,OFnFG;EEoFH;EACA,eFzFG;EE0FH,cF1FG;EE2FH;;AH1JA;EGmJF;IAUI;IACA;;;AAGF;EACE;EACA;EACA;EACA,OL/KO;EKgLP;;AAYF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAKE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAWE,YF9JG;;;AG3EP;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;ALoBF;EACE;;AClBA;EILF;IL2BE;;;ACtBA;EDOF;IACE;;;ACRA;EILF;ILiBE;;;AKPA;EACE;EACA,YH+DC;EG9DD,aHuDC;EGtDD,gBHsDC;EGrDD;EAEE,eH0DD;EGzDC,cHqDD;;ADlEH;EIKA;IAeI,YHgDD;IG/CC;IAEE,eH6CH;IG5CG,cH4CH;;;AGrCD;EACE,OHkCD;EGjCC,QHiCD;EGhCC;;AAGF;EACE;EACA;;AAGF;EAEE;EACA;;AASJ;EACE;EAEE;EAGF,OHUC;EGTD,QHSC;EGRD;EACA,ONzEO;;AEUT;EIsDA;IAYI,OHED;IGDC,QHCD;IGAC;;;AAGF;EACE;;AAQA;EACE;;AAKN;EACE;EACA,cHvBC;EGwBD;;AAEA;EACE;;AAEA;EACE,OH/EI;;AGkFN;EACE,OHnFI;;AGyFR;EAEI;;AAMJ;EACE;;;AAMR;EACE;EACA;EACA;EACA;EACA;;ALhIA;EACE;;ACEA;EIwHJ;ILtHI;;;ACFA;EIwHJ;IASI;IACA,YHhEG;IGiEH;;EAEA;IACE;;;;AAMJ;EACE;;AAEA;EACE;;AAGE;EACE,ON9JG;;AMiKL;EACE,ONlKG;;;AM2Kb;EACE;EACA;;ALtKA;EACE;;ACEA;EIiKJ;IL/JI;;;AKoKF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AJlLA;EIiKJ;IAqBI,eHpHG;;;;ADlEH;EI4LJ;IAEI;;;;AAIJ;EACE;EACA,eHnIK;EGoIL;;;AAGF;EACE;;AL5MA;EACE;;ACEA;EIwMJ;ILtMI;;;AK0MF;EACE;;AAGF;EACE;EACA,cHlJG;EGmJH,aHnJG;EGoJH,OHpMU;EGqMV;;AAIA;EACE;;;ACrON;AAAA;EAEE;;ANoEA;AAAA;EACE;EACA,aElEuB;;ADKvB;EKXJ;AAAA;IN4EI;;;;AA5BF;AAAA;AAAA;EACE;;ACtCA;EKJJ;AAAA;AAAA;IN8CI;IACA,aEhDuB;;;;AFgCzB;AAAA;EACE;;AC5BA;EKEJ;AAAA;IN8BI;;;;AMzBJ;AAAA;EAEE;EACA;EACA;;ANdA;AAAA;EACE;;ACEA;EKOJ;AAAA;INLI;;;;AMcJ;EACE;;;ANVA;AAAA;EACE;;ACRA;EKoBJ;AAAA;INRI;;;;AAfF;AAAA;EACE;;ACEA;EKyBJ;AAAA;INvBI;;;;AALF;EACE;;ACEA;EK8BJ;IN5BI;;;;AMgCJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvDF;AAAA;EAEE;EACA;EACA,cLoEK;EKnEL,aLmEK;EKlEL,OLiBM;EKhBN;EACA;EACA,kBL6BS;EK5BT;;APLA;AAAA;EACE;;ACEA;EMRJ;AAAA;IPUI;;;;AOKJ;EACE,kBL4BU;;;AKzBZ;EACE,kBLcW;;;AKXb;EACE,kBL4BQ;;;AKzBV;EACE,OLFY;EKGZ,kBLkBW;;;AMlDb;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OTRW;ESSX;EACA;EACA;EACA,kBNiBY;EMhBZ;EACA,eNyEc;EMxEd,YACE;EAEF;;AAEA;EACE;EACA;EACA;;AAGF;EAEE;;AAGF;EAEE;;AAGF;EAIE;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;AAKA;EAEE;EACA;EACA;EACA;EACA;;;AAKN;EACE,OTtEW;ESuEX;EACA;;AAEA;EAIE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA,YACE;;AAIJ;EAEE;;;AAIJ;ECnGE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADgFJ;ECvGE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADoFJ;EC3GE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADwFJ;EC/GE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AD4FJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AE3HF;EACE;EACA;EACA;EACA,QRgFM;EQ/EN,SRuEK;EQtEL;;ATME;ESZJ;IASI;IACA;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA,QR8DK;EQ7DL;EACA,eRmEc;EQlEd,YACE;EAEF;;ATdE;ESKJ;IAYI;IACA;IACA,WRwEmB;IQvEnB;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA,ORTY;EQUZ,kBRfY;EQgBZ;EACA;EACA;EACA;EACA;;ATvCE;ES2BJ;IAeI;IACA;IACA,kBRxBU;IQyBV;;;AAGF;EACE;EACA;;AAEA;EACE,OX/DO;;;AWoEb;EACE;EACA;EACA;EACA,cRIK;;ADlEH;ES0DJ;IAOI,cRGG;IQFH;;;AAGF;EACE;EACA;EACA;EACA,ORzDU;;;AQ6Dd;EACE;EACA;EACA;EACA;EACA;EACA;EACA,kBRjEY;EQkEZ,4BRRc;EQSd,2BRTc;EQUd,YACE;;ATxFA;ES6EJ;IAeI;IACA,ORFmB;IQGnB;;;;AAIJ;EACE;EACA,eRrCK;EQsCL;;AVpFA;EACE;;AClBA;ESkGJ;IV5EI;;;ACtBA;EDOF;IACE;;;ACRA;ESkGJ;IVtFI;;;;AUiGJ;EACE;EACA;;;AAGF;EACE;EACA;;AAEA;EAEE,kBX3Ha;;;AW+HjB;EACE;EACA,aR9DK;EQ+DL,gBR/DK;;ADhEH;ES4HJ;IAMI;IACA;IACA,eRpEG;IQqEH;;;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;;AVxIF;EACE;;ACRA;ES8IF;IVlIE;;;ACZA;EDHF;IACE;;;ACEA;ES8IF;IV5IE;;;AUqJF;EACE,ORtFG;EQuFH,QRvFG;EQwFH,cR1FG;EQ2FH,OXrKS;EWsKT;;AAGF;EACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,ORrJY;EQsJZ;EACA;;AV5LA;EACE;;ACYA;ESyKJ;IVjLI;;;;AU2LJ;EACE;EACA,aRrHK;EQsHL,gBRtHK;EQuHL,cRrHK;EQsHL,aRxHK;EQyHL,ORjKY;EQkKZ;EACA,aR/GO;EQgHP,mBR1KY;;AFrBZ;EACE;;ACEA;ESmLJ;IVjLI;;;ACFA;ESmLJ;IAaI;IACA;IACA,cRlIG;IQmIH;IACA;;;;AAIJ;EACE,YR1IK;;;AQ6IP;EACE;;;AAGF;EACE;;AV1MA;EACE;;ACRA;ESgNJ;IVpMI;;;;AUyMJ;EACE;EACA,ORrJK;EQsJL,QRtJK;EQuJL;EACA,ORnJK;EQoJL,QRpJK;EQqJL,kBRz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BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAQR;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AdhHA;EACE;;ACYA;EcZJ;IfII;;;;AAKF;EACE;;ACEA;EcRJ;IfUI;;;;AAKF;EACE;;ACRA;EcJJ;IfgBI;;;;AAKF;EACE;;AClBA;EcAJ;IfsBI;;;;AAKF;EACE;;AC5BA;EcIJ;If4BI;;;;AAKF;EACE;;ACtCA;EcQJ;IfkCI;IACA,aEhDuB;;;;AFqDzB;EACE;EACA,aEvDuB;;ADKvB;EcYJ;If0CI;;;;AAKF;EACE;EACA,aElEuB;;ADKvB;EcgBJ;IfiDI;;;;AAKF;EACE;EACA,aE7EuB;;ADKvB;EcoBJ;IfwDI;;;;AAKF;EACE;EACA,aExFuB;;ADKvB;EcwBJ;If+DI;;;;Ae3DJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,abxDiB;;;Aa2DnB;EACE,ab1DyB;;;Aa6D3B;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC/EF;EACE;EACA;EACA;;AAGE;EACE;;;ACLN;EACE;EACA;;;AAQA;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AhBlCA;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAaN;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AhB7GA;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AC3JR;EACE;AAAA;AAAA;AAAA;AAAA;AAAA;IAME;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;;;ACvCJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE,OpBXW;EoBYX,kBjBkBY;EiBjBZ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACpBF;EACE,kBlByBY;;;AkBtBd;EACI;EACA;EACA,elB4EY;EkB3EZ;EACA;;AAEA;EACI,OlB8BI;EkB7BJ;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlBoBM;EkBnBN;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBiDY;EkBhDZ;EACA;;AACA;EACE;EACA;EACA,OlBEM;EkBDN;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,elBGY;EkBFZ;EACA;;AAEA;EACI,OlB/CG;EkBgDH;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlBzDK;EkB0DL;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBxBY;EkByBZ;EACA;;AACA;EACE;EACA;EACA,OlB3EK;EkB4EL;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,elBtEY;EkBuEZ;EACA;;AAEA;EACI,OlBhHK;EkBiHL;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlB1HO;EkB2HP;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBjGY;EkBkGZ;EACA;;AACA;EACE;EACA;EACA,OlB5IO;EkB6IP;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE","sourcesContent":["/*\ngenerated by accessible-pygments \nCopyright (c) 2022, Quansight Labs\nLicensed under the BSD license, see LICENSE for details.\n--\ngenerated by Pygments \nCopyright 2006-2025 by the Pygments team.\nLicensed under the BSD license, see LICENSE for details.\n*/\n\n.highlight .hll { background-color: #0969da4a }\n.highlight .c { color: #6E7781 } /* Comment */\n.highlight .err { color: #CF222E } /* Error */\n.highlight .k { color: #CF222E } /* Keyword */\n.highlight .l { color: #953800 } /* Literal */\n.highlight .n { color: #8250DF } /* Name */\n.highlight .o { color: #116329 } /* Operator */\n.highlight .p { color: #24292F } /* Punctuation */\n.highlight .ch { color: #6E7781 } /* Comment.Hashbang */\n.highlight .cm { color: #6E7781 } /* Comment.Multiline */\n.highlight .cp { color: #6E7781 } /* Comment.Preproc */\n.highlight .cpf { color: #6E7781 } /* Comment.PreprocFile */\n.highlight .c1 { color: #6E7781 } /* Comment.Single */\n.highlight .cs { color: #6E7781 } /* Comment.Special */\n.highlight .gd { color: #0550AE } /* Generic.Deleted */\n.highlight .ge { font-style: italic } /* Generic.Emph */\n.highlight .gr { color: #CF222E } /* Generic.Error */\n.highlight .gh { color: #0550AE } /* Generic.Heading */\n.highlight .gs { font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #0550AE } /* Generic.Subheading */\n.highlight .kc { color: #0550AE } /* Keyword.Constant */\n.highlight .kd { color: #CF222E } /* Keyword.Declaration */\n.highlight .kn { color: #CF222E } /* Keyword.Namespace */\n.highlight .kp { color: #CF222E } /* Keyword.Pseudo */\n.highlight .kr { color: #CF222E } /* Keyword.Reserved */\n.highlight .kt { color: #CF222E } /* Keyword.Type */\n.highlight .ld { color: #953800 } /* Literal.Date */\n.highlight .m { color: #953800 } /* Literal.Number */\n.highlight .s { color: #0550AE } /* Literal.String */\n.highlight .na { color: #953800 } /* Name.Attribute */\n.highlight .nb { color: #953800 } /* Name.Builtin */\n.highlight .nc { color: #0550AE } /* Name.Class */\n.highlight .no { color: #0550AE } /* Name.Constant */\n.highlight .nd { color: #953800 } /* Name.Decorator */\n.highlight .ni { color: #116329 } /* Name.Entity */\n.highlight .ne { color: #8250DF } /* Name.Exception */\n.highlight .nf { color: #0550AE } /* Name.Function */\n.highlight .nl { color: #953800 } /* Name.Label */\n.highlight .nn { color: #24292F } /* Name.Namespace */\n.highlight .nx { color: #8250DF } /* Name.Other */\n.highlight .py { color: #0550AE } /* Name.Property */\n.highlight .nt { color: #116329 } /* Name.Tag */\n.highlight .nv { color: #953800 } /* Name.Variable */\n.highlight .ow { color: #8250DF } /* Operator.Word */\n.highlight .pm { color: #24292F } /* Punctuation.Marker */\n.highlight .w { color: #24292F } /* Text.Whitespace */\n.highlight .mb { color: #953800 } /* Literal.Number.Bin */\n.highlight .mf { color: #953800 } /* Literal.Number.Float */\n.highlight .mh { color: #953800 } /* Literal.Number.Hex */\n.highlight .mi { color: #953800 } /* Literal.Number.Integer */\n.highlight .mo { color: #953800 } /* Literal.Number.Oct */\n.highlight .sa { color: #0550AE } /* Literal.String.Affix */\n.highlight .sb { color: #0550AE } /* Literal.String.Backtick */\n.highlight .sc { color: #0550AE } /* Literal.String.Char */\n.highlight .dl { color: #0550AE } /* Literal.String.Delimiter */\n.highlight .sd { color: #0550AE } /* Literal.String.Doc */\n.highlight .s2 { color: #0550AE } /* Literal.String.Double */\n.highlight .se { color: #0550AE } /* Literal.String.Escape */\n.highlight .sh { color: #0550AE } /* Literal.String.Heredoc */\n.highlight .si { color: #0550AE } /* Literal.String.Interpol */\n.highlight .sx { color: #0550AE } /* Literal.String.Other */\n.highlight .sr { color: #0550AE } /* Literal.String.Regex */\n.highlight .s1 { color: #0550AE } /* Literal.String.Single */\n.highlight .ss { color: #0550AE } /* Literal.String.Symbol */\n.highlight .bp { color: #953800 } /* Name.Builtin.Pseudo */\n.highlight .fm { color: #0550AE } /* Name.Function.Magic */\n.highlight .vc { color: #953800 } /* Name.Variable.Class */\n.highlight .vg { color: #953800 } /* Name.Variable.Global */\n.highlight .vi { color: #953800 } /* Name.Variable.Instance */\n.highlight .vm { color: #953800 } /* Name.Variable.Magic */\n.highlight .il { color: #953800 } /* Literal.Number.Integer.Long */\n","/*\ngenerated by accessible-pygments \nCopyright (c) 2022, Quansight Labs\nLicensed under the BSD license, see LICENSE for details.\n--\ngenerated by Pygments \nCopyright 2006-2025 by the Pygments team.\nLicensed under the BSD license, see LICENSE for details.\n*/\n\n.highlight .hll { background-color: #6e7681 }\n.highlight { background: #0d1117; color: #E6EDF3 }\n.highlight .c { color: #8B949E; font-style: italic } /* Comment */\n.highlight .err { color: #F85149 } /* Error */\n.highlight .esc { color: #E6EDF3 } /* Escape */\n.highlight .g { color: #E6EDF3 } /* Generic */\n.highlight .k { color: #FF7B72 } /* Keyword */\n.highlight .l { color: #A5D6FF } /* Literal */\n.highlight .n { color: #E6EDF3 } /* Name */\n.highlight .o { color: #FF7B72; font-weight: bold } /* Operator */\n.highlight .x { color: #E6EDF3 } /* Other */\n.highlight .p { color: #E6EDF3 } /* Punctuation */\n.highlight .ch { color: #8B949E; font-style: italic } /* Comment.Hashbang */\n.highlight .cm { color: #8B949E; font-style: italic } /* Comment.Multiline */\n.highlight .cp { color: #8B949E; font-weight: bold; font-style: italic } /* Comment.Preproc */\n.highlight .cpf { color: #8B949E; font-style: italic } /* Comment.PreprocFile */\n.highlight .c1 { color: #8B949E; font-style: italic } /* Comment.Single */\n.highlight .cs { color: #8B949E; font-weight: bold; font-style: italic } /* Comment.Special */\n.highlight .gd { color: #FFA198; background-color: #490202 } /* Generic.Deleted */\n.highlight .ge { color: #E6EDF3; font-style: italic } /* Generic.Emph */\n.highlight .ges { color: #E6EDF3; font-weight: bold; font-style: italic } /* Generic.EmphStrong */\n.highlight .gr { color: #FFA198 } /* Generic.Error */\n.highlight .gh { color: #79C0FF; font-weight: bold } /* Generic.Heading */\n.highlight .gi { color: #56D364; background-color: #0F5323 } /* Generic.Inserted */\n.highlight .go { color: #8B949E } /* Generic.Output */\n.highlight .gp { color: #8B949E } /* Generic.Prompt */\n.highlight .gs { color: #E6EDF3; font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #79C0FF } /* Generic.Subheading */\n.highlight .gt { color: #FF7B72 } /* Generic.Traceback */\n.highlight .g-Underline { color: #E6EDF3; text-decoration: underline } /* Generic.Underline */\n.highlight .kc { color: #79C0FF } /* Keyword.Constant */\n.highlight .kd { color: #FF7B72 } /* Keyword.Declaration */\n.highlight .kn { color: #FF7B72 } /* Keyword.Namespace */\n.highlight .kp { color: #79C0FF } /* Keyword.Pseudo */\n.highlight .kr { color: #FF7B72 } /* Keyword.Reserved */\n.highlight .kt { color: #FF7B72 } /* Keyword.Type */\n.highlight .ld { color: #79C0FF } /* Literal.Date */\n.highlight .m { color: #A5D6FF } /* Literal.Number */\n.highlight .s { color: #A5D6FF } /* Literal.String */\n.highlight .na { color: #E6EDF3 } /* Name.Attribute */\n.highlight .nb { color: #E6EDF3 } /* Name.Builtin */\n.highlight .nc { color: #F0883E; font-weight: bold } /* Name.Class */\n.highlight .no { color: #79C0FF; font-weight: bold } /* Name.Constant */\n.highlight .nd { color: #D2A8FF; font-weight: bold } /* Name.Decorator */\n.highlight .ni { color: #FFA657 } /* Name.Entity */\n.highlight .ne { color: #F0883E; font-weight: bold } /* Name.Exception */\n.highlight .nf { color: #D2A8FF; font-weight: bold } /* Name.Function */\n.highlight .nl { color: #79C0FF; font-weight: bold } /* Name.Label */\n.highlight .nn { color: #FF7B72 } /* Name.Namespace */\n.highlight .nx { color: #E6EDF3 } /* Name.Other */\n.highlight .py { color: #79C0FF } /* Name.Property */\n.highlight .nt { color: #7EE787 } /* Name.Tag */\n.highlight .nv { color: #79C0FF } /* Name.Variable */\n.highlight .ow { color: #FF7B72; font-weight: bold } /* Operator.Word */\n.highlight .pm { color: #E6EDF3 } /* Punctuation.Marker */\n.highlight .w { color: #6E7681 } /* Text.Whitespace */\n.highlight .mb { color: #A5D6FF } /* Literal.Number.Bin */\n.highlight .mf { color: #A5D6FF } /* Literal.Number.Float */\n.highlight .mh { color: #A5D6FF } /* Literal.Number.Hex */\n.highlight .mi { color: #A5D6FF } /* Literal.Number.Integer */\n.highlight .mo { color: #A5D6FF } /* Literal.Number.Oct */\n.highlight .sa { color: #79C0FF } /* Literal.String.Affix */\n.highlight .sb { color: #A5D6FF } /* Literal.String.Backtick */\n.highlight .sc { color: #A5D6FF } /* Literal.String.Char */\n.highlight .dl { color: #79C0FF } /* Literal.String.Delimiter */\n.highlight .sd { color: #A5D6FF } /* Literal.String.Doc */\n.highlight .s2 { color: #A5D6FF } /* Literal.String.Double */\n.highlight .se { color: #79C0FF } /* Literal.String.Escape */\n.highlight .sh { color: #79C0FF } /* Literal.String.Heredoc */\n.highlight .si { color: #A5D6FF } /* Literal.String.Interpol */\n.highlight .sx { color: #A5D6FF } /* Literal.String.Other */\n.highlight .sr { color: #79C0FF } /* Literal.String.Regex */\n.highlight .s1 { color: #A5D6FF } /* Literal.String.Single */\n.highlight .ss { color: #A5D6FF } /* Literal.String.Symbol */\n.highlight .bp { color: #E6EDF3 } /* Name.Builtin.Pseudo */\n.highlight .fm { color: #D2A8FF; font-weight: bold } /* Name.Function.Magic */\n.highlight .vc { color: #79C0FF } /* Name.Variable.Class */\n.highlight .vg { color: #79C0FF } /* Name.Variable.Global */\n.highlight .vi { color: #79C0FF } /* Name.Variable.Instance */\n.highlight .vm { color: #79C0FF } /* Name.Variable.Magic */\n.highlight .il { color: #A5D6FF } /* Literal.Number.Integer.Long */\n","/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput {\n /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect {\n /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// Base element style overrides\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\n:root {\n color-scheme: $color-scheme;\n}\n\n* {\n box-sizing: border-box;\n}\n\nhtml {\n scroll-behavior: smooth;\n\n @include fs-4;\n}\n\nbody {\n font-family: $body-font-family;\n font-size: inherit;\n line-height: $body-line-height;\n color: $body-text-color;\n background-color: $body-background-color;\n overflow-wrap: break-word;\n}\n\nol,\nul,\ndl,\npre,\naddress,\nblockquote,\ntable,\ndiv,\nhr,\nform,\nfieldset,\nnoscript .table-wrapper {\n margin-top: 0;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n#toctitle {\n margin-top: 0;\n margin-bottom: 1em;\n font-weight: 500;\n line-height: $body-heading-line-height;\n color: $body-heading-color;\n}\n\np {\n margin-top: 1em;\n margin-bottom: 1em;\n}\n\na {\n color: $link-color;\n text-decoration: none;\n}\n\na:not([class]) {\n text-decoration: underline;\n text-decoration-color: $border-color;\n text-underline-offset: 2px;\n\n &:hover {\n text-decoration-color: rgba($link-color, 0.45);\n }\n}\n\ncode {\n font-family: $mono-font-family;\n font-size: 0.75em;\n line-height: $body-line-height;\n}\n\nfigure,\npre {\n margin: 0;\n}\n\nli {\n margin: 0.25em 0;\n}\n\nimg {\n max-width: 100%;\n height: auto;\n}\n\nhr {\n height: 1px;\n padding: 0;\n margin: $sp-6 0;\n background-color: $border-color;\n border: 0;\n}\n\n// adds a GitHub-style sidebar to blockquotes\nblockquote {\n margin: 10px 0;\n\n // resets user-agent stylesheets for blockquotes\n margin-block-start: 0;\n margin-inline-start: 0;\n padding-left: 1rem;\n border-left: 3px solid $border-color;\n}\n","$color-scheme: dark;\n$body-background-color: $grey-dk-300;\n$body-heading-color: $grey-lt-000;\n$body-text-color: $grey-lt-300;\n$link-color: lighten($blue-000, 10%);\n$nav-child-link-color: $grey-dk-000;\n$sidebar-color: $grey-dk-300;\n$base-button-color: $grey-dk-250;\n$btn-primary-color: $blue-200;\n$code-background-color: #0d1117; // github-dark bg color\n$code-linenumber-color: #e6edf3; // github-dark line number color\n$feedback-color: darken($sidebar-color, 3%);\n$table-background-color: $grey-dk-250;\n$search-background-color: $grey-dk-250;\n$search-result-preview-color: $grey-lt-300;\n$border-color: $grey-dk-200;\n\n@import \"./vendor/accessible-pygments/github-dark\";\n","@mixin fs-1 {\n & {\n font-size: $font-size-1 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-1-sm !important;\n }\n}\n\n@mixin fs-2 {\n & {\n font-size: $font-size-2 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-3 !important;\n }\n}\n\n@mixin fs-3 {\n & {\n font-size: $font-size-3 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-4 !important;\n }\n}\n\n@mixin fs-4 {\n & {\n font-size: $font-size-4 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-5 !important;\n }\n}\n\n@mixin fs-5 {\n & {\n font-size: $font-size-5 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-6 !important;\n }\n}\n\n@mixin fs-6 {\n & {\n font-size: $font-size-6 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n}\n\n@mixin fs-7 {\n & {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-8 !important;\n }\n}\n\n@mixin fs-8 {\n & {\n font-size: $font-size-8 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-9 !important;\n }\n}\n\n@mixin fs-9 {\n & {\n font-size: $font-size-9 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10 !important;\n }\n}\n\n@mixin fs-10 {\n & {\n font-size: $font-size-10 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10-sm !important;\n }\n}\n","// Media query\n\n// Media query mixin\n// Usage:\n// @include mq(md) {\n// ..medium and up styles\n// }\n@mixin mq($name) {\n // Retrieves the value from the key\n $value: map-get($media-queries, $name);\n\n // If the key exists in the map\n @if $value {\n // Prints a media query based on the value\n @media (min-width: $value) {\n @content;\n }\n } @else {\n @warn \"No value could be retrieved from `#{$media-query}`. Please make sure it is defined in `$media-queries` map.\";\n }\n}\n\n// Responsive container\n\n@mixin container {\n padding-right: $gutter-spacing-sm;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-right: $gutter-spacing;\n padding-left: $gutter-spacing;\n }\n}\n","// Typography\n\n// prettier-ignore\n$body-font-family: system-ui, -apple-system, blinkmacsystemfont, \"Segoe UI\",\n roboto, \"Helvetica Neue\", arial, sans-serif, \"Segoe UI Emoji\" !default;\n$mono-font-family: \"SFMono-Regular\", menlo, consolas, monospace !default;\n$root-font-size: 16px !default; // DEPRECATED: previously base font-size for rems\n$body-line-height: 1.4 !default;\n$content-line-height: 1.6 !default;\n$body-heading-line-height: 1.25 !default;\n\n// Font size\n// `-sm` suffix is the size at the small (and above) media query\n\n$font-size-1: 0.5625rem !default;\n$font-size-1-sm: 0.625rem !default;\n$font-size-2: 0.6875rem !default; // h4 - uppercased!, h6 not uppercased, text-small\n$font-size-3: 0.75rem !default; // h5\n$font-size-4: 0.875rem !default;\n$font-size-5: 1rem !default; // h3\n$font-size-6: 1.125rem !default; // h2\n$font-size-7: 1.5rem !default;\n$font-size-8: 2rem !default; // h1\n$font-size-9: 2.25rem !default;\n$font-size-10: 2.625rem !default;\n$font-size-10-sm: 3rem !default;\n\n// Colors\n\n$white: #fff !default;\n$grey-dk-000: #959396 !default;\n$grey-dk-100: #5c5962 !default;\n$grey-dk-200: #44434d !default;\n$grey-dk-250: #302d36 !default;\n$grey-dk-300: #27262b !default;\n$grey-lt-000: #f5f6fa !default;\n$grey-lt-100: #eeebee !default;\n$grey-lt-200: #ecebed !default;\n$grey-lt-300: #e6e1e8 !default;\n$purple-000: #7253ed !default;\n$purple-100: #5e41d0 !default;\n$purple-200: #4e26af !default;\n$purple-300: #381885 !default;\n$blue-000: #2c84fa !default;\n$blue-100: #2869e6 !default;\n$blue-200: #264caf !default;\n$blue-300: #183385 !default;\n$green-000: #41d693 !default;\n$green-100: #11b584 !default;\n$green-200: #009c7b !default;\n$green-300: #026e57 !default;\n$yellow-000: #ffeb82 !default;\n$yellow-100: #fadf50 !default;\n$yellow-200: #f7d12e !default;\n$yellow-300: #e7af06 !default;\n$red-000: #f77e7e !default;\n$red-100: #f96e65 !default;\n$red-200: #e94c4c !default;\n$red-300: #dd2e2e !default;\n\n// Spacing\n\n$spacing-unit: 1rem; // 1rem == 16px\n\n$spacers: (\n sp-0: 0,\n sp-1: $spacing-unit * 0.25,\n sp-2: $spacing-unit * 0.5,\n sp-3: $spacing-unit * 0.75,\n sp-4: $spacing-unit,\n sp-5: $spacing-unit * 1.5,\n sp-6: $spacing-unit * 2,\n sp-7: $spacing-unit * 2.5,\n sp-8: $spacing-unit * 3,\n sp-9: $spacing-unit * 3.5,\n sp-10: $spacing-unit * 4,\n) !default;\n$sp-1: map-get($spacers, sp-1) !default; // 0.25 rem == 4px\n$sp-2: map-get($spacers, sp-2) !default; // 0.5 rem == 8px\n$sp-3: map-get($spacers, sp-3) !default; // 0.75 rem == 12px\n$sp-4: map-get($spacers, sp-4) !default; // 1 rem == 16px\n$sp-5: map-get($spacers, sp-5) !default; // 1.5 rem == 24px\n$sp-6: map-get($spacers, sp-6) !default; // 2 rem == 32px\n$sp-7: map-get($spacers, sp-7) !default; // 2.5 rem == 40px\n$sp-8: map-get($spacers, sp-8) !default; // 3 rem == 48px\n$sp-9: map-get($spacers, sp-9) !default; // 3.5 rem == 56px\n$sp-10: map-get($spacers, sp-10) !default; // 4 rem == 64px\n\n// Borders\n\n$border: 1px solid !default;\n$border-radius: 4px !default;\n$border-color: $grey-lt-100 !default;\n\n// Grid system\n\n$gutter-spacing: $sp-6 !default;\n$gutter-spacing-sm: $sp-4 !default;\n$nav-width: 16.5rem !default;\n$nav-width-md: 15.5rem !default;\n$nav-list-item-height: $sp-6 !default;\n$nav-list-item-height-sm: $sp-8 !default;\n$nav-list-expander-right: true;\n$content-width: 50rem !default;\n$header-height: 3.75rem !default;\n$search-results-width: $content-width - $nav-width !default;\n$transition-duration: 400ms;\n\n// Media queries in pixels\n\n$media-queries: (\n xs: 20rem,\n sm: 31.25rem,\n md: $content-width,\n lg: $content-width + $nav-width,\n xl: 87.5rem,\n) !default;\n","// The basic two column layout\n\n.side-bar {\n z-index: 0;\n display: flex;\n flex-wrap: wrap;\n background-color: $sidebar-color;\n\n @include mq(md) {\n flex-flow: column nowrap;\n position: fixed;\n width: $nav-width-md;\n height: 100%;\n border-right: $border $border-color;\n align-items: flex-end;\n }\n\n @include mq(lg) {\n width: calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width});\n min-width: $nav-width;\n }\n\n & + .main {\n @include mq(md) {\n margin-left: $nav-width-md;\n }\n\n @include mq(lg) {\n // stylelint-disable function-name-case\n // disable for Max(), we want to use the CSS max() function\n margin-left: Max(\n #{$nav-width},\n calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width})\n );\n // stylelint-enable function-name-case\n }\n\n .main-header {\n display: none;\n background-color: $sidebar-color;\n\n @include mq(md) {\n display: flex;\n background-color: $body-background-color;\n }\n\n &.nav-open {\n display: block;\n\n @include mq(md) {\n display: flex;\n }\n }\n }\n }\n}\n\n.main {\n margin: auto;\n\n @include mq(md) {\n position: relative;\n max-width: $content-width;\n }\n}\n\n.main-content-wrap {\n padding-top: $gutter-spacing-sm;\n padding-bottom: $gutter-spacing-sm;\n\n @include container;\n\n @include mq(md) {\n padding-top: $gutter-spacing;\n padding-bottom: $gutter-spacing;\n }\n}\n\n.main-header {\n z-index: 0;\n border-bottom: $border $border-color;\n\n @include mq(md) {\n display: flex;\n justify-content: space-between;\n height: $header-height;\n }\n}\n\n.site-nav,\n.site-header,\n.site-footer {\n width: 100%;\n\n @include mq(lg) {\n width: $nav-width;\n }\n}\n\n.site-nav {\n display: none;\n\n &.nav-open {\n display: block;\n }\n\n @include mq(md) {\n display: block;\n padding-top: $sp-8;\n padding-bottom: $gutter-spacing-sm;\n overflow-y: auto;\n flex: 1 1 auto;\n }\n}\n\n.site-header {\n display: flex;\n min-height: $header-height;\n align-items: center;\n\n @include mq(md) {\n height: $header-height;\n max-height: $header-height;\n border-bottom: $border $border-color;\n }\n}\n\n.site-title {\n flex-grow: 1;\n display: flex;\n height: 100%;\n align-items: center;\n padding-top: $sp-3;\n padding-bottom: $sp-3;\n color: $body-heading-color;\n\n @include container;\n\n @include fs-6;\n\n @include mq(md) {\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n }\n}\n\n@if variable-exists(logo) {\n .site-logo {\n width: 100%;\n height: 100%;\n background-image: url($logo);\n background-repeat: no-repeat;\n background-position: left center;\n background-size: contain;\n }\n}\n\n.site-button {\n display: flex;\n height: 100%;\n padding: $gutter-spacing-sm;\n align-items: center;\n}\n\n@include mq(md) {\n .site-header .site-button {\n display: none;\n }\n}\n\n.site-title:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n}\n\n.site-button:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n}\n\n.site-footer {\n position: absolute;\n bottom: 0;\n left: 0;\n padding-top: $sp-4;\n padding-bottom: $sp-4;\n\n @include container;\n\n @include fs-2;\n\n @include mq(md) {\n position: static;\n justify-self: end;\n }\n}\n\n.icon {\n width: $sp-5;\n height: $sp-5;\n color: $link-color;\n}\n","@charset \"UTF-8\";\n\n// Styles for rendered markdown in the .main-content container\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity, selector-max-id\n\n.main-content {\n line-height: $content-line-height;\n\n ol,\n ul,\n dl,\n pre,\n address,\n blockquote,\n .table-wrapper {\n margin-top: 0.5em;\n }\n\n a {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n ul,\n ol {\n padding-left: 1.5em;\n }\n\n li {\n .highlight {\n margin-top: $sp-1;\n }\n }\n\n ol {\n list-style-type: none;\n counter-reset: step-counter;\n\n > li {\n position: relative;\n\n &::before {\n position: absolute;\n top: 0.2em;\n left: -1.6em;\n color: $grey-dk-000;\n content: counter(step-counter);\n counter-increment: step-counter;\n @include fs-3;\n\n @include mq(sm) {\n top: 0.11em;\n }\n }\n\n ol {\n counter-reset: sub-counter;\n\n > li {\n &::before {\n content: counter(sub-counter, lower-alpha);\n counter-increment: sub-counter;\n }\n }\n }\n }\n }\n\n ul {\n list-style: none;\n\n > li {\n &::before {\n position: absolute;\n margin-left: -1.4em;\n color: $grey-dk-000;\n content: \"•\";\n }\n }\n }\n\n .task-list-item {\n &::before {\n content: \"\";\n }\n }\n\n .task-list-item-checkbox {\n margin-right: 0.6em;\n margin-left: -1.4em;\n\n // The same margin-left is used above for ul > li::before\n }\n\n hr + * {\n margin-top: 0;\n }\n\n h1:first-of-type {\n margin-top: 0.5em;\n }\n\n dl {\n display: grid;\n grid-template: auto / 10em 1fr;\n }\n\n dt,\n dd {\n margin: 0.25em 0;\n }\n\n dt {\n grid-column: 1;\n font-weight: 500;\n text-align: right;\n\n &::after {\n content: \":\";\n }\n }\n\n dd {\n grid-column: 2;\n margin-bottom: 0;\n margin-left: 1em;\n\n blockquote,\n div,\n dl,\n dt,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n li,\n ol,\n p,\n pre,\n table,\n ul,\n .table-wrapper {\n &:first-child {\n margin-top: 0;\n }\n }\n }\n\n dd,\n ol,\n ul {\n dl:first-child {\n dt:first-child,\n dd:nth-child(2) {\n margin-top: 0;\n }\n }\n }\n\n .anchor-heading {\n position: absolute;\n right: -$sp-4;\n width: $sp-5;\n height: 100%;\n padding-right: $sp-1;\n padding-left: $sp-1;\n overflow: visible;\n\n @include mq(md) {\n right: auto;\n left: -$sp-5;\n }\n\n svg {\n display: inline-block;\n width: 100%;\n height: 100%;\n color: $link-color;\n visibility: hidden;\n }\n }\n\n .anchor-heading:hover,\n .anchor-heading:focus,\n h1:hover > .anchor-heading,\n h2:hover > .anchor-heading,\n h3:hover > .anchor-heading,\n h4:hover > .anchor-heading,\n h5:hover > .anchor-heading,\n h6:hover > .anchor-heading {\n svg {\n visibility: visible;\n }\n }\n\n summary {\n cursor: pointer;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n #toctitle {\n position: relative;\n margin-top: 1.5em;\n margin-bottom: 0.25em;\n\n + table,\n + .table-wrapper,\n + .code-example,\n + .highlighter-rouge,\n + .sectionbody .listingblock {\n margin-top: 1em;\n }\n\n + p:not(.label) {\n margin-top: 0;\n }\n }\n\n > h1:first-child,\n > h2:first-child,\n > h3:first-child,\n > h4:first-child,\n > h5:first-child,\n > h6:first-child,\n > .sect1:first-child > h2,\n > .sect2:first-child > h3,\n > .sect3:first-child > h4,\n > .sect4:first-child > h5,\n > .sect5:first-child > h6 {\n margin-top: $sp-2;\n }\n}\n","// Main nav, breadcrumb, etc...\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity\n\n.nav-list {\n padding: 0;\n margin-top: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n margin: 0;\n\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n\n .nav-list-link {\n display: block;\n min-height: $nav-list-item-height-sm;\n padding-top: $sp-1;\n padding-bottom: $sp-1;\n line-height: #{$nav-list-item-height-sm - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height-sm;\n padding-left: $gutter-spacing-sm;\n } @else {\n padding-right: $gutter-spacing-sm;\n padding-left: $nav-list-item-height-sm;\n }\n\n @include mq(md) {\n min-height: $nav-list-item-height;\n line-height: #{$nav-list-item-height - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height;\n padding-left: $gutter-spacing;\n } @else {\n padding-right: $gutter-spacing;\n padding-left: $nav-list-item-height;\n }\n }\n\n &.external > svg {\n width: $sp-4;\n height: $sp-4;\n vertical-align: text-bottom;\n }\n\n &.active {\n font-weight: 600;\n text-decoration: none;\n }\n\n &:hover,\n &.active {\n color: darken($link-color, 5%);\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n }\n }\n\n .nav-list-expander {\n position: absolute;\n @if $nav-list-expander-right {\n right: 0;\n }\n\n width: $nav-list-item-height-sm;\n height: $nav-list-item-height-sm;\n padding: #{$nav-list-item-height-sm * 0.25};\n color: $link-color;\n\n @include mq(md) {\n width: $nav-list-item-height;\n height: $nav-list-item-height;\n padding: #{$nav-list-item-height * 0.25};\n }\n\n &:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n }\n\n @if $nav-list-expander-right {\n svg {\n transform: rotate(90deg);\n }\n }\n }\n\n > .nav-list {\n display: none;\n padding-left: $sp-3;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n\n .nav-list-link {\n color: $nav-child-link-color;\n }\n\n .nav-list-expander {\n color: $nav-child-link-color;\n }\n }\n }\n\n &.active {\n > .nav-list-expander svg {\n @if $nav-list-expander-right {\n transform: rotate(-90deg);\n } @else {\n transform: rotate(90deg);\n }\n }\n\n > .nav-list {\n display: block;\n }\n }\n }\n}\n\n.nav-category {\n padding: $sp-2 $gutter-spacing-sm;\n font-weight: 600;\n text-align: start;\n text-transform: uppercase;\n border-bottom: $border $border-color;\n @include fs-2;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing;\n margin-top: $gutter-spacing-sm;\n text-align: start;\n\n &:first-child {\n margin-top: 0;\n }\n }\n}\n\n.nav-list.nav-category-list {\n > .nav-list-item {\n margin: 0;\n\n > .nav-list {\n padding: 0;\n\n > .nav-list-item {\n > .nav-list-link {\n color: $link-color;\n }\n\n > .nav-list-expander {\n color: $link-color;\n }\n }\n }\n }\n}\n\n// Aux nav\n\n.aux-nav {\n height: 100%;\n overflow-x: auto;\n @include fs-2;\n\n .aux-nav-list {\n display: flex;\n height: 100%;\n padding: 0;\n margin: 0;\n list-style: none;\n }\n\n .aux-nav-list-item {\n display: inline-block;\n height: 100%;\n padding: 0;\n margin: 0;\n }\n\n @include mq(md) {\n padding-right: $gutter-spacing-sm;\n }\n}\n\n// Breadcrumb nav\n\n.breadcrumb-nav {\n @include mq(md) {\n margin-top: -$sp-4;\n }\n}\n\n.breadcrumb-nav-list {\n padding-left: 0;\n margin-bottom: $sp-3;\n list-style: none;\n}\n\n.breadcrumb-nav-list-item {\n display: table-cell;\n @include fs-2;\n\n &::before {\n display: none;\n }\n\n &::after {\n display: inline-block;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $grey-dk-000;\n content: \"/\";\n }\n\n &:last-child {\n &::after {\n content: \"\";\n }\n }\n}\n","// Typography\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\nh1,\n.text-alpha {\n font-weight: 300;\n\n @include fs-8;\n}\n\nh2,\n.text-beta,\n#toctitle {\n @include fs-6;\n}\n\nh3,\n.text-gamma {\n @include fs-5;\n}\n\nh4,\n.text-delta {\n font-weight: 400;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n\n @include fs-2;\n}\n\nh4 code {\n text-transform: none;\n}\n\nh5,\n.text-epsilon {\n @include fs-3;\n}\n\nh6,\n.text-zeta {\n @include fs-2;\n}\n\n.text-small {\n @include fs-2;\n}\n\n.text-mono {\n font-family: $mono-font-family !important;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n","// Labels (not the form kind)\n\n// this :not() prevents a style clash with Mermaid.js's\n// diagram labels, which also use .label\n// for more, see https://github.com/just-the-docs/just-the-docs/issues/1272\n// and the accompanying PR\n.label:not(g),\n.label-blue:not(g) {\n display: inline-block;\n padding: 0.16em 0.56em;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $white;\n text-transform: uppercase;\n vertical-align: middle;\n background-color: $blue-100;\n border-radius: 12px;\n\n @include fs-2;\n}\n\n.label-green:not(g) {\n background-color: $green-300;\n}\n\n.label-purple:not(g) {\n background-color: $purple-100;\n}\n\n.label-red:not(g) {\n background-color: $red-300;\n}\n\n.label-yellow:not(g) {\n color: $grey-dk-200;\n background-color: $yellow-200;\n}\n","// Buttons and things that look like buttons\n// stylelint-disable color-named\n\n.btn {\n display: inline-block;\n box-sizing: border-box;\n padding: 0.3em 1em;\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n font-weight: 500;\n line-height: 1.5;\n color: $link-color;\n text-decoration: none;\n vertical-align: baseline;\n cursor: pointer;\n background-color: $base-button-color;\n border-width: 0;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n appearance: none;\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: darken($link-color, 2%);\n }\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n text-decoration: none;\n background-color: darken($base-button-color, 1%);\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($base-button-color, 3%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken(#dcdcdc, 5%);\n }\n\n &:disabled,\n &.disabled {\n &,\n &:hover {\n color: rgba(102, 102, 102, 0.5);\n cursor: default;\n background-color: rgba(229, 229, 229, 0.5);\n background-image: none;\n box-shadow: none;\n }\n }\n}\n\n.btn-outline {\n color: $link-color;\n background: transparent;\n box-shadow: inset 0 0 0 2px $grey-lt-300;\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n color: darken($link-color, 4%);\n text-decoration: none;\n background-color: transparent;\n box-shadow: inset 0 0 0 3px $grey-lt-300;\n }\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow:\n inset 0 0 0 2px $grey-dk-100,\n 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: inset 0 0 0 2px $grey-dk-100;\n }\n}\n\n.btn-primary {\n @include btn-color($white, $btn-primary-color);\n}\n\n.btn-purple {\n @include btn-color($white, $purple-100);\n}\n\n.btn-blue {\n @include btn-color($white, $blue-200);\n}\n\n.btn-green {\n @include btn-color($white, $green-300);\n}\n\n.btn-reset {\n background: none;\n border: none;\n margin: 0;\n text-align: inherit;\n font: inherit;\n border-radius: 0;\n appearance: none;\n}\n","// Colored button\n\n@mixin btn-color($fg, $bg) {\n color: $fg;\n background-color: darken($bg, 2%);\n background-image: linear-gradient(lighten($bg, 5%), darken($bg, 2%));\n box-shadow:\n 0 1px 3px rgba(0, 0, 0, 0.25),\n 0 4px 10px rgba(0, 0, 0, 0.12);\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: $fg;\n background-color: darken($bg, 4%);\n background-image: linear-gradient((lighten($bg, 2%), darken($bg, 4%)));\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($bg, 5%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken($bg, 10%);\n }\n}\n","// Search input and autocomplete\n\n.search {\n position: relative;\n z-index: 2;\n flex-grow: 1;\n height: $sp-10;\n padding: $sp-2;\n transition: padding linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: relative !important;\n width: auto !important;\n height: 100% !important;\n padding: 0;\n transition: none;\n }\n}\n\n.search-input-wrap {\n position: relative;\n z-index: 1;\n height: $sp-8;\n overflow: hidden;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n transition: height linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: absolute;\n width: 100%;\n max-width: $search-results-width;\n height: 100% !important;\n border-radius: 0;\n box-shadow: none;\n transition: width ease $transition-duration;\n }\n}\n\n.search-input {\n position: absolute;\n width: 100%;\n height: 100%;\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing-sm + $sp-5};\n font-size: 1rem;\n color: $body-text-color;\n background-color: $search-background-color;\n border-top: 0;\n border-right: 0;\n border-bottom: 0;\n border-left: 0;\n border-radius: 0;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing + $sp-5};\n font-size: 0.875rem;\n background-color: $body-background-color;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n &:focus {\n outline: 2px solid $link-color;\n outline-offset: -2px;\n\n + .search-label .search-icon {\n color: $link-color;\n }\n }\n}\n\n.search-label {\n position: absolute;\n display: flex;\n height: 100%;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-left: $gutter-spacing;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n .search-icon {\n width: #{$sp-4 * 1.2};\n height: #{$sp-4 * 1.2};\n align-self: center;\n color: $grey-dk-000;\n }\n}\n\n.search-results {\n position: absolute;\n left: 0;\n display: none;\n width: 100%;\n max-height: calc(100% - #{$sp-10});\n overflow-y: auto;\n background-color: $search-background-color;\n border-bottom-right-radius: $border-radius;\n border-bottom-left-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n\n @include mq(md) {\n top: 100%;\n width: $search-results-width;\n max-height: calc(100vh - 200%) !important;\n }\n}\n\n.search-results-list {\n padding-left: 0;\n margin-bottom: $sp-1;\n list-style: none;\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n}\n\n.search-results-list-item {\n padding: 0;\n margin: 0;\n}\n\n.search-result {\n display: block;\n padding: $sp-1 $sp-3;\n\n &:hover,\n &.active {\n background-color: $feedback-color;\n }\n}\n\n.search-result-title {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 40%;\n padding-right: $sp-2;\n vertical-align: top;\n }\n}\n\n.search-result-doc {\n display: flex;\n align-items: center;\n word-wrap: break-word;\n\n &.search-result-doc-parent {\n opacity: 0.5;\n @include fs-3;\n\n @include mq(md) {\n @include fs-2;\n }\n }\n\n .search-result-icon {\n width: $sp-4;\n height: $sp-4;\n margin-right: $sp-2;\n color: $link-color;\n flex-shrink: 0;\n }\n\n .search-result-doc-title {\n overflow: auto;\n }\n}\n\n.search-result-section {\n margin-left: #{$sp-4 + $sp-2};\n word-wrap: break-word;\n}\n\n.search-result-rel-url {\n display: block;\n margin-left: #{$sp-4 + $sp-2};\n overflow: hidden;\n color: $search-result-preview-color;\n text-overflow: ellipsis;\n white-space: nowrap;\n @include fs-1;\n}\n\n.search-result-previews {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n padding-left: $sp-4;\n margin-left: $sp-2;\n color: $search-result-preview-color;\n word-wrap: break-word;\n border-left: $border;\n border-left-color: $border-color;\n @include fs-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 60%;\n padding-left: $sp-2;\n margin-left: 0;\n vertical-align: top;\n }\n}\n\n.search-result-preview + .search-result-preview {\n margin-top: $sp-1;\n}\n\n.search-result-highlight {\n font-weight: bold;\n}\n\n.search-no-result {\n padding: $sp-2 $sp-3;\n @include fs-3;\n}\n\n.search-button {\n position: fixed;\n right: $sp-4;\n bottom: $sp-4;\n display: flex;\n width: $sp-9;\n height: $sp-9;\n background-color: $search-background-color;\n border: 1px solid rgba($link-color, 0.3);\n border-radius: #{$sp-9 * 0.5};\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n align-items: center;\n justify-content: center;\n}\n\n.search-overlay {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1;\n width: 0;\n height: 0;\n background-color: rgba(0, 0, 0, 0.3);\n opacity: 0;\n transition:\n opacity ease $transition-duration,\n width 0s $transition-duration,\n height 0s $transition-duration;\n}\n\n.search-active {\n .search {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .search-input-wrap {\n height: $sp-10;\n border-radius: 0;\n\n @include mq(md) {\n width: $search-results-width;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n }\n }\n\n .search-input {\n background-color: $search-background-color;\n\n @include mq(md) {\n padding-left: 2.3rem;\n }\n }\n\n .search-label {\n @include mq(md) {\n padding-left: 0.6rem;\n }\n }\n\n .search-results {\n display: block;\n }\n\n .search-overlay {\n width: 100%;\n height: 100%;\n opacity: 1;\n transition:\n opacity ease $transition-duration,\n width 0s,\n height 0s;\n }\n\n @include mq(md) {\n .main {\n position: fixed;\n right: 0;\n left: 0;\n }\n }\n\n .main-header {\n padding-top: $sp-10;\n\n @include mq(md) {\n padding-top: 0;\n }\n }\n}\n","// Tables\n// stylelint-disable max-nesting-depth, selector-no-type, selector-max-type\n\n.table-wrapper {\n display: block;\n width: 100%;\n max-width: 100%;\n margin-bottom: $sp-5;\n overflow-x: auto;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n}\n\ntable {\n display: table;\n min-width: 100%;\n border-collapse: separate;\n}\n\nth,\ntd {\n min-width: 7.5rem;\n padding: $sp-2 $sp-3;\n background-color: $table-background-color;\n border-bottom: $border rgba($border-color, 0.5);\n border-left: $border $border-color;\n\n @include fs-3;\n\n &:first-of-type {\n border-left: 0;\n }\n}\n\ntbody {\n tr {\n &:last-of-type {\n th,\n td {\n border-bottom: 0;\n }\n\n td {\n padding-bottom: $sp-3;\n }\n }\n }\n}\n\nthead {\n th {\n border-bottom: $border $border-color;\n }\n}\n","// Code and syntax highlighting\n// stylelint-disable selector-no-qualifying-type, declaration-block-semicolon-newline-after,declaration-block-single-line-max-declarations, selector-no-type, selector-max-type, scss/comment-no-empty\n\n// {% raw %}\n\n// This instruction applies to all queues not within 'pre' or 'figure', avoiding 'code' generated by the highlight.\n:not(pre, figure) {\n & > code {\n padding: 0.2em 0.15em;\n font-weight: 400;\n background-color: $code-background-color;\n border: $border $border-color;\n border-radius: $border-radius;\n }\n}\n\n// Avoid appearance of dark border around visited code links in Safari\na:visited code {\n border-color: $border-color;\n}\n\n// Content structure for highlighted code blocks using fences or Liquid\n//\n// ```[LANG]...```, no kramdown line_numbers:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n//\n// ```[LANG]...```, kramdown line_numbers = true:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.rouge-gutter.gl > pre.lineno\n// | td.rouge-code > pre\n//\n// {% highlight LANG %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n//\n// {% highlight LANG linenos %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.gutter.gl > pre.lineno\n// | td.code > pre\n//\n// ----...---- (AsciiDoc)\n// div.listingblock > div.content > pre.rouge.highlight\n//\n// fix_linenos removes the outermost pre when it encloses table.rouge-table\n//\n// See docs/index-test.md for some tests.\n//\n// No kramdown line_numbers: fences and Liquid highlighting look the same.\n// Kramdown line_numbers = true: fences have a wider gutter than with Liquid?\n\n// ```[LANG]...```\n// or in AsciiDoc:\n//\n// ----\n// ...\n// ----\n\n// the code may appear with 3 different types:\n// container \\ case: default case, code with line number, code with html rendering\n// top level: div.highlighter-rouge, figure.highlight, figure.highlight\n// second level: div.highlight, div.table-wrapper, pre.highlight\n// third level: pre.highlight, td.code, absent\n// last level: code, pre, code (optionality)\n// highlighter level: span, span, span\n// the spacing are only in the second level for case 1, 3 and in the third level for case 2\n// in AsciiDoc, there is a parent container that contains optionally a title and the content.\n\n// select top level container\ndiv.highlighter-rouge,\ndiv.listingblock > div.content,\nfigure.highlight {\n margin-top: 0;\n margin-bottom: $sp-3;\n background-color: $code-background-color;\n border-radius: $border-radius;\n box-shadow: none;\n -webkit-overflow-scrolling: touch;\n position: relative;\n padding: 0;\n\n // copy button (or other button)\n // the button appear only when there is a hover on the code or focus on button\n > button {\n width: $sp-3;\n opacity: 0;\n position: absolute;\n top: 0;\n right: 0;\n padding: $sp-3;\n border: none;\n background: none;\n color: $body-text-color;\n box-sizing: content-box;\n\n svg {\n fill: $body-text-color;\n }\n\n &:active {\n text-decoration: none;\n outline: none;\n opacity: 1;\n }\n\n &:focus {\n opacity: 1;\n outline: 2px solid $link-color;\n }\n }\n\n // the button can be seen by doing a simple hover in the code, there is no need to go over the location of the button\n &:hover {\n > button {\n cursor: copy;\n opacity: 1;\n }\n }\n}\n\n// setting the spacing and scrollbar on the second level for the first case\n// remove all space on the second and third level\n// this is a mixin to accommodate for the slightly different structures generated via Markdown vs AsciiDoc\n@mixin scroll-and-spacing($code-div, $pre-select) {\n #{$code-div} {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n\n #{$pre-select},\n code {\n padding: 0;\n margin: 0;\n border: 0;\n }\n}\n\n// for Markdown\ndiv.highlighter-rouge {\n @include scroll-and-spacing(\"div.highlight\", \"pre.highlight\");\n}\n\n// for AsciiDoc. we also need to fix the margins for its parent container.\ndiv.listingblock {\n margin-top: 0;\n margin-bottom: $sp-3;\n\n @include scroll-and-spacing(\"div.content\", \"div.content > pre\");\n}\n\n// {% highlight LANG %}...{% endhighlight %},\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the second level for the thirt case\n// the css rule are apply only to the last code enviroment\n// setting the scroolbar\nfigure.highlight {\n pre,\n :not(pre) > code {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n}\n\n// ```[LANG]...```, kramdown line_numbers = true,\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the thirt level for the second case\n.highlight .table-wrapper {\n padding: $sp-3 0;\n margin: 0;\n border: 0;\n box-shadow: none;\n\n td,\n pre {\n min-width: 0;\n padding: 0;\n background-color: $code-background-color;\n border: 0;\n\n @include fs-2;\n }\n\n td.gl {\n width: 1em;\n padding-right: $sp-3;\n padding-left: $sp-3;\n }\n\n pre {\n margin: 0;\n line-height: 2;\n }\n}\n\n// Code examples: html render of a code\n.code-example,\n.listingblock > .title {\n padding: $sp-3;\n margin-bottom: $sp-3;\n overflow: auto;\n border: 1px solid $border-color;\n border-radius: $border-radius;\n\n + .highlighter-rouge,\n + .sectionbody .listingblock,\n + .content,\n + figure.highlight {\n position: relative;\n margin-top: -$sp-4;\n border-right: 1px solid $border-color;\n border-bottom: 1px solid $border-color;\n border-left: 1px solid $border-color;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n}\n\n// Mermaid diagram code blocks should be left unstyled.\ncode.language-mermaid {\n padding: 0;\n background-color: inherit;\n border: 0;\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight,\npre.highlight {\n background: $code-background-color; // Code Background\n // For Backwards Compatibility Before $code-linenumber-color was added\n @if variable-exists(code-linenumber-color) {\n color: $code-linenumber-color; // Code Line Numbers\n } @else {\n color: $body-text-color; // Code Line Numbers\n }\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight pre {\n background: $code-background-color; // Code Background\n}\n\n// {% endraw %}\n","// Utility classes for colors\n\n// Text colors\n\n.text-grey-dk-000 {\n color: $grey-dk-000 !important;\n}\n\n.text-grey-dk-100 {\n color: $grey-dk-100 !important;\n}\n\n.text-grey-dk-200 {\n color: $grey-dk-200 !important;\n}\n\n.text-grey-dk-250 {\n color: $grey-dk-250 !important;\n}\n\n.text-grey-dk-300 {\n color: $grey-dk-300 !important;\n}\n\n.text-grey-lt-000 {\n color: $grey-lt-000 !important;\n}\n\n.text-grey-lt-100 {\n color: $grey-lt-100 !important;\n}\n\n.text-grey-lt-200 {\n color: $grey-lt-200 !important;\n}\n\n.text-grey-lt-300 {\n color: $grey-lt-300 !important;\n}\n\n.text-blue-000 {\n color: $blue-000 !important;\n}\n\n.text-blue-100 {\n color: $blue-100 !important;\n}\n\n.text-blue-200 {\n color: $blue-200 !important;\n}\n\n.text-blue-300 {\n color: $blue-300 !important;\n}\n\n.text-green-000 {\n color: $green-000 !important;\n}\n\n.text-green-100 {\n color: $green-100 !important;\n}\n\n.text-green-200 {\n color: $green-200 !important;\n}\n\n.text-green-300 {\n color: $green-300 !important;\n}\n\n.text-purple-000 {\n color: $purple-000 !important;\n}\n\n.text-purple-100 {\n color: $purple-100 !important;\n}\n\n.text-purple-200 {\n color: $purple-200 !important;\n}\n\n.text-purple-300 {\n color: $purple-300 !important;\n}\n\n.text-yellow-000 {\n color: $yellow-000 !important;\n}\n\n.text-yellow-100 {\n color: $yellow-100 !important;\n}\n\n.text-yellow-200 {\n color: $yellow-200 !important;\n}\n\n.text-yellow-300 {\n color: $yellow-300 !important;\n}\n\n.text-red-000 {\n color: $red-000 !important;\n}\n\n.text-red-100 {\n color: $red-100 !important;\n}\n\n.text-red-200 {\n color: $red-200 !important;\n}\n\n.text-red-300 {\n color: $red-300 !important;\n}\n\n// Background colors\n\n.bg-grey-dk-000 {\n background-color: $grey-dk-000 !important;\n}\n\n.bg-grey-dk-100 {\n background-color: $grey-dk-100 !important;\n}\n\n.bg-grey-dk-200 {\n background-color: $grey-dk-200 !important;\n}\n\n.bg-grey-dk-250 {\n background-color: $grey-dk-250 !important;\n}\n\n.bg-grey-dk-300 {\n background-color: $grey-dk-300 !important;\n}\n\n.bg-grey-lt-000 {\n background-color: $grey-lt-000 !important;\n}\n\n.bg-grey-lt-100 {\n background-color: $grey-lt-100 !important;\n}\n\n.bg-grey-lt-200 {\n background-color: $grey-lt-200 !important;\n}\n\n.bg-grey-lt-300 {\n background-color: $grey-lt-300 !important;\n}\n\n.bg-blue-000 {\n background-color: $blue-000 !important;\n}\n\n.bg-blue-100 {\n background-color: $blue-100 !important;\n}\n\n.bg-blue-200 {\n background-color: $blue-200 !important;\n}\n\n.bg-blue-300 {\n background-color: $blue-300 !important;\n}\n\n.bg-green-000 {\n background-color: $green-000 !important;\n}\n\n.bg-green-100 {\n background-color: $green-100 !important;\n}\n\n.bg-green-200 {\n background-color: $green-200 !important;\n}\n\n.bg-green-300 {\n background-color: $green-300 !important;\n}\n\n.bg-purple-000 {\n background-color: $purple-000 !important;\n}\n\n.bg-purple-100 {\n background-color: $purple-100 !important;\n}\n\n.bg-purple-200 {\n background-color: $purple-200 !important;\n}\n\n.bg-purple-300 {\n background-color: $purple-300 !important;\n}\n\n.bg-yellow-000 {\n background-color: $yellow-000 !important;\n}\n\n.bg-yellow-100 {\n background-color: $yellow-100 !important;\n}\n\n.bg-yellow-200 {\n background-color: $yellow-200 !important;\n}\n\n.bg-yellow-300 {\n background-color: $yellow-300 !important;\n}\n\n.bg-red-000 {\n background-color: $red-000 !important;\n}\n\n.bg-red-100 {\n background-color: $red-100 !important;\n}\n\n.bg-red-200 {\n background-color: $red-200 !important;\n}\n\n.bg-red-300 {\n background-color: $red-300 !important;\n}\n","// Utility classes for layout\n\n// Display\n\n.d-block {\n display: block !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n// Screenreader-only\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .d-sm-block, .d-md-none, .d-lg-inline\n .d-#{$media-query}-block {\n display: block !important;\n }\n .d-#{$media-query}-flex {\n display: flex !important;\n }\n .d-#{$media-query}-inline {\n display: inline !important;\n }\n .d-#{$media-query}-inline-block {\n display: inline-block !important;\n }\n .d-#{$media-query}-none {\n display: none !important;\n }\n }\n }\n}\n\n// Horizontal alignment\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.flex-justify-start {\n justify-content: flex-start !important;\n}\n\n.flex-justify-end {\n justify-content: flex-end !important;\n}\n\n.flex-justify-between {\n justify-content: space-between !important;\n}\n\n.flex-justify-around {\n justify-content: space-around !important;\n}\n\n// Vertical alignment\n\n.v-align-baseline {\n vertical-align: baseline !important;\n}\n\n.v-align-bottom {\n vertical-align: bottom !important;\n}\n\n.v-align-middle {\n vertical-align: middle !important;\n}\n\n.v-align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.v-align-text-top {\n vertical-align: text-top !important;\n}\n\n.v-align-top {\n vertical-align: top !important;\n}\n","// Utility classes for typography\n\n.fs-1 {\n @include fs-1;\n}\n\n.fs-2 {\n @include fs-2;\n}\n\n.fs-3 {\n @include fs-3;\n}\n\n.fs-4 {\n @include fs-4;\n}\n\n.fs-5 {\n @include fs-5;\n}\n\n.fs-6 {\n @include fs-6;\n}\n\n.fs-7 {\n @include fs-7;\n}\n\n.fs-8 {\n @include fs-8;\n}\n\n.fs-9 {\n @include fs-9;\n}\n\n.fs-10 {\n @include fs-10;\n}\n\n.fw-300 {\n font-weight: 300 !important;\n}\n\n.fw-400 {\n font-weight: 400 !important;\n}\n\n.fw-500 {\n font-weight: 500 !important;\n}\n\n.fw-700 {\n font-weight: 700 !important;\n}\n\n.lh-0 {\n line-height: 0 !important;\n}\n\n.lh-default {\n line-height: $body-line-height;\n}\n\n.lh-tight {\n line-height: $body-heading-line-height;\n}\n\n.ls-5 {\n letter-spacing: 0.05em !important;\n}\n\n.ls-10 {\n letter-spacing: 0.1em !important;\n}\n\n.ls-0 {\n letter-spacing: 0 !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n","// Utility classes for lists\n\n// stylelint-disable selector-max-type\n\n.list-style-none {\n padding: 0 !important;\n margin: 0 !important;\n list-style: none !important;\n\n li {\n &::before {\n display: none !important;\n }\n }\n}\n","// Utility classes for margins and padding\n\n// stylelint-disable block-opening-brace-space-after, block-opening-brace-space-before\n\n// Margin spacer utilities\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-0, .m-1, .m-2...\n .m-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n .mx-#{$scale}-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-sm-0, .m-md-1, .m-lg-2...\n .m-#{$media-query}-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$media-query}-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$media-query}-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$media-query}-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n }\n }\n}\n\n// Padding spacer utilities\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-0, .p-1, .p-2...\n .p-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @include mq($media-query) {\n @for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-sm-0, .p-md-1, .p-lg-2...\n .p-#{$media-query}-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$media-query}-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$media-query}-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n }\n }\n}\n","// stylelint-disable selector-max-specificity, selector-max-id, selector-max-type, selector-no-qualifying-type\n\n@media print {\n .site-footer,\n .site-button,\n #edit-this-page,\n #back-to-top,\n .site-nav,\n .main-header {\n display: none !important;\n }\n\n hr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n }\n\n .side-bar {\n width: 100%;\n height: auto;\n border-right: 0 !important;\n }\n\n .site-header {\n border-bottom: 1px solid $border-color;\n }\n\n .site-title {\n font-size: 1rem !important;\n font-weight: 700 !important;\n }\n\n .text-small {\n font-size: 8pt !important;\n }\n\n pre.highlight {\n border: 1px solid $border-color;\n }\n\n .main {\n max-width: none;\n margin-left: 0;\n }\n}\n","// Skipnav\n// Skip to main content\n\na.skip-to-main {\n left: -999px;\n position: absolute;\n top: auto;\n width: 1px;\n height: 1px;\n overflow: hidden;\n z-index: -999;\n}\n\na.skip-to-main:focus,\na.skip-to-main:active {\n color: $link-color;\n background-color: $body-background-color;\n left: auto;\n top: auto;\n width: 30%;\n height: auto;\n overflow: auto;\n margin: 10px 35%;\n padding: 5px;\n border-radius: 15px;\n border: 4px solid $btn-primary-color;\n text-align: center;\n font-size: 1.2em;\n z-index: 999;\n}\n","\n@import \"./support/support\";\n@import \"./custom/setup\";\n@import \"./color_schemes/light\";\n\n@import \"./color_schemes/dark\";\n\n@import \"./modules\";\ndiv.opaque {\n background-color: $body-background-color;\n}\n\np.tip, blockquote.tip {\n border: 1px $green-300 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $green-300;\n content: \"Tip\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .tip-title {\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.tip-title, blockquote.tip-title {\n border: 1px $green-300 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.tip {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.tip-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.note, blockquote.note {\n border: 1px $blue-300 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $blue-300;\n content: \"Note\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .note-title {\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.note-title, blockquote.note-title {\n border: 1px $blue-300 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.note {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.note-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.warning, blockquote.warning {\n border: 1px $yellow-300 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $yellow-300;\n content: \"Warning\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .warning-title {\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.warning-title, blockquote.warning-title {\n border: 1px $yellow-300 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.warning {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.warning-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n@import \"./custom/custom\";\n\n\n"],"file":"just-the-docs-dark.css"}
\ No newline at end of file
diff --git a/main/assets/css/just-the-docs-default.css.map b/main/assets/css/just-the-docs-default.css.map
index 9a070b1c2a..4c32b309c9 100644
--- a/main/assets/css/just-the-docs-default.css.map
+++ b/main/assets/css/just-the-docs-default.css.map
@@ -1 +1 @@
-{"version":3,"sourceRoot":"","sources":["../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/vendor/accessible-pygments/github-light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/vendor/normalize.scss/normalize.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/base.scss","../../_sass/color_schemes/meshtastic.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/support/mixins/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/support/mixins/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/support/_variables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/content.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/navigation.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/labels.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/color_schemes/light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/support/mixins/_buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/search.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/tables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/code.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/utilities/_colors.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/utilities/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/utilities/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/utilities/_lists.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/utilities/_spacing.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/print.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/skiptomain.scss","just-the-docs-default.scss"],"names":[],"mappings":"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AGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvOF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AdrBE;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAQR;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AfhHA;EACE;;ACYA;EeZJ;IhBII;;;;AAKF;EACE;;ACEA;EeRJ;IhBUI;;;;AAKF;EACE;;ACRA;EeJJ;IhBgBI;;;;AAKF;EACE;;AClBA;EeAJ;IhBsBI;;;;AAKF;EACE;;AC5BA;EeIJ;IhB4BI;;;;AAKF;EACE;;ACtCA;EeQJ;IhBkCI;IACA,aEhDuB;;;;AFqDzB;EACE;EACA,aEvDuB;;ADKvB;EeYJ;IhB0CI;;;;AAKF;EACE;EACA,aElEuB;;ADKvB;EegBJ;IhBiDI;;;;AAKF;EACE;EACA,aE7EuB;;ADKvB;EeoBJ;IhBwDI;;;;AAKF;EACE;EACA,aExFuB;;ADKvB;EewBJ;IhB+DI;;;;AgB3DJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,adxDiB;;;Ac2DnB;EACE,ad1DyB;;;Ac6D3B;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC/EF;EACE;EACA;EACA;;AAGE;EACE;;;ACLN;EACE;EACA;;;AAQA;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AjBlCA;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAaN;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AjB7GA;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AC3JR;EACE;AAAA;AAAA;AAAA;AAAA;AAAA;IAME;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;;;ACvCJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE,OrBCW;EqBAX,kBrBNsB;EqBOtB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACnBF;EACE;;;AAGF;EACI;EACA;EACA,enB2EY;EmB1EZ;EACA;;AAEA;EACI,OnB6BI;EmB5BJ;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OnBmBM;EmBlBN;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,enBgDY;EmB/CZ;EACA;;AACA;EACE;EACA;EACA,OnBCM;EmBAN;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,enBEY;EmBDZ;EACA;;AAEA;EACI,OnBhDG;EmBiDH;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OnB1DK;EmB2DL;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,enBzBY;EmB0BZ;EACA;;AACA;EACE;EACA;EACA,OnB5EK;EmB6EL;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,enBvEY;EmBwEZ;EACA;;AAEA;EACI,OnBjHK;EmBkHL;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OnB3HO;EmB4HP;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,enBlGY;EmBmGZ;EACA;;AACA;EACE;EACA;EACA,OnB7IO;EmB8IP;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE","sourcesContent":["/*\ngenerated by accessible-pygments \nCopyright (c) 2022, Quansight Labs\nLicensed under the BSD license, see LICENSE for details.\n--\ngenerated by Pygments \nCopyright 2006-2025 by the Pygments team.\nLicensed under the BSD license, see LICENSE for details.\n*/\n\n.highlight .hll { background-color: #0969da4a }\n.highlight .c { color: #6E7781 } /* Comment */\n.highlight .err { color: #CF222E } /* Error */\n.highlight .k { color: #CF222E } /* Keyword */\n.highlight .l { color: #953800 } /* Literal */\n.highlight .n { color: #8250DF } /* Name */\n.highlight .o { color: #116329 } /* Operator */\n.highlight .p { color: #24292F } /* Punctuation */\n.highlight .ch { color: #6E7781 } /* Comment.Hashbang */\n.highlight .cm { color: #6E7781 } /* Comment.Multiline */\n.highlight .cp { color: #6E7781 } /* Comment.Preproc */\n.highlight .cpf { color: #6E7781 } /* Comment.PreprocFile */\n.highlight .c1 { color: #6E7781 } /* Comment.Single */\n.highlight .cs { color: #6E7781 } /* Comment.Special */\n.highlight .gd { color: #0550AE } /* Generic.Deleted */\n.highlight .ge { font-style: italic } /* Generic.Emph */\n.highlight .gr { color: #CF222E } /* Generic.Error */\n.highlight .gh { color: #0550AE } /* Generic.Heading */\n.highlight .gs { font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #0550AE } /* Generic.Subheading */\n.highlight .kc { color: #0550AE } /* Keyword.Constant */\n.highlight .kd { color: #CF222E } /* Keyword.Declaration */\n.highlight .kn { color: #CF222E } /* Keyword.Namespace */\n.highlight .kp { color: #CF222E } /* Keyword.Pseudo */\n.highlight .kr { color: #CF222E } /* Keyword.Reserved */\n.highlight .kt { color: #CF222E } /* Keyword.Type */\n.highlight .ld { color: #953800 } /* Literal.Date */\n.highlight .m { color: #953800 } /* Literal.Number */\n.highlight .s { color: #0550AE } /* Literal.String */\n.highlight .na { color: #953800 } /* Name.Attribute */\n.highlight .nb { color: #953800 } /* Name.Builtin */\n.highlight .nc { color: #0550AE } /* Name.Class */\n.highlight .no { color: #0550AE } /* Name.Constant */\n.highlight .nd { color: #953800 } /* Name.Decorator */\n.highlight .ni { color: #116329 } /* Name.Entity */\n.highlight .ne { color: #8250DF } /* Name.Exception */\n.highlight .nf { color: #0550AE } /* Name.Function */\n.highlight .nl { color: #953800 } /* Name.Label */\n.highlight .nn { color: #24292F } /* Name.Namespace */\n.highlight .nx { color: #8250DF } /* Name.Other */\n.highlight .py { color: #0550AE } /* Name.Property */\n.highlight .nt { color: #116329 } /* Name.Tag */\n.highlight .nv { color: #953800 } /* Name.Variable */\n.highlight .ow { color: #8250DF } /* Operator.Word */\n.highlight .pm { color: #24292F } /* Punctuation.Marker */\n.highlight .w { color: #24292F } /* Text.Whitespace */\n.highlight .mb { color: #953800 } /* Literal.Number.Bin */\n.highlight .mf { color: #953800 } /* Literal.Number.Float */\n.highlight .mh { color: #953800 } /* Literal.Number.Hex */\n.highlight .mi { color: #953800 } /* Literal.Number.Integer */\n.highlight .mo { color: #953800 } /* Literal.Number.Oct */\n.highlight .sa { color: #0550AE } /* Literal.String.Affix */\n.highlight .sb { color: #0550AE } /* Literal.String.Backtick */\n.highlight .sc { color: #0550AE } /* Literal.String.Char */\n.highlight .dl { color: #0550AE } /* Literal.String.Delimiter */\n.highlight .sd { color: #0550AE } /* Literal.String.Doc */\n.highlight .s2 { color: #0550AE } /* Literal.String.Double */\n.highlight .se { color: #0550AE } /* Literal.String.Escape */\n.highlight .sh { color: #0550AE } /* Literal.String.Heredoc */\n.highlight .si { color: #0550AE } /* Literal.String.Interpol */\n.highlight .sx { color: #0550AE } /* Literal.String.Other */\n.highlight .sr { color: #0550AE } /* Literal.String.Regex */\n.highlight .s1 { color: #0550AE } /* Literal.String.Single */\n.highlight .ss { color: #0550AE } /* Literal.String.Symbol */\n.highlight .bp { color: #953800 } /* Name.Builtin.Pseudo */\n.highlight .fm { color: #0550AE } /* Name.Function.Magic */\n.highlight .vc { color: #953800 } /* Name.Variable.Class */\n.highlight .vg { color: #953800 } /* Name.Variable.Global */\n.highlight .vi { color: #953800 } /* Name.Variable.Instance */\n.highlight .vm { color: #953800 } /* Name.Variable.Magic */\n.highlight .il { color: #953800 } /* Literal.Number.Integer.Long */\n","/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput {\n /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect {\n /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// Base element style overrides\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\n:root {\n color-scheme: $color-scheme;\n}\n\n* {\n box-sizing: border-box;\n}\n\nhtml {\n scroll-behavior: smooth;\n\n @include fs-4;\n}\n\nbody {\n font-family: $body-font-family;\n font-size: inherit;\n line-height: $body-line-height;\n color: $body-text-color;\n background-color: $body-background-color;\n overflow-wrap: break-word;\n}\n\nol,\nul,\ndl,\npre,\naddress,\nblockquote,\ntable,\ndiv,\nhr,\nform,\nfieldset,\nnoscript .table-wrapper {\n margin-top: 0;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n#toctitle {\n margin-top: 0;\n margin-bottom: 1em;\n font-weight: 500;\n line-height: $body-heading-line-height;\n color: $body-heading-color;\n}\n\np {\n margin-top: 1em;\n margin-bottom: 1em;\n}\n\na {\n color: $link-color;\n text-decoration: none;\n}\n\na:not([class]) {\n text-decoration: underline;\n text-decoration-color: $border-color;\n text-underline-offset: 2px;\n\n &:hover {\n text-decoration-color: rgba($link-color, 0.45);\n }\n}\n\ncode {\n font-family: $mono-font-family;\n font-size: 0.75em;\n line-height: $body-line-height;\n}\n\nfigure,\npre {\n margin: 0;\n}\n\nli {\n margin: 0.25em 0;\n}\n\nimg {\n max-width: 100%;\n height: auto;\n}\n\nhr {\n height: 1px;\n padding: 0;\n margin: $sp-6 0;\n background-color: $border-color;\n border: 0;\n}\n\n// adds a GitHub-style sidebar to blockquotes\nblockquote {\n margin: 10px 0;\n\n // resets user-agent stylesheets for blockquotes\n margin-block-start: 0;\n margin-inline-start: 0;\n padding-left: 1rem;\n border-left: 3px solid $border-color;\n}\n","// Meshtastic Material 3 — Light color scheme for just-the-docs\n// Source: core/ui/.../Color.kt §8.2 (Light Scheme)\n//\n// Brand colors:\n// Primary (Light): #2D8F52 (Green 700)\n// Surface (Light): #F5F6FA (Neutral 50)\n\n$color-scheme: light;\n\n// Body / page background\n$body-background-color: #F5F6FA; // Neutral 50 — surfaceLight\n$sidebar-color: #ECEDF3; // Neutral 100 — surfaceContainerLight\n$body-text-color: #2C2D3C; // Neutral 800 — onSurfaceLight\n$body-heading-color: #2C2D3C; // Neutral 800\n\n// Links\n$link-color: #2D8F52; // Green 700 — primaryLight\n$nav-link-color: #2D8F52; // Green 700\n\n// Navigation\n$nav-child-link-color: #555668; // Neutral 600 — secondaryLight\n$search-result-preview-color: #555668;\n\n// Code\n$code-background-color: #ECEDF3; // Neutral 100\n$code-linenumber-color: #9496A6; // Neutral 400\n\n// Borders\n$border-color: #D5D6E0; // Neutral 200 — outlineVariantLight\n$table-background-color: #F5F6FA; // Neutral 50\n\n// Buttons\n$btn-primary-color: #2D8F52; // Green 700\n\n// Feedback / callouts\n$feedback-color: #E0E1EB; // surfaceContainerHighLight\n\n// Search\n$search-background-color: #FFFFFF; // surfaceContainerLowestLight\n","@mixin fs-1 {\n & {\n font-size: $font-size-1 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-1-sm !important;\n }\n}\n\n@mixin fs-2 {\n & {\n font-size: $font-size-2 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-3 !important;\n }\n}\n\n@mixin fs-3 {\n & {\n font-size: $font-size-3 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-4 !important;\n }\n}\n\n@mixin fs-4 {\n & {\n font-size: $font-size-4 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-5 !important;\n }\n}\n\n@mixin fs-5 {\n & {\n font-size: $font-size-5 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-6 !important;\n }\n}\n\n@mixin fs-6 {\n & {\n font-size: $font-size-6 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n}\n\n@mixin fs-7 {\n & {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-8 !important;\n }\n}\n\n@mixin fs-8 {\n & {\n font-size: $font-size-8 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-9 !important;\n }\n}\n\n@mixin fs-9 {\n & {\n font-size: $font-size-9 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10 !important;\n }\n}\n\n@mixin fs-10 {\n & {\n font-size: $font-size-10 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10-sm !important;\n }\n}\n","// Media query\n\n// Media query mixin\n// Usage:\n// @include mq(md) {\n// ..medium and up styles\n// }\n@mixin mq($name) {\n // Retrieves the value from the key\n $value: map-get($media-queries, $name);\n\n // If the key exists in the map\n @if $value {\n // Prints a media query based on the value\n @media (min-width: $value) {\n @content;\n }\n } @else {\n @warn \"No value could be retrieved from `#{$media-query}`. Please make sure it is defined in `$media-queries` map.\";\n }\n}\n\n// Responsive container\n\n@mixin container {\n padding-right: $gutter-spacing-sm;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-right: $gutter-spacing;\n padding-left: $gutter-spacing;\n }\n}\n","// Typography\n\n// prettier-ignore\n$body-font-family: system-ui, -apple-system, blinkmacsystemfont, \"Segoe UI\",\n roboto, \"Helvetica Neue\", arial, sans-serif, \"Segoe UI Emoji\" !default;\n$mono-font-family: \"SFMono-Regular\", menlo, consolas, monospace !default;\n$root-font-size: 16px !default; // DEPRECATED: previously base font-size for rems\n$body-line-height: 1.4 !default;\n$content-line-height: 1.6 !default;\n$body-heading-line-height: 1.25 !default;\n\n// Font size\n// `-sm` suffix is the size at the small (and above) media query\n\n$font-size-1: 0.5625rem !default;\n$font-size-1-sm: 0.625rem !default;\n$font-size-2: 0.6875rem !default; // h4 - uppercased!, h6 not uppercased, text-small\n$font-size-3: 0.75rem !default; // h5\n$font-size-4: 0.875rem !default;\n$font-size-5: 1rem !default; // h3\n$font-size-6: 1.125rem !default; // h2\n$font-size-7: 1.5rem !default;\n$font-size-8: 2rem !default; // h1\n$font-size-9: 2.25rem !default;\n$font-size-10: 2.625rem !default;\n$font-size-10-sm: 3rem !default;\n\n// Colors\n\n$white: #fff !default;\n$grey-dk-000: #959396 !default;\n$grey-dk-100: #5c5962 !default;\n$grey-dk-200: #44434d !default;\n$grey-dk-250: #302d36 !default;\n$grey-dk-300: #27262b !default;\n$grey-lt-000: #f5f6fa !default;\n$grey-lt-100: #eeebee !default;\n$grey-lt-200: #ecebed !default;\n$grey-lt-300: #e6e1e8 !default;\n$purple-000: #7253ed !default;\n$purple-100: #5e41d0 !default;\n$purple-200: #4e26af !default;\n$purple-300: #381885 !default;\n$blue-000: #2c84fa !default;\n$blue-100: #2869e6 !default;\n$blue-200: #264caf !default;\n$blue-300: #183385 !default;\n$green-000: #41d693 !default;\n$green-100: #11b584 !default;\n$green-200: #009c7b !default;\n$green-300: #026e57 !default;\n$yellow-000: #ffeb82 !default;\n$yellow-100: #fadf50 !default;\n$yellow-200: #f7d12e !default;\n$yellow-300: #e7af06 !default;\n$red-000: #f77e7e !default;\n$red-100: #f96e65 !default;\n$red-200: #e94c4c !default;\n$red-300: #dd2e2e !default;\n\n// Spacing\n\n$spacing-unit: 1rem; // 1rem == 16px\n\n$spacers: (\n sp-0: 0,\n sp-1: $spacing-unit * 0.25,\n sp-2: $spacing-unit * 0.5,\n sp-3: $spacing-unit * 0.75,\n sp-4: $spacing-unit,\n sp-5: $spacing-unit * 1.5,\n sp-6: $spacing-unit * 2,\n sp-7: $spacing-unit * 2.5,\n sp-8: $spacing-unit * 3,\n sp-9: $spacing-unit * 3.5,\n sp-10: $spacing-unit * 4,\n) !default;\n$sp-1: map-get($spacers, sp-1) !default; // 0.25 rem == 4px\n$sp-2: map-get($spacers, sp-2) !default; // 0.5 rem == 8px\n$sp-3: map-get($spacers, sp-3) !default; // 0.75 rem == 12px\n$sp-4: map-get($spacers, sp-4) !default; // 1 rem == 16px\n$sp-5: map-get($spacers, sp-5) !default; // 1.5 rem == 24px\n$sp-6: map-get($spacers, sp-6) !default; // 2 rem == 32px\n$sp-7: map-get($spacers, sp-7) !default; // 2.5 rem == 40px\n$sp-8: map-get($spacers, sp-8) !default; // 3 rem == 48px\n$sp-9: map-get($spacers, sp-9) !default; // 3.5 rem == 56px\n$sp-10: map-get($spacers, sp-10) !default; // 4 rem == 64px\n\n// Borders\n\n$border: 1px solid !default;\n$border-radius: 4px !default;\n$border-color: $grey-lt-100 !default;\n\n// Grid system\n\n$gutter-spacing: $sp-6 !default;\n$gutter-spacing-sm: $sp-4 !default;\n$nav-width: 16.5rem !default;\n$nav-width-md: 15.5rem !default;\n$nav-list-item-height: $sp-6 !default;\n$nav-list-item-height-sm: $sp-8 !default;\n$nav-list-expander-right: true;\n$content-width: 50rem !default;\n$header-height: 3.75rem !default;\n$search-results-width: $content-width - $nav-width !default;\n$transition-duration: 400ms;\n\n// Media queries in pixels\n\n$media-queries: (\n xs: 20rem,\n sm: 31.25rem,\n md: $content-width,\n lg: $content-width + $nav-width,\n xl: 87.5rem,\n) !default;\n","// The basic two column layout\n\n.side-bar {\n z-index: 0;\n display: flex;\n flex-wrap: wrap;\n background-color: $sidebar-color;\n\n @include mq(md) {\n flex-flow: column nowrap;\n position: fixed;\n width: $nav-width-md;\n height: 100%;\n border-right: $border $border-color;\n align-items: flex-end;\n }\n\n @include mq(lg) {\n width: calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width});\n min-width: $nav-width;\n }\n\n & + .main {\n @include mq(md) {\n margin-left: $nav-width-md;\n }\n\n @include mq(lg) {\n // stylelint-disable function-name-case\n // disable for Max(), we want to use the CSS max() function\n margin-left: Max(\n #{$nav-width},\n calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width})\n );\n // stylelint-enable function-name-case\n }\n\n .main-header {\n display: none;\n background-color: $sidebar-color;\n\n @include mq(md) {\n display: flex;\n background-color: $body-background-color;\n }\n\n &.nav-open {\n display: block;\n\n @include mq(md) {\n display: flex;\n }\n }\n }\n }\n}\n\n.main {\n margin: auto;\n\n @include mq(md) {\n position: relative;\n max-width: $content-width;\n }\n}\n\n.main-content-wrap {\n padding-top: $gutter-spacing-sm;\n padding-bottom: $gutter-spacing-sm;\n\n @include container;\n\n @include mq(md) {\n padding-top: $gutter-spacing;\n padding-bottom: $gutter-spacing;\n }\n}\n\n.main-header {\n z-index: 0;\n border-bottom: $border $border-color;\n\n @include mq(md) {\n display: flex;\n justify-content: space-between;\n height: $header-height;\n }\n}\n\n.site-nav,\n.site-header,\n.site-footer {\n width: 100%;\n\n @include mq(lg) {\n width: $nav-width;\n }\n}\n\n.site-nav {\n display: none;\n\n &.nav-open {\n display: block;\n }\n\n @include mq(md) {\n display: block;\n padding-top: $sp-8;\n padding-bottom: $gutter-spacing-sm;\n overflow-y: auto;\n flex: 1 1 auto;\n }\n}\n\n.site-header {\n display: flex;\n min-height: $header-height;\n align-items: center;\n\n @include mq(md) {\n height: $header-height;\n max-height: $header-height;\n border-bottom: $border $border-color;\n }\n}\n\n.site-title {\n flex-grow: 1;\n display: flex;\n height: 100%;\n align-items: center;\n padding-top: $sp-3;\n padding-bottom: $sp-3;\n color: $body-heading-color;\n\n @include container;\n\n @include fs-6;\n\n @include mq(md) {\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n }\n}\n\n@if variable-exists(logo) {\n .site-logo {\n width: 100%;\n height: 100%;\n background-image: url($logo);\n background-repeat: no-repeat;\n background-position: left center;\n background-size: contain;\n }\n}\n\n.site-button {\n display: flex;\n height: 100%;\n padding: $gutter-spacing-sm;\n align-items: center;\n}\n\n@include mq(md) {\n .site-header .site-button {\n display: none;\n }\n}\n\n.site-title:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n}\n\n.site-button:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n}\n\n.site-footer {\n position: absolute;\n bottom: 0;\n left: 0;\n padding-top: $sp-4;\n padding-bottom: $sp-4;\n\n @include container;\n\n @include fs-2;\n\n @include mq(md) {\n position: static;\n justify-self: end;\n }\n}\n\n.icon {\n width: $sp-5;\n height: $sp-5;\n color: $link-color;\n}\n","@charset \"UTF-8\";\n\n// Styles for rendered markdown in the .main-content container\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity, selector-max-id\n\n.main-content {\n line-height: $content-line-height;\n\n ol,\n ul,\n dl,\n pre,\n address,\n blockquote,\n .table-wrapper {\n margin-top: 0.5em;\n }\n\n a {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n ul,\n ol {\n padding-left: 1.5em;\n }\n\n li {\n .highlight {\n margin-top: $sp-1;\n }\n }\n\n ol {\n list-style-type: none;\n counter-reset: step-counter;\n\n > li {\n position: relative;\n\n &::before {\n position: absolute;\n top: 0.2em;\n left: -1.6em;\n color: $grey-dk-000;\n content: counter(step-counter);\n counter-increment: step-counter;\n @include fs-3;\n\n @include mq(sm) {\n top: 0.11em;\n }\n }\n\n ol {\n counter-reset: sub-counter;\n\n > li {\n &::before {\n content: counter(sub-counter, lower-alpha);\n counter-increment: sub-counter;\n }\n }\n }\n }\n }\n\n ul {\n list-style: none;\n\n > li {\n &::before {\n position: absolute;\n margin-left: -1.4em;\n color: $grey-dk-000;\n content: \"•\";\n }\n }\n }\n\n .task-list-item {\n &::before {\n content: \"\";\n }\n }\n\n .task-list-item-checkbox {\n margin-right: 0.6em;\n margin-left: -1.4em;\n\n // The same margin-left is used above for ul > li::before\n }\n\n hr + * {\n margin-top: 0;\n }\n\n h1:first-of-type {\n margin-top: 0.5em;\n }\n\n dl {\n display: grid;\n grid-template: auto / 10em 1fr;\n }\n\n dt,\n dd {\n margin: 0.25em 0;\n }\n\n dt {\n grid-column: 1;\n font-weight: 500;\n text-align: right;\n\n &::after {\n content: \":\";\n }\n }\n\n dd {\n grid-column: 2;\n margin-bottom: 0;\n margin-left: 1em;\n\n blockquote,\n div,\n dl,\n dt,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n li,\n ol,\n p,\n pre,\n table,\n ul,\n .table-wrapper {\n &:first-child {\n margin-top: 0;\n }\n }\n }\n\n dd,\n ol,\n ul {\n dl:first-child {\n dt:first-child,\n dd:nth-child(2) {\n margin-top: 0;\n }\n }\n }\n\n .anchor-heading {\n position: absolute;\n right: -$sp-4;\n width: $sp-5;\n height: 100%;\n padding-right: $sp-1;\n padding-left: $sp-1;\n overflow: visible;\n\n @include mq(md) {\n right: auto;\n left: -$sp-5;\n }\n\n svg {\n display: inline-block;\n width: 100%;\n height: 100%;\n color: $link-color;\n visibility: hidden;\n }\n }\n\n .anchor-heading:hover,\n .anchor-heading:focus,\n h1:hover > .anchor-heading,\n h2:hover > .anchor-heading,\n h3:hover > .anchor-heading,\n h4:hover > .anchor-heading,\n h5:hover > .anchor-heading,\n h6:hover > .anchor-heading {\n svg {\n visibility: visible;\n }\n }\n\n summary {\n cursor: pointer;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n #toctitle {\n position: relative;\n margin-top: 1.5em;\n margin-bottom: 0.25em;\n\n + table,\n + .table-wrapper,\n + .code-example,\n + .highlighter-rouge,\n + .sectionbody .listingblock {\n margin-top: 1em;\n }\n\n + p:not(.label) {\n margin-top: 0;\n }\n }\n\n > h1:first-child,\n > h2:first-child,\n > h3:first-child,\n > h4:first-child,\n > h5:first-child,\n > h6:first-child,\n > .sect1:first-child > h2,\n > .sect2:first-child > h3,\n > .sect3:first-child > h4,\n > .sect4:first-child > h5,\n > .sect5:first-child > h6 {\n margin-top: $sp-2;\n }\n}\n","// Main nav, breadcrumb, etc...\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity\n\n.nav-list {\n padding: 0;\n margin-top: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n margin: 0;\n\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n\n .nav-list-link {\n display: block;\n min-height: $nav-list-item-height-sm;\n padding-top: $sp-1;\n padding-bottom: $sp-1;\n line-height: #{$nav-list-item-height-sm - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height-sm;\n padding-left: $gutter-spacing-sm;\n } @else {\n padding-right: $gutter-spacing-sm;\n padding-left: $nav-list-item-height-sm;\n }\n\n @include mq(md) {\n min-height: $nav-list-item-height;\n line-height: #{$nav-list-item-height - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height;\n padding-left: $gutter-spacing;\n } @else {\n padding-right: $gutter-spacing;\n padding-left: $nav-list-item-height;\n }\n }\n\n &.external > svg {\n width: $sp-4;\n height: $sp-4;\n vertical-align: text-bottom;\n }\n\n &.active {\n font-weight: 600;\n text-decoration: none;\n }\n\n &:hover,\n &.active {\n color: darken($link-color, 5%);\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n }\n }\n\n .nav-list-expander {\n position: absolute;\n @if $nav-list-expander-right {\n right: 0;\n }\n\n width: $nav-list-item-height-sm;\n height: $nav-list-item-height-sm;\n padding: #{$nav-list-item-height-sm * 0.25};\n color: $link-color;\n\n @include mq(md) {\n width: $nav-list-item-height;\n height: $nav-list-item-height;\n padding: #{$nav-list-item-height * 0.25};\n }\n\n &:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n }\n\n @if $nav-list-expander-right {\n svg {\n transform: rotate(90deg);\n }\n }\n }\n\n > .nav-list {\n display: none;\n padding-left: $sp-3;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n\n .nav-list-link {\n color: $nav-child-link-color;\n }\n\n .nav-list-expander {\n color: $nav-child-link-color;\n }\n }\n }\n\n &.active {\n > .nav-list-expander svg {\n @if $nav-list-expander-right {\n transform: rotate(-90deg);\n } @else {\n transform: rotate(90deg);\n }\n }\n\n > .nav-list {\n display: block;\n }\n }\n }\n}\n\n.nav-category {\n padding: $sp-2 $gutter-spacing-sm;\n font-weight: 600;\n text-align: start;\n text-transform: uppercase;\n border-bottom: $border $border-color;\n @include fs-2;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing;\n margin-top: $gutter-spacing-sm;\n text-align: start;\n\n &:first-child {\n margin-top: 0;\n }\n }\n}\n\n.nav-list.nav-category-list {\n > .nav-list-item {\n margin: 0;\n\n > .nav-list {\n padding: 0;\n\n > .nav-list-item {\n > .nav-list-link {\n color: $link-color;\n }\n\n > .nav-list-expander {\n color: $link-color;\n }\n }\n }\n }\n}\n\n// Aux nav\n\n.aux-nav {\n height: 100%;\n overflow-x: auto;\n @include fs-2;\n\n .aux-nav-list {\n display: flex;\n height: 100%;\n padding: 0;\n margin: 0;\n list-style: none;\n }\n\n .aux-nav-list-item {\n display: inline-block;\n height: 100%;\n padding: 0;\n margin: 0;\n }\n\n @include mq(md) {\n padding-right: $gutter-spacing-sm;\n }\n}\n\n// Breadcrumb nav\n\n.breadcrumb-nav {\n @include mq(md) {\n margin-top: -$sp-4;\n }\n}\n\n.breadcrumb-nav-list {\n padding-left: 0;\n margin-bottom: $sp-3;\n list-style: none;\n}\n\n.breadcrumb-nav-list-item {\n display: table-cell;\n @include fs-2;\n\n &::before {\n display: none;\n }\n\n &::after {\n display: inline-block;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $grey-dk-000;\n content: \"/\";\n }\n\n &:last-child {\n &::after {\n content: \"\";\n }\n }\n}\n","// Typography\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\nh1,\n.text-alpha {\n font-weight: 300;\n\n @include fs-8;\n}\n\nh2,\n.text-beta,\n#toctitle {\n @include fs-6;\n}\n\nh3,\n.text-gamma {\n @include fs-5;\n}\n\nh4,\n.text-delta {\n font-weight: 400;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n\n @include fs-2;\n}\n\nh4 code {\n text-transform: none;\n}\n\nh5,\n.text-epsilon {\n @include fs-3;\n}\n\nh6,\n.text-zeta {\n @include fs-2;\n}\n\n.text-small {\n @include fs-2;\n}\n\n.text-mono {\n font-family: $mono-font-family !important;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n","// Labels (not the form kind)\n\n// this :not() prevents a style clash with Mermaid.js's\n// diagram labels, which also use .label\n// for more, see https://github.com/just-the-docs/just-the-docs/issues/1272\n// and the accompanying PR\n.label:not(g),\n.label-blue:not(g) {\n display: inline-block;\n padding: 0.16em 0.56em;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $white;\n text-transform: uppercase;\n vertical-align: middle;\n background-color: $blue-100;\n border-radius: 12px;\n\n @include fs-2;\n}\n\n.label-green:not(g) {\n background-color: $green-300;\n}\n\n.label-purple:not(g) {\n background-color: $purple-100;\n}\n\n.label-red:not(g) {\n background-color: $red-300;\n}\n\n.label-yellow:not(g) {\n color: $grey-dk-200;\n background-color: $yellow-200;\n}\n","// Buttons and things that look like buttons\n// stylelint-disable color-named\n\n.btn {\n display: inline-block;\n box-sizing: border-box;\n padding: 0.3em 1em;\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n font-weight: 500;\n line-height: 1.5;\n color: $link-color;\n text-decoration: none;\n vertical-align: baseline;\n cursor: pointer;\n background-color: $base-button-color;\n border-width: 0;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n appearance: none;\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: darken($link-color, 2%);\n }\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n text-decoration: none;\n background-color: darken($base-button-color, 1%);\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($base-button-color, 3%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken(#dcdcdc, 5%);\n }\n\n &:disabled,\n &.disabled {\n &,\n &:hover {\n color: rgba(102, 102, 102, 0.5);\n cursor: default;\n background-color: rgba(229, 229, 229, 0.5);\n background-image: none;\n box-shadow: none;\n }\n }\n}\n\n.btn-outline {\n color: $link-color;\n background: transparent;\n box-shadow: inset 0 0 0 2px $grey-lt-300;\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n color: darken($link-color, 4%);\n text-decoration: none;\n background-color: transparent;\n box-shadow: inset 0 0 0 3px $grey-lt-300;\n }\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow:\n inset 0 0 0 2px $grey-dk-100,\n 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: inset 0 0 0 2px $grey-dk-100;\n }\n}\n\n.btn-primary {\n @include btn-color($white, $btn-primary-color);\n}\n\n.btn-purple {\n @include btn-color($white, $purple-100);\n}\n\n.btn-blue {\n @include btn-color($white, $blue-200);\n}\n\n.btn-green {\n @include btn-color($white, $green-300);\n}\n\n.btn-reset {\n background: none;\n border: none;\n margin: 0;\n text-align: inherit;\n font: inherit;\n border-radius: 0;\n appearance: none;\n}\n","$color-scheme: light !default;\n$body-background-color: $white !default;\n$body-heading-color: $grey-dk-300 !default;\n$body-text-color: $grey-dk-100 !default;\n$link-color: $purple-000 !default;\n$nav-child-link-color: $grey-dk-100 !default;\n$sidebar-color: $grey-lt-000 !default;\n$base-button-color: #f7f7f7 !default;\n$btn-primary-color: $purple-100 !default;\n$code-background-color: $white !default;\n$feedback-color: darken($sidebar-color, 3%) !default;\n$table-background-color: $white !default;\n$search-background-color: $white !default;\n$search-result-preview-color: $grey-dk-100 !default;\n\n@import \"./vendor/accessible-pygments/github-light\";\n","// Colored button\n\n@mixin btn-color($fg, $bg) {\n color: $fg;\n background-color: darken($bg, 2%);\n background-image: linear-gradient(lighten($bg, 5%), darken($bg, 2%));\n box-shadow:\n 0 1px 3px rgba(0, 0, 0, 0.25),\n 0 4px 10px rgba(0, 0, 0, 0.12);\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: $fg;\n background-color: darken($bg, 4%);\n background-image: linear-gradient((lighten($bg, 2%), darken($bg, 4%)));\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($bg, 5%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken($bg, 10%);\n }\n}\n","// Search input and autocomplete\n\n.search {\n position: relative;\n z-index: 2;\n flex-grow: 1;\n height: $sp-10;\n padding: $sp-2;\n transition: padding linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: relative !important;\n width: auto !important;\n height: 100% !important;\n padding: 0;\n transition: none;\n }\n}\n\n.search-input-wrap {\n position: relative;\n z-index: 1;\n height: $sp-8;\n overflow: hidden;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n transition: height linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: absolute;\n width: 100%;\n max-width: $search-results-width;\n height: 100% !important;\n border-radius: 0;\n box-shadow: none;\n transition: width ease $transition-duration;\n }\n}\n\n.search-input {\n position: absolute;\n width: 100%;\n height: 100%;\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing-sm + $sp-5};\n font-size: 1rem;\n color: $body-text-color;\n background-color: $search-background-color;\n border-top: 0;\n border-right: 0;\n border-bottom: 0;\n border-left: 0;\n border-radius: 0;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing + $sp-5};\n font-size: 0.875rem;\n background-color: $body-background-color;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n &:focus {\n outline: 2px solid $link-color;\n outline-offset: -2px;\n\n + .search-label .search-icon {\n color: $link-color;\n }\n }\n}\n\n.search-label {\n position: absolute;\n display: flex;\n height: 100%;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-left: $gutter-spacing;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n .search-icon {\n width: #{$sp-4 * 1.2};\n height: #{$sp-4 * 1.2};\n align-self: center;\n color: $grey-dk-000;\n }\n}\n\n.search-results {\n position: absolute;\n left: 0;\n display: none;\n width: 100%;\n max-height: calc(100% - #{$sp-10});\n overflow-y: auto;\n background-color: $search-background-color;\n border-bottom-right-radius: $border-radius;\n border-bottom-left-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n\n @include mq(md) {\n top: 100%;\n width: $search-results-width;\n max-height: calc(100vh - 200%) !important;\n }\n}\n\n.search-results-list {\n padding-left: 0;\n margin-bottom: $sp-1;\n list-style: none;\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n}\n\n.search-results-list-item {\n padding: 0;\n margin: 0;\n}\n\n.search-result {\n display: block;\n padding: $sp-1 $sp-3;\n\n &:hover,\n &.active {\n background-color: $feedback-color;\n }\n}\n\n.search-result-title {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 40%;\n padding-right: $sp-2;\n vertical-align: top;\n }\n}\n\n.search-result-doc {\n display: flex;\n align-items: center;\n word-wrap: break-word;\n\n &.search-result-doc-parent {\n opacity: 0.5;\n @include fs-3;\n\n @include mq(md) {\n @include fs-2;\n }\n }\n\n .search-result-icon {\n width: $sp-4;\n height: $sp-4;\n margin-right: $sp-2;\n color: $link-color;\n flex-shrink: 0;\n }\n\n .search-result-doc-title {\n overflow: auto;\n }\n}\n\n.search-result-section {\n margin-left: #{$sp-4 + $sp-2};\n word-wrap: break-word;\n}\n\n.search-result-rel-url {\n display: block;\n margin-left: #{$sp-4 + $sp-2};\n overflow: hidden;\n color: $search-result-preview-color;\n text-overflow: ellipsis;\n white-space: nowrap;\n @include fs-1;\n}\n\n.search-result-previews {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n padding-left: $sp-4;\n margin-left: $sp-2;\n color: $search-result-preview-color;\n word-wrap: break-word;\n border-left: $border;\n border-left-color: $border-color;\n @include fs-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 60%;\n padding-left: $sp-2;\n margin-left: 0;\n vertical-align: top;\n }\n}\n\n.search-result-preview + .search-result-preview {\n margin-top: $sp-1;\n}\n\n.search-result-highlight {\n font-weight: bold;\n}\n\n.search-no-result {\n padding: $sp-2 $sp-3;\n @include fs-3;\n}\n\n.search-button {\n position: fixed;\n right: $sp-4;\n bottom: $sp-4;\n display: flex;\n width: $sp-9;\n height: $sp-9;\n background-color: $search-background-color;\n border: 1px solid rgba($link-color, 0.3);\n border-radius: #{$sp-9 * 0.5};\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n align-items: center;\n justify-content: center;\n}\n\n.search-overlay {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1;\n width: 0;\n height: 0;\n background-color: rgba(0, 0, 0, 0.3);\n opacity: 0;\n transition:\n opacity ease $transition-duration,\n width 0s $transition-duration,\n height 0s $transition-duration;\n}\n\n.search-active {\n .search {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .search-input-wrap {\n height: $sp-10;\n border-radius: 0;\n\n @include mq(md) {\n width: $search-results-width;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n }\n }\n\n .search-input {\n background-color: $search-background-color;\n\n @include mq(md) {\n padding-left: 2.3rem;\n }\n }\n\n .search-label {\n @include mq(md) {\n padding-left: 0.6rem;\n }\n }\n\n .search-results {\n display: block;\n }\n\n .search-overlay {\n width: 100%;\n height: 100%;\n opacity: 1;\n transition:\n opacity ease $transition-duration,\n width 0s,\n height 0s;\n }\n\n @include mq(md) {\n .main {\n position: fixed;\n right: 0;\n left: 0;\n }\n }\n\n .main-header {\n padding-top: $sp-10;\n\n @include mq(md) {\n padding-top: 0;\n }\n }\n}\n","// Tables\n// stylelint-disable max-nesting-depth, selector-no-type, selector-max-type\n\n.table-wrapper {\n display: block;\n width: 100%;\n max-width: 100%;\n margin-bottom: $sp-5;\n overflow-x: auto;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n}\n\ntable {\n display: table;\n min-width: 100%;\n border-collapse: separate;\n}\n\nth,\ntd {\n min-width: 7.5rem;\n padding: $sp-2 $sp-3;\n background-color: $table-background-color;\n border-bottom: $border rgba($border-color, 0.5);\n border-left: $border $border-color;\n\n @include fs-3;\n\n &:first-of-type {\n border-left: 0;\n }\n}\n\ntbody {\n tr {\n &:last-of-type {\n th,\n td {\n border-bottom: 0;\n }\n\n td {\n padding-bottom: $sp-3;\n }\n }\n }\n}\n\nthead {\n th {\n border-bottom: $border $border-color;\n }\n}\n","// Code and syntax highlighting\n// stylelint-disable selector-no-qualifying-type, declaration-block-semicolon-newline-after,declaration-block-single-line-max-declarations, selector-no-type, selector-max-type, scss/comment-no-empty\n\n// {% raw %}\n\n// This instruction applies to all queues not within 'pre' or 'figure', avoiding 'code' generated by the highlight.\n:not(pre, figure) {\n & > code {\n padding: 0.2em 0.15em;\n font-weight: 400;\n background-color: $code-background-color;\n border: $border $border-color;\n border-radius: $border-radius;\n }\n}\n\n// Avoid appearance of dark border around visited code links in Safari\na:visited code {\n border-color: $border-color;\n}\n\n// Content structure for highlighted code blocks using fences or Liquid\n//\n// ```[LANG]...```, no kramdown line_numbers:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n//\n// ```[LANG]...```, kramdown line_numbers = true:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.rouge-gutter.gl > pre.lineno\n// | td.rouge-code > pre\n//\n// {% highlight LANG %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n//\n// {% highlight LANG linenos %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.gutter.gl > pre.lineno\n// | td.code > pre\n//\n// ----...---- (AsciiDoc)\n// div.listingblock > div.content > pre.rouge.highlight\n//\n// fix_linenos removes the outermost pre when it encloses table.rouge-table\n//\n// See docs/index-test.md for some tests.\n//\n// No kramdown line_numbers: fences and Liquid highlighting look the same.\n// Kramdown line_numbers = true: fences have a wider gutter than with Liquid?\n\n// ```[LANG]...```\n// or in AsciiDoc:\n//\n// ----\n// ...\n// ----\n\n// the code may appear with 3 different types:\n// container \\ case: default case, code with line number, code with html rendering\n// top level: div.highlighter-rouge, figure.highlight, figure.highlight\n// second level: div.highlight, div.table-wrapper, pre.highlight\n// third level: pre.highlight, td.code, absent\n// last level: code, pre, code (optionality)\n// highlighter level: span, span, span\n// the spacing are only in the second level for case 1, 3 and in the third level for case 2\n// in AsciiDoc, there is a parent container that contains optionally a title and the content.\n\n// select top level container\ndiv.highlighter-rouge,\ndiv.listingblock > div.content,\nfigure.highlight {\n margin-top: 0;\n margin-bottom: $sp-3;\n background-color: $code-background-color;\n border-radius: $border-radius;\n box-shadow: none;\n -webkit-overflow-scrolling: touch;\n position: relative;\n padding: 0;\n\n // copy button (or other button)\n // the button appear only when there is a hover on the code or focus on button\n > button {\n width: $sp-3;\n opacity: 0;\n position: absolute;\n top: 0;\n right: 0;\n padding: $sp-3;\n border: none;\n background: none;\n color: $body-text-color;\n box-sizing: content-box;\n\n svg {\n fill: $body-text-color;\n }\n\n &:active {\n text-decoration: none;\n outline: none;\n opacity: 1;\n }\n\n &:focus {\n opacity: 1;\n outline: 2px solid $link-color;\n }\n }\n\n // the button can be seen by doing a simple hover in the code, there is no need to go over the location of the button\n &:hover {\n > button {\n cursor: copy;\n opacity: 1;\n }\n }\n}\n\n// setting the spacing and scrollbar on the second level for the first case\n// remove all space on the second and third level\n// this is a mixin to accommodate for the slightly different structures generated via Markdown vs AsciiDoc\n@mixin scroll-and-spacing($code-div, $pre-select) {\n #{$code-div} {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n\n #{$pre-select},\n code {\n padding: 0;\n margin: 0;\n border: 0;\n }\n}\n\n// for Markdown\ndiv.highlighter-rouge {\n @include scroll-and-spacing(\"div.highlight\", \"pre.highlight\");\n}\n\n// for AsciiDoc. we also need to fix the margins for its parent container.\ndiv.listingblock {\n margin-top: 0;\n margin-bottom: $sp-3;\n\n @include scroll-and-spacing(\"div.content\", \"div.content > pre\");\n}\n\n// {% highlight LANG %}...{% endhighlight %},\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the second level for the thirt case\n// the css rule are apply only to the last code enviroment\n// setting the scroolbar\nfigure.highlight {\n pre,\n :not(pre) > code {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n}\n\n// ```[LANG]...```, kramdown line_numbers = true,\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the thirt level for the second case\n.highlight .table-wrapper {\n padding: $sp-3 0;\n margin: 0;\n border: 0;\n box-shadow: none;\n\n td,\n pre {\n min-width: 0;\n padding: 0;\n background-color: $code-background-color;\n border: 0;\n\n @include fs-2;\n }\n\n td.gl {\n width: 1em;\n padding-right: $sp-3;\n padding-left: $sp-3;\n }\n\n pre {\n margin: 0;\n line-height: 2;\n }\n}\n\n// Code examples: html render of a code\n.code-example,\n.listingblock > .title {\n padding: $sp-3;\n margin-bottom: $sp-3;\n overflow: auto;\n border: 1px solid $border-color;\n border-radius: $border-radius;\n\n + .highlighter-rouge,\n + .sectionbody .listingblock,\n + .content,\n + figure.highlight {\n position: relative;\n margin-top: -$sp-4;\n border-right: 1px solid $border-color;\n border-bottom: 1px solid $border-color;\n border-left: 1px solid $border-color;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n}\n\n// Mermaid diagram code blocks should be left unstyled.\ncode.language-mermaid {\n padding: 0;\n background-color: inherit;\n border: 0;\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight,\npre.highlight {\n background: $code-background-color; // Code Background\n // For Backwards Compatibility Before $code-linenumber-color was added\n @if variable-exists(code-linenumber-color) {\n color: $code-linenumber-color; // Code Line Numbers\n } @else {\n color: $body-text-color; // Code Line Numbers\n }\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight pre {\n background: $code-background-color; // Code Background\n}\n\n// {% endraw %}\n","// Utility classes for colors\n\n// Text colors\n\n.text-grey-dk-000 {\n color: $grey-dk-000 !important;\n}\n\n.text-grey-dk-100 {\n color: $grey-dk-100 !important;\n}\n\n.text-grey-dk-200 {\n color: $grey-dk-200 !important;\n}\n\n.text-grey-dk-250 {\n color: $grey-dk-250 !important;\n}\n\n.text-grey-dk-300 {\n color: $grey-dk-300 !important;\n}\n\n.text-grey-lt-000 {\n color: $grey-lt-000 !important;\n}\n\n.text-grey-lt-100 {\n color: $grey-lt-100 !important;\n}\n\n.text-grey-lt-200 {\n color: $grey-lt-200 !important;\n}\n\n.text-grey-lt-300 {\n color: $grey-lt-300 !important;\n}\n\n.text-blue-000 {\n color: $blue-000 !important;\n}\n\n.text-blue-100 {\n color: $blue-100 !important;\n}\n\n.text-blue-200 {\n color: $blue-200 !important;\n}\n\n.text-blue-300 {\n color: $blue-300 !important;\n}\n\n.text-green-000 {\n color: $green-000 !important;\n}\n\n.text-green-100 {\n color: $green-100 !important;\n}\n\n.text-green-200 {\n color: $green-200 !important;\n}\n\n.text-green-300 {\n color: $green-300 !important;\n}\n\n.text-purple-000 {\n color: $purple-000 !important;\n}\n\n.text-purple-100 {\n color: $purple-100 !important;\n}\n\n.text-purple-200 {\n color: $purple-200 !important;\n}\n\n.text-purple-300 {\n color: $purple-300 !important;\n}\n\n.text-yellow-000 {\n color: $yellow-000 !important;\n}\n\n.text-yellow-100 {\n color: $yellow-100 !important;\n}\n\n.text-yellow-200 {\n color: $yellow-200 !important;\n}\n\n.text-yellow-300 {\n color: $yellow-300 !important;\n}\n\n.text-red-000 {\n color: $red-000 !important;\n}\n\n.text-red-100 {\n color: $red-100 !important;\n}\n\n.text-red-200 {\n color: $red-200 !important;\n}\n\n.text-red-300 {\n color: $red-300 !important;\n}\n\n// Background colors\n\n.bg-grey-dk-000 {\n background-color: $grey-dk-000 !important;\n}\n\n.bg-grey-dk-100 {\n background-color: $grey-dk-100 !important;\n}\n\n.bg-grey-dk-200 {\n background-color: $grey-dk-200 !important;\n}\n\n.bg-grey-dk-250 {\n background-color: $grey-dk-250 !important;\n}\n\n.bg-grey-dk-300 {\n background-color: $grey-dk-300 !important;\n}\n\n.bg-grey-lt-000 {\n background-color: $grey-lt-000 !important;\n}\n\n.bg-grey-lt-100 {\n background-color: $grey-lt-100 !important;\n}\n\n.bg-grey-lt-200 {\n background-color: $grey-lt-200 !important;\n}\n\n.bg-grey-lt-300 {\n background-color: $grey-lt-300 !important;\n}\n\n.bg-blue-000 {\n background-color: $blue-000 !important;\n}\n\n.bg-blue-100 {\n background-color: $blue-100 !important;\n}\n\n.bg-blue-200 {\n background-color: $blue-200 !important;\n}\n\n.bg-blue-300 {\n background-color: $blue-300 !important;\n}\n\n.bg-green-000 {\n background-color: $green-000 !important;\n}\n\n.bg-green-100 {\n background-color: $green-100 !important;\n}\n\n.bg-green-200 {\n background-color: $green-200 !important;\n}\n\n.bg-green-300 {\n background-color: $green-300 !important;\n}\n\n.bg-purple-000 {\n background-color: $purple-000 !important;\n}\n\n.bg-purple-100 {\n background-color: $purple-100 !important;\n}\n\n.bg-purple-200 {\n background-color: $purple-200 !important;\n}\n\n.bg-purple-300 {\n background-color: $purple-300 !important;\n}\n\n.bg-yellow-000 {\n background-color: $yellow-000 !important;\n}\n\n.bg-yellow-100 {\n background-color: $yellow-100 !important;\n}\n\n.bg-yellow-200 {\n background-color: $yellow-200 !important;\n}\n\n.bg-yellow-300 {\n background-color: $yellow-300 !important;\n}\n\n.bg-red-000 {\n background-color: $red-000 !important;\n}\n\n.bg-red-100 {\n background-color: $red-100 !important;\n}\n\n.bg-red-200 {\n background-color: $red-200 !important;\n}\n\n.bg-red-300 {\n background-color: $red-300 !important;\n}\n","// Utility classes for layout\n\n// Display\n\n.d-block {\n display: block !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n// Screenreader-only\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .d-sm-block, .d-md-none, .d-lg-inline\n .d-#{$media-query}-block {\n display: block !important;\n }\n .d-#{$media-query}-flex {\n display: flex !important;\n }\n .d-#{$media-query}-inline {\n display: inline !important;\n }\n .d-#{$media-query}-inline-block {\n display: inline-block !important;\n }\n .d-#{$media-query}-none {\n display: none !important;\n }\n }\n }\n}\n\n// Horizontal alignment\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.flex-justify-start {\n justify-content: flex-start !important;\n}\n\n.flex-justify-end {\n justify-content: flex-end !important;\n}\n\n.flex-justify-between {\n justify-content: space-between !important;\n}\n\n.flex-justify-around {\n justify-content: space-around !important;\n}\n\n// Vertical alignment\n\n.v-align-baseline {\n vertical-align: baseline !important;\n}\n\n.v-align-bottom {\n vertical-align: bottom !important;\n}\n\n.v-align-middle {\n vertical-align: middle !important;\n}\n\n.v-align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.v-align-text-top {\n vertical-align: text-top !important;\n}\n\n.v-align-top {\n vertical-align: top !important;\n}\n","// Utility classes for typography\n\n.fs-1 {\n @include fs-1;\n}\n\n.fs-2 {\n @include fs-2;\n}\n\n.fs-3 {\n @include fs-3;\n}\n\n.fs-4 {\n @include fs-4;\n}\n\n.fs-5 {\n @include fs-5;\n}\n\n.fs-6 {\n @include fs-6;\n}\n\n.fs-7 {\n @include fs-7;\n}\n\n.fs-8 {\n @include fs-8;\n}\n\n.fs-9 {\n @include fs-9;\n}\n\n.fs-10 {\n @include fs-10;\n}\n\n.fw-300 {\n font-weight: 300 !important;\n}\n\n.fw-400 {\n font-weight: 400 !important;\n}\n\n.fw-500 {\n font-weight: 500 !important;\n}\n\n.fw-700 {\n font-weight: 700 !important;\n}\n\n.lh-0 {\n line-height: 0 !important;\n}\n\n.lh-default {\n line-height: $body-line-height;\n}\n\n.lh-tight {\n line-height: $body-heading-line-height;\n}\n\n.ls-5 {\n letter-spacing: 0.05em !important;\n}\n\n.ls-10 {\n letter-spacing: 0.1em !important;\n}\n\n.ls-0 {\n letter-spacing: 0 !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n","// Utility classes for lists\n\n// stylelint-disable selector-max-type\n\n.list-style-none {\n padding: 0 !important;\n margin: 0 !important;\n list-style: none !important;\n\n li {\n &::before {\n display: none !important;\n }\n }\n}\n","// Utility classes for margins and padding\n\n// stylelint-disable block-opening-brace-space-after, block-opening-brace-space-before\n\n// Margin spacer utilities\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-0, .m-1, .m-2...\n .m-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n .mx-#{$scale}-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-sm-0, .m-md-1, .m-lg-2...\n .m-#{$media-query}-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$media-query}-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$media-query}-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$media-query}-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n }\n }\n}\n\n// Padding spacer utilities\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-0, .p-1, .p-2...\n .p-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @include mq($media-query) {\n @for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-sm-0, .p-md-1, .p-lg-2...\n .p-#{$media-query}-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$media-query}-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$media-query}-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n }\n }\n}\n","// stylelint-disable selector-max-specificity, selector-max-id, selector-max-type, selector-no-qualifying-type\n\n@media print {\n .site-footer,\n .site-button,\n #edit-this-page,\n #back-to-top,\n .site-nav,\n .main-header {\n display: none !important;\n }\n\n hr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n }\n\n .side-bar {\n width: 100%;\n height: auto;\n border-right: 0 !important;\n }\n\n .site-header {\n border-bottom: 1px solid $border-color;\n }\n\n .site-title {\n font-size: 1rem !important;\n font-weight: 700 !important;\n }\n\n .text-small {\n font-size: 8pt !important;\n }\n\n pre.highlight {\n border: 1px solid $border-color;\n }\n\n .main {\n max-width: none;\n margin-left: 0;\n }\n}\n","// Skipnav\n// Skip to main content\n\na.skip-to-main {\n left: -999px;\n position: absolute;\n top: auto;\n width: 1px;\n height: 1px;\n overflow: hidden;\n z-index: -999;\n}\n\na.skip-to-main:focus,\na.skip-to-main:active {\n color: $link-color;\n background-color: $body-background-color;\n left: auto;\n top: auto;\n width: 30%;\n height: auto;\n overflow: auto;\n margin: 10px 35%;\n padding: 5px;\n border-radius: 15px;\n border: 4px solid $btn-primary-color;\n text-align: center;\n font-size: 1.2em;\n z-index: 999;\n}\n","\n\n@import \"./support/support\";\n@import \"./custom/setup\";\n@import \"./color_schemes/light\";\n\n@import \"./color_schemes/meshtastic\";\n\n@import \"./modules\";\ndiv.opaque {\n background-color: $body-background-color;\n}\n\np.tip, blockquote.tip {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $green-300;\n content: \"Tip\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .tip-title {\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.tip-title, blockquote.tip-title {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.tip {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.tip-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.note, blockquote.note {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $blue-300;\n content: \"Note\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .note-title {\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.note-title, blockquote.note-title {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.note {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.note-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.warning, blockquote.warning {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $yellow-300;\n content: \"Warning\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .warning-title {\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.warning-title, blockquote.warning-title {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.warning {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.warning-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n@import \"./custom/custom\";\n\n\n"],"file":"just-the-docs-default.css"}
\ No newline at end of file
+{"version":3,"sourceRoot":"","sources":["../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/vendor/accessible-pygments/github-light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/vendor/normalize.scss/normalize.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/base.scss","../../_sass/color_schemes/meshtastic.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/support/mixins/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/support/mixins/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/support/_variables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/content.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/navigation.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/labels.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/color_schemes/light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/support/mixins/_buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/search.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/tables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/code.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/utilities/_colors.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/utilities/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/utilities/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/utilities/_lists.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/utilities/_spacing.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/print.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/skiptomain.scss","just-the-docs-default.scss"],"names":[],"mappings":"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AGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvOF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AdrBE;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAQR;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AfhHA;EACE;;ACYA;EeZJ;IhBII;;;;AAKF;EACE;;ACEA;EeRJ;IhBUI;;;;AAKF;EACE;;ACRA;EeJJ;IhBgBI;;;;AAKF;EACE;;AClBA;EeAJ;IhBsBI;;;;AAKF;EACE;;AC5BA;EeIJ;IhB4BI;;;;AAKF;EACE;;ACtCA;EeQJ;IhBkCI;IACA,aEhDuB;;;;AFqDzB;EACE;EACA,aEvDuB;;ADKvB;EeYJ;IhB0CI;;;;AAKF;EACE;EACA,aElEuB;;ADKvB;EegBJ;IhBiDI;;;;AAKF;EACE;EACA,aE7EuB;;ADKvB;EeoBJ;IhBwDI;;;;AAKF;EACE;EACA,aExFuB;;ADKvB;EewBJ;IhB+DI;;;;AgB3DJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,adxDiB;;;Ac2DnB;EACE,ad1DyB;;;Ac6D3B;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC/EF;EACE;EACA;EACA;;AAGE;EACE;;;ACLN;EACE;EACA;;;AAQA;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AjBlCA;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAaN;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AjB7GA;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AC3JR;EACE;AAAA;AAAA;AAAA;AAAA;AAAA;IAME;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;;;ACvCJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE,OrBCW;EqBAX,kBrBNsB;EqBOtB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACnBF;EACE;;;AAGF;EACI;EACA;EACA,enB2EY;EmB1EZ;EACA;;AAEA;EACI,OnB6BI;EmB5BJ;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OnBmBM;EmBlBN;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,enBgDY;EmB/CZ;EACA;;AACA;EACE;EACA;EACA,OnBCM;EmBAN;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,enBEY;EmBDZ;EACA;;AAEA;EACI,OnBhDG;EmBiDH;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OnB1DK;EmB2DL;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,enBzBY;EmB0BZ;EACA;;AACA;EACE;EACA;EACA,OnB5EK;EmB6EL;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,enBvEY;EmBwEZ;EACA;;AAEA;EACI,OnBjHK;EmBkHL;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OnB3HO;EmB4HP;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,enBlGY;EmBmGZ;EACA;;AACA;EACE;EACA;EACA,OnB7IO;EmB8IP;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE","sourcesContent":["/*\ngenerated by accessible-pygments \nCopyright (c) 2022, Quansight Labs\nLicensed under the BSD license, see LICENSE for details.\n--\ngenerated by Pygments \nCopyright 2006-2025 by the Pygments team.\nLicensed under the BSD license, see LICENSE for details.\n*/\n\n.highlight .hll { background-color: #0969da4a }\n.highlight .c { color: #6E7781 } /* Comment */\n.highlight .err { color: #CF222E } /* Error */\n.highlight .k { color: #CF222E } /* Keyword */\n.highlight .l { color: #953800 } /* Literal */\n.highlight .n { color: #8250DF } /* Name */\n.highlight .o { color: #116329 } /* Operator */\n.highlight .p { color: #24292F } /* Punctuation */\n.highlight .ch { color: #6E7781 } /* Comment.Hashbang */\n.highlight .cm { color: #6E7781 } /* Comment.Multiline */\n.highlight .cp { color: #6E7781 } /* Comment.Preproc */\n.highlight .cpf { color: #6E7781 } /* Comment.PreprocFile */\n.highlight .c1 { color: #6E7781 } /* Comment.Single */\n.highlight .cs { color: #6E7781 } /* Comment.Special */\n.highlight .gd { color: #0550AE } /* Generic.Deleted */\n.highlight .ge { font-style: italic } /* Generic.Emph */\n.highlight .gr { color: #CF222E } /* Generic.Error */\n.highlight .gh { color: #0550AE } /* Generic.Heading */\n.highlight .gs { font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #0550AE } /* Generic.Subheading */\n.highlight .kc { color: #0550AE } /* Keyword.Constant */\n.highlight .kd { color: #CF222E } /* Keyword.Declaration */\n.highlight .kn { color: #CF222E } /* Keyword.Namespace */\n.highlight .kp { color: #CF222E } /* Keyword.Pseudo */\n.highlight .kr { color: #CF222E } /* Keyword.Reserved */\n.highlight .kt { color: #CF222E } /* Keyword.Type */\n.highlight .ld { color: #953800 } /* Literal.Date */\n.highlight .m { color: #953800 } /* Literal.Number */\n.highlight .s { color: #0550AE } /* Literal.String */\n.highlight .na { color: #953800 } /* Name.Attribute */\n.highlight .nb { color: #953800 } /* Name.Builtin */\n.highlight .nc { color: #0550AE } /* Name.Class */\n.highlight .no { color: #0550AE } /* Name.Constant */\n.highlight .nd { color: #953800 } /* Name.Decorator */\n.highlight .ni { color: #116329 } /* Name.Entity */\n.highlight .ne { color: #8250DF } /* Name.Exception */\n.highlight .nf { color: #0550AE } /* Name.Function */\n.highlight .nl { color: #953800 } /* Name.Label */\n.highlight .nn { color: #24292F } /* Name.Namespace */\n.highlight .nx { color: #8250DF } /* Name.Other */\n.highlight .py { color: #0550AE } /* Name.Property */\n.highlight .nt { color: #116329 } /* Name.Tag */\n.highlight .nv { color: #953800 } /* Name.Variable */\n.highlight .ow { color: #8250DF } /* Operator.Word */\n.highlight .pm { color: #24292F } /* Punctuation.Marker */\n.highlight .w { color: #24292F } /* Text.Whitespace */\n.highlight .mb { color: #953800 } /* Literal.Number.Bin */\n.highlight .mf { color: #953800 } /* Literal.Number.Float */\n.highlight .mh { color: #953800 } /* Literal.Number.Hex */\n.highlight .mi { color: #953800 } /* Literal.Number.Integer */\n.highlight .mo { color: #953800 } /* Literal.Number.Oct */\n.highlight .sa { color: #0550AE } /* Literal.String.Affix */\n.highlight .sb { color: #0550AE } /* Literal.String.Backtick */\n.highlight .sc { color: #0550AE } /* Literal.String.Char */\n.highlight .dl { color: #0550AE } /* Literal.String.Delimiter */\n.highlight .sd { color: #0550AE } /* Literal.String.Doc */\n.highlight .s2 { color: #0550AE } /* Literal.String.Double */\n.highlight .se { color: #0550AE } /* Literal.String.Escape */\n.highlight .sh { color: #0550AE } /* Literal.String.Heredoc */\n.highlight .si { color: #0550AE } /* Literal.String.Interpol */\n.highlight .sx { color: #0550AE } /* Literal.String.Other */\n.highlight .sr { color: #0550AE } /* Literal.String.Regex */\n.highlight .s1 { color: #0550AE } /* Literal.String.Single */\n.highlight .ss { color: #0550AE } /* Literal.String.Symbol */\n.highlight .bp { color: #953800 } /* Name.Builtin.Pseudo */\n.highlight .fm { color: #0550AE } /* Name.Function.Magic */\n.highlight .vc { color: #953800 } /* Name.Variable.Class */\n.highlight .vg { color: #953800 } /* Name.Variable.Global */\n.highlight .vi { color: #953800 } /* Name.Variable.Instance */\n.highlight .vm { color: #953800 } /* Name.Variable.Magic */\n.highlight .il { color: #953800 } /* Literal.Number.Integer.Long */\n","/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput {\n /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect {\n /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// Base element style overrides\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\n:root {\n color-scheme: $color-scheme;\n}\n\n* {\n box-sizing: border-box;\n}\n\nhtml {\n scroll-behavior: smooth;\n\n @include fs-4;\n}\n\nbody {\n font-family: $body-font-family;\n font-size: inherit;\n line-height: $body-line-height;\n color: $body-text-color;\n background-color: $body-background-color;\n overflow-wrap: break-word;\n}\n\nol,\nul,\ndl,\npre,\naddress,\nblockquote,\ntable,\ndiv,\nhr,\nform,\nfieldset,\nnoscript .table-wrapper {\n margin-top: 0;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n#toctitle {\n margin-top: 0;\n margin-bottom: 1em;\n font-weight: 500;\n line-height: $body-heading-line-height;\n color: $body-heading-color;\n}\n\np {\n margin-top: 1em;\n margin-bottom: 1em;\n}\n\na {\n color: $link-color;\n text-decoration: none;\n}\n\na:not([class]) {\n text-decoration: underline;\n text-decoration-color: $border-color;\n text-underline-offset: 2px;\n\n &:hover {\n text-decoration-color: rgba($link-color, 0.45);\n }\n}\n\ncode {\n font-family: $mono-font-family;\n font-size: 0.75em;\n line-height: $body-line-height;\n}\n\nfigure,\npre {\n margin: 0;\n}\n\nli {\n margin: 0.25em 0;\n}\n\nimg {\n max-width: 100%;\n height: auto;\n}\n\nhr {\n height: 1px;\n padding: 0;\n margin: $sp-6 0;\n background-color: $border-color;\n border: 0;\n}\n\n// adds a GitHub-style sidebar to blockquotes\nblockquote {\n margin: 10px 0;\n\n // resets user-agent stylesheets for blockquotes\n margin-block-start: 0;\n margin-inline-start: 0;\n padding-left: 1rem;\n border-left: 3px solid $border-color;\n}\n","// Meshtastic Material 3 — Light color scheme for just-the-docs\n// Source: core/ui/.../Color.kt §8.2 (Light Scheme)\n//\n// Brand colors:\n// Primary (Light): #2D8F52 (Green 700)\n// Surface (Light): #F5F6FA (Neutral 50)\n\n$color-scheme: light;\n\n// Body / page background\n$body-background-color: #F5F6FA; // Neutral 50 — surfaceLight\n$sidebar-color: #ECEDF3; // Neutral 100 — surfaceContainerLight\n$body-text-color: #2C2D3C; // Neutral 800 — onSurfaceLight\n$body-heading-color: #2C2D3C; // Neutral 800\n\n// Links\n$link-color: #2D8F52; // Green 700 — primaryLight\n$nav-link-color: #2D8F52; // Green 700\n\n// Navigation\n$nav-child-link-color: #555668; // Neutral 600 — secondaryLight\n$search-result-preview-color: #555668;\n\n// Code\n$code-background-color: #ECEDF3; // Neutral 100\n$code-linenumber-color: #9496A6; // Neutral 400\n\n// Borders\n$border-color: #D5D6E0; // Neutral 200 — outlineVariantLight\n$table-background-color: #F5F6FA; // Neutral 50\n\n// Buttons\n$btn-primary-color: #2D8F52; // Green 700\n\n// Feedback / callouts\n$feedback-color: #E0E1EB; // surfaceContainerHighLight\n\n// Search\n$search-background-color: #FFFFFF; // surfaceContainerLowestLight\n","@mixin fs-1 {\n & {\n font-size: $font-size-1 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-1-sm !important;\n }\n}\n\n@mixin fs-2 {\n & {\n font-size: $font-size-2 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-3 !important;\n }\n}\n\n@mixin fs-3 {\n & {\n font-size: $font-size-3 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-4 !important;\n }\n}\n\n@mixin fs-4 {\n & {\n font-size: $font-size-4 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-5 !important;\n }\n}\n\n@mixin fs-5 {\n & {\n font-size: $font-size-5 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-6 !important;\n }\n}\n\n@mixin fs-6 {\n & {\n font-size: $font-size-6 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n}\n\n@mixin fs-7 {\n & {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-8 !important;\n }\n}\n\n@mixin fs-8 {\n & {\n font-size: $font-size-8 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-9 !important;\n }\n}\n\n@mixin fs-9 {\n & {\n font-size: $font-size-9 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10 !important;\n }\n}\n\n@mixin fs-10 {\n & {\n font-size: $font-size-10 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10-sm !important;\n }\n}\n","// Media query\n\n// Media query mixin\n// Usage:\n// @include mq(md) {\n// ..medium and up styles\n// }\n@mixin mq($name) {\n // Retrieves the value from the key\n $value: map-get($media-queries, $name);\n\n // If the key exists in the map\n @if $value {\n // Prints a media query based on the value\n @media (min-width: $value) {\n @content;\n }\n } @else {\n @warn \"No value could be retrieved from `#{$media-query}`. Please make sure it is defined in `$media-queries` map.\";\n }\n}\n\n// Responsive container\n\n@mixin container {\n padding-right: $gutter-spacing-sm;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-right: $gutter-spacing;\n padding-left: $gutter-spacing;\n }\n}\n","// Typography\n\n// prettier-ignore\n$body-font-family: system-ui, -apple-system, blinkmacsystemfont, \"Segoe UI\",\n roboto, \"Helvetica Neue\", arial, sans-serif, \"Segoe UI Emoji\" !default;\n$mono-font-family: \"SFMono-Regular\", menlo, consolas, monospace !default;\n$root-font-size: 16px !default; // DEPRECATED: previously base font-size for rems\n$body-line-height: 1.4 !default;\n$content-line-height: 1.6 !default;\n$body-heading-line-height: 1.25 !default;\n\n// Font size\n// `-sm` suffix is the size at the small (and above) media query\n\n$font-size-1: 0.5625rem !default;\n$font-size-1-sm: 0.625rem !default;\n$font-size-2: 0.6875rem !default; // h4 - uppercased!, h6 not uppercased, text-small\n$font-size-3: 0.75rem !default; // h5\n$font-size-4: 0.875rem !default;\n$font-size-5: 1rem !default; // h3\n$font-size-6: 1.125rem !default; // h2\n$font-size-7: 1.5rem !default;\n$font-size-8: 2rem !default; // h1\n$font-size-9: 2.25rem !default;\n$font-size-10: 2.625rem !default;\n$font-size-10-sm: 3rem !default;\n\n// Colors\n\n$white: #fff !default;\n$grey-dk-000: #959396 !default;\n$grey-dk-100: #5c5962 !default;\n$grey-dk-200: #44434d !default;\n$grey-dk-250: #302d36 !default;\n$grey-dk-300: #27262b !default;\n$grey-lt-000: #f5f6fa !default;\n$grey-lt-100: #eeebee !default;\n$grey-lt-200: #ecebed !default;\n$grey-lt-300: #e6e1e8 !default;\n$purple-000: #7253ed !default;\n$purple-100: #5e41d0 !default;\n$purple-200: #4e26af !default;\n$purple-300: #381885 !default;\n$blue-000: #2c84fa !default;\n$blue-100: #2869e6 !default;\n$blue-200: #264caf !default;\n$blue-300: #183385 !default;\n$green-000: #41d693 !default;\n$green-100: #11b584 !default;\n$green-200: #009c7b !default;\n$green-300: #026e57 !default;\n$yellow-000: #ffeb82 !default;\n$yellow-100: #fadf50 !default;\n$yellow-200: #f7d12e !default;\n$yellow-300: #e7af06 !default;\n$red-000: #f77e7e !default;\n$red-100: #f96e65 !default;\n$red-200: #e94c4c !default;\n$red-300: #dd2e2e !default;\n\n// Spacing\n\n$spacing-unit: 1rem; // 1rem == 16px\n\n$spacers: (\n sp-0: 0,\n sp-1: $spacing-unit * 0.25,\n sp-2: $spacing-unit * 0.5,\n sp-3: $spacing-unit * 0.75,\n sp-4: $spacing-unit,\n sp-5: $spacing-unit * 1.5,\n sp-6: $spacing-unit * 2,\n sp-7: $spacing-unit * 2.5,\n sp-8: $spacing-unit * 3,\n sp-9: $spacing-unit * 3.5,\n sp-10: $spacing-unit * 4,\n) !default;\n$sp-1: map-get($spacers, sp-1) !default; // 0.25 rem == 4px\n$sp-2: map-get($spacers, sp-2) !default; // 0.5 rem == 8px\n$sp-3: map-get($spacers, sp-3) !default; // 0.75 rem == 12px\n$sp-4: map-get($spacers, sp-4) !default; // 1 rem == 16px\n$sp-5: map-get($spacers, sp-5) !default; // 1.5 rem == 24px\n$sp-6: map-get($spacers, sp-6) !default; // 2 rem == 32px\n$sp-7: map-get($spacers, sp-7) !default; // 2.5 rem == 40px\n$sp-8: map-get($spacers, sp-8) !default; // 3 rem == 48px\n$sp-9: map-get($spacers, sp-9) !default; // 3.5 rem == 56px\n$sp-10: map-get($spacers, sp-10) !default; // 4 rem == 64px\n\n// Borders\n\n$border: 1px solid !default;\n$border-radius: 4px !default;\n$border-color: $grey-lt-100 !default;\n\n// Grid system\n\n$gutter-spacing: $sp-6 !default;\n$gutter-spacing-sm: $sp-4 !default;\n$nav-width: 16.5rem !default;\n$nav-width-md: 15.5rem !default;\n$nav-list-item-height: $sp-6 !default;\n$nav-list-item-height-sm: $sp-8 !default;\n$nav-list-expander-right: true;\n$content-width: 50rem !default;\n$header-height: 3.75rem !default;\n$search-results-width: $content-width - $nav-width !default;\n$transition-duration: 400ms;\n\n// Media queries in pixels\n\n$media-queries: (\n xs: 20rem,\n sm: 31.25rem,\n md: $content-width,\n lg: $content-width + $nav-width,\n xl: 87.5rem,\n) !default;\n","// The basic two column layout\n\n.side-bar {\n z-index: 0;\n display: flex;\n flex-wrap: wrap;\n background-color: $sidebar-color;\n\n @include mq(md) {\n flex-flow: column nowrap;\n position: fixed;\n width: $nav-width-md;\n height: 100%;\n border-right: $border $border-color;\n align-items: flex-end;\n }\n\n @include mq(lg) {\n width: calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width});\n min-width: $nav-width;\n }\n\n & + .main {\n @include mq(md) {\n margin-left: $nav-width-md;\n }\n\n @include mq(lg) {\n // stylelint-disable function-name-case\n // disable for Max(), we want to use the CSS max() function\n margin-left: Max(\n #{$nav-width},\n calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width})\n );\n // stylelint-enable function-name-case\n }\n\n .main-header {\n display: none;\n background-color: $sidebar-color;\n\n @include mq(md) {\n display: flex;\n background-color: $body-background-color;\n }\n\n &.nav-open {\n display: block;\n\n @include mq(md) {\n display: flex;\n }\n }\n }\n }\n}\n\n.main {\n margin: auto;\n\n @include mq(md) {\n position: relative;\n max-width: $content-width;\n }\n}\n\n.main-content-wrap {\n padding-top: $gutter-spacing-sm;\n padding-bottom: $gutter-spacing-sm;\n\n @include container;\n\n @include mq(md) {\n padding-top: $gutter-spacing;\n padding-bottom: $gutter-spacing;\n }\n}\n\n.main-header {\n z-index: 0;\n border-bottom: $border $border-color;\n\n @include mq(md) {\n display: flex;\n justify-content: space-between;\n height: $header-height;\n }\n}\n\n.site-nav,\n.site-header,\n.site-footer {\n width: 100%;\n\n @include mq(lg) {\n width: $nav-width;\n }\n}\n\n.site-nav {\n display: none;\n\n &.nav-open {\n display: block;\n }\n\n @include mq(md) {\n display: block;\n padding-top: $sp-8;\n padding-bottom: $gutter-spacing-sm;\n overflow-y: auto;\n flex: 1 1 auto;\n }\n}\n\n.site-header {\n display: flex;\n min-height: $header-height;\n align-items: center;\n\n @include mq(md) {\n height: $header-height;\n max-height: $header-height;\n border-bottom: $border $border-color;\n }\n}\n\n.site-title {\n flex-grow: 1;\n display: flex;\n height: 100%;\n align-items: center;\n padding-top: $sp-3;\n padding-bottom: $sp-3;\n color: $body-heading-color;\n\n @include container;\n\n @include fs-6;\n\n @include mq(md) {\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n }\n}\n\n@if variable-exists(logo) {\n .site-logo {\n width: 100%;\n height: 100%;\n background-image: url($logo);\n background-repeat: no-repeat;\n background-position: left center;\n background-size: contain;\n }\n}\n\n.site-button {\n display: flex;\n height: 100%;\n padding: $gutter-spacing-sm;\n align-items: center;\n}\n\n@include mq(md) {\n .site-header .site-button {\n display: none;\n }\n}\n\n.site-title:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n}\n\n.site-button:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n}\n\n.site-footer {\n position: absolute;\n bottom: 0;\n left: 0;\n padding-top: $sp-4;\n padding-bottom: $sp-4;\n\n @include container;\n\n @include fs-2;\n\n @include mq(md) {\n position: static;\n justify-self: end;\n }\n}\n\n.icon {\n width: $sp-5;\n height: $sp-5;\n color: $link-color;\n}\n","@charset \"UTF-8\";\n\n// Styles for rendered markdown in the .main-content container\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity, selector-max-id\n\n.main-content {\n line-height: $content-line-height;\n\n ol,\n ul,\n dl,\n pre,\n address,\n blockquote,\n .table-wrapper {\n margin-top: 0.5em;\n }\n\n a {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n ul,\n ol {\n padding-left: 1.5em;\n }\n\n li {\n .highlight {\n margin-top: $sp-1;\n }\n }\n\n ol {\n list-style-type: none;\n counter-reset: step-counter;\n\n > li {\n position: relative;\n\n &::before {\n position: absolute;\n top: 0.2em;\n left: -1.6em;\n color: $grey-dk-000;\n content: counter(step-counter);\n counter-increment: step-counter;\n @include fs-3;\n\n @include mq(sm) {\n top: 0.11em;\n }\n }\n\n ol {\n counter-reset: sub-counter;\n\n > li {\n &::before {\n content: counter(sub-counter, lower-alpha);\n counter-increment: sub-counter;\n }\n }\n }\n }\n }\n\n ul {\n list-style: none;\n\n > li {\n &::before {\n position: absolute;\n margin-left: -1.4em;\n color: $grey-dk-000;\n content: \"•\";\n }\n }\n }\n\n .task-list-item {\n &::before {\n content: \"\";\n }\n }\n\n .task-list-item-checkbox {\n margin-right: 0.6em;\n margin-left: -1.4em;\n\n // The same margin-left is used above for ul > li::before\n }\n\n hr + * {\n margin-top: 0;\n }\n\n h1:first-of-type {\n margin-top: 0.5em;\n }\n\n dl {\n display: grid;\n grid-template: auto / 10em 1fr;\n }\n\n dt,\n dd {\n margin: 0.25em 0;\n }\n\n dt {\n grid-column: 1;\n font-weight: 500;\n text-align: right;\n\n &::after {\n content: \":\";\n }\n }\n\n dd {\n grid-column: 2;\n margin-bottom: 0;\n margin-left: 1em;\n\n blockquote,\n div,\n dl,\n dt,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n li,\n ol,\n p,\n pre,\n table,\n ul,\n .table-wrapper {\n &:first-child {\n margin-top: 0;\n }\n }\n }\n\n dd,\n ol,\n ul {\n dl:first-child {\n dt:first-child,\n dd:nth-child(2) {\n margin-top: 0;\n }\n }\n }\n\n .anchor-heading {\n position: absolute;\n right: -$sp-4;\n width: $sp-5;\n height: 100%;\n padding-right: $sp-1;\n padding-left: $sp-1;\n overflow: visible;\n\n @include mq(md) {\n right: auto;\n left: -$sp-5;\n }\n\n svg {\n display: inline-block;\n width: 100%;\n height: 100%;\n color: $link-color;\n visibility: hidden;\n }\n }\n\n .anchor-heading:hover,\n .anchor-heading:focus,\n h1:hover > .anchor-heading,\n h2:hover > .anchor-heading,\n h3:hover > .anchor-heading,\n h4:hover > .anchor-heading,\n h5:hover > .anchor-heading,\n h6:hover > .anchor-heading {\n svg {\n visibility: visible;\n }\n }\n\n summary {\n cursor: pointer;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n #toctitle {\n position: relative;\n margin-top: 1.5em;\n margin-bottom: 0.25em;\n\n + table,\n + .table-wrapper,\n + .code-example,\n + .highlighter-rouge,\n + .sectionbody .listingblock {\n margin-top: 1em;\n }\n\n + p:not(.label) {\n margin-top: 0;\n }\n }\n\n > h1:first-child,\n > h2:first-child,\n > h3:first-child,\n > h4:first-child,\n > h5:first-child,\n > h6:first-child,\n > .sect1:first-child > h2,\n > .sect2:first-child > h3,\n > .sect3:first-child > h4,\n > .sect4:first-child > h5,\n > .sect5:first-child > h6 {\n margin-top: $sp-2;\n }\n}\n","// Main nav, breadcrumb, etc...\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity\n\n.nav-list {\n padding: 0;\n margin-top: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n margin: 0;\n\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n\n .nav-list-link {\n display: block;\n min-height: $nav-list-item-height-sm;\n padding-top: $sp-1;\n padding-bottom: $sp-1;\n line-height: #{$nav-list-item-height-sm - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height-sm;\n padding-left: $gutter-spacing-sm;\n } @else {\n padding-right: $gutter-spacing-sm;\n padding-left: $nav-list-item-height-sm;\n }\n\n @include mq(md) {\n min-height: $nav-list-item-height;\n line-height: #{$nav-list-item-height - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height;\n padding-left: $gutter-spacing;\n } @else {\n padding-right: $gutter-spacing;\n padding-left: $nav-list-item-height;\n }\n }\n\n &.external > svg {\n width: $sp-4;\n height: $sp-4;\n vertical-align: text-bottom;\n }\n\n &.active {\n font-weight: 600;\n text-decoration: none;\n }\n\n &:hover,\n &.active {\n color: darken($link-color, 5%);\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n }\n }\n\n .nav-list-expander {\n position: absolute;\n @if $nav-list-expander-right {\n right: 0;\n }\n\n width: $nav-list-item-height-sm;\n height: $nav-list-item-height-sm;\n padding: #{$nav-list-item-height-sm * 0.25};\n color: $link-color;\n\n @include mq(md) {\n width: $nav-list-item-height;\n height: $nav-list-item-height;\n padding: #{$nav-list-item-height * 0.25};\n }\n\n &:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n }\n\n @if $nav-list-expander-right {\n svg {\n transform: rotate(90deg);\n }\n }\n }\n\n > .nav-list {\n display: none;\n padding-left: $sp-3;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n\n .nav-list-link {\n color: $nav-child-link-color;\n }\n\n .nav-list-expander {\n color: $nav-child-link-color;\n }\n }\n }\n\n &.active {\n > .nav-list-expander svg {\n @if $nav-list-expander-right {\n transform: rotate(-90deg);\n } @else {\n transform: rotate(90deg);\n }\n }\n\n > .nav-list {\n display: block;\n }\n }\n }\n}\n\n.nav-category {\n padding: $sp-2 $gutter-spacing-sm;\n font-weight: 600;\n text-align: start;\n text-transform: uppercase;\n border-bottom: $border $border-color;\n @include fs-2;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing;\n margin-top: $gutter-spacing-sm;\n text-align: start;\n\n &:first-child {\n margin-top: 0;\n }\n }\n}\n\n.nav-list.nav-category-list {\n > .nav-list-item {\n margin: 0;\n\n > .nav-list {\n padding: 0;\n\n > .nav-list-item {\n > .nav-list-link {\n color: $link-color;\n }\n\n > .nav-list-expander {\n color: $link-color;\n }\n }\n }\n }\n}\n\n// Aux nav\n\n.aux-nav {\n height: 100%;\n overflow-x: auto;\n @include fs-2;\n\n .aux-nav-list {\n display: flex;\n height: 100%;\n padding: 0;\n margin: 0;\n list-style: none;\n }\n\n .aux-nav-list-item {\n display: inline-block;\n height: 100%;\n padding: 0;\n margin: 0;\n }\n\n @include mq(md) {\n padding-right: $gutter-spacing-sm;\n }\n}\n\n// Breadcrumb nav\n\n.breadcrumb-nav {\n @include mq(md) {\n margin-top: -$sp-4;\n }\n}\n\n.breadcrumb-nav-list {\n padding-left: 0;\n margin-bottom: $sp-3;\n list-style: none;\n}\n\n.breadcrumb-nav-list-item {\n display: table-cell;\n @include fs-2;\n\n &::before {\n display: none;\n }\n\n &::after {\n display: inline-block;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $grey-dk-000;\n content: \"/\";\n }\n\n &:last-child {\n &::after {\n content: \"\";\n }\n }\n}\n","// Typography\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\nh1,\n.text-alpha {\n font-weight: 300;\n\n @include fs-8;\n}\n\nh2,\n.text-beta,\n#toctitle {\n @include fs-6;\n}\n\nh3,\n.text-gamma {\n @include fs-5;\n}\n\nh4,\n.text-delta {\n font-weight: 400;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n\n @include fs-2;\n}\n\nh4 code {\n text-transform: none;\n}\n\nh5,\n.text-epsilon {\n @include fs-3;\n}\n\nh6,\n.text-zeta {\n @include fs-2;\n}\n\n.text-small {\n @include fs-2;\n}\n\n.text-mono {\n font-family: $mono-font-family !important;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n","// Labels (not the form kind)\n\n// this :not() prevents a style clash with Mermaid.js's\n// diagram labels, which also use .label\n// for more, see https://github.com/just-the-docs/just-the-docs/issues/1272\n// and the accompanying PR\n.label:not(g),\n.label-blue:not(g) {\n display: inline-block;\n padding: 0.16em 0.56em;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $white;\n text-transform: uppercase;\n vertical-align: middle;\n background-color: $blue-100;\n border-radius: 12px;\n\n @include fs-2;\n}\n\n.label-green:not(g) {\n background-color: $green-300;\n}\n\n.label-purple:not(g) {\n background-color: $purple-100;\n}\n\n.label-red:not(g) {\n background-color: $red-300;\n}\n\n.label-yellow:not(g) {\n color: $grey-dk-200;\n background-color: $yellow-200;\n}\n","// Buttons and things that look like buttons\n// stylelint-disable color-named\n\n.btn {\n display: inline-block;\n box-sizing: border-box;\n padding: 0.3em 1em;\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n font-weight: 500;\n line-height: 1.5;\n color: $link-color;\n text-decoration: none;\n vertical-align: baseline;\n cursor: pointer;\n background-color: $base-button-color;\n border-width: 0;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n appearance: none;\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: darken($link-color, 2%);\n }\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n text-decoration: none;\n background-color: darken($base-button-color, 1%);\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($base-button-color, 3%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken(#dcdcdc, 5%);\n }\n\n &:disabled,\n &.disabled {\n &,\n &:hover {\n color: rgba(102, 102, 102, 0.5);\n cursor: default;\n background-color: rgba(229, 229, 229, 0.5);\n background-image: none;\n box-shadow: none;\n }\n }\n}\n\n.btn-outline {\n color: $link-color;\n background: transparent;\n box-shadow: inset 0 0 0 2px $grey-lt-300;\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n color: darken($link-color, 4%);\n text-decoration: none;\n background-color: transparent;\n box-shadow: inset 0 0 0 3px $grey-lt-300;\n }\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow:\n inset 0 0 0 2px $grey-dk-100,\n 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: inset 0 0 0 2px $grey-dk-100;\n }\n}\n\n.btn-primary {\n @include btn-color($white, $btn-primary-color);\n}\n\n.btn-purple {\n @include btn-color($white, $purple-100);\n}\n\n.btn-blue {\n @include btn-color($white, $blue-200);\n}\n\n.btn-green {\n @include btn-color($white, $green-300);\n}\n\n.btn-reset {\n background: none;\n border: none;\n margin: 0;\n text-align: inherit;\n font: inherit;\n border-radius: 0;\n appearance: none;\n}\n","$color-scheme: light !default;\n$body-background-color: $white !default;\n$body-heading-color: $grey-dk-300 !default;\n$body-text-color: $grey-dk-100 !default;\n$link-color: $purple-000 !default;\n$nav-child-link-color: $grey-dk-100 !default;\n$sidebar-color: $grey-lt-000 !default;\n$base-button-color: #f7f7f7 !default;\n$btn-primary-color: $purple-100 !default;\n$code-background-color: $white !default;\n$feedback-color: darken($sidebar-color, 3%) !default;\n$table-background-color: $white !default;\n$search-background-color: $white !default;\n$search-result-preview-color: $grey-dk-100 !default;\n\n@import \"./vendor/accessible-pygments/github-light\";\n","// Colored button\n\n@mixin btn-color($fg, $bg) {\n color: $fg;\n background-color: darken($bg, 2%);\n background-image: linear-gradient(lighten($bg, 5%), darken($bg, 2%));\n box-shadow:\n 0 1px 3px rgba(0, 0, 0, 0.25),\n 0 4px 10px rgba(0, 0, 0, 0.12);\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: $fg;\n background-color: darken($bg, 4%);\n background-image: linear-gradient((lighten($bg, 2%), darken($bg, 4%)));\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($bg, 5%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken($bg, 10%);\n }\n}\n","// Search input and autocomplete\n\n.search {\n position: relative;\n z-index: 2;\n flex-grow: 1;\n height: $sp-10;\n padding: $sp-2;\n transition: padding linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: relative !important;\n width: auto !important;\n height: 100% !important;\n padding: 0;\n transition: none;\n }\n}\n\n.search-input-wrap {\n position: relative;\n z-index: 1;\n height: $sp-8;\n overflow: hidden;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n transition: height linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: absolute;\n width: 100%;\n max-width: $search-results-width;\n height: 100% !important;\n border-radius: 0;\n box-shadow: none;\n transition: width ease $transition-duration;\n }\n}\n\n.search-input {\n position: absolute;\n width: 100%;\n height: 100%;\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing-sm + $sp-5};\n font-size: 1rem;\n color: $body-text-color;\n background-color: $search-background-color;\n border-top: 0;\n border-right: 0;\n border-bottom: 0;\n border-left: 0;\n border-radius: 0;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing + $sp-5};\n font-size: 0.875rem;\n background-color: $body-background-color;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n &:focus {\n outline: 2px solid $link-color;\n outline-offset: -2px;\n\n + .search-label .search-icon {\n color: $link-color;\n }\n }\n}\n\n.search-label {\n position: absolute;\n display: flex;\n height: 100%;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-left: $gutter-spacing;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n .search-icon {\n width: #{$sp-4 * 1.2};\n height: #{$sp-4 * 1.2};\n align-self: center;\n color: $grey-dk-000;\n }\n}\n\n.search-results {\n position: absolute;\n left: 0;\n display: none;\n width: 100%;\n max-height: calc(100% - #{$sp-10});\n overflow-y: auto;\n background-color: $search-background-color;\n border-bottom-right-radius: $border-radius;\n border-bottom-left-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n\n @include mq(md) {\n top: 100%;\n width: $search-results-width;\n max-height: calc(100vh - 200%) !important;\n }\n}\n\n.search-results-list {\n padding-left: 0;\n margin-bottom: $sp-1;\n list-style: none;\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n}\n\n.search-results-list-item {\n padding: 0;\n margin: 0;\n}\n\n.search-result {\n display: block;\n padding: $sp-1 $sp-3;\n\n &:hover,\n &.active {\n background-color: $feedback-color;\n }\n}\n\n.search-result-title {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 40%;\n padding-right: $sp-2;\n vertical-align: top;\n }\n}\n\n.search-result-doc {\n display: flex;\n align-items: center;\n word-wrap: break-word;\n\n &.search-result-doc-parent {\n opacity: 0.5;\n @include fs-3;\n\n @include mq(md) {\n @include fs-2;\n }\n }\n\n .search-result-icon {\n width: $sp-4;\n height: $sp-4;\n margin-right: $sp-2;\n color: $link-color;\n flex-shrink: 0;\n }\n\n .search-result-doc-title {\n overflow: auto;\n }\n}\n\n.search-result-section {\n margin-left: #{$sp-4 + $sp-2};\n word-wrap: break-word;\n}\n\n.search-result-rel-url {\n display: block;\n margin-left: #{$sp-4 + $sp-2};\n overflow: hidden;\n color: $search-result-preview-color;\n text-overflow: ellipsis;\n white-space: nowrap;\n @include fs-1;\n}\n\n.search-result-previews {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n padding-left: $sp-4;\n margin-left: $sp-2;\n color: $search-result-preview-color;\n word-wrap: break-word;\n border-left: $border;\n border-left-color: $border-color;\n @include fs-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 60%;\n padding-left: $sp-2;\n margin-left: 0;\n vertical-align: top;\n }\n}\n\n.search-result-preview + .search-result-preview {\n margin-top: $sp-1;\n}\n\n.search-result-highlight {\n font-weight: bold;\n}\n\n.search-no-result {\n padding: $sp-2 $sp-3;\n @include fs-3;\n}\n\n.search-button {\n position: fixed;\n right: $sp-4;\n bottom: $sp-4;\n display: flex;\n width: $sp-9;\n height: $sp-9;\n background-color: $search-background-color;\n border: 1px solid rgba($link-color, 0.3);\n border-radius: #{$sp-9 * 0.5};\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n align-items: center;\n justify-content: center;\n}\n\n.search-overlay {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1;\n width: 0;\n height: 0;\n background-color: rgba(0, 0, 0, 0.3);\n opacity: 0;\n transition:\n opacity ease $transition-duration,\n width 0s $transition-duration,\n height 0s $transition-duration;\n}\n\n.search-active {\n .search {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .search-input-wrap {\n height: $sp-10;\n border-radius: 0;\n\n @include mq(md) {\n width: $search-results-width;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n }\n }\n\n .search-input {\n background-color: $search-background-color;\n\n @include mq(md) {\n padding-left: 2.3rem;\n }\n }\n\n .search-label {\n @include mq(md) {\n padding-left: 0.6rem;\n }\n }\n\n .search-results {\n display: block;\n }\n\n .search-overlay {\n width: 100%;\n height: 100%;\n opacity: 1;\n transition:\n opacity ease $transition-duration,\n width 0s,\n height 0s;\n }\n\n @include mq(md) {\n .main {\n position: fixed;\n right: 0;\n left: 0;\n }\n }\n\n .main-header {\n padding-top: $sp-10;\n\n @include mq(md) {\n padding-top: 0;\n }\n }\n}\n","// Tables\n// stylelint-disable max-nesting-depth, selector-no-type, selector-max-type\n\n.table-wrapper {\n display: block;\n width: 100%;\n max-width: 100%;\n margin-bottom: $sp-5;\n overflow-x: auto;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n}\n\ntable {\n display: table;\n min-width: 100%;\n border-collapse: separate;\n}\n\nth,\ntd {\n min-width: 7.5rem;\n padding: $sp-2 $sp-3;\n background-color: $table-background-color;\n border-bottom: $border rgba($border-color, 0.5);\n border-left: $border $border-color;\n\n @include fs-3;\n\n &:first-of-type {\n border-left: 0;\n }\n}\n\ntbody {\n tr {\n &:last-of-type {\n th,\n td {\n border-bottom: 0;\n }\n\n td {\n padding-bottom: $sp-3;\n }\n }\n }\n}\n\nthead {\n th {\n border-bottom: $border $border-color;\n }\n}\n","// Code and syntax highlighting\n// stylelint-disable selector-no-qualifying-type, declaration-block-semicolon-newline-after,declaration-block-single-line-max-declarations, selector-no-type, selector-max-type, scss/comment-no-empty\n\n// {% raw %}\n\n// This instruction applies to all queues not within 'pre' or 'figure', avoiding 'code' generated by the highlight.\n:not(pre, figure) {\n & > code {\n padding: 0.2em 0.15em;\n font-weight: 400;\n background-color: $code-background-color;\n border: $border $border-color;\n border-radius: $border-radius;\n }\n}\n\n// Avoid appearance of dark border around visited code links in Safari\na:visited code {\n border-color: $border-color;\n}\n\n// Content structure for highlighted code blocks using fences or Liquid\n//\n// ```[LANG]...```, no kramdown line_numbers:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n//\n// ```[LANG]...```, kramdown line_numbers = true:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.rouge-gutter.gl > pre.lineno\n// | td.rouge-code > pre\n//\n// {% highlight LANG %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n//\n// {% highlight LANG linenos %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.gutter.gl > pre.lineno\n// | td.code > pre\n//\n// ----...---- (AsciiDoc)\n// div.listingblock > div.content > pre.rouge.highlight\n//\n// fix_linenos removes the outermost pre when it encloses table.rouge-table\n//\n// See docs/index-test.md for some tests.\n//\n// No kramdown line_numbers: fences and Liquid highlighting look the same.\n// Kramdown line_numbers = true: fences have a wider gutter than with Liquid?\n\n// ```[LANG]...```\n// or in AsciiDoc:\n//\n// ----\n// ...\n// ----\n\n// the code may appear with 3 different types:\n// container \\ case: default case, code with line number, code with html rendering\n// top level: div.highlighter-rouge, figure.highlight, figure.highlight\n// second level: div.highlight, div.table-wrapper, pre.highlight\n// third level: pre.highlight, td.code, absent\n// last level: code, pre, code (optionality)\n// highlighter level: span, span, span\n// the spacing are only in the second level for case 1, 3 and in the third level for case 2\n// in AsciiDoc, there is a parent container that contains optionally a title and the content.\n\n// select top level container\ndiv.highlighter-rouge,\ndiv.listingblock > div.content,\nfigure.highlight {\n margin-top: 0;\n margin-bottom: $sp-3;\n background-color: $code-background-color;\n border-radius: $border-radius;\n box-shadow: none;\n -webkit-overflow-scrolling: touch;\n position: relative;\n padding: 0;\n\n // copy button (or other button)\n // the button appear only when there is a hover on the code or focus on button\n > button {\n width: $sp-3;\n opacity: 0;\n position: absolute;\n top: 0;\n right: 0;\n padding: $sp-3;\n border: none;\n background: none;\n color: $body-text-color;\n box-sizing: content-box;\n\n svg {\n fill: $body-text-color;\n }\n\n &:active {\n text-decoration: none;\n outline: none;\n opacity: 1;\n }\n\n &:focus {\n opacity: 1;\n outline: 2px solid $link-color;\n }\n }\n\n // the button can be seen by doing a simple hover in the code, there is no need to go over the location of the button\n &:hover {\n > button {\n cursor: copy;\n opacity: 1;\n }\n }\n}\n\n// setting the spacing and scrollbar on the second level for the first case\n// remove all space on the second and third level\n// this is a mixin to accommodate for the slightly different structures generated via Markdown vs AsciiDoc\n@mixin scroll-and-spacing($code-div, $pre-select) {\n #{$code-div} {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n\n #{$pre-select},\n code {\n padding: 0;\n margin: 0;\n border: 0;\n }\n}\n\n// for Markdown\ndiv.highlighter-rouge {\n @include scroll-and-spacing(\"div.highlight\", \"pre.highlight\");\n}\n\n// for AsciiDoc. we also need to fix the margins for its parent container.\ndiv.listingblock {\n margin-top: 0;\n margin-bottom: $sp-3;\n\n @include scroll-and-spacing(\"div.content\", \"div.content > pre\");\n}\n\n// {% highlight LANG %}...{% endhighlight %},\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the second level for the thirt case\n// the css rule are apply only to the last code enviroment\n// setting the scroolbar\nfigure.highlight {\n pre,\n :not(pre) > code {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n}\n\n// ```[LANG]...```, kramdown line_numbers = true,\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the thirt level for the second case\n.highlight .table-wrapper {\n padding: $sp-3 0;\n margin: 0;\n border: 0;\n box-shadow: none;\n\n td,\n pre {\n min-width: 0;\n padding: 0;\n background-color: $code-background-color;\n border: 0;\n\n @include fs-2;\n }\n\n td.gl {\n width: 1em;\n padding-right: $sp-3;\n padding-left: $sp-3;\n }\n\n pre {\n margin: 0;\n line-height: 2;\n }\n}\n\n// Code examples: html render of a code\n.code-example,\n.listingblock > .title {\n padding: $sp-3;\n margin-bottom: $sp-3;\n overflow: auto;\n border: 1px solid $border-color;\n border-radius: $border-radius;\n\n + .highlighter-rouge,\n + .sectionbody .listingblock,\n + .content,\n + figure.highlight {\n position: relative;\n margin-top: -$sp-4;\n border-right: 1px solid $border-color;\n border-bottom: 1px solid $border-color;\n border-left: 1px solid $border-color;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n}\n\n// Mermaid diagram code blocks should be left unstyled.\ncode.language-mermaid {\n padding: 0;\n background-color: inherit;\n border: 0;\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight,\npre.highlight {\n background: $code-background-color; // Code Background\n // For Backwards Compatibility Before $code-linenumber-color was added\n @if variable-exists(code-linenumber-color) {\n color: $code-linenumber-color; // Code Line Numbers\n } @else {\n color: $body-text-color; // Code Line Numbers\n }\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight pre {\n background: $code-background-color; // Code Background\n}\n\n// {% endraw %}\n","// Utility classes for colors\n\n// Text colors\n\n.text-grey-dk-000 {\n color: $grey-dk-000 !important;\n}\n\n.text-grey-dk-100 {\n color: $grey-dk-100 !important;\n}\n\n.text-grey-dk-200 {\n color: $grey-dk-200 !important;\n}\n\n.text-grey-dk-250 {\n color: $grey-dk-250 !important;\n}\n\n.text-grey-dk-300 {\n color: $grey-dk-300 !important;\n}\n\n.text-grey-lt-000 {\n color: $grey-lt-000 !important;\n}\n\n.text-grey-lt-100 {\n color: $grey-lt-100 !important;\n}\n\n.text-grey-lt-200 {\n color: $grey-lt-200 !important;\n}\n\n.text-grey-lt-300 {\n color: $grey-lt-300 !important;\n}\n\n.text-blue-000 {\n color: $blue-000 !important;\n}\n\n.text-blue-100 {\n color: $blue-100 !important;\n}\n\n.text-blue-200 {\n color: $blue-200 !important;\n}\n\n.text-blue-300 {\n color: $blue-300 !important;\n}\n\n.text-green-000 {\n color: $green-000 !important;\n}\n\n.text-green-100 {\n color: $green-100 !important;\n}\n\n.text-green-200 {\n color: $green-200 !important;\n}\n\n.text-green-300 {\n color: $green-300 !important;\n}\n\n.text-purple-000 {\n color: $purple-000 !important;\n}\n\n.text-purple-100 {\n color: $purple-100 !important;\n}\n\n.text-purple-200 {\n color: $purple-200 !important;\n}\n\n.text-purple-300 {\n color: $purple-300 !important;\n}\n\n.text-yellow-000 {\n color: $yellow-000 !important;\n}\n\n.text-yellow-100 {\n color: $yellow-100 !important;\n}\n\n.text-yellow-200 {\n color: $yellow-200 !important;\n}\n\n.text-yellow-300 {\n color: $yellow-300 !important;\n}\n\n.text-red-000 {\n color: $red-000 !important;\n}\n\n.text-red-100 {\n color: $red-100 !important;\n}\n\n.text-red-200 {\n color: $red-200 !important;\n}\n\n.text-red-300 {\n color: $red-300 !important;\n}\n\n// Background colors\n\n.bg-grey-dk-000 {\n background-color: $grey-dk-000 !important;\n}\n\n.bg-grey-dk-100 {\n background-color: $grey-dk-100 !important;\n}\n\n.bg-grey-dk-200 {\n background-color: $grey-dk-200 !important;\n}\n\n.bg-grey-dk-250 {\n background-color: $grey-dk-250 !important;\n}\n\n.bg-grey-dk-300 {\n background-color: $grey-dk-300 !important;\n}\n\n.bg-grey-lt-000 {\n background-color: $grey-lt-000 !important;\n}\n\n.bg-grey-lt-100 {\n background-color: $grey-lt-100 !important;\n}\n\n.bg-grey-lt-200 {\n background-color: $grey-lt-200 !important;\n}\n\n.bg-grey-lt-300 {\n background-color: $grey-lt-300 !important;\n}\n\n.bg-blue-000 {\n background-color: $blue-000 !important;\n}\n\n.bg-blue-100 {\n background-color: $blue-100 !important;\n}\n\n.bg-blue-200 {\n background-color: $blue-200 !important;\n}\n\n.bg-blue-300 {\n background-color: $blue-300 !important;\n}\n\n.bg-green-000 {\n background-color: $green-000 !important;\n}\n\n.bg-green-100 {\n background-color: $green-100 !important;\n}\n\n.bg-green-200 {\n background-color: $green-200 !important;\n}\n\n.bg-green-300 {\n background-color: $green-300 !important;\n}\n\n.bg-purple-000 {\n background-color: $purple-000 !important;\n}\n\n.bg-purple-100 {\n background-color: $purple-100 !important;\n}\n\n.bg-purple-200 {\n background-color: $purple-200 !important;\n}\n\n.bg-purple-300 {\n background-color: $purple-300 !important;\n}\n\n.bg-yellow-000 {\n background-color: $yellow-000 !important;\n}\n\n.bg-yellow-100 {\n background-color: $yellow-100 !important;\n}\n\n.bg-yellow-200 {\n background-color: $yellow-200 !important;\n}\n\n.bg-yellow-300 {\n background-color: $yellow-300 !important;\n}\n\n.bg-red-000 {\n background-color: $red-000 !important;\n}\n\n.bg-red-100 {\n background-color: $red-100 !important;\n}\n\n.bg-red-200 {\n background-color: $red-200 !important;\n}\n\n.bg-red-300 {\n background-color: $red-300 !important;\n}\n","// Utility classes for layout\n\n// Display\n\n.d-block {\n display: block !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n// Screenreader-only\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .d-sm-block, .d-md-none, .d-lg-inline\n .d-#{$media-query}-block {\n display: block !important;\n }\n .d-#{$media-query}-flex {\n display: flex !important;\n }\n .d-#{$media-query}-inline {\n display: inline !important;\n }\n .d-#{$media-query}-inline-block {\n display: inline-block !important;\n }\n .d-#{$media-query}-none {\n display: none !important;\n }\n }\n }\n}\n\n// Horizontal alignment\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.flex-justify-start {\n justify-content: flex-start !important;\n}\n\n.flex-justify-end {\n justify-content: flex-end !important;\n}\n\n.flex-justify-between {\n justify-content: space-between !important;\n}\n\n.flex-justify-around {\n justify-content: space-around !important;\n}\n\n// Vertical alignment\n\n.v-align-baseline {\n vertical-align: baseline !important;\n}\n\n.v-align-bottom {\n vertical-align: bottom !important;\n}\n\n.v-align-middle {\n vertical-align: middle !important;\n}\n\n.v-align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.v-align-text-top {\n vertical-align: text-top !important;\n}\n\n.v-align-top {\n vertical-align: top !important;\n}\n","// Utility classes for typography\n\n.fs-1 {\n @include fs-1;\n}\n\n.fs-2 {\n @include fs-2;\n}\n\n.fs-3 {\n @include fs-3;\n}\n\n.fs-4 {\n @include fs-4;\n}\n\n.fs-5 {\n @include fs-5;\n}\n\n.fs-6 {\n @include fs-6;\n}\n\n.fs-7 {\n @include fs-7;\n}\n\n.fs-8 {\n @include fs-8;\n}\n\n.fs-9 {\n @include fs-9;\n}\n\n.fs-10 {\n @include fs-10;\n}\n\n.fw-300 {\n font-weight: 300 !important;\n}\n\n.fw-400 {\n font-weight: 400 !important;\n}\n\n.fw-500 {\n font-weight: 500 !important;\n}\n\n.fw-700 {\n font-weight: 700 !important;\n}\n\n.lh-0 {\n line-height: 0 !important;\n}\n\n.lh-default {\n line-height: $body-line-height;\n}\n\n.lh-tight {\n line-height: $body-heading-line-height;\n}\n\n.ls-5 {\n letter-spacing: 0.05em !important;\n}\n\n.ls-10 {\n letter-spacing: 0.1em !important;\n}\n\n.ls-0 {\n letter-spacing: 0 !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n","// Utility classes for lists\n\n// stylelint-disable selector-max-type\n\n.list-style-none {\n padding: 0 !important;\n margin: 0 !important;\n list-style: none !important;\n\n li {\n &::before {\n display: none !important;\n }\n }\n}\n","// Utility classes for margins and padding\n\n// stylelint-disable block-opening-brace-space-after, block-opening-brace-space-before\n\n// Margin spacer utilities\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-0, .m-1, .m-2...\n .m-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n .mx-#{$scale}-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-sm-0, .m-md-1, .m-lg-2...\n .m-#{$media-query}-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$media-query}-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$media-query}-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$media-query}-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n }\n }\n}\n\n// Padding spacer utilities\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-0, .p-1, .p-2...\n .p-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @include mq($media-query) {\n @for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-sm-0, .p-md-1, .p-lg-2...\n .p-#{$media-query}-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$media-query}-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$media-query}-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n }\n }\n}\n","// stylelint-disable selector-max-specificity, selector-max-id, selector-max-type, selector-no-qualifying-type\n\n@media print {\n .site-footer,\n .site-button,\n #edit-this-page,\n #back-to-top,\n .site-nav,\n .main-header {\n display: none !important;\n }\n\n hr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n }\n\n .side-bar {\n width: 100%;\n height: auto;\n border-right: 0 !important;\n }\n\n .site-header {\n border-bottom: 1px solid $border-color;\n }\n\n .site-title {\n font-size: 1rem !important;\n font-weight: 700 !important;\n }\n\n .text-small {\n font-size: 8pt !important;\n }\n\n pre.highlight {\n border: 1px solid $border-color;\n }\n\n .main {\n max-width: none;\n margin-left: 0;\n }\n}\n","// Skipnav\n// Skip to main content\n\na.skip-to-main {\n left: -999px;\n position: absolute;\n top: auto;\n width: 1px;\n height: 1px;\n overflow: hidden;\n z-index: -999;\n}\n\na.skip-to-main:focus,\na.skip-to-main:active {\n color: $link-color;\n background-color: $body-background-color;\n left: auto;\n top: auto;\n width: 30%;\n height: auto;\n overflow: auto;\n margin: 10px 35%;\n padding: 5px;\n border-radius: 15px;\n border: 4px solid $btn-primary-color;\n text-align: center;\n font-size: 1.2em;\n z-index: 999;\n}\n","\n\n@import \"./support/support\";\n@import \"./custom/setup\";\n@import \"./color_schemes/light\";\n\n@import \"./color_schemes/meshtastic\";\n\n@import \"./modules\";\ndiv.opaque {\n background-color: $body-background-color;\n}\n\np.tip, blockquote.tip {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $green-300;\n content: \"Tip\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .tip-title {\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.tip-title, blockquote.tip-title {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.tip {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.tip-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.note, blockquote.note {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $blue-300;\n content: \"Note\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .note-title {\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.note-title, blockquote.note-title {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.note {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.note-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.warning, blockquote.warning {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $yellow-300;\n content: \"Warning\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .warning-title {\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.warning-title, blockquote.warning-title {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.warning {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.warning-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n@import \"./custom/custom\";\n\n\n"],"file":"just-the-docs-default.css"}
\ No newline at end of file
diff --git a/main/assets/css/just-the-docs-light.css.map b/main/assets/css/just-the-docs-light.css.map
index 8601c54e0b..1f3456be81 100644
--- a/main/assets/css/just-the-docs-light.css.map
+++ b/main/assets/css/just-the-docs-light.css.map
@@ -1 +1 @@
-{"version":3,"sourceRoot":"","sources":["../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/vendor/accessible-pygments/github-light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/vendor/normalize.scss/normalize.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/base.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/color_schemes/light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/support/mixins/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/support/mixins/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/support/_variables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/content.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/navigation.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/labels.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/support/mixins/_buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/search.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/tables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/code.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/utilities/_colors.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/utilities/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/utilities/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/utilities/_lists.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/utilities/_spacing.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/print.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/skiptomain.scss","just-the-docs-light.scss"],"names":[],"mappings":"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;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvOF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AbrBE;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAQR;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AdhHA;EACE;;ACYA;EcZJ;IfII;;;;AAKF;EACE;;ACEA;EcRJ;IfUI;;;;AAKF;EACE;;ACRA;EcJJ;IfgBI;;;;AAKF;EACE;;AClBA;EcAJ;IfsBI;;;;AAKF;EACE;;AC5BA;EcIJ;If4BI;;;;AAKF;EACE;;ACtCA;EcQJ;IfkCI;IACA,aEhDuB;;;;AFqDzB;EACE;EACA,aEvDuB;;ADKvB;EcYJ;If0CI;;;;AAKF;EACE;EACA,aElEuB;;ADKvB;EcgBJ;IfiDI;;;;AAKF;EACE;EACA,aE7EuB;;ADKvB;EcoBJ;IfwDI;;;;AAKF;EACE;EACA,aExFuB;;ADKvB;EcwBJ;If+DI;;;;Ae3DJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,abxDiB;;;Aa2DnB;EACE,ab1DyB;;;Aa6D3B;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC/EF;EACE;EACA;EACA;;AAGE;EACE;;;ACLN;EACE;EACA;;;AAQA;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AhBlCA;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAaN;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AhB7GA;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AC3JR;EACE;AAAA;AAAA;AAAA;AAAA;AAAA;IAME;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;;;ACvCJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE,OjBwBW;EiBvBX,kBjBaM;EiBZN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACtBF;EACE,kBlBsBM;;;AkBnBR;EACI;EACA;EACA,elB8EY;EkB7EZ;EACA;;AAEA;EACI,OlBgCI;EkB/BJ;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlBsBM;EkBrBN;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBmDY;EkBlDZ;EACA;;AACA;EACE;EACA;EACA,OlBIM;EkBHN;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,elBKY;EkBJZ;EACA;;AAEA;EACI,OlB7CG;EkB8CH;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlBvDK;EkBwDL;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBtBY;EkBuBZ;EACA;;AACA;EACE;EACA;EACA,OlBzEK;EkB0EL;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,elBpEY;EkBqEZ;EACA;;AAEA;EACI,OlB9GK;EkB+GL;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlBxHO;EkByHP;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elB/FY;EkBgGZ;EACA;;AACA;EACE;EACA;EACA,OlB1IO;EkB2IP;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE","sourcesContent":["/*\ngenerated by accessible-pygments \nCopyright (c) 2022, Quansight Labs\nLicensed under the BSD license, see LICENSE for details.\n--\ngenerated by Pygments \nCopyright 2006-2025 by the Pygments team.\nLicensed under the BSD license, see LICENSE for details.\n*/\n\n.highlight .hll { background-color: #0969da4a }\n.highlight .c { color: #6E7781 } /* Comment */\n.highlight .err { color: #CF222E } /* Error */\n.highlight .k { color: #CF222E } /* Keyword */\n.highlight .l { color: #953800 } /* Literal */\n.highlight .n { color: #8250DF } /* Name */\n.highlight .o { color: #116329 } /* Operator */\n.highlight .p { color: #24292F } /* Punctuation */\n.highlight .ch { color: #6E7781 } /* Comment.Hashbang */\n.highlight .cm { color: #6E7781 } /* Comment.Multiline */\n.highlight .cp { color: #6E7781 } /* Comment.Preproc */\n.highlight .cpf { color: #6E7781 } /* Comment.PreprocFile */\n.highlight .c1 { color: #6E7781 } /* Comment.Single */\n.highlight .cs { color: #6E7781 } /* Comment.Special */\n.highlight .gd { color: #0550AE } /* Generic.Deleted */\n.highlight .ge { font-style: italic } /* Generic.Emph */\n.highlight .gr { color: #CF222E } /* Generic.Error */\n.highlight .gh { color: #0550AE } /* Generic.Heading */\n.highlight .gs { font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #0550AE } /* Generic.Subheading */\n.highlight .kc { color: #0550AE } /* Keyword.Constant */\n.highlight .kd { color: #CF222E } /* Keyword.Declaration */\n.highlight .kn { color: #CF222E } /* Keyword.Namespace */\n.highlight .kp { color: #CF222E } /* Keyword.Pseudo */\n.highlight .kr { color: #CF222E } /* Keyword.Reserved */\n.highlight .kt { color: #CF222E } /* Keyword.Type */\n.highlight .ld { color: #953800 } /* Literal.Date */\n.highlight .m { color: #953800 } /* Literal.Number */\n.highlight .s { color: #0550AE } /* Literal.String */\n.highlight .na { color: #953800 } /* Name.Attribute */\n.highlight .nb { color: #953800 } /* Name.Builtin */\n.highlight .nc { color: #0550AE } /* Name.Class */\n.highlight .no { color: #0550AE } /* Name.Constant */\n.highlight .nd { color: #953800 } /* Name.Decorator */\n.highlight .ni { color: #116329 } /* Name.Entity */\n.highlight .ne { color: #8250DF } /* Name.Exception */\n.highlight .nf { color: #0550AE } /* Name.Function */\n.highlight .nl { color: #953800 } /* Name.Label */\n.highlight .nn { color: #24292F } /* Name.Namespace */\n.highlight .nx { color: #8250DF } /* Name.Other */\n.highlight .py { color: #0550AE } /* Name.Property */\n.highlight .nt { color: #116329 } /* Name.Tag */\n.highlight .nv { color: #953800 } /* Name.Variable */\n.highlight .ow { color: #8250DF } /* Operator.Word */\n.highlight .pm { color: #24292F } /* Punctuation.Marker */\n.highlight .w { color: #24292F } /* Text.Whitespace */\n.highlight .mb { color: #953800 } /* Literal.Number.Bin */\n.highlight .mf { color: #953800 } /* Literal.Number.Float */\n.highlight .mh { color: #953800 } /* Literal.Number.Hex */\n.highlight .mi { color: #953800 } /* Literal.Number.Integer */\n.highlight .mo { color: #953800 } /* Literal.Number.Oct */\n.highlight .sa { color: #0550AE } /* Literal.String.Affix */\n.highlight .sb { color: #0550AE } /* Literal.String.Backtick */\n.highlight .sc { color: #0550AE } /* Literal.String.Char */\n.highlight .dl { color: #0550AE } /* Literal.String.Delimiter */\n.highlight .sd { color: #0550AE } /* Literal.String.Doc */\n.highlight .s2 { color: #0550AE } /* Literal.String.Double */\n.highlight .se { color: #0550AE } /* Literal.String.Escape */\n.highlight .sh { color: #0550AE } /* Literal.String.Heredoc */\n.highlight .si { color: #0550AE } /* Literal.String.Interpol */\n.highlight .sx { color: #0550AE } /* Literal.String.Other */\n.highlight .sr { color: #0550AE } /* Literal.String.Regex */\n.highlight .s1 { color: #0550AE } /* Literal.String.Single */\n.highlight .ss { color: #0550AE } /* Literal.String.Symbol */\n.highlight .bp { color: #953800 } /* Name.Builtin.Pseudo */\n.highlight .fm { color: #0550AE } /* Name.Function.Magic */\n.highlight .vc { color: #953800 } /* Name.Variable.Class */\n.highlight .vg { color: #953800 } /* Name.Variable.Global */\n.highlight .vi { color: #953800 } /* Name.Variable.Instance */\n.highlight .vm { color: #953800 } /* Name.Variable.Magic */\n.highlight .il { color: #953800 } /* Literal.Number.Integer.Long */\n","/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput {\n /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect {\n /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// Base element style overrides\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\n:root {\n color-scheme: $color-scheme;\n}\n\n* {\n box-sizing: border-box;\n}\n\nhtml {\n scroll-behavior: smooth;\n\n @include fs-4;\n}\n\nbody {\n font-family: $body-font-family;\n font-size: inherit;\n line-height: $body-line-height;\n color: $body-text-color;\n background-color: $body-background-color;\n overflow-wrap: break-word;\n}\n\nol,\nul,\ndl,\npre,\naddress,\nblockquote,\ntable,\ndiv,\nhr,\nform,\nfieldset,\nnoscript .table-wrapper {\n margin-top: 0;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n#toctitle {\n margin-top: 0;\n margin-bottom: 1em;\n font-weight: 500;\n line-height: $body-heading-line-height;\n color: $body-heading-color;\n}\n\np {\n margin-top: 1em;\n margin-bottom: 1em;\n}\n\na {\n color: $link-color;\n text-decoration: none;\n}\n\na:not([class]) {\n text-decoration: underline;\n text-decoration-color: $border-color;\n text-underline-offset: 2px;\n\n &:hover {\n text-decoration-color: rgba($link-color, 0.45);\n }\n}\n\ncode {\n font-family: $mono-font-family;\n font-size: 0.75em;\n line-height: $body-line-height;\n}\n\nfigure,\npre {\n margin: 0;\n}\n\nli {\n margin: 0.25em 0;\n}\n\nimg {\n max-width: 100%;\n height: auto;\n}\n\nhr {\n height: 1px;\n padding: 0;\n margin: $sp-6 0;\n background-color: $border-color;\n border: 0;\n}\n\n// adds a GitHub-style sidebar to blockquotes\nblockquote {\n margin: 10px 0;\n\n // resets user-agent stylesheets for blockquotes\n margin-block-start: 0;\n margin-inline-start: 0;\n padding-left: 1rem;\n border-left: 3px solid $border-color;\n}\n","$color-scheme: light !default;\n$body-background-color: $white !default;\n$body-heading-color: $grey-dk-300 !default;\n$body-text-color: $grey-dk-100 !default;\n$link-color: $purple-000 !default;\n$nav-child-link-color: $grey-dk-100 !default;\n$sidebar-color: $grey-lt-000 !default;\n$base-button-color: #f7f7f7 !default;\n$btn-primary-color: $purple-100 !default;\n$code-background-color: $white !default;\n$feedback-color: darken($sidebar-color, 3%) !default;\n$table-background-color: $white !default;\n$search-background-color: $white !default;\n$search-result-preview-color: $grey-dk-100 !default;\n\n@import \"./vendor/accessible-pygments/github-light\";\n","@mixin fs-1 {\n & {\n font-size: $font-size-1 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-1-sm !important;\n }\n}\n\n@mixin fs-2 {\n & {\n font-size: $font-size-2 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-3 !important;\n }\n}\n\n@mixin fs-3 {\n & {\n font-size: $font-size-3 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-4 !important;\n }\n}\n\n@mixin fs-4 {\n & {\n font-size: $font-size-4 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-5 !important;\n }\n}\n\n@mixin fs-5 {\n & {\n font-size: $font-size-5 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-6 !important;\n }\n}\n\n@mixin fs-6 {\n & {\n font-size: $font-size-6 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n}\n\n@mixin fs-7 {\n & {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-8 !important;\n }\n}\n\n@mixin fs-8 {\n & {\n font-size: $font-size-8 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-9 !important;\n }\n}\n\n@mixin fs-9 {\n & {\n font-size: $font-size-9 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10 !important;\n }\n}\n\n@mixin fs-10 {\n & {\n font-size: $font-size-10 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10-sm !important;\n }\n}\n","// Media query\n\n// Media query mixin\n// Usage:\n// @include mq(md) {\n// ..medium and up styles\n// }\n@mixin mq($name) {\n // Retrieves the value from the key\n $value: map-get($media-queries, $name);\n\n // If the key exists in the map\n @if $value {\n // Prints a media query based on the value\n @media (min-width: $value) {\n @content;\n }\n } @else {\n @warn \"No value could be retrieved from `#{$media-query}`. Please make sure it is defined in `$media-queries` map.\";\n }\n}\n\n// Responsive container\n\n@mixin container {\n padding-right: $gutter-spacing-sm;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-right: $gutter-spacing;\n padding-left: $gutter-spacing;\n }\n}\n","// Typography\n\n// prettier-ignore\n$body-font-family: system-ui, -apple-system, blinkmacsystemfont, \"Segoe UI\",\n roboto, \"Helvetica Neue\", arial, sans-serif, \"Segoe UI Emoji\" !default;\n$mono-font-family: \"SFMono-Regular\", menlo, consolas, monospace !default;\n$root-font-size: 16px !default; // DEPRECATED: previously base font-size for rems\n$body-line-height: 1.4 !default;\n$content-line-height: 1.6 !default;\n$body-heading-line-height: 1.25 !default;\n\n// Font size\n// `-sm` suffix is the size at the small (and above) media query\n\n$font-size-1: 0.5625rem !default;\n$font-size-1-sm: 0.625rem !default;\n$font-size-2: 0.6875rem !default; // h4 - uppercased!, h6 not uppercased, text-small\n$font-size-3: 0.75rem !default; // h5\n$font-size-4: 0.875rem !default;\n$font-size-5: 1rem !default; // h3\n$font-size-6: 1.125rem !default; // h2\n$font-size-7: 1.5rem !default;\n$font-size-8: 2rem !default; // h1\n$font-size-9: 2.25rem !default;\n$font-size-10: 2.625rem !default;\n$font-size-10-sm: 3rem !default;\n\n// Colors\n\n$white: #fff !default;\n$grey-dk-000: #959396 !default;\n$grey-dk-100: #5c5962 !default;\n$grey-dk-200: #44434d !default;\n$grey-dk-250: #302d36 !default;\n$grey-dk-300: #27262b !default;\n$grey-lt-000: #f5f6fa !default;\n$grey-lt-100: #eeebee !default;\n$grey-lt-200: #ecebed !default;\n$grey-lt-300: #e6e1e8 !default;\n$purple-000: #7253ed !default;\n$purple-100: #5e41d0 !default;\n$purple-200: #4e26af !default;\n$purple-300: #381885 !default;\n$blue-000: #2c84fa !default;\n$blue-100: #2869e6 !default;\n$blue-200: #264caf !default;\n$blue-300: #183385 !default;\n$green-000: #41d693 !default;\n$green-100: #11b584 !default;\n$green-200: #009c7b !default;\n$green-300: #026e57 !default;\n$yellow-000: #ffeb82 !default;\n$yellow-100: #fadf50 !default;\n$yellow-200: #f7d12e !default;\n$yellow-300: #e7af06 !default;\n$red-000: #f77e7e !default;\n$red-100: #f96e65 !default;\n$red-200: #e94c4c !default;\n$red-300: #dd2e2e !default;\n\n// Spacing\n\n$spacing-unit: 1rem; // 1rem == 16px\n\n$spacers: (\n sp-0: 0,\n sp-1: $spacing-unit * 0.25,\n sp-2: $spacing-unit * 0.5,\n sp-3: $spacing-unit * 0.75,\n sp-4: $spacing-unit,\n sp-5: $spacing-unit * 1.5,\n sp-6: $spacing-unit * 2,\n sp-7: $spacing-unit * 2.5,\n sp-8: $spacing-unit * 3,\n sp-9: $spacing-unit * 3.5,\n sp-10: $spacing-unit * 4,\n) !default;\n$sp-1: map-get($spacers, sp-1) !default; // 0.25 rem == 4px\n$sp-2: map-get($spacers, sp-2) !default; // 0.5 rem == 8px\n$sp-3: map-get($spacers, sp-3) !default; // 0.75 rem == 12px\n$sp-4: map-get($spacers, sp-4) !default; // 1 rem == 16px\n$sp-5: map-get($spacers, sp-5) !default; // 1.5 rem == 24px\n$sp-6: map-get($spacers, sp-6) !default; // 2 rem == 32px\n$sp-7: map-get($spacers, sp-7) !default; // 2.5 rem == 40px\n$sp-8: map-get($spacers, sp-8) !default; // 3 rem == 48px\n$sp-9: map-get($spacers, sp-9) !default; // 3.5 rem == 56px\n$sp-10: map-get($spacers, sp-10) !default; // 4 rem == 64px\n\n// Borders\n\n$border: 1px solid !default;\n$border-radius: 4px !default;\n$border-color: $grey-lt-100 !default;\n\n// Grid system\n\n$gutter-spacing: $sp-6 !default;\n$gutter-spacing-sm: $sp-4 !default;\n$nav-width: 16.5rem !default;\n$nav-width-md: 15.5rem !default;\n$nav-list-item-height: $sp-6 !default;\n$nav-list-item-height-sm: $sp-8 !default;\n$nav-list-expander-right: true;\n$content-width: 50rem !default;\n$header-height: 3.75rem !default;\n$search-results-width: $content-width - $nav-width !default;\n$transition-duration: 400ms;\n\n// Media queries in pixels\n\n$media-queries: (\n xs: 20rem,\n sm: 31.25rem,\n md: $content-width,\n lg: $content-width + $nav-width,\n xl: 87.5rem,\n) !default;\n","// The basic two column layout\n\n.side-bar {\n z-index: 0;\n display: flex;\n flex-wrap: wrap;\n background-color: $sidebar-color;\n\n @include mq(md) {\n flex-flow: column nowrap;\n position: fixed;\n width: $nav-width-md;\n height: 100%;\n border-right: $border $border-color;\n align-items: flex-end;\n }\n\n @include mq(lg) {\n width: calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width});\n min-width: $nav-width;\n }\n\n & + .main {\n @include mq(md) {\n margin-left: $nav-width-md;\n }\n\n @include mq(lg) {\n // stylelint-disable function-name-case\n // disable for Max(), we want to use the CSS max() function\n margin-left: Max(\n #{$nav-width},\n calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width})\n );\n // stylelint-enable function-name-case\n }\n\n .main-header {\n display: none;\n background-color: $sidebar-color;\n\n @include mq(md) {\n display: flex;\n background-color: $body-background-color;\n }\n\n &.nav-open {\n display: block;\n\n @include mq(md) {\n display: flex;\n }\n }\n }\n }\n}\n\n.main {\n margin: auto;\n\n @include mq(md) {\n position: relative;\n max-width: $content-width;\n }\n}\n\n.main-content-wrap {\n padding-top: $gutter-spacing-sm;\n padding-bottom: $gutter-spacing-sm;\n\n @include container;\n\n @include mq(md) {\n padding-top: $gutter-spacing;\n padding-bottom: $gutter-spacing;\n }\n}\n\n.main-header {\n z-index: 0;\n border-bottom: $border $border-color;\n\n @include mq(md) {\n display: flex;\n justify-content: space-between;\n height: $header-height;\n }\n}\n\n.site-nav,\n.site-header,\n.site-footer {\n width: 100%;\n\n @include mq(lg) {\n width: $nav-width;\n }\n}\n\n.site-nav {\n display: none;\n\n &.nav-open {\n display: block;\n }\n\n @include mq(md) {\n display: block;\n padding-top: $sp-8;\n padding-bottom: $gutter-spacing-sm;\n overflow-y: auto;\n flex: 1 1 auto;\n }\n}\n\n.site-header {\n display: flex;\n min-height: $header-height;\n align-items: center;\n\n @include mq(md) {\n height: $header-height;\n max-height: $header-height;\n border-bottom: $border $border-color;\n }\n}\n\n.site-title {\n flex-grow: 1;\n display: flex;\n height: 100%;\n align-items: center;\n padding-top: $sp-3;\n padding-bottom: $sp-3;\n color: $body-heading-color;\n\n @include container;\n\n @include fs-6;\n\n @include mq(md) {\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n }\n}\n\n@if variable-exists(logo) {\n .site-logo {\n width: 100%;\n height: 100%;\n background-image: url($logo);\n background-repeat: no-repeat;\n background-position: left center;\n background-size: contain;\n }\n}\n\n.site-button {\n display: flex;\n height: 100%;\n padding: $gutter-spacing-sm;\n align-items: center;\n}\n\n@include mq(md) {\n .site-header .site-button {\n display: none;\n }\n}\n\n.site-title:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n}\n\n.site-button:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n}\n\n.site-footer {\n position: absolute;\n bottom: 0;\n left: 0;\n padding-top: $sp-4;\n padding-bottom: $sp-4;\n\n @include container;\n\n @include fs-2;\n\n @include mq(md) {\n position: static;\n justify-self: end;\n }\n}\n\n.icon {\n width: $sp-5;\n height: $sp-5;\n color: $link-color;\n}\n","@charset \"UTF-8\";\n\n// Styles for rendered markdown in the .main-content container\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity, selector-max-id\n\n.main-content {\n line-height: $content-line-height;\n\n ol,\n ul,\n dl,\n pre,\n address,\n blockquote,\n .table-wrapper {\n margin-top: 0.5em;\n }\n\n a {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n ul,\n ol {\n padding-left: 1.5em;\n }\n\n li {\n .highlight {\n margin-top: $sp-1;\n }\n }\n\n ol {\n list-style-type: none;\n counter-reset: step-counter;\n\n > li {\n position: relative;\n\n &::before {\n position: absolute;\n top: 0.2em;\n left: -1.6em;\n color: $grey-dk-000;\n content: counter(step-counter);\n counter-increment: step-counter;\n @include fs-3;\n\n @include mq(sm) {\n top: 0.11em;\n }\n }\n\n ol {\n counter-reset: sub-counter;\n\n > li {\n &::before {\n content: counter(sub-counter, lower-alpha);\n counter-increment: sub-counter;\n }\n }\n }\n }\n }\n\n ul {\n list-style: none;\n\n > li {\n &::before {\n position: absolute;\n margin-left: -1.4em;\n color: $grey-dk-000;\n content: \"•\";\n }\n }\n }\n\n .task-list-item {\n &::before {\n content: \"\";\n }\n }\n\n .task-list-item-checkbox {\n margin-right: 0.6em;\n margin-left: -1.4em;\n\n // The same margin-left is used above for ul > li::before\n }\n\n hr + * {\n margin-top: 0;\n }\n\n h1:first-of-type {\n margin-top: 0.5em;\n }\n\n dl {\n display: grid;\n grid-template: auto / 10em 1fr;\n }\n\n dt,\n dd {\n margin: 0.25em 0;\n }\n\n dt {\n grid-column: 1;\n font-weight: 500;\n text-align: right;\n\n &::after {\n content: \":\";\n }\n }\n\n dd {\n grid-column: 2;\n margin-bottom: 0;\n margin-left: 1em;\n\n blockquote,\n div,\n dl,\n dt,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n li,\n ol,\n p,\n pre,\n table,\n ul,\n .table-wrapper {\n &:first-child {\n margin-top: 0;\n }\n }\n }\n\n dd,\n ol,\n ul {\n dl:first-child {\n dt:first-child,\n dd:nth-child(2) {\n margin-top: 0;\n }\n }\n }\n\n .anchor-heading {\n position: absolute;\n right: -$sp-4;\n width: $sp-5;\n height: 100%;\n padding-right: $sp-1;\n padding-left: $sp-1;\n overflow: visible;\n\n @include mq(md) {\n right: auto;\n left: -$sp-5;\n }\n\n svg {\n display: inline-block;\n width: 100%;\n height: 100%;\n color: $link-color;\n visibility: hidden;\n }\n }\n\n .anchor-heading:hover,\n .anchor-heading:focus,\n h1:hover > .anchor-heading,\n h2:hover > .anchor-heading,\n h3:hover > .anchor-heading,\n h4:hover > .anchor-heading,\n h5:hover > .anchor-heading,\n h6:hover > .anchor-heading {\n svg {\n visibility: visible;\n }\n }\n\n summary {\n cursor: pointer;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n #toctitle {\n position: relative;\n margin-top: 1.5em;\n margin-bottom: 0.25em;\n\n + table,\n + .table-wrapper,\n + .code-example,\n + .highlighter-rouge,\n + .sectionbody .listingblock {\n margin-top: 1em;\n }\n\n + p:not(.label) {\n margin-top: 0;\n }\n }\n\n > h1:first-child,\n > h2:first-child,\n > h3:first-child,\n > h4:first-child,\n > h5:first-child,\n > h6:first-child,\n > .sect1:first-child > h2,\n > .sect2:first-child > h3,\n > .sect3:first-child > h4,\n > .sect4:first-child > h5,\n > .sect5:first-child > h6 {\n margin-top: $sp-2;\n }\n}\n","// Main nav, breadcrumb, etc...\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity\n\n.nav-list {\n padding: 0;\n margin-top: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n margin: 0;\n\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n\n .nav-list-link {\n display: block;\n min-height: $nav-list-item-height-sm;\n padding-top: $sp-1;\n padding-bottom: $sp-1;\n line-height: #{$nav-list-item-height-sm - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height-sm;\n padding-left: $gutter-spacing-sm;\n } @else {\n padding-right: $gutter-spacing-sm;\n padding-left: $nav-list-item-height-sm;\n }\n\n @include mq(md) {\n min-height: $nav-list-item-height;\n line-height: #{$nav-list-item-height - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height;\n padding-left: $gutter-spacing;\n } @else {\n padding-right: $gutter-spacing;\n padding-left: $nav-list-item-height;\n }\n }\n\n &.external > svg {\n width: $sp-4;\n height: $sp-4;\n vertical-align: text-bottom;\n }\n\n &.active {\n font-weight: 600;\n text-decoration: none;\n }\n\n &:hover,\n &.active {\n color: darken($link-color, 5%);\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n }\n }\n\n .nav-list-expander {\n position: absolute;\n @if $nav-list-expander-right {\n right: 0;\n }\n\n width: $nav-list-item-height-sm;\n height: $nav-list-item-height-sm;\n padding: #{$nav-list-item-height-sm * 0.25};\n color: $link-color;\n\n @include mq(md) {\n width: $nav-list-item-height;\n height: $nav-list-item-height;\n padding: #{$nav-list-item-height * 0.25};\n }\n\n &:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n }\n\n @if $nav-list-expander-right {\n svg {\n transform: rotate(90deg);\n }\n }\n }\n\n > .nav-list {\n display: none;\n padding-left: $sp-3;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n\n .nav-list-link {\n color: $nav-child-link-color;\n }\n\n .nav-list-expander {\n color: $nav-child-link-color;\n }\n }\n }\n\n &.active {\n > .nav-list-expander svg {\n @if $nav-list-expander-right {\n transform: rotate(-90deg);\n } @else {\n transform: rotate(90deg);\n }\n }\n\n > .nav-list {\n display: block;\n }\n }\n }\n}\n\n.nav-category {\n padding: $sp-2 $gutter-spacing-sm;\n font-weight: 600;\n text-align: start;\n text-transform: uppercase;\n border-bottom: $border $border-color;\n @include fs-2;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing;\n margin-top: $gutter-spacing-sm;\n text-align: start;\n\n &:first-child {\n margin-top: 0;\n }\n }\n}\n\n.nav-list.nav-category-list {\n > .nav-list-item {\n margin: 0;\n\n > .nav-list {\n padding: 0;\n\n > .nav-list-item {\n > .nav-list-link {\n color: $link-color;\n }\n\n > .nav-list-expander {\n color: $link-color;\n }\n }\n }\n }\n}\n\n// Aux nav\n\n.aux-nav {\n height: 100%;\n overflow-x: auto;\n @include fs-2;\n\n .aux-nav-list {\n display: flex;\n height: 100%;\n padding: 0;\n margin: 0;\n list-style: none;\n }\n\n .aux-nav-list-item {\n display: inline-block;\n height: 100%;\n padding: 0;\n margin: 0;\n }\n\n @include mq(md) {\n padding-right: $gutter-spacing-sm;\n }\n}\n\n// Breadcrumb nav\n\n.breadcrumb-nav {\n @include mq(md) {\n margin-top: -$sp-4;\n }\n}\n\n.breadcrumb-nav-list {\n padding-left: 0;\n margin-bottom: $sp-3;\n list-style: none;\n}\n\n.breadcrumb-nav-list-item {\n display: table-cell;\n @include fs-2;\n\n &::before {\n display: none;\n }\n\n &::after {\n display: inline-block;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $grey-dk-000;\n content: \"/\";\n }\n\n &:last-child {\n &::after {\n content: \"\";\n }\n }\n}\n","// Typography\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\nh1,\n.text-alpha {\n font-weight: 300;\n\n @include fs-8;\n}\n\nh2,\n.text-beta,\n#toctitle {\n @include fs-6;\n}\n\nh3,\n.text-gamma {\n @include fs-5;\n}\n\nh4,\n.text-delta {\n font-weight: 400;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n\n @include fs-2;\n}\n\nh4 code {\n text-transform: none;\n}\n\nh5,\n.text-epsilon {\n @include fs-3;\n}\n\nh6,\n.text-zeta {\n @include fs-2;\n}\n\n.text-small {\n @include fs-2;\n}\n\n.text-mono {\n font-family: $mono-font-family !important;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n","// Labels (not the form kind)\n\n// this :not() prevents a style clash with Mermaid.js's\n// diagram labels, which also use .label\n// for more, see https://github.com/just-the-docs/just-the-docs/issues/1272\n// and the accompanying PR\n.label:not(g),\n.label-blue:not(g) {\n display: inline-block;\n padding: 0.16em 0.56em;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $white;\n text-transform: uppercase;\n vertical-align: middle;\n background-color: $blue-100;\n border-radius: 12px;\n\n @include fs-2;\n}\n\n.label-green:not(g) {\n background-color: $green-300;\n}\n\n.label-purple:not(g) {\n background-color: $purple-100;\n}\n\n.label-red:not(g) {\n background-color: $red-300;\n}\n\n.label-yellow:not(g) {\n color: $grey-dk-200;\n background-color: $yellow-200;\n}\n","// Buttons and things that look like buttons\n// stylelint-disable color-named\n\n.btn {\n display: inline-block;\n box-sizing: border-box;\n padding: 0.3em 1em;\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n font-weight: 500;\n line-height: 1.5;\n color: $link-color;\n text-decoration: none;\n vertical-align: baseline;\n cursor: pointer;\n background-color: $base-button-color;\n border-width: 0;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n appearance: none;\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: darken($link-color, 2%);\n }\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n text-decoration: none;\n background-color: darken($base-button-color, 1%);\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($base-button-color, 3%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken(#dcdcdc, 5%);\n }\n\n &:disabled,\n &.disabled {\n &,\n &:hover {\n color: rgba(102, 102, 102, 0.5);\n cursor: default;\n background-color: rgba(229, 229, 229, 0.5);\n background-image: none;\n box-shadow: none;\n }\n }\n}\n\n.btn-outline {\n color: $link-color;\n background: transparent;\n box-shadow: inset 0 0 0 2px $grey-lt-300;\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n color: darken($link-color, 4%);\n text-decoration: none;\n background-color: transparent;\n box-shadow: inset 0 0 0 3px $grey-lt-300;\n }\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow:\n inset 0 0 0 2px $grey-dk-100,\n 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: inset 0 0 0 2px $grey-dk-100;\n }\n}\n\n.btn-primary {\n @include btn-color($white, $btn-primary-color);\n}\n\n.btn-purple {\n @include btn-color($white, $purple-100);\n}\n\n.btn-blue {\n @include btn-color($white, $blue-200);\n}\n\n.btn-green {\n @include btn-color($white, $green-300);\n}\n\n.btn-reset {\n background: none;\n border: none;\n margin: 0;\n text-align: inherit;\n font: inherit;\n border-radius: 0;\n appearance: none;\n}\n","// Colored button\n\n@mixin btn-color($fg, $bg) {\n color: $fg;\n background-color: darken($bg, 2%);\n background-image: linear-gradient(lighten($bg, 5%), darken($bg, 2%));\n box-shadow:\n 0 1px 3px rgba(0, 0, 0, 0.25),\n 0 4px 10px rgba(0, 0, 0, 0.12);\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: $fg;\n background-color: darken($bg, 4%);\n background-image: linear-gradient((lighten($bg, 2%), darken($bg, 4%)));\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($bg, 5%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken($bg, 10%);\n }\n}\n","// Search input and autocomplete\n\n.search {\n position: relative;\n z-index: 2;\n flex-grow: 1;\n height: $sp-10;\n padding: $sp-2;\n transition: padding linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: relative !important;\n width: auto !important;\n height: 100% !important;\n padding: 0;\n transition: none;\n }\n}\n\n.search-input-wrap {\n position: relative;\n z-index: 1;\n height: $sp-8;\n overflow: hidden;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n transition: height linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: absolute;\n width: 100%;\n max-width: $search-results-width;\n height: 100% !important;\n border-radius: 0;\n box-shadow: none;\n transition: width ease $transition-duration;\n }\n}\n\n.search-input {\n position: absolute;\n width: 100%;\n height: 100%;\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing-sm + $sp-5};\n font-size: 1rem;\n color: $body-text-color;\n background-color: $search-background-color;\n border-top: 0;\n border-right: 0;\n border-bottom: 0;\n border-left: 0;\n border-radius: 0;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing + $sp-5};\n font-size: 0.875rem;\n background-color: $body-background-color;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n &:focus {\n outline: 2px solid $link-color;\n outline-offset: -2px;\n\n + .search-label .search-icon {\n color: $link-color;\n }\n }\n}\n\n.search-label {\n position: absolute;\n display: flex;\n height: 100%;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-left: $gutter-spacing;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n .search-icon {\n width: #{$sp-4 * 1.2};\n height: #{$sp-4 * 1.2};\n align-self: center;\n color: $grey-dk-000;\n }\n}\n\n.search-results {\n position: absolute;\n left: 0;\n display: none;\n width: 100%;\n max-height: calc(100% - #{$sp-10});\n overflow-y: auto;\n background-color: $search-background-color;\n border-bottom-right-radius: $border-radius;\n border-bottom-left-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n\n @include mq(md) {\n top: 100%;\n width: $search-results-width;\n max-height: calc(100vh - 200%) !important;\n }\n}\n\n.search-results-list {\n padding-left: 0;\n margin-bottom: $sp-1;\n list-style: none;\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n}\n\n.search-results-list-item {\n padding: 0;\n margin: 0;\n}\n\n.search-result {\n display: block;\n padding: $sp-1 $sp-3;\n\n &:hover,\n &.active {\n background-color: $feedback-color;\n }\n}\n\n.search-result-title {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 40%;\n padding-right: $sp-2;\n vertical-align: top;\n }\n}\n\n.search-result-doc {\n display: flex;\n align-items: center;\n word-wrap: break-word;\n\n &.search-result-doc-parent {\n opacity: 0.5;\n @include fs-3;\n\n @include mq(md) {\n @include fs-2;\n }\n }\n\n .search-result-icon {\n width: $sp-4;\n height: $sp-4;\n margin-right: $sp-2;\n color: $link-color;\n flex-shrink: 0;\n }\n\n .search-result-doc-title {\n overflow: auto;\n }\n}\n\n.search-result-section {\n margin-left: #{$sp-4 + $sp-2};\n word-wrap: break-word;\n}\n\n.search-result-rel-url {\n display: block;\n margin-left: #{$sp-4 + $sp-2};\n overflow: hidden;\n color: $search-result-preview-color;\n text-overflow: ellipsis;\n white-space: nowrap;\n @include fs-1;\n}\n\n.search-result-previews {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n padding-left: $sp-4;\n margin-left: $sp-2;\n color: $search-result-preview-color;\n word-wrap: break-word;\n border-left: $border;\n border-left-color: $border-color;\n @include fs-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 60%;\n padding-left: $sp-2;\n margin-left: 0;\n vertical-align: top;\n }\n}\n\n.search-result-preview + .search-result-preview {\n margin-top: $sp-1;\n}\n\n.search-result-highlight {\n font-weight: bold;\n}\n\n.search-no-result {\n padding: $sp-2 $sp-3;\n @include fs-3;\n}\n\n.search-button {\n position: fixed;\n right: $sp-4;\n bottom: $sp-4;\n display: flex;\n width: $sp-9;\n height: $sp-9;\n background-color: $search-background-color;\n border: 1px solid rgba($link-color, 0.3);\n border-radius: #{$sp-9 * 0.5};\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n align-items: center;\n justify-content: center;\n}\n\n.search-overlay {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1;\n width: 0;\n height: 0;\n background-color: rgba(0, 0, 0, 0.3);\n opacity: 0;\n transition:\n opacity ease $transition-duration,\n width 0s $transition-duration,\n height 0s $transition-duration;\n}\n\n.search-active {\n .search {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .search-input-wrap {\n height: $sp-10;\n border-radius: 0;\n\n @include mq(md) {\n width: $search-results-width;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n }\n }\n\n .search-input {\n background-color: $search-background-color;\n\n @include mq(md) {\n padding-left: 2.3rem;\n }\n }\n\n .search-label {\n @include mq(md) {\n padding-left: 0.6rem;\n }\n }\n\n .search-results {\n display: block;\n }\n\n .search-overlay {\n width: 100%;\n height: 100%;\n opacity: 1;\n transition:\n opacity ease $transition-duration,\n width 0s,\n height 0s;\n }\n\n @include mq(md) {\n .main {\n position: fixed;\n right: 0;\n left: 0;\n }\n }\n\n .main-header {\n padding-top: $sp-10;\n\n @include mq(md) {\n padding-top: 0;\n }\n }\n}\n","// Tables\n// stylelint-disable max-nesting-depth, selector-no-type, selector-max-type\n\n.table-wrapper {\n display: block;\n width: 100%;\n max-width: 100%;\n margin-bottom: $sp-5;\n overflow-x: auto;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n}\n\ntable {\n display: table;\n min-width: 100%;\n border-collapse: separate;\n}\n\nth,\ntd {\n min-width: 7.5rem;\n padding: $sp-2 $sp-3;\n background-color: $table-background-color;\n border-bottom: $border rgba($border-color, 0.5);\n border-left: $border $border-color;\n\n @include fs-3;\n\n &:first-of-type {\n border-left: 0;\n }\n}\n\ntbody {\n tr {\n &:last-of-type {\n th,\n td {\n border-bottom: 0;\n }\n\n td {\n padding-bottom: $sp-3;\n }\n }\n }\n}\n\nthead {\n th {\n border-bottom: $border $border-color;\n }\n}\n","// Code and syntax highlighting\n// stylelint-disable selector-no-qualifying-type, declaration-block-semicolon-newline-after,declaration-block-single-line-max-declarations, selector-no-type, selector-max-type, scss/comment-no-empty\n\n// {% raw %}\n\n// This instruction applies to all queues not within 'pre' or 'figure', avoiding 'code' generated by the highlight.\n:not(pre, figure) {\n & > code {\n padding: 0.2em 0.15em;\n font-weight: 400;\n background-color: $code-background-color;\n border: $border $border-color;\n border-radius: $border-radius;\n }\n}\n\n// Avoid appearance of dark border around visited code links in Safari\na:visited code {\n border-color: $border-color;\n}\n\n// Content structure for highlighted code blocks using fences or Liquid\n//\n// ```[LANG]...```, no kramdown line_numbers:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n//\n// ```[LANG]...```, kramdown line_numbers = true:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.rouge-gutter.gl > pre.lineno\n// | td.rouge-code > pre\n//\n// {% highlight LANG %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n//\n// {% highlight LANG linenos %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.gutter.gl > pre.lineno\n// | td.code > pre\n//\n// ----...---- (AsciiDoc)\n// div.listingblock > div.content > pre.rouge.highlight\n//\n// fix_linenos removes the outermost pre when it encloses table.rouge-table\n//\n// See docs/index-test.md for some tests.\n//\n// No kramdown line_numbers: fences and Liquid highlighting look the same.\n// Kramdown line_numbers = true: fences have a wider gutter than with Liquid?\n\n// ```[LANG]...```\n// or in AsciiDoc:\n//\n// ----\n// ...\n// ----\n\n// the code may appear with 3 different types:\n// container \\ case: default case, code with line number, code with html rendering\n// top level: div.highlighter-rouge, figure.highlight, figure.highlight\n// second level: div.highlight, div.table-wrapper, pre.highlight\n// third level: pre.highlight, td.code, absent\n// last level: code, pre, code (optionality)\n// highlighter level: span, span, span\n// the spacing are only in the second level for case 1, 3 and in the third level for case 2\n// in AsciiDoc, there is a parent container that contains optionally a title and the content.\n\n// select top level container\ndiv.highlighter-rouge,\ndiv.listingblock > div.content,\nfigure.highlight {\n margin-top: 0;\n margin-bottom: $sp-3;\n background-color: $code-background-color;\n border-radius: $border-radius;\n box-shadow: none;\n -webkit-overflow-scrolling: touch;\n position: relative;\n padding: 0;\n\n // copy button (or other button)\n // the button appear only when there is a hover on the code or focus on button\n > button {\n width: $sp-3;\n opacity: 0;\n position: absolute;\n top: 0;\n right: 0;\n padding: $sp-3;\n border: none;\n background: none;\n color: $body-text-color;\n box-sizing: content-box;\n\n svg {\n fill: $body-text-color;\n }\n\n &:active {\n text-decoration: none;\n outline: none;\n opacity: 1;\n }\n\n &:focus {\n opacity: 1;\n outline: 2px solid $link-color;\n }\n }\n\n // the button can be seen by doing a simple hover in the code, there is no need to go over the location of the button\n &:hover {\n > button {\n cursor: copy;\n opacity: 1;\n }\n }\n}\n\n// setting the spacing and scrollbar on the second level for the first case\n// remove all space on the second and third level\n// this is a mixin to accommodate for the slightly different structures generated via Markdown vs AsciiDoc\n@mixin scroll-and-spacing($code-div, $pre-select) {\n #{$code-div} {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n\n #{$pre-select},\n code {\n padding: 0;\n margin: 0;\n border: 0;\n }\n}\n\n// for Markdown\ndiv.highlighter-rouge {\n @include scroll-and-spacing(\"div.highlight\", \"pre.highlight\");\n}\n\n// for AsciiDoc. we also need to fix the margins for its parent container.\ndiv.listingblock {\n margin-top: 0;\n margin-bottom: $sp-3;\n\n @include scroll-and-spacing(\"div.content\", \"div.content > pre\");\n}\n\n// {% highlight LANG %}...{% endhighlight %},\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the second level for the thirt case\n// the css rule are apply only to the last code enviroment\n// setting the scroolbar\nfigure.highlight {\n pre,\n :not(pre) > code {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n}\n\n// ```[LANG]...```, kramdown line_numbers = true,\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the thirt level for the second case\n.highlight .table-wrapper {\n padding: $sp-3 0;\n margin: 0;\n border: 0;\n box-shadow: none;\n\n td,\n pre {\n min-width: 0;\n padding: 0;\n background-color: $code-background-color;\n border: 0;\n\n @include fs-2;\n }\n\n td.gl {\n width: 1em;\n padding-right: $sp-3;\n padding-left: $sp-3;\n }\n\n pre {\n margin: 0;\n line-height: 2;\n }\n}\n\n// Code examples: html render of a code\n.code-example,\n.listingblock > .title {\n padding: $sp-3;\n margin-bottom: $sp-3;\n overflow: auto;\n border: 1px solid $border-color;\n border-radius: $border-radius;\n\n + .highlighter-rouge,\n + .sectionbody .listingblock,\n + .content,\n + figure.highlight {\n position: relative;\n margin-top: -$sp-4;\n border-right: 1px solid $border-color;\n border-bottom: 1px solid $border-color;\n border-left: 1px solid $border-color;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n}\n\n// Mermaid diagram code blocks should be left unstyled.\ncode.language-mermaid {\n padding: 0;\n background-color: inherit;\n border: 0;\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight,\npre.highlight {\n background: $code-background-color; // Code Background\n // For Backwards Compatibility Before $code-linenumber-color was added\n @if variable-exists(code-linenumber-color) {\n color: $code-linenumber-color; // Code Line Numbers\n } @else {\n color: $body-text-color; // Code Line Numbers\n }\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight pre {\n background: $code-background-color; // Code Background\n}\n\n// {% endraw %}\n","// Utility classes for colors\n\n// Text colors\n\n.text-grey-dk-000 {\n color: $grey-dk-000 !important;\n}\n\n.text-grey-dk-100 {\n color: $grey-dk-100 !important;\n}\n\n.text-grey-dk-200 {\n color: $grey-dk-200 !important;\n}\n\n.text-grey-dk-250 {\n color: $grey-dk-250 !important;\n}\n\n.text-grey-dk-300 {\n color: $grey-dk-300 !important;\n}\n\n.text-grey-lt-000 {\n color: $grey-lt-000 !important;\n}\n\n.text-grey-lt-100 {\n color: $grey-lt-100 !important;\n}\n\n.text-grey-lt-200 {\n color: $grey-lt-200 !important;\n}\n\n.text-grey-lt-300 {\n color: $grey-lt-300 !important;\n}\n\n.text-blue-000 {\n color: $blue-000 !important;\n}\n\n.text-blue-100 {\n color: $blue-100 !important;\n}\n\n.text-blue-200 {\n color: $blue-200 !important;\n}\n\n.text-blue-300 {\n color: $blue-300 !important;\n}\n\n.text-green-000 {\n color: $green-000 !important;\n}\n\n.text-green-100 {\n color: $green-100 !important;\n}\n\n.text-green-200 {\n color: $green-200 !important;\n}\n\n.text-green-300 {\n color: $green-300 !important;\n}\n\n.text-purple-000 {\n color: $purple-000 !important;\n}\n\n.text-purple-100 {\n color: $purple-100 !important;\n}\n\n.text-purple-200 {\n color: $purple-200 !important;\n}\n\n.text-purple-300 {\n color: $purple-300 !important;\n}\n\n.text-yellow-000 {\n color: $yellow-000 !important;\n}\n\n.text-yellow-100 {\n color: $yellow-100 !important;\n}\n\n.text-yellow-200 {\n color: $yellow-200 !important;\n}\n\n.text-yellow-300 {\n color: $yellow-300 !important;\n}\n\n.text-red-000 {\n color: $red-000 !important;\n}\n\n.text-red-100 {\n color: $red-100 !important;\n}\n\n.text-red-200 {\n color: $red-200 !important;\n}\n\n.text-red-300 {\n color: $red-300 !important;\n}\n\n// Background colors\n\n.bg-grey-dk-000 {\n background-color: $grey-dk-000 !important;\n}\n\n.bg-grey-dk-100 {\n background-color: $grey-dk-100 !important;\n}\n\n.bg-grey-dk-200 {\n background-color: $grey-dk-200 !important;\n}\n\n.bg-grey-dk-250 {\n background-color: $grey-dk-250 !important;\n}\n\n.bg-grey-dk-300 {\n background-color: $grey-dk-300 !important;\n}\n\n.bg-grey-lt-000 {\n background-color: $grey-lt-000 !important;\n}\n\n.bg-grey-lt-100 {\n background-color: $grey-lt-100 !important;\n}\n\n.bg-grey-lt-200 {\n background-color: $grey-lt-200 !important;\n}\n\n.bg-grey-lt-300 {\n background-color: $grey-lt-300 !important;\n}\n\n.bg-blue-000 {\n background-color: $blue-000 !important;\n}\n\n.bg-blue-100 {\n background-color: $blue-100 !important;\n}\n\n.bg-blue-200 {\n background-color: $blue-200 !important;\n}\n\n.bg-blue-300 {\n background-color: $blue-300 !important;\n}\n\n.bg-green-000 {\n background-color: $green-000 !important;\n}\n\n.bg-green-100 {\n background-color: $green-100 !important;\n}\n\n.bg-green-200 {\n background-color: $green-200 !important;\n}\n\n.bg-green-300 {\n background-color: $green-300 !important;\n}\n\n.bg-purple-000 {\n background-color: $purple-000 !important;\n}\n\n.bg-purple-100 {\n background-color: $purple-100 !important;\n}\n\n.bg-purple-200 {\n background-color: $purple-200 !important;\n}\n\n.bg-purple-300 {\n background-color: $purple-300 !important;\n}\n\n.bg-yellow-000 {\n background-color: $yellow-000 !important;\n}\n\n.bg-yellow-100 {\n background-color: $yellow-100 !important;\n}\n\n.bg-yellow-200 {\n background-color: $yellow-200 !important;\n}\n\n.bg-yellow-300 {\n background-color: $yellow-300 !important;\n}\n\n.bg-red-000 {\n background-color: $red-000 !important;\n}\n\n.bg-red-100 {\n background-color: $red-100 !important;\n}\n\n.bg-red-200 {\n background-color: $red-200 !important;\n}\n\n.bg-red-300 {\n background-color: $red-300 !important;\n}\n","// Utility classes for layout\n\n// Display\n\n.d-block {\n display: block !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n// Screenreader-only\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .d-sm-block, .d-md-none, .d-lg-inline\n .d-#{$media-query}-block {\n display: block !important;\n }\n .d-#{$media-query}-flex {\n display: flex !important;\n }\n .d-#{$media-query}-inline {\n display: inline !important;\n }\n .d-#{$media-query}-inline-block {\n display: inline-block !important;\n }\n .d-#{$media-query}-none {\n display: none !important;\n }\n }\n }\n}\n\n// Horizontal alignment\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.flex-justify-start {\n justify-content: flex-start !important;\n}\n\n.flex-justify-end {\n justify-content: flex-end !important;\n}\n\n.flex-justify-between {\n justify-content: space-between !important;\n}\n\n.flex-justify-around {\n justify-content: space-around !important;\n}\n\n// Vertical alignment\n\n.v-align-baseline {\n vertical-align: baseline !important;\n}\n\n.v-align-bottom {\n vertical-align: bottom !important;\n}\n\n.v-align-middle {\n vertical-align: middle !important;\n}\n\n.v-align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.v-align-text-top {\n vertical-align: text-top !important;\n}\n\n.v-align-top {\n vertical-align: top !important;\n}\n","// Utility classes for typography\n\n.fs-1 {\n @include fs-1;\n}\n\n.fs-2 {\n @include fs-2;\n}\n\n.fs-3 {\n @include fs-3;\n}\n\n.fs-4 {\n @include fs-4;\n}\n\n.fs-5 {\n @include fs-5;\n}\n\n.fs-6 {\n @include fs-6;\n}\n\n.fs-7 {\n @include fs-7;\n}\n\n.fs-8 {\n @include fs-8;\n}\n\n.fs-9 {\n @include fs-9;\n}\n\n.fs-10 {\n @include fs-10;\n}\n\n.fw-300 {\n font-weight: 300 !important;\n}\n\n.fw-400 {\n font-weight: 400 !important;\n}\n\n.fw-500 {\n font-weight: 500 !important;\n}\n\n.fw-700 {\n font-weight: 700 !important;\n}\n\n.lh-0 {\n line-height: 0 !important;\n}\n\n.lh-default {\n line-height: $body-line-height;\n}\n\n.lh-tight {\n line-height: $body-heading-line-height;\n}\n\n.ls-5 {\n letter-spacing: 0.05em !important;\n}\n\n.ls-10 {\n letter-spacing: 0.1em !important;\n}\n\n.ls-0 {\n letter-spacing: 0 !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n","// Utility classes for lists\n\n// stylelint-disable selector-max-type\n\n.list-style-none {\n padding: 0 !important;\n margin: 0 !important;\n list-style: none !important;\n\n li {\n &::before {\n display: none !important;\n }\n }\n}\n","// Utility classes for margins and padding\n\n// stylelint-disable block-opening-brace-space-after, block-opening-brace-space-before\n\n// Margin spacer utilities\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-0, .m-1, .m-2...\n .m-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n .mx-#{$scale}-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-sm-0, .m-md-1, .m-lg-2...\n .m-#{$media-query}-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$media-query}-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$media-query}-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$media-query}-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n }\n }\n}\n\n// Padding spacer utilities\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-0, .p-1, .p-2...\n .p-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @include mq($media-query) {\n @for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-sm-0, .p-md-1, .p-lg-2...\n .p-#{$media-query}-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$media-query}-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$media-query}-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n }\n }\n}\n","// stylelint-disable selector-max-specificity, selector-max-id, selector-max-type, selector-no-qualifying-type\n\n@media print {\n .site-footer,\n .site-button,\n #edit-this-page,\n #back-to-top,\n .site-nav,\n .main-header {\n display: none !important;\n }\n\n hr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n }\n\n .side-bar {\n width: 100%;\n height: auto;\n border-right: 0 !important;\n }\n\n .site-header {\n border-bottom: 1px solid $border-color;\n }\n\n .site-title {\n font-size: 1rem !important;\n font-weight: 700 !important;\n }\n\n .text-small {\n font-size: 8pt !important;\n }\n\n pre.highlight {\n border: 1px solid $border-color;\n }\n\n .main {\n max-width: none;\n margin-left: 0;\n }\n}\n","// Skipnav\n// Skip to main content\n\na.skip-to-main {\n left: -999px;\n position: absolute;\n top: auto;\n width: 1px;\n height: 1px;\n overflow: hidden;\n z-index: -999;\n}\n\na.skip-to-main:focus,\na.skip-to-main:active {\n color: $link-color;\n background-color: $body-background-color;\n left: auto;\n top: auto;\n width: 30%;\n height: auto;\n overflow: auto;\n margin: 10px 35%;\n padding: 5px;\n border-radius: 15px;\n border: 4px solid $btn-primary-color;\n text-align: center;\n font-size: 1.2em;\n z-index: 999;\n}\n","\n@import \"./support/support\";\n@import \"./custom/setup\";\n@import \"./color_schemes/light\";\n\n@import \"./modules\";\ndiv.opaque {\n background-color: $body-background-color;\n}\n\np.tip, blockquote.tip {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $green-300;\n content: \"Tip\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .tip-title {\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.tip-title, blockquote.tip-title {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.tip {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.tip-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.note, blockquote.note {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $blue-300;\n content: \"Note\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .note-title {\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.note-title, blockquote.note-title {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.note {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.note-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.warning, blockquote.warning {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $yellow-300;\n content: \"Warning\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .warning-title {\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.warning-title, blockquote.warning-title {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.warning {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.warning-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n@import \"./custom/custom\";\n\n\n"],"file":"just-the-docs-light.css"}
\ No newline at end of file
+{"version":3,"sourceRoot":"","sources":["../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/vendor/accessible-pygments/github-light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/vendor/normalize.scss/normalize.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/base.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/color_schemes/light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/support/mixins/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/support/mixins/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/support/_variables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/content.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/navigation.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/labels.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/support/mixins/_buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/search.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/tables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/code.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/utilities/_colors.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/utilities/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/utilities/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/utilities/_lists.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/utilities/_spacing.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/print.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/skiptomain.scss","just-the-docs-light.scss"],"names":[],"mappings":"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;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvOF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AbrBE;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAQR;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AdhHA;EACE;;ACYA;EcZJ;IfII;;;;AAKF;EACE;;ACEA;EcRJ;IfUI;;;;AAKF;EACE;;ACRA;EcJJ;IfgBI;;;;AAKF;EACE;;AClBA;EcAJ;IfsBI;;;;AAKF;EACE;;AC5BA;EcIJ;If4BI;;;;AAKF;EACE;;ACtCA;EcQJ;IfkCI;IACA,aEhDuB;;;;AFqDzB;EACE;EACA,aEvDuB;;ADKvB;EcYJ;If0CI;;;;AAKF;EACE;EACA,aElEuB;;ADKvB;EcgBJ;IfiDI;;;;AAKF;EACE;EACA,aE7EuB;;ADKvB;EcoBJ;IfwDI;;;;AAKF;EACE;EACA,aExFuB;;ADKvB;EcwBJ;If+DI;;;;Ae3DJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,abxDiB;;;Aa2DnB;EACE,ab1DyB;;;Aa6D3B;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC/EF;EACE;EACA;EACA;;AAGE;EACE;;;ACLN;EACE;EACA;;;AAQA;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AhBlCA;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAaN;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AhB7GA;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AC3JR;EACE;AAAA;AAAA;AAAA;AAAA;AAAA;IAME;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;;;ACvCJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE,OjBwBW;EiBvBX,kBjBaM;EiBZN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACtBF;EACE,kBlBsBM;;;AkBnBR;EACI;EACA;EACA,elB8EY;EkB7EZ;EACA;;AAEA;EACI,OlBgCI;EkB/BJ;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlBsBM;EkBrBN;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBmDY;EkBlDZ;EACA;;AACA;EACE;EACA;EACA,OlBIM;EkBHN;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,elBKY;EkBJZ;EACA;;AAEA;EACI,OlB7CG;EkB8CH;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlBvDK;EkBwDL;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBtBY;EkBuBZ;EACA;;AACA;EACE;EACA;EACA,OlBzEK;EkB0EL;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,elBpEY;EkBqEZ;EACA;;AAEA;EACI,OlB9GK;EkB+GL;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlBxHO;EkByHP;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elB/FY;EkBgGZ;EACA;;AACA;EACE;EACA;EACA,OlB1IO;EkB2IP;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE","sourcesContent":["/*\ngenerated by accessible-pygments \nCopyright (c) 2022, Quansight Labs\nLicensed under the BSD license, see LICENSE for details.\n--\ngenerated by Pygments \nCopyright 2006-2025 by the Pygments team.\nLicensed under the BSD license, see LICENSE for details.\n*/\n\n.highlight .hll { background-color: #0969da4a }\n.highlight .c { color: #6E7781 } /* Comment */\n.highlight .err { color: #CF222E } /* Error */\n.highlight .k { color: #CF222E } /* Keyword */\n.highlight .l { color: #953800 } /* Literal */\n.highlight .n { color: #8250DF } /* Name */\n.highlight .o { color: #116329 } /* Operator */\n.highlight .p { color: #24292F } /* Punctuation */\n.highlight .ch { color: #6E7781 } /* Comment.Hashbang */\n.highlight .cm { color: #6E7781 } /* Comment.Multiline */\n.highlight .cp { color: #6E7781 } /* Comment.Preproc */\n.highlight .cpf { color: #6E7781 } /* Comment.PreprocFile */\n.highlight .c1 { color: #6E7781 } /* Comment.Single */\n.highlight .cs { color: #6E7781 } /* Comment.Special */\n.highlight .gd { color: #0550AE } /* Generic.Deleted */\n.highlight .ge { font-style: italic } /* Generic.Emph */\n.highlight .gr { color: #CF222E } /* Generic.Error */\n.highlight .gh { color: #0550AE } /* Generic.Heading */\n.highlight .gs { font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #0550AE } /* Generic.Subheading */\n.highlight .kc { color: #0550AE } /* Keyword.Constant */\n.highlight .kd { color: #CF222E } /* Keyword.Declaration */\n.highlight .kn { color: #CF222E } /* Keyword.Namespace */\n.highlight .kp { color: #CF222E } /* Keyword.Pseudo */\n.highlight .kr { color: #CF222E } /* Keyword.Reserved */\n.highlight .kt { color: #CF222E } /* Keyword.Type */\n.highlight .ld { color: #953800 } /* Literal.Date */\n.highlight .m { color: #953800 } /* Literal.Number */\n.highlight .s { color: #0550AE } /* Literal.String */\n.highlight .na { color: #953800 } /* Name.Attribute */\n.highlight .nb { color: #953800 } /* Name.Builtin */\n.highlight .nc { color: #0550AE } /* Name.Class */\n.highlight .no { color: #0550AE } /* Name.Constant */\n.highlight .nd { color: #953800 } /* Name.Decorator */\n.highlight .ni { color: #116329 } /* Name.Entity */\n.highlight .ne { color: #8250DF } /* Name.Exception */\n.highlight .nf { color: #0550AE } /* Name.Function */\n.highlight .nl { color: #953800 } /* Name.Label */\n.highlight .nn { color: #24292F } /* Name.Namespace */\n.highlight .nx { color: #8250DF } /* Name.Other */\n.highlight .py { color: #0550AE } /* Name.Property */\n.highlight .nt { color: #116329 } /* Name.Tag */\n.highlight .nv { color: #953800 } /* Name.Variable */\n.highlight .ow { color: #8250DF } /* Operator.Word */\n.highlight .pm { color: #24292F } /* Punctuation.Marker */\n.highlight .w { color: #24292F } /* Text.Whitespace */\n.highlight .mb { color: #953800 } /* Literal.Number.Bin */\n.highlight .mf { color: #953800 } /* Literal.Number.Float */\n.highlight .mh { color: #953800 } /* Literal.Number.Hex */\n.highlight .mi { color: #953800 } /* Literal.Number.Integer */\n.highlight .mo { color: #953800 } /* Literal.Number.Oct */\n.highlight .sa { color: #0550AE } /* Literal.String.Affix */\n.highlight .sb { color: #0550AE } /* Literal.String.Backtick */\n.highlight .sc { color: #0550AE } /* Literal.String.Char */\n.highlight .dl { color: #0550AE } /* Literal.String.Delimiter */\n.highlight .sd { color: #0550AE } /* Literal.String.Doc */\n.highlight .s2 { color: #0550AE } /* Literal.String.Double */\n.highlight .se { color: #0550AE } /* Literal.String.Escape */\n.highlight .sh { color: #0550AE } /* Literal.String.Heredoc */\n.highlight .si { color: #0550AE } /* Literal.String.Interpol */\n.highlight .sx { color: #0550AE } /* Literal.String.Other */\n.highlight .sr { color: #0550AE } /* Literal.String.Regex */\n.highlight .s1 { color: #0550AE } /* Literal.String.Single */\n.highlight .ss { color: #0550AE } /* Literal.String.Symbol */\n.highlight .bp { color: #953800 } /* Name.Builtin.Pseudo */\n.highlight .fm { color: #0550AE } /* Name.Function.Magic */\n.highlight .vc { color: #953800 } /* Name.Variable.Class */\n.highlight .vg { color: #953800 } /* Name.Variable.Global */\n.highlight .vi { color: #953800 } /* Name.Variable.Instance */\n.highlight .vm { color: #953800 } /* Name.Variable.Magic */\n.highlight .il { color: #953800 } /* Literal.Number.Integer.Long */\n","/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput {\n /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect {\n /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// Base element style overrides\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\n:root {\n color-scheme: $color-scheme;\n}\n\n* {\n box-sizing: border-box;\n}\n\nhtml {\n scroll-behavior: smooth;\n\n @include fs-4;\n}\n\nbody {\n font-family: $body-font-family;\n font-size: inherit;\n line-height: $body-line-height;\n color: $body-text-color;\n background-color: $body-background-color;\n overflow-wrap: break-word;\n}\n\nol,\nul,\ndl,\npre,\naddress,\nblockquote,\ntable,\ndiv,\nhr,\nform,\nfieldset,\nnoscript .table-wrapper {\n margin-top: 0;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n#toctitle {\n margin-top: 0;\n margin-bottom: 1em;\n font-weight: 500;\n line-height: $body-heading-line-height;\n color: $body-heading-color;\n}\n\np {\n margin-top: 1em;\n margin-bottom: 1em;\n}\n\na {\n color: $link-color;\n text-decoration: none;\n}\n\na:not([class]) {\n text-decoration: underline;\n text-decoration-color: $border-color;\n text-underline-offset: 2px;\n\n &:hover {\n text-decoration-color: rgba($link-color, 0.45);\n }\n}\n\ncode {\n font-family: $mono-font-family;\n font-size: 0.75em;\n line-height: $body-line-height;\n}\n\nfigure,\npre {\n margin: 0;\n}\n\nli {\n margin: 0.25em 0;\n}\n\nimg {\n max-width: 100%;\n height: auto;\n}\n\nhr {\n height: 1px;\n padding: 0;\n margin: $sp-6 0;\n background-color: $border-color;\n border: 0;\n}\n\n// adds a GitHub-style sidebar to blockquotes\nblockquote {\n margin: 10px 0;\n\n // resets user-agent stylesheets for blockquotes\n margin-block-start: 0;\n margin-inline-start: 0;\n padding-left: 1rem;\n border-left: 3px solid $border-color;\n}\n","$color-scheme: light !default;\n$body-background-color: $white !default;\n$body-heading-color: $grey-dk-300 !default;\n$body-text-color: $grey-dk-100 !default;\n$link-color: $purple-000 !default;\n$nav-child-link-color: $grey-dk-100 !default;\n$sidebar-color: $grey-lt-000 !default;\n$base-button-color: #f7f7f7 !default;\n$btn-primary-color: $purple-100 !default;\n$code-background-color: $white !default;\n$feedback-color: darken($sidebar-color, 3%) !default;\n$table-background-color: $white !default;\n$search-background-color: $white !default;\n$search-result-preview-color: $grey-dk-100 !default;\n\n@import \"./vendor/accessible-pygments/github-light\";\n","@mixin fs-1 {\n & {\n font-size: $font-size-1 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-1-sm !important;\n }\n}\n\n@mixin fs-2 {\n & {\n font-size: $font-size-2 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-3 !important;\n }\n}\n\n@mixin fs-3 {\n & {\n font-size: $font-size-3 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-4 !important;\n }\n}\n\n@mixin fs-4 {\n & {\n font-size: $font-size-4 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-5 !important;\n }\n}\n\n@mixin fs-5 {\n & {\n font-size: $font-size-5 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-6 !important;\n }\n}\n\n@mixin fs-6 {\n & {\n font-size: $font-size-6 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n}\n\n@mixin fs-7 {\n & {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-8 !important;\n }\n}\n\n@mixin fs-8 {\n & {\n font-size: $font-size-8 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-9 !important;\n }\n}\n\n@mixin fs-9 {\n & {\n font-size: $font-size-9 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10 !important;\n }\n}\n\n@mixin fs-10 {\n & {\n font-size: $font-size-10 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10-sm !important;\n }\n}\n","// Media query\n\n// Media query mixin\n// Usage:\n// @include mq(md) {\n// ..medium and up styles\n// }\n@mixin mq($name) {\n // Retrieves the value from the key\n $value: map-get($media-queries, $name);\n\n // If the key exists in the map\n @if $value {\n // Prints a media query based on the value\n @media (min-width: $value) {\n @content;\n }\n } @else {\n @warn \"No value could be retrieved from `#{$media-query}`. Please make sure it is defined in `$media-queries` map.\";\n }\n}\n\n// Responsive container\n\n@mixin container {\n padding-right: $gutter-spacing-sm;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-right: $gutter-spacing;\n padding-left: $gutter-spacing;\n }\n}\n","// Typography\n\n// prettier-ignore\n$body-font-family: system-ui, -apple-system, blinkmacsystemfont, \"Segoe UI\",\n roboto, \"Helvetica Neue\", arial, sans-serif, \"Segoe UI Emoji\" !default;\n$mono-font-family: \"SFMono-Regular\", menlo, consolas, monospace !default;\n$root-font-size: 16px !default; // DEPRECATED: previously base font-size for rems\n$body-line-height: 1.4 !default;\n$content-line-height: 1.6 !default;\n$body-heading-line-height: 1.25 !default;\n\n// Font size\n// `-sm` suffix is the size at the small (and above) media query\n\n$font-size-1: 0.5625rem !default;\n$font-size-1-sm: 0.625rem !default;\n$font-size-2: 0.6875rem !default; // h4 - uppercased!, h6 not uppercased, text-small\n$font-size-3: 0.75rem !default; // h5\n$font-size-4: 0.875rem !default;\n$font-size-5: 1rem !default; // h3\n$font-size-6: 1.125rem !default; // h2\n$font-size-7: 1.5rem !default;\n$font-size-8: 2rem !default; // h1\n$font-size-9: 2.25rem !default;\n$font-size-10: 2.625rem !default;\n$font-size-10-sm: 3rem !default;\n\n// Colors\n\n$white: #fff !default;\n$grey-dk-000: #959396 !default;\n$grey-dk-100: #5c5962 !default;\n$grey-dk-200: #44434d !default;\n$grey-dk-250: #302d36 !default;\n$grey-dk-300: #27262b !default;\n$grey-lt-000: #f5f6fa !default;\n$grey-lt-100: #eeebee !default;\n$grey-lt-200: #ecebed !default;\n$grey-lt-300: #e6e1e8 !default;\n$purple-000: #7253ed !default;\n$purple-100: #5e41d0 !default;\n$purple-200: #4e26af !default;\n$purple-300: #381885 !default;\n$blue-000: #2c84fa !default;\n$blue-100: #2869e6 !default;\n$blue-200: #264caf !default;\n$blue-300: #183385 !default;\n$green-000: #41d693 !default;\n$green-100: #11b584 !default;\n$green-200: #009c7b !default;\n$green-300: #026e57 !default;\n$yellow-000: #ffeb82 !default;\n$yellow-100: #fadf50 !default;\n$yellow-200: #f7d12e !default;\n$yellow-300: #e7af06 !default;\n$red-000: #f77e7e !default;\n$red-100: #f96e65 !default;\n$red-200: #e94c4c !default;\n$red-300: #dd2e2e !default;\n\n// Spacing\n\n$spacing-unit: 1rem; // 1rem == 16px\n\n$spacers: (\n sp-0: 0,\n sp-1: $spacing-unit * 0.25,\n sp-2: $spacing-unit * 0.5,\n sp-3: $spacing-unit * 0.75,\n sp-4: $spacing-unit,\n sp-5: $spacing-unit * 1.5,\n sp-6: $spacing-unit * 2,\n sp-7: $spacing-unit * 2.5,\n sp-8: $spacing-unit * 3,\n sp-9: $spacing-unit * 3.5,\n sp-10: $spacing-unit * 4,\n) !default;\n$sp-1: map-get($spacers, sp-1) !default; // 0.25 rem == 4px\n$sp-2: map-get($spacers, sp-2) !default; // 0.5 rem == 8px\n$sp-3: map-get($spacers, sp-3) !default; // 0.75 rem == 12px\n$sp-4: map-get($spacers, sp-4) !default; // 1 rem == 16px\n$sp-5: map-get($spacers, sp-5) !default; // 1.5 rem == 24px\n$sp-6: map-get($spacers, sp-6) !default; // 2 rem == 32px\n$sp-7: map-get($spacers, sp-7) !default; // 2.5 rem == 40px\n$sp-8: map-get($spacers, sp-8) !default; // 3 rem == 48px\n$sp-9: map-get($spacers, sp-9) !default; // 3.5 rem == 56px\n$sp-10: map-get($spacers, sp-10) !default; // 4 rem == 64px\n\n// Borders\n\n$border: 1px solid !default;\n$border-radius: 4px !default;\n$border-color: $grey-lt-100 !default;\n\n// Grid system\n\n$gutter-spacing: $sp-6 !default;\n$gutter-spacing-sm: $sp-4 !default;\n$nav-width: 16.5rem !default;\n$nav-width-md: 15.5rem !default;\n$nav-list-item-height: $sp-6 !default;\n$nav-list-item-height-sm: $sp-8 !default;\n$nav-list-expander-right: true;\n$content-width: 50rem !default;\n$header-height: 3.75rem !default;\n$search-results-width: $content-width - $nav-width !default;\n$transition-duration: 400ms;\n\n// Media queries in pixels\n\n$media-queries: (\n xs: 20rem,\n sm: 31.25rem,\n md: $content-width,\n lg: $content-width + $nav-width,\n xl: 87.5rem,\n) !default;\n","// The basic two column layout\n\n.side-bar {\n z-index: 0;\n display: flex;\n flex-wrap: wrap;\n background-color: $sidebar-color;\n\n @include mq(md) {\n flex-flow: column nowrap;\n position: fixed;\n width: $nav-width-md;\n height: 100%;\n border-right: $border $border-color;\n align-items: flex-end;\n }\n\n @include mq(lg) {\n width: calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width});\n min-width: $nav-width;\n }\n\n & + .main {\n @include mq(md) {\n margin-left: $nav-width-md;\n }\n\n @include mq(lg) {\n // stylelint-disable function-name-case\n // disable for Max(), we want to use the CSS max() function\n margin-left: Max(\n #{$nav-width},\n calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width})\n );\n // stylelint-enable function-name-case\n }\n\n .main-header {\n display: none;\n background-color: $sidebar-color;\n\n @include mq(md) {\n display: flex;\n background-color: $body-background-color;\n }\n\n &.nav-open {\n display: block;\n\n @include mq(md) {\n display: flex;\n }\n }\n }\n }\n}\n\n.main {\n margin: auto;\n\n @include mq(md) {\n position: relative;\n max-width: $content-width;\n }\n}\n\n.main-content-wrap {\n padding-top: $gutter-spacing-sm;\n padding-bottom: $gutter-spacing-sm;\n\n @include container;\n\n @include mq(md) {\n padding-top: $gutter-spacing;\n padding-bottom: $gutter-spacing;\n }\n}\n\n.main-header {\n z-index: 0;\n border-bottom: $border $border-color;\n\n @include mq(md) {\n display: flex;\n justify-content: space-between;\n height: $header-height;\n }\n}\n\n.site-nav,\n.site-header,\n.site-footer {\n width: 100%;\n\n @include mq(lg) {\n width: $nav-width;\n }\n}\n\n.site-nav {\n display: none;\n\n &.nav-open {\n display: block;\n }\n\n @include mq(md) {\n display: block;\n padding-top: $sp-8;\n padding-bottom: $gutter-spacing-sm;\n overflow-y: auto;\n flex: 1 1 auto;\n }\n}\n\n.site-header {\n display: flex;\n min-height: $header-height;\n align-items: center;\n\n @include mq(md) {\n height: $header-height;\n max-height: $header-height;\n border-bottom: $border $border-color;\n }\n}\n\n.site-title {\n flex-grow: 1;\n display: flex;\n height: 100%;\n align-items: center;\n padding-top: $sp-3;\n padding-bottom: $sp-3;\n color: $body-heading-color;\n\n @include container;\n\n @include fs-6;\n\n @include mq(md) {\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n }\n}\n\n@if variable-exists(logo) {\n .site-logo {\n width: 100%;\n height: 100%;\n background-image: url($logo);\n background-repeat: no-repeat;\n background-position: left center;\n background-size: contain;\n }\n}\n\n.site-button {\n display: flex;\n height: 100%;\n padding: $gutter-spacing-sm;\n align-items: center;\n}\n\n@include mq(md) {\n .site-header .site-button {\n display: none;\n }\n}\n\n.site-title:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n}\n\n.site-button:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n}\n\n.site-footer {\n position: absolute;\n bottom: 0;\n left: 0;\n padding-top: $sp-4;\n padding-bottom: $sp-4;\n\n @include container;\n\n @include fs-2;\n\n @include mq(md) {\n position: static;\n justify-self: end;\n }\n}\n\n.icon {\n width: $sp-5;\n height: $sp-5;\n color: $link-color;\n}\n","@charset \"UTF-8\";\n\n// Styles for rendered markdown in the .main-content container\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity, selector-max-id\n\n.main-content {\n line-height: $content-line-height;\n\n ol,\n ul,\n dl,\n pre,\n address,\n blockquote,\n .table-wrapper {\n margin-top: 0.5em;\n }\n\n a {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n ul,\n ol {\n padding-left: 1.5em;\n }\n\n li {\n .highlight {\n margin-top: $sp-1;\n }\n }\n\n ol {\n list-style-type: none;\n counter-reset: step-counter;\n\n > li {\n position: relative;\n\n &::before {\n position: absolute;\n top: 0.2em;\n left: -1.6em;\n color: $grey-dk-000;\n content: counter(step-counter);\n counter-increment: step-counter;\n @include fs-3;\n\n @include mq(sm) {\n top: 0.11em;\n }\n }\n\n ol {\n counter-reset: sub-counter;\n\n > li {\n &::before {\n content: counter(sub-counter, lower-alpha);\n counter-increment: sub-counter;\n }\n }\n }\n }\n }\n\n ul {\n list-style: none;\n\n > li {\n &::before {\n position: absolute;\n margin-left: -1.4em;\n color: $grey-dk-000;\n content: \"•\";\n }\n }\n }\n\n .task-list-item {\n &::before {\n content: \"\";\n }\n }\n\n .task-list-item-checkbox {\n margin-right: 0.6em;\n margin-left: -1.4em;\n\n // The same margin-left is used above for ul > li::before\n }\n\n hr + * {\n margin-top: 0;\n }\n\n h1:first-of-type {\n margin-top: 0.5em;\n }\n\n dl {\n display: grid;\n grid-template: auto / 10em 1fr;\n }\n\n dt,\n dd {\n margin: 0.25em 0;\n }\n\n dt {\n grid-column: 1;\n font-weight: 500;\n text-align: right;\n\n &::after {\n content: \":\";\n }\n }\n\n dd {\n grid-column: 2;\n margin-bottom: 0;\n margin-left: 1em;\n\n blockquote,\n div,\n dl,\n dt,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n li,\n ol,\n p,\n pre,\n table,\n ul,\n .table-wrapper {\n &:first-child {\n margin-top: 0;\n }\n }\n }\n\n dd,\n ol,\n ul {\n dl:first-child {\n dt:first-child,\n dd:nth-child(2) {\n margin-top: 0;\n }\n }\n }\n\n .anchor-heading {\n position: absolute;\n right: -$sp-4;\n width: $sp-5;\n height: 100%;\n padding-right: $sp-1;\n padding-left: $sp-1;\n overflow: visible;\n\n @include mq(md) {\n right: auto;\n left: -$sp-5;\n }\n\n svg {\n display: inline-block;\n width: 100%;\n height: 100%;\n color: $link-color;\n visibility: hidden;\n }\n }\n\n .anchor-heading:hover,\n .anchor-heading:focus,\n h1:hover > .anchor-heading,\n h2:hover > .anchor-heading,\n h3:hover > .anchor-heading,\n h4:hover > .anchor-heading,\n h5:hover > .anchor-heading,\n h6:hover > .anchor-heading {\n svg {\n visibility: visible;\n }\n }\n\n summary {\n cursor: pointer;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n #toctitle {\n position: relative;\n margin-top: 1.5em;\n margin-bottom: 0.25em;\n\n + table,\n + .table-wrapper,\n + .code-example,\n + .highlighter-rouge,\n + .sectionbody .listingblock {\n margin-top: 1em;\n }\n\n + p:not(.label) {\n margin-top: 0;\n }\n }\n\n > h1:first-child,\n > h2:first-child,\n > h3:first-child,\n > h4:first-child,\n > h5:first-child,\n > h6:first-child,\n > .sect1:first-child > h2,\n > .sect2:first-child > h3,\n > .sect3:first-child > h4,\n > .sect4:first-child > h5,\n > .sect5:first-child > h6 {\n margin-top: $sp-2;\n }\n}\n","// Main nav, breadcrumb, etc...\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity\n\n.nav-list {\n padding: 0;\n margin-top: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n margin: 0;\n\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n\n .nav-list-link {\n display: block;\n min-height: $nav-list-item-height-sm;\n padding-top: $sp-1;\n padding-bottom: $sp-1;\n line-height: #{$nav-list-item-height-sm - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height-sm;\n padding-left: $gutter-spacing-sm;\n } @else {\n padding-right: $gutter-spacing-sm;\n padding-left: $nav-list-item-height-sm;\n }\n\n @include mq(md) {\n min-height: $nav-list-item-height;\n line-height: #{$nav-list-item-height - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height;\n padding-left: $gutter-spacing;\n } @else {\n padding-right: $gutter-spacing;\n padding-left: $nav-list-item-height;\n }\n }\n\n &.external > svg {\n width: $sp-4;\n height: $sp-4;\n vertical-align: text-bottom;\n }\n\n &.active {\n font-weight: 600;\n text-decoration: none;\n }\n\n &:hover,\n &.active {\n color: darken($link-color, 5%);\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n }\n }\n\n .nav-list-expander {\n position: absolute;\n @if $nav-list-expander-right {\n right: 0;\n }\n\n width: $nav-list-item-height-sm;\n height: $nav-list-item-height-sm;\n padding: #{$nav-list-item-height-sm * 0.25};\n color: $link-color;\n\n @include mq(md) {\n width: $nav-list-item-height;\n height: $nav-list-item-height;\n padding: #{$nav-list-item-height * 0.25};\n }\n\n &:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n }\n\n @if $nav-list-expander-right {\n svg {\n transform: rotate(90deg);\n }\n }\n }\n\n > .nav-list {\n display: none;\n padding-left: $sp-3;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n\n .nav-list-link {\n color: $nav-child-link-color;\n }\n\n .nav-list-expander {\n color: $nav-child-link-color;\n }\n }\n }\n\n &.active {\n > .nav-list-expander svg {\n @if $nav-list-expander-right {\n transform: rotate(-90deg);\n } @else {\n transform: rotate(90deg);\n }\n }\n\n > .nav-list {\n display: block;\n }\n }\n }\n}\n\n.nav-category {\n padding: $sp-2 $gutter-spacing-sm;\n font-weight: 600;\n text-align: start;\n text-transform: uppercase;\n border-bottom: $border $border-color;\n @include fs-2;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing;\n margin-top: $gutter-spacing-sm;\n text-align: start;\n\n &:first-child {\n margin-top: 0;\n }\n }\n}\n\n.nav-list.nav-category-list {\n > .nav-list-item {\n margin: 0;\n\n > .nav-list {\n padding: 0;\n\n > .nav-list-item {\n > .nav-list-link {\n color: $link-color;\n }\n\n > .nav-list-expander {\n color: $link-color;\n }\n }\n }\n }\n}\n\n// Aux nav\n\n.aux-nav {\n height: 100%;\n overflow-x: auto;\n @include fs-2;\n\n .aux-nav-list {\n display: flex;\n height: 100%;\n padding: 0;\n margin: 0;\n list-style: none;\n }\n\n .aux-nav-list-item {\n display: inline-block;\n height: 100%;\n padding: 0;\n margin: 0;\n }\n\n @include mq(md) {\n padding-right: $gutter-spacing-sm;\n }\n}\n\n// Breadcrumb nav\n\n.breadcrumb-nav {\n @include mq(md) {\n margin-top: -$sp-4;\n }\n}\n\n.breadcrumb-nav-list {\n padding-left: 0;\n margin-bottom: $sp-3;\n list-style: none;\n}\n\n.breadcrumb-nav-list-item {\n display: table-cell;\n @include fs-2;\n\n &::before {\n display: none;\n }\n\n &::after {\n display: inline-block;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $grey-dk-000;\n content: \"/\";\n }\n\n &:last-child {\n &::after {\n content: \"\";\n }\n }\n}\n","// Typography\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\nh1,\n.text-alpha {\n font-weight: 300;\n\n @include fs-8;\n}\n\nh2,\n.text-beta,\n#toctitle {\n @include fs-6;\n}\n\nh3,\n.text-gamma {\n @include fs-5;\n}\n\nh4,\n.text-delta {\n font-weight: 400;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n\n @include fs-2;\n}\n\nh4 code {\n text-transform: none;\n}\n\nh5,\n.text-epsilon {\n @include fs-3;\n}\n\nh6,\n.text-zeta {\n @include fs-2;\n}\n\n.text-small {\n @include fs-2;\n}\n\n.text-mono {\n font-family: $mono-font-family !important;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n","// Labels (not the form kind)\n\n// this :not() prevents a style clash with Mermaid.js's\n// diagram labels, which also use .label\n// for more, see https://github.com/just-the-docs/just-the-docs/issues/1272\n// and the accompanying PR\n.label:not(g),\n.label-blue:not(g) {\n display: inline-block;\n padding: 0.16em 0.56em;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $white;\n text-transform: uppercase;\n vertical-align: middle;\n background-color: $blue-100;\n border-radius: 12px;\n\n @include fs-2;\n}\n\n.label-green:not(g) {\n background-color: $green-300;\n}\n\n.label-purple:not(g) {\n background-color: $purple-100;\n}\n\n.label-red:not(g) {\n background-color: $red-300;\n}\n\n.label-yellow:not(g) {\n color: $grey-dk-200;\n background-color: $yellow-200;\n}\n","// Buttons and things that look like buttons\n// stylelint-disable color-named\n\n.btn {\n display: inline-block;\n box-sizing: border-box;\n padding: 0.3em 1em;\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n font-weight: 500;\n line-height: 1.5;\n color: $link-color;\n text-decoration: none;\n vertical-align: baseline;\n cursor: pointer;\n background-color: $base-button-color;\n border-width: 0;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n appearance: none;\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: darken($link-color, 2%);\n }\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n text-decoration: none;\n background-color: darken($base-button-color, 1%);\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($base-button-color, 3%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken(#dcdcdc, 5%);\n }\n\n &:disabled,\n &.disabled {\n &,\n &:hover {\n color: rgba(102, 102, 102, 0.5);\n cursor: default;\n background-color: rgba(229, 229, 229, 0.5);\n background-image: none;\n box-shadow: none;\n }\n }\n}\n\n.btn-outline {\n color: $link-color;\n background: transparent;\n box-shadow: inset 0 0 0 2px $grey-lt-300;\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n color: darken($link-color, 4%);\n text-decoration: none;\n background-color: transparent;\n box-shadow: inset 0 0 0 3px $grey-lt-300;\n }\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow:\n inset 0 0 0 2px $grey-dk-100,\n 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: inset 0 0 0 2px $grey-dk-100;\n }\n}\n\n.btn-primary {\n @include btn-color($white, $btn-primary-color);\n}\n\n.btn-purple {\n @include btn-color($white, $purple-100);\n}\n\n.btn-blue {\n @include btn-color($white, $blue-200);\n}\n\n.btn-green {\n @include btn-color($white, $green-300);\n}\n\n.btn-reset {\n background: none;\n border: none;\n margin: 0;\n text-align: inherit;\n font: inherit;\n border-radius: 0;\n appearance: none;\n}\n","// Colored button\n\n@mixin btn-color($fg, $bg) {\n color: $fg;\n background-color: darken($bg, 2%);\n background-image: linear-gradient(lighten($bg, 5%), darken($bg, 2%));\n box-shadow:\n 0 1px 3px rgba(0, 0, 0, 0.25),\n 0 4px 10px rgba(0, 0, 0, 0.12);\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: $fg;\n background-color: darken($bg, 4%);\n background-image: linear-gradient((lighten($bg, 2%), darken($bg, 4%)));\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($bg, 5%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken($bg, 10%);\n }\n}\n","// Search input and autocomplete\n\n.search {\n position: relative;\n z-index: 2;\n flex-grow: 1;\n height: $sp-10;\n padding: $sp-2;\n transition: padding linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: relative !important;\n width: auto !important;\n height: 100% !important;\n padding: 0;\n transition: none;\n }\n}\n\n.search-input-wrap {\n position: relative;\n z-index: 1;\n height: $sp-8;\n overflow: hidden;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n transition: height linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: absolute;\n width: 100%;\n max-width: $search-results-width;\n height: 100% !important;\n border-radius: 0;\n box-shadow: none;\n transition: width ease $transition-duration;\n }\n}\n\n.search-input {\n position: absolute;\n width: 100%;\n height: 100%;\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing-sm + $sp-5};\n font-size: 1rem;\n color: $body-text-color;\n background-color: $search-background-color;\n border-top: 0;\n border-right: 0;\n border-bottom: 0;\n border-left: 0;\n border-radius: 0;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing + $sp-5};\n font-size: 0.875rem;\n background-color: $body-background-color;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n &:focus {\n outline: 2px solid $link-color;\n outline-offset: -2px;\n\n + .search-label .search-icon {\n color: $link-color;\n }\n }\n}\n\n.search-label {\n position: absolute;\n display: flex;\n height: 100%;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-left: $gutter-spacing;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n .search-icon {\n width: #{$sp-4 * 1.2};\n height: #{$sp-4 * 1.2};\n align-self: center;\n color: $grey-dk-000;\n }\n}\n\n.search-results {\n position: absolute;\n left: 0;\n display: none;\n width: 100%;\n max-height: calc(100% - #{$sp-10});\n overflow-y: auto;\n background-color: $search-background-color;\n border-bottom-right-radius: $border-radius;\n border-bottom-left-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n\n @include mq(md) {\n top: 100%;\n width: $search-results-width;\n max-height: calc(100vh - 200%) !important;\n }\n}\n\n.search-results-list {\n padding-left: 0;\n margin-bottom: $sp-1;\n list-style: none;\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n}\n\n.search-results-list-item {\n padding: 0;\n margin: 0;\n}\n\n.search-result {\n display: block;\n padding: $sp-1 $sp-3;\n\n &:hover,\n &.active {\n background-color: $feedback-color;\n }\n}\n\n.search-result-title {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 40%;\n padding-right: $sp-2;\n vertical-align: top;\n }\n}\n\n.search-result-doc {\n display: flex;\n align-items: center;\n word-wrap: break-word;\n\n &.search-result-doc-parent {\n opacity: 0.5;\n @include fs-3;\n\n @include mq(md) {\n @include fs-2;\n }\n }\n\n .search-result-icon {\n width: $sp-4;\n height: $sp-4;\n margin-right: $sp-2;\n color: $link-color;\n flex-shrink: 0;\n }\n\n .search-result-doc-title {\n overflow: auto;\n }\n}\n\n.search-result-section {\n margin-left: #{$sp-4 + $sp-2};\n word-wrap: break-word;\n}\n\n.search-result-rel-url {\n display: block;\n margin-left: #{$sp-4 + $sp-2};\n overflow: hidden;\n color: $search-result-preview-color;\n text-overflow: ellipsis;\n white-space: nowrap;\n @include fs-1;\n}\n\n.search-result-previews {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n padding-left: $sp-4;\n margin-left: $sp-2;\n color: $search-result-preview-color;\n word-wrap: break-word;\n border-left: $border;\n border-left-color: $border-color;\n @include fs-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 60%;\n padding-left: $sp-2;\n margin-left: 0;\n vertical-align: top;\n }\n}\n\n.search-result-preview + .search-result-preview {\n margin-top: $sp-1;\n}\n\n.search-result-highlight {\n font-weight: bold;\n}\n\n.search-no-result {\n padding: $sp-2 $sp-3;\n @include fs-3;\n}\n\n.search-button {\n position: fixed;\n right: $sp-4;\n bottom: $sp-4;\n display: flex;\n width: $sp-9;\n height: $sp-9;\n background-color: $search-background-color;\n border: 1px solid rgba($link-color, 0.3);\n border-radius: #{$sp-9 * 0.5};\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n align-items: center;\n justify-content: center;\n}\n\n.search-overlay {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1;\n width: 0;\n height: 0;\n background-color: rgba(0, 0, 0, 0.3);\n opacity: 0;\n transition:\n opacity ease $transition-duration,\n width 0s $transition-duration,\n height 0s $transition-duration;\n}\n\n.search-active {\n .search {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .search-input-wrap {\n height: $sp-10;\n border-radius: 0;\n\n @include mq(md) {\n width: $search-results-width;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n }\n }\n\n .search-input {\n background-color: $search-background-color;\n\n @include mq(md) {\n padding-left: 2.3rem;\n }\n }\n\n .search-label {\n @include mq(md) {\n padding-left: 0.6rem;\n }\n }\n\n .search-results {\n display: block;\n }\n\n .search-overlay {\n width: 100%;\n height: 100%;\n opacity: 1;\n transition:\n opacity ease $transition-duration,\n width 0s,\n height 0s;\n }\n\n @include mq(md) {\n .main {\n position: fixed;\n right: 0;\n left: 0;\n }\n }\n\n .main-header {\n padding-top: $sp-10;\n\n @include mq(md) {\n padding-top: 0;\n }\n }\n}\n","// Tables\n// stylelint-disable max-nesting-depth, selector-no-type, selector-max-type\n\n.table-wrapper {\n display: block;\n width: 100%;\n max-width: 100%;\n margin-bottom: $sp-5;\n overflow-x: auto;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n}\n\ntable {\n display: table;\n min-width: 100%;\n border-collapse: separate;\n}\n\nth,\ntd {\n min-width: 7.5rem;\n padding: $sp-2 $sp-3;\n background-color: $table-background-color;\n border-bottom: $border rgba($border-color, 0.5);\n border-left: $border $border-color;\n\n @include fs-3;\n\n &:first-of-type {\n border-left: 0;\n }\n}\n\ntbody {\n tr {\n &:last-of-type {\n th,\n td {\n border-bottom: 0;\n }\n\n td {\n padding-bottom: $sp-3;\n }\n }\n }\n}\n\nthead {\n th {\n border-bottom: $border $border-color;\n }\n}\n","// Code and syntax highlighting\n// stylelint-disable selector-no-qualifying-type, declaration-block-semicolon-newline-after,declaration-block-single-line-max-declarations, selector-no-type, selector-max-type, scss/comment-no-empty\n\n// {% raw %}\n\n// This instruction applies to all queues not within 'pre' or 'figure', avoiding 'code' generated by the highlight.\n:not(pre, figure) {\n & > code {\n padding: 0.2em 0.15em;\n font-weight: 400;\n background-color: $code-background-color;\n border: $border $border-color;\n border-radius: $border-radius;\n }\n}\n\n// Avoid appearance of dark border around visited code links in Safari\na:visited code {\n border-color: $border-color;\n}\n\n// Content structure for highlighted code blocks using fences or Liquid\n//\n// ```[LANG]...```, no kramdown line_numbers:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n//\n// ```[LANG]...```, kramdown line_numbers = true:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.rouge-gutter.gl > pre.lineno\n// | td.rouge-code > pre\n//\n// {% highlight LANG %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n//\n// {% highlight LANG linenos %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.gutter.gl > pre.lineno\n// | td.code > pre\n//\n// ----...---- (AsciiDoc)\n// div.listingblock > div.content > pre.rouge.highlight\n//\n// fix_linenos removes the outermost pre when it encloses table.rouge-table\n//\n// See docs/index-test.md for some tests.\n//\n// No kramdown line_numbers: fences and Liquid highlighting look the same.\n// Kramdown line_numbers = true: fences have a wider gutter than with Liquid?\n\n// ```[LANG]...```\n// or in AsciiDoc:\n//\n// ----\n// ...\n// ----\n\n// the code may appear with 3 different types:\n// container \\ case: default case, code with line number, code with html rendering\n// top level: div.highlighter-rouge, figure.highlight, figure.highlight\n// second level: div.highlight, div.table-wrapper, pre.highlight\n// third level: pre.highlight, td.code, absent\n// last level: code, pre, code (optionality)\n// highlighter level: span, span, span\n// the spacing are only in the second level for case 1, 3 and in the third level for case 2\n// in AsciiDoc, there is a parent container that contains optionally a title and the content.\n\n// select top level container\ndiv.highlighter-rouge,\ndiv.listingblock > div.content,\nfigure.highlight {\n margin-top: 0;\n margin-bottom: $sp-3;\n background-color: $code-background-color;\n border-radius: $border-radius;\n box-shadow: none;\n -webkit-overflow-scrolling: touch;\n position: relative;\n padding: 0;\n\n // copy button (or other button)\n // the button appear only when there is a hover on the code or focus on button\n > button {\n width: $sp-3;\n opacity: 0;\n position: absolute;\n top: 0;\n right: 0;\n padding: $sp-3;\n border: none;\n background: none;\n color: $body-text-color;\n box-sizing: content-box;\n\n svg {\n fill: $body-text-color;\n }\n\n &:active {\n text-decoration: none;\n outline: none;\n opacity: 1;\n }\n\n &:focus {\n opacity: 1;\n outline: 2px solid $link-color;\n }\n }\n\n // the button can be seen by doing a simple hover in the code, there is no need to go over the location of the button\n &:hover {\n > button {\n cursor: copy;\n opacity: 1;\n }\n }\n}\n\n// setting the spacing and scrollbar on the second level for the first case\n// remove all space on the second and third level\n// this is a mixin to accommodate for the slightly different structures generated via Markdown vs AsciiDoc\n@mixin scroll-and-spacing($code-div, $pre-select) {\n #{$code-div} {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n\n #{$pre-select},\n code {\n padding: 0;\n margin: 0;\n border: 0;\n }\n}\n\n// for Markdown\ndiv.highlighter-rouge {\n @include scroll-and-spacing(\"div.highlight\", \"pre.highlight\");\n}\n\n// for AsciiDoc. we also need to fix the margins for its parent container.\ndiv.listingblock {\n margin-top: 0;\n margin-bottom: $sp-3;\n\n @include scroll-and-spacing(\"div.content\", \"div.content > pre\");\n}\n\n// {% highlight LANG %}...{% endhighlight %},\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the second level for the thirt case\n// the css rule are apply only to the last code enviroment\n// setting the scroolbar\nfigure.highlight {\n pre,\n :not(pre) > code {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n}\n\n// ```[LANG]...```, kramdown line_numbers = true,\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the thirt level for the second case\n.highlight .table-wrapper {\n padding: $sp-3 0;\n margin: 0;\n border: 0;\n box-shadow: none;\n\n td,\n pre {\n min-width: 0;\n padding: 0;\n background-color: $code-background-color;\n border: 0;\n\n @include fs-2;\n }\n\n td.gl {\n width: 1em;\n padding-right: $sp-3;\n padding-left: $sp-3;\n }\n\n pre {\n margin: 0;\n line-height: 2;\n }\n}\n\n// Code examples: html render of a code\n.code-example,\n.listingblock > .title {\n padding: $sp-3;\n margin-bottom: $sp-3;\n overflow: auto;\n border: 1px solid $border-color;\n border-radius: $border-radius;\n\n + .highlighter-rouge,\n + .sectionbody .listingblock,\n + .content,\n + figure.highlight {\n position: relative;\n margin-top: -$sp-4;\n border-right: 1px solid $border-color;\n border-bottom: 1px solid $border-color;\n border-left: 1px solid $border-color;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n}\n\n// Mermaid diagram code blocks should be left unstyled.\ncode.language-mermaid {\n padding: 0;\n background-color: inherit;\n border: 0;\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight,\npre.highlight {\n background: $code-background-color; // Code Background\n // For Backwards Compatibility Before $code-linenumber-color was added\n @if variable-exists(code-linenumber-color) {\n color: $code-linenumber-color; // Code Line Numbers\n } @else {\n color: $body-text-color; // Code Line Numbers\n }\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight pre {\n background: $code-background-color; // Code Background\n}\n\n// {% endraw %}\n","// Utility classes for colors\n\n// Text colors\n\n.text-grey-dk-000 {\n color: $grey-dk-000 !important;\n}\n\n.text-grey-dk-100 {\n color: $grey-dk-100 !important;\n}\n\n.text-grey-dk-200 {\n color: $grey-dk-200 !important;\n}\n\n.text-grey-dk-250 {\n color: $grey-dk-250 !important;\n}\n\n.text-grey-dk-300 {\n color: $grey-dk-300 !important;\n}\n\n.text-grey-lt-000 {\n color: $grey-lt-000 !important;\n}\n\n.text-grey-lt-100 {\n color: $grey-lt-100 !important;\n}\n\n.text-grey-lt-200 {\n color: $grey-lt-200 !important;\n}\n\n.text-grey-lt-300 {\n color: $grey-lt-300 !important;\n}\n\n.text-blue-000 {\n color: $blue-000 !important;\n}\n\n.text-blue-100 {\n color: $blue-100 !important;\n}\n\n.text-blue-200 {\n color: $blue-200 !important;\n}\n\n.text-blue-300 {\n color: $blue-300 !important;\n}\n\n.text-green-000 {\n color: $green-000 !important;\n}\n\n.text-green-100 {\n color: $green-100 !important;\n}\n\n.text-green-200 {\n color: $green-200 !important;\n}\n\n.text-green-300 {\n color: $green-300 !important;\n}\n\n.text-purple-000 {\n color: $purple-000 !important;\n}\n\n.text-purple-100 {\n color: $purple-100 !important;\n}\n\n.text-purple-200 {\n color: $purple-200 !important;\n}\n\n.text-purple-300 {\n color: $purple-300 !important;\n}\n\n.text-yellow-000 {\n color: $yellow-000 !important;\n}\n\n.text-yellow-100 {\n color: $yellow-100 !important;\n}\n\n.text-yellow-200 {\n color: $yellow-200 !important;\n}\n\n.text-yellow-300 {\n color: $yellow-300 !important;\n}\n\n.text-red-000 {\n color: $red-000 !important;\n}\n\n.text-red-100 {\n color: $red-100 !important;\n}\n\n.text-red-200 {\n color: $red-200 !important;\n}\n\n.text-red-300 {\n color: $red-300 !important;\n}\n\n// Background colors\n\n.bg-grey-dk-000 {\n background-color: $grey-dk-000 !important;\n}\n\n.bg-grey-dk-100 {\n background-color: $grey-dk-100 !important;\n}\n\n.bg-grey-dk-200 {\n background-color: $grey-dk-200 !important;\n}\n\n.bg-grey-dk-250 {\n background-color: $grey-dk-250 !important;\n}\n\n.bg-grey-dk-300 {\n background-color: $grey-dk-300 !important;\n}\n\n.bg-grey-lt-000 {\n background-color: $grey-lt-000 !important;\n}\n\n.bg-grey-lt-100 {\n background-color: $grey-lt-100 !important;\n}\n\n.bg-grey-lt-200 {\n background-color: $grey-lt-200 !important;\n}\n\n.bg-grey-lt-300 {\n background-color: $grey-lt-300 !important;\n}\n\n.bg-blue-000 {\n background-color: $blue-000 !important;\n}\n\n.bg-blue-100 {\n background-color: $blue-100 !important;\n}\n\n.bg-blue-200 {\n background-color: $blue-200 !important;\n}\n\n.bg-blue-300 {\n background-color: $blue-300 !important;\n}\n\n.bg-green-000 {\n background-color: $green-000 !important;\n}\n\n.bg-green-100 {\n background-color: $green-100 !important;\n}\n\n.bg-green-200 {\n background-color: $green-200 !important;\n}\n\n.bg-green-300 {\n background-color: $green-300 !important;\n}\n\n.bg-purple-000 {\n background-color: $purple-000 !important;\n}\n\n.bg-purple-100 {\n background-color: $purple-100 !important;\n}\n\n.bg-purple-200 {\n background-color: $purple-200 !important;\n}\n\n.bg-purple-300 {\n background-color: $purple-300 !important;\n}\n\n.bg-yellow-000 {\n background-color: $yellow-000 !important;\n}\n\n.bg-yellow-100 {\n background-color: $yellow-100 !important;\n}\n\n.bg-yellow-200 {\n background-color: $yellow-200 !important;\n}\n\n.bg-yellow-300 {\n background-color: $yellow-300 !important;\n}\n\n.bg-red-000 {\n background-color: $red-000 !important;\n}\n\n.bg-red-100 {\n background-color: $red-100 !important;\n}\n\n.bg-red-200 {\n background-color: $red-200 !important;\n}\n\n.bg-red-300 {\n background-color: $red-300 !important;\n}\n","// Utility classes for layout\n\n// Display\n\n.d-block {\n display: block !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n// Screenreader-only\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .d-sm-block, .d-md-none, .d-lg-inline\n .d-#{$media-query}-block {\n display: block !important;\n }\n .d-#{$media-query}-flex {\n display: flex !important;\n }\n .d-#{$media-query}-inline {\n display: inline !important;\n }\n .d-#{$media-query}-inline-block {\n display: inline-block !important;\n }\n .d-#{$media-query}-none {\n display: none !important;\n }\n }\n }\n}\n\n// Horizontal alignment\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.flex-justify-start {\n justify-content: flex-start !important;\n}\n\n.flex-justify-end {\n justify-content: flex-end !important;\n}\n\n.flex-justify-between {\n justify-content: space-between !important;\n}\n\n.flex-justify-around {\n justify-content: space-around !important;\n}\n\n// Vertical alignment\n\n.v-align-baseline {\n vertical-align: baseline !important;\n}\n\n.v-align-bottom {\n vertical-align: bottom !important;\n}\n\n.v-align-middle {\n vertical-align: middle !important;\n}\n\n.v-align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.v-align-text-top {\n vertical-align: text-top !important;\n}\n\n.v-align-top {\n vertical-align: top !important;\n}\n","// Utility classes for typography\n\n.fs-1 {\n @include fs-1;\n}\n\n.fs-2 {\n @include fs-2;\n}\n\n.fs-3 {\n @include fs-3;\n}\n\n.fs-4 {\n @include fs-4;\n}\n\n.fs-5 {\n @include fs-5;\n}\n\n.fs-6 {\n @include fs-6;\n}\n\n.fs-7 {\n @include fs-7;\n}\n\n.fs-8 {\n @include fs-8;\n}\n\n.fs-9 {\n @include fs-9;\n}\n\n.fs-10 {\n @include fs-10;\n}\n\n.fw-300 {\n font-weight: 300 !important;\n}\n\n.fw-400 {\n font-weight: 400 !important;\n}\n\n.fw-500 {\n font-weight: 500 !important;\n}\n\n.fw-700 {\n font-weight: 700 !important;\n}\n\n.lh-0 {\n line-height: 0 !important;\n}\n\n.lh-default {\n line-height: $body-line-height;\n}\n\n.lh-tight {\n line-height: $body-heading-line-height;\n}\n\n.ls-5 {\n letter-spacing: 0.05em !important;\n}\n\n.ls-10 {\n letter-spacing: 0.1em !important;\n}\n\n.ls-0 {\n letter-spacing: 0 !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n","// Utility classes for lists\n\n// stylelint-disable selector-max-type\n\n.list-style-none {\n padding: 0 !important;\n margin: 0 !important;\n list-style: none !important;\n\n li {\n &::before {\n display: none !important;\n }\n }\n}\n","// Utility classes for margins and padding\n\n// stylelint-disable block-opening-brace-space-after, block-opening-brace-space-before\n\n// Margin spacer utilities\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-0, .m-1, .m-2...\n .m-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n .mx-#{$scale}-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-sm-0, .m-md-1, .m-lg-2...\n .m-#{$media-query}-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$media-query}-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$media-query}-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$media-query}-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n }\n }\n}\n\n// Padding spacer utilities\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-0, .p-1, .p-2...\n .p-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @include mq($media-query) {\n @for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-sm-0, .p-md-1, .p-lg-2...\n .p-#{$media-query}-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$media-query}-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$media-query}-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n }\n }\n}\n","// stylelint-disable selector-max-specificity, selector-max-id, selector-max-type, selector-no-qualifying-type\n\n@media print {\n .site-footer,\n .site-button,\n #edit-this-page,\n #back-to-top,\n .site-nav,\n .main-header {\n display: none !important;\n }\n\n hr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n }\n\n .side-bar {\n width: 100%;\n height: auto;\n border-right: 0 !important;\n }\n\n .site-header {\n border-bottom: 1px solid $border-color;\n }\n\n .site-title {\n font-size: 1rem !important;\n font-weight: 700 !important;\n }\n\n .text-small {\n font-size: 8pt !important;\n }\n\n pre.highlight {\n border: 1px solid $border-color;\n }\n\n .main {\n max-width: none;\n margin-left: 0;\n }\n}\n","// Skipnav\n// Skip to main content\n\na.skip-to-main {\n left: -999px;\n position: absolute;\n top: auto;\n width: 1px;\n height: 1px;\n overflow: hidden;\n z-index: -999;\n}\n\na.skip-to-main:focus,\na.skip-to-main:active {\n color: $link-color;\n background-color: $body-background-color;\n left: auto;\n top: auto;\n width: 30%;\n height: auto;\n overflow: auto;\n margin: 10px 35%;\n padding: 5px;\n border-radius: 15px;\n border: 4px solid $btn-primary-color;\n text-align: center;\n font-size: 1.2em;\n z-index: 999;\n}\n","\n@import \"./support/support\";\n@import \"./custom/setup\";\n@import \"./color_schemes/light\";\n\n@import \"./modules\";\ndiv.opaque {\n background-color: $body-background-color;\n}\n\np.tip, blockquote.tip {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $green-300;\n content: \"Tip\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .tip-title {\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.tip-title, blockquote.tip-title {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.tip {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.tip-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.note, blockquote.note {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $blue-300;\n content: \"Note\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .note-title {\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.note-title, blockquote.note-title {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.note {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.note-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.warning, blockquote.warning {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $yellow-300;\n content: \"Warning\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .warning-title {\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.warning-title, blockquote.warning-title {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.warning {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.warning-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n@import \"./custom/custom\";\n\n\n"],"file":"just-the-docs-light.css"}
\ No newline at end of file
diff --git a/main/assets/css/just-the-docs-meshtastic-dark.css.map b/main/assets/css/just-the-docs-meshtastic-dark.css.map
index 971394281c..9d2fcfd929 100644
--- a/main/assets/css/just-the-docs-meshtastic-dark.css.map
+++ b/main/assets/css/just-the-docs-meshtastic-dark.css.map
@@ -1 +1 @@
-{"version":3,"sourceRoot":"","sources":["../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/vendor/accessible-pygments/github-light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/vendor/normalize.scss/normalize.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/base.scss","../../_sass/color_schemes/meshtastic-dark.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/support/mixins/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/support/mixins/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/support/_variables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/content.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/navigation.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/labels.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/support/mixins/_buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/search.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/tables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/code.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/utilities/_colors.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/utilities/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/utilities/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/utilities/_lists.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/utilities/_spacing.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/print.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/skiptomain.scss","just-the-docs-meshtastic-dark.scss"],"names":[],"mappings":"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;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvOF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AbrBE;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAQR;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AdhHA;EACE;;ACYA;EcZJ;IfII;;;;AAKF;EACE;;ACEA;EcRJ;IfUI;;;;AAKF;EACE;;ACRA;EcJJ;IfgBI;;;;AAKF;EACE;;AClBA;EcAJ;IfsBI;;;;AAKF;EACE;;AC5BA;EcIJ;If4BI;;;;AAKF;EACE;;ACtCA;EcQJ;IfkCI;IACA,aEhDuB;;;;AFqDzB;EACE;EACA,aEvDuB;;ADKvB;EcYJ;If0CI;;;;AAKF;EACE;EACA,aElEuB;;ADKvB;EcgBJ;IfiDI;;;;AAKF;EACE;EACA,aE7EuB;;ADKvB;EcoBJ;IfwDI;;;;AAKF;EACE;EACA,aExFuB;;ADKvB;EcwBJ;If+DI;;;;Ae3DJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,abxDiB;;;Aa2DnB;EACE,ab1DyB;;;Aa6D3B;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC/EF;EACE;EACA;EACA;;AAGE;EACE;;;ACLN;EACE;EACA;;;AAQA;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AhBlCA;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAaN;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AhB7GA;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AC3JR;EACE;AAAA;AAAA;AAAA;AAAA;AAAA;IAME;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;;;ACvCJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE,OpBCW;EoBAX,kBpBNsB;EoBOtB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACpBF;EACE,kBrBCsB;;;AqBExB;EACI;EACA;EACA,elB4EY;EkB3EZ;EACA;;AAEA;EACI,OlB8BI;EkB7BJ;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlBoBM;EkBnBN;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBiDY;EkBhDZ;EACA;;AACA;EACE;EACA;EACA,OlBEM;EkBDN;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,elBGY;EkBFZ;EACA;;AAEA;EACI,OlB/CG;EkBgDH;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlBzDK;EkB0DL;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBxBY;EkByBZ;EACA;;AACA;EACE;EACA;EACA,OlB3EK;EkB4EL;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,elBtEY;EkBuEZ;EACA;;AAEA;EACI,OlBhHK;EkBiHL;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlB1HO;EkB2HP;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBjGY;EkBkGZ;EACA;;AACA;EACE;EACA;EACA,OlB5IO;EkB6IP;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE","sourcesContent":["/*\ngenerated by accessible-pygments \nCopyright (c) 2022, Quansight Labs\nLicensed under the BSD license, see LICENSE for details.\n--\ngenerated by Pygments \nCopyright 2006-2025 by the Pygments team.\nLicensed under the BSD license, see LICENSE for details.\n*/\n\n.highlight .hll { background-color: #0969da4a }\n.highlight .c { color: #6E7781 } /* Comment */\n.highlight .err { color: #CF222E } /* Error */\n.highlight .k { color: #CF222E } /* Keyword */\n.highlight .l { color: #953800 } /* Literal */\n.highlight .n { color: #8250DF } /* Name */\n.highlight .o { color: #116329 } /* Operator */\n.highlight .p { color: #24292F } /* Punctuation */\n.highlight .ch { color: #6E7781 } /* Comment.Hashbang */\n.highlight .cm { color: #6E7781 } /* Comment.Multiline */\n.highlight .cp { color: #6E7781 } /* Comment.Preproc */\n.highlight .cpf { color: #6E7781 } /* Comment.PreprocFile */\n.highlight .c1 { color: #6E7781 } /* Comment.Single */\n.highlight .cs { color: #6E7781 } /* Comment.Special */\n.highlight .gd { color: #0550AE } /* Generic.Deleted */\n.highlight .ge { font-style: italic } /* Generic.Emph */\n.highlight .gr { color: #CF222E } /* Generic.Error */\n.highlight .gh { color: #0550AE } /* Generic.Heading */\n.highlight .gs { font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #0550AE } /* Generic.Subheading */\n.highlight .kc { color: #0550AE } /* Keyword.Constant */\n.highlight .kd { color: #CF222E } /* Keyword.Declaration */\n.highlight .kn { color: #CF222E } /* Keyword.Namespace */\n.highlight .kp { color: #CF222E } /* Keyword.Pseudo */\n.highlight .kr { color: #CF222E } /* Keyword.Reserved */\n.highlight .kt { color: #CF222E } /* Keyword.Type */\n.highlight .ld { color: #953800 } /* Literal.Date */\n.highlight .m { color: #953800 } /* Literal.Number */\n.highlight .s { color: #0550AE } /* Literal.String */\n.highlight .na { color: #953800 } /* Name.Attribute */\n.highlight .nb { color: #953800 } /* Name.Builtin */\n.highlight .nc { color: #0550AE } /* Name.Class */\n.highlight .no { color: #0550AE } /* Name.Constant */\n.highlight .nd { color: #953800 } /* Name.Decorator */\n.highlight .ni { color: #116329 } /* Name.Entity */\n.highlight .ne { color: #8250DF } /* Name.Exception */\n.highlight .nf { color: #0550AE } /* Name.Function */\n.highlight .nl { color: #953800 } /* Name.Label */\n.highlight .nn { color: #24292F } /* Name.Namespace */\n.highlight .nx { color: #8250DF } /* Name.Other */\n.highlight .py { color: #0550AE } /* Name.Property */\n.highlight .nt { color: #116329 } /* Name.Tag */\n.highlight .nv { color: #953800 } /* Name.Variable */\n.highlight .ow { color: #8250DF } /* Operator.Word */\n.highlight .pm { color: #24292F } /* Punctuation.Marker */\n.highlight .w { color: #24292F } /* Text.Whitespace */\n.highlight .mb { color: #953800 } /* Literal.Number.Bin */\n.highlight .mf { color: #953800 } /* Literal.Number.Float */\n.highlight .mh { color: #953800 } /* Literal.Number.Hex */\n.highlight .mi { color: #953800 } /* Literal.Number.Integer */\n.highlight .mo { color: #953800 } /* Literal.Number.Oct */\n.highlight .sa { color: #0550AE } /* Literal.String.Affix */\n.highlight .sb { color: #0550AE } /* Literal.String.Backtick */\n.highlight .sc { color: #0550AE } /* Literal.String.Char */\n.highlight .dl { color: #0550AE } /* Literal.String.Delimiter */\n.highlight .sd { color: #0550AE } /* Literal.String.Doc */\n.highlight .s2 { color: #0550AE } /* Literal.String.Double */\n.highlight .se { color: #0550AE } /* Literal.String.Escape */\n.highlight .sh { color: #0550AE } /* Literal.String.Heredoc */\n.highlight .si { color: #0550AE } /* Literal.String.Interpol */\n.highlight .sx { color: #0550AE } /* Literal.String.Other */\n.highlight .sr { color: #0550AE } /* Literal.String.Regex */\n.highlight .s1 { color: #0550AE } /* Literal.String.Single */\n.highlight .ss { color: #0550AE } /* Literal.String.Symbol */\n.highlight .bp { color: #953800 } /* Name.Builtin.Pseudo */\n.highlight .fm { color: #0550AE } /* Name.Function.Magic */\n.highlight .vc { color: #953800 } /* Name.Variable.Class */\n.highlight .vg { color: #953800 } /* Name.Variable.Global */\n.highlight .vi { color: #953800 } /* Name.Variable.Instance */\n.highlight .vm { color: #953800 } /* Name.Variable.Magic */\n.highlight .il { color: #953800 } /* Literal.Number.Integer.Long */\n","/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput {\n /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect {\n /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// Base element style overrides\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\n:root {\n color-scheme: $color-scheme;\n}\n\n* {\n box-sizing: border-box;\n}\n\nhtml {\n scroll-behavior: smooth;\n\n @include fs-4;\n}\n\nbody {\n font-family: $body-font-family;\n font-size: inherit;\n line-height: $body-line-height;\n color: $body-text-color;\n background-color: $body-background-color;\n overflow-wrap: break-word;\n}\n\nol,\nul,\ndl,\npre,\naddress,\nblockquote,\ntable,\ndiv,\nhr,\nform,\nfieldset,\nnoscript .table-wrapper {\n margin-top: 0;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n#toctitle {\n margin-top: 0;\n margin-bottom: 1em;\n font-weight: 500;\n line-height: $body-heading-line-height;\n color: $body-heading-color;\n}\n\np {\n margin-top: 1em;\n margin-bottom: 1em;\n}\n\na {\n color: $link-color;\n text-decoration: none;\n}\n\na:not([class]) {\n text-decoration: underline;\n text-decoration-color: $border-color;\n text-underline-offset: 2px;\n\n &:hover {\n text-decoration-color: rgba($link-color, 0.45);\n }\n}\n\ncode {\n font-family: $mono-font-family;\n font-size: 0.75em;\n line-height: $body-line-height;\n}\n\nfigure,\npre {\n margin: 0;\n}\n\nli {\n margin: 0.25em 0;\n}\n\nimg {\n max-width: 100%;\n height: auto;\n}\n\nhr {\n height: 1px;\n padding: 0;\n margin: $sp-6 0;\n background-color: $border-color;\n border: 0;\n}\n\n// adds a GitHub-style sidebar to blockquotes\nblockquote {\n margin: 10px 0;\n\n // resets user-agent stylesheets for blockquotes\n margin-block-start: 0;\n margin-inline-start: 0;\n padding-left: 1rem;\n border-left: 3px solid $border-color;\n}\n","// Meshtastic Material 3 — Dark color scheme for just-the-docs\n// Source: core/ui/.../Color.kt §8.3 (Dark Scheme)\n//\n// Brand colors:\n// Primary (Dark): #67EA94 (Green 500)\n// Surface (Dark): #1A1B26 (Neutral 900)\n\n$color-scheme: dark;\n\n// Body / page background\n$body-background-color: #1A1B26; // Neutral 900 — surfaceDark\n$sidebar-color: #1A1B26; // Neutral 900\n$body-text-color: #ECEDF3; // Neutral 100 — onSurfaceDark\n$body-heading-color: #ECEDF3; // Neutral 100\n\n// Links\n$link-color: #67EA94; // Green 500 — primaryDark\n$nav-link-color: #67EA94; // Green 500\n\n// Navigation\n$nav-child-link-color: #B8BAC8; // Neutral 300 — secondaryDark\n$search-result-preview-color: #B8BAC8;\n\n// Code\n$code-background-color: #0F1017; // Neutral 950 — surfaceContainerLowestDark\n$code-linenumber-color: #9496A6; // Neutral 400\n\n// Borders\n$border-color: #3D3E50; // Neutral 700 — outlineVariantDark\n$table-background-color: #242533; // Interpolated — surfaceContainerDark\n\n// Buttons\n$btn-primary-color: #67EA94; // Green 500\n$base-button-color: #2C2D3C; // Neutral 800\n\n// Feedback / callouts\n$feedback-color: #242533; // surfaceContainerDark\n\n// Search\n$search-background-color: #242533; // surfaceContainerDark\n","@mixin fs-1 {\n & {\n font-size: $font-size-1 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-1-sm !important;\n }\n}\n\n@mixin fs-2 {\n & {\n font-size: $font-size-2 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-3 !important;\n }\n}\n\n@mixin fs-3 {\n & {\n font-size: $font-size-3 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-4 !important;\n }\n}\n\n@mixin fs-4 {\n & {\n font-size: $font-size-4 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-5 !important;\n }\n}\n\n@mixin fs-5 {\n & {\n font-size: $font-size-5 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-6 !important;\n }\n}\n\n@mixin fs-6 {\n & {\n font-size: $font-size-6 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n}\n\n@mixin fs-7 {\n & {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-8 !important;\n }\n}\n\n@mixin fs-8 {\n & {\n font-size: $font-size-8 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-9 !important;\n }\n}\n\n@mixin fs-9 {\n & {\n font-size: $font-size-9 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10 !important;\n }\n}\n\n@mixin fs-10 {\n & {\n font-size: $font-size-10 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10-sm !important;\n }\n}\n","// Media query\n\n// Media query mixin\n// Usage:\n// @include mq(md) {\n// ..medium and up styles\n// }\n@mixin mq($name) {\n // Retrieves the value from the key\n $value: map-get($media-queries, $name);\n\n // If the key exists in the map\n @if $value {\n // Prints a media query based on the value\n @media (min-width: $value) {\n @content;\n }\n } @else {\n @warn \"No value could be retrieved from `#{$media-query}`. Please make sure it is defined in `$media-queries` map.\";\n }\n}\n\n// Responsive container\n\n@mixin container {\n padding-right: $gutter-spacing-sm;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-right: $gutter-spacing;\n padding-left: $gutter-spacing;\n }\n}\n","// Typography\n\n// prettier-ignore\n$body-font-family: system-ui, -apple-system, blinkmacsystemfont, \"Segoe UI\",\n roboto, \"Helvetica Neue\", arial, sans-serif, \"Segoe UI Emoji\" !default;\n$mono-font-family: \"SFMono-Regular\", menlo, consolas, monospace !default;\n$root-font-size: 16px !default; // DEPRECATED: previously base font-size for rems\n$body-line-height: 1.4 !default;\n$content-line-height: 1.6 !default;\n$body-heading-line-height: 1.25 !default;\n\n// Font size\n// `-sm` suffix is the size at the small (and above) media query\n\n$font-size-1: 0.5625rem !default;\n$font-size-1-sm: 0.625rem !default;\n$font-size-2: 0.6875rem !default; // h4 - uppercased!, h6 not uppercased, text-small\n$font-size-3: 0.75rem !default; // h5\n$font-size-4: 0.875rem !default;\n$font-size-5: 1rem !default; // h3\n$font-size-6: 1.125rem !default; // h2\n$font-size-7: 1.5rem !default;\n$font-size-8: 2rem !default; // h1\n$font-size-9: 2.25rem !default;\n$font-size-10: 2.625rem !default;\n$font-size-10-sm: 3rem !default;\n\n// Colors\n\n$white: #fff !default;\n$grey-dk-000: #959396 !default;\n$grey-dk-100: #5c5962 !default;\n$grey-dk-200: #44434d !default;\n$grey-dk-250: #302d36 !default;\n$grey-dk-300: #27262b !default;\n$grey-lt-000: #f5f6fa !default;\n$grey-lt-100: #eeebee !default;\n$grey-lt-200: #ecebed !default;\n$grey-lt-300: #e6e1e8 !default;\n$purple-000: #7253ed !default;\n$purple-100: #5e41d0 !default;\n$purple-200: #4e26af !default;\n$purple-300: #381885 !default;\n$blue-000: #2c84fa !default;\n$blue-100: #2869e6 !default;\n$blue-200: #264caf !default;\n$blue-300: #183385 !default;\n$green-000: #41d693 !default;\n$green-100: #11b584 !default;\n$green-200: #009c7b !default;\n$green-300: #026e57 !default;\n$yellow-000: #ffeb82 !default;\n$yellow-100: #fadf50 !default;\n$yellow-200: #f7d12e !default;\n$yellow-300: #e7af06 !default;\n$red-000: #f77e7e !default;\n$red-100: #f96e65 !default;\n$red-200: #e94c4c !default;\n$red-300: #dd2e2e !default;\n\n// Spacing\n\n$spacing-unit: 1rem; // 1rem == 16px\n\n$spacers: (\n sp-0: 0,\n sp-1: $spacing-unit * 0.25,\n sp-2: $spacing-unit * 0.5,\n sp-3: $spacing-unit * 0.75,\n sp-4: $spacing-unit,\n sp-5: $spacing-unit * 1.5,\n sp-6: $spacing-unit * 2,\n sp-7: $spacing-unit * 2.5,\n sp-8: $spacing-unit * 3,\n sp-9: $spacing-unit * 3.5,\n sp-10: $spacing-unit * 4,\n) !default;\n$sp-1: map-get($spacers, sp-1) !default; // 0.25 rem == 4px\n$sp-2: map-get($spacers, sp-2) !default; // 0.5 rem == 8px\n$sp-3: map-get($spacers, sp-3) !default; // 0.75 rem == 12px\n$sp-4: map-get($spacers, sp-4) !default; // 1 rem == 16px\n$sp-5: map-get($spacers, sp-5) !default; // 1.5 rem == 24px\n$sp-6: map-get($spacers, sp-6) !default; // 2 rem == 32px\n$sp-7: map-get($spacers, sp-7) !default; // 2.5 rem == 40px\n$sp-8: map-get($spacers, sp-8) !default; // 3 rem == 48px\n$sp-9: map-get($spacers, sp-9) !default; // 3.5 rem == 56px\n$sp-10: map-get($spacers, sp-10) !default; // 4 rem == 64px\n\n// Borders\n\n$border: 1px solid !default;\n$border-radius: 4px !default;\n$border-color: $grey-lt-100 !default;\n\n// Grid system\n\n$gutter-spacing: $sp-6 !default;\n$gutter-spacing-sm: $sp-4 !default;\n$nav-width: 16.5rem !default;\n$nav-width-md: 15.5rem !default;\n$nav-list-item-height: $sp-6 !default;\n$nav-list-item-height-sm: $sp-8 !default;\n$nav-list-expander-right: true;\n$content-width: 50rem !default;\n$header-height: 3.75rem !default;\n$search-results-width: $content-width - $nav-width !default;\n$transition-duration: 400ms;\n\n// Media queries in pixels\n\n$media-queries: (\n xs: 20rem,\n sm: 31.25rem,\n md: $content-width,\n lg: $content-width + $nav-width,\n xl: 87.5rem,\n) !default;\n","// The basic two column layout\n\n.side-bar {\n z-index: 0;\n display: flex;\n flex-wrap: wrap;\n background-color: $sidebar-color;\n\n @include mq(md) {\n flex-flow: column nowrap;\n position: fixed;\n width: $nav-width-md;\n height: 100%;\n border-right: $border $border-color;\n align-items: flex-end;\n }\n\n @include mq(lg) {\n width: calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width});\n min-width: $nav-width;\n }\n\n & + .main {\n @include mq(md) {\n margin-left: $nav-width-md;\n }\n\n @include mq(lg) {\n // stylelint-disable function-name-case\n // disable for Max(), we want to use the CSS max() function\n margin-left: Max(\n #{$nav-width},\n calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width})\n );\n // stylelint-enable function-name-case\n }\n\n .main-header {\n display: none;\n background-color: $sidebar-color;\n\n @include mq(md) {\n display: flex;\n background-color: $body-background-color;\n }\n\n &.nav-open {\n display: block;\n\n @include mq(md) {\n display: flex;\n }\n }\n }\n }\n}\n\n.main {\n margin: auto;\n\n @include mq(md) {\n position: relative;\n max-width: $content-width;\n }\n}\n\n.main-content-wrap {\n padding-top: $gutter-spacing-sm;\n padding-bottom: $gutter-spacing-sm;\n\n @include container;\n\n @include mq(md) {\n padding-top: $gutter-spacing;\n padding-bottom: $gutter-spacing;\n }\n}\n\n.main-header {\n z-index: 0;\n border-bottom: $border $border-color;\n\n @include mq(md) {\n display: flex;\n justify-content: space-between;\n height: $header-height;\n }\n}\n\n.site-nav,\n.site-header,\n.site-footer {\n width: 100%;\n\n @include mq(lg) {\n width: $nav-width;\n }\n}\n\n.site-nav {\n display: none;\n\n &.nav-open {\n display: block;\n }\n\n @include mq(md) {\n display: block;\n padding-top: $sp-8;\n padding-bottom: $gutter-spacing-sm;\n overflow-y: auto;\n flex: 1 1 auto;\n }\n}\n\n.site-header {\n display: flex;\n min-height: $header-height;\n align-items: center;\n\n @include mq(md) {\n height: $header-height;\n max-height: $header-height;\n border-bottom: $border $border-color;\n }\n}\n\n.site-title {\n flex-grow: 1;\n display: flex;\n height: 100%;\n align-items: center;\n padding-top: $sp-3;\n padding-bottom: $sp-3;\n color: $body-heading-color;\n\n @include container;\n\n @include fs-6;\n\n @include mq(md) {\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n }\n}\n\n@if variable-exists(logo) {\n .site-logo {\n width: 100%;\n height: 100%;\n background-image: url($logo);\n background-repeat: no-repeat;\n background-position: left center;\n background-size: contain;\n }\n}\n\n.site-button {\n display: flex;\n height: 100%;\n padding: $gutter-spacing-sm;\n align-items: center;\n}\n\n@include mq(md) {\n .site-header .site-button {\n display: none;\n }\n}\n\n.site-title:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n}\n\n.site-button:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n}\n\n.site-footer {\n position: absolute;\n bottom: 0;\n left: 0;\n padding-top: $sp-4;\n padding-bottom: $sp-4;\n\n @include container;\n\n @include fs-2;\n\n @include mq(md) {\n position: static;\n justify-self: end;\n }\n}\n\n.icon {\n width: $sp-5;\n height: $sp-5;\n color: $link-color;\n}\n","@charset \"UTF-8\";\n\n// Styles for rendered markdown in the .main-content container\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity, selector-max-id\n\n.main-content {\n line-height: $content-line-height;\n\n ol,\n ul,\n dl,\n pre,\n address,\n blockquote,\n .table-wrapper {\n margin-top: 0.5em;\n }\n\n a {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n ul,\n ol {\n padding-left: 1.5em;\n }\n\n li {\n .highlight {\n margin-top: $sp-1;\n }\n }\n\n ol {\n list-style-type: none;\n counter-reset: step-counter;\n\n > li {\n position: relative;\n\n &::before {\n position: absolute;\n top: 0.2em;\n left: -1.6em;\n color: $grey-dk-000;\n content: counter(step-counter);\n counter-increment: step-counter;\n @include fs-3;\n\n @include mq(sm) {\n top: 0.11em;\n }\n }\n\n ol {\n counter-reset: sub-counter;\n\n > li {\n &::before {\n content: counter(sub-counter, lower-alpha);\n counter-increment: sub-counter;\n }\n }\n }\n }\n }\n\n ul {\n list-style: none;\n\n > li {\n &::before {\n position: absolute;\n margin-left: -1.4em;\n color: $grey-dk-000;\n content: \"•\";\n }\n }\n }\n\n .task-list-item {\n &::before {\n content: \"\";\n }\n }\n\n .task-list-item-checkbox {\n margin-right: 0.6em;\n margin-left: -1.4em;\n\n // The same margin-left is used above for ul > li::before\n }\n\n hr + * {\n margin-top: 0;\n }\n\n h1:first-of-type {\n margin-top: 0.5em;\n }\n\n dl {\n display: grid;\n grid-template: auto / 10em 1fr;\n }\n\n dt,\n dd {\n margin: 0.25em 0;\n }\n\n dt {\n grid-column: 1;\n font-weight: 500;\n text-align: right;\n\n &::after {\n content: \":\";\n }\n }\n\n dd {\n grid-column: 2;\n margin-bottom: 0;\n margin-left: 1em;\n\n blockquote,\n div,\n dl,\n dt,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n li,\n ol,\n p,\n pre,\n table,\n ul,\n .table-wrapper {\n &:first-child {\n margin-top: 0;\n }\n }\n }\n\n dd,\n ol,\n ul {\n dl:first-child {\n dt:first-child,\n dd:nth-child(2) {\n margin-top: 0;\n }\n }\n }\n\n .anchor-heading {\n position: absolute;\n right: -$sp-4;\n width: $sp-5;\n height: 100%;\n padding-right: $sp-1;\n padding-left: $sp-1;\n overflow: visible;\n\n @include mq(md) {\n right: auto;\n left: -$sp-5;\n }\n\n svg {\n display: inline-block;\n width: 100%;\n height: 100%;\n color: $link-color;\n visibility: hidden;\n }\n }\n\n .anchor-heading:hover,\n .anchor-heading:focus,\n h1:hover > .anchor-heading,\n h2:hover > .anchor-heading,\n h3:hover > .anchor-heading,\n h4:hover > .anchor-heading,\n h5:hover > .anchor-heading,\n h6:hover > .anchor-heading {\n svg {\n visibility: visible;\n }\n }\n\n summary {\n cursor: pointer;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n #toctitle {\n position: relative;\n margin-top: 1.5em;\n margin-bottom: 0.25em;\n\n + table,\n + .table-wrapper,\n + .code-example,\n + .highlighter-rouge,\n + .sectionbody .listingblock {\n margin-top: 1em;\n }\n\n + p:not(.label) {\n margin-top: 0;\n }\n }\n\n > h1:first-child,\n > h2:first-child,\n > h3:first-child,\n > h4:first-child,\n > h5:first-child,\n > h6:first-child,\n > .sect1:first-child > h2,\n > .sect2:first-child > h3,\n > .sect3:first-child > h4,\n > .sect4:first-child > h5,\n > .sect5:first-child > h6 {\n margin-top: $sp-2;\n }\n}\n","// Main nav, breadcrumb, etc...\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity\n\n.nav-list {\n padding: 0;\n margin-top: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n margin: 0;\n\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n\n .nav-list-link {\n display: block;\n min-height: $nav-list-item-height-sm;\n padding-top: $sp-1;\n padding-bottom: $sp-1;\n line-height: #{$nav-list-item-height-sm - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height-sm;\n padding-left: $gutter-spacing-sm;\n } @else {\n padding-right: $gutter-spacing-sm;\n padding-left: $nav-list-item-height-sm;\n }\n\n @include mq(md) {\n min-height: $nav-list-item-height;\n line-height: #{$nav-list-item-height - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height;\n padding-left: $gutter-spacing;\n } @else {\n padding-right: $gutter-spacing;\n padding-left: $nav-list-item-height;\n }\n }\n\n &.external > svg {\n width: $sp-4;\n height: $sp-4;\n vertical-align: text-bottom;\n }\n\n &.active {\n font-weight: 600;\n text-decoration: none;\n }\n\n &:hover,\n &.active {\n color: darken($link-color, 5%);\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n }\n }\n\n .nav-list-expander {\n position: absolute;\n @if $nav-list-expander-right {\n right: 0;\n }\n\n width: $nav-list-item-height-sm;\n height: $nav-list-item-height-sm;\n padding: #{$nav-list-item-height-sm * 0.25};\n color: $link-color;\n\n @include mq(md) {\n width: $nav-list-item-height;\n height: $nav-list-item-height;\n padding: #{$nav-list-item-height * 0.25};\n }\n\n &:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n }\n\n @if $nav-list-expander-right {\n svg {\n transform: rotate(90deg);\n }\n }\n }\n\n > .nav-list {\n display: none;\n padding-left: $sp-3;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n\n .nav-list-link {\n color: $nav-child-link-color;\n }\n\n .nav-list-expander {\n color: $nav-child-link-color;\n }\n }\n }\n\n &.active {\n > .nav-list-expander svg {\n @if $nav-list-expander-right {\n transform: rotate(-90deg);\n } @else {\n transform: rotate(90deg);\n }\n }\n\n > .nav-list {\n display: block;\n }\n }\n }\n}\n\n.nav-category {\n padding: $sp-2 $gutter-spacing-sm;\n font-weight: 600;\n text-align: start;\n text-transform: uppercase;\n border-bottom: $border $border-color;\n @include fs-2;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing;\n margin-top: $gutter-spacing-sm;\n text-align: start;\n\n &:first-child {\n margin-top: 0;\n }\n }\n}\n\n.nav-list.nav-category-list {\n > .nav-list-item {\n margin: 0;\n\n > .nav-list {\n padding: 0;\n\n > .nav-list-item {\n > .nav-list-link {\n color: $link-color;\n }\n\n > .nav-list-expander {\n color: $link-color;\n }\n }\n }\n }\n}\n\n// Aux nav\n\n.aux-nav {\n height: 100%;\n overflow-x: auto;\n @include fs-2;\n\n .aux-nav-list {\n display: flex;\n height: 100%;\n padding: 0;\n margin: 0;\n list-style: none;\n }\n\n .aux-nav-list-item {\n display: inline-block;\n height: 100%;\n padding: 0;\n margin: 0;\n }\n\n @include mq(md) {\n padding-right: $gutter-spacing-sm;\n }\n}\n\n// Breadcrumb nav\n\n.breadcrumb-nav {\n @include mq(md) {\n margin-top: -$sp-4;\n }\n}\n\n.breadcrumb-nav-list {\n padding-left: 0;\n margin-bottom: $sp-3;\n list-style: none;\n}\n\n.breadcrumb-nav-list-item {\n display: table-cell;\n @include fs-2;\n\n &::before {\n display: none;\n }\n\n &::after {\n display: inline-block;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $grey-dk-000;\n content: \"/\";\n }\n\n &:last-child {\n &::after {\n content: \"\";\n }\n }\n}\n","// Typography\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\nh1,\n.text-alpha {\n font-weight: 300;\n\n @include fs-8;\n}\n\nh2,\n.text-beta,\n#toctitle {\n @include fs-6;\n}\n\nh3,\n.text-gamma {\n @include fs-5;\n}\n\nh4,\n.text-delta {\n font-weight: 400;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n\n @include fs-2;\n}\n\nh4 code {\n text-transform: none;\n}\n\nh5,\n.text-epsilon {\n @include fs-3;\n}\n\nh6,\n.text-zeta {\n @include fs-2;\n}\n\n.text-small {\n @include fs-2;\n}\n\n.text-mono {\n font-family: $mono-font-family !important;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n","// Labels (not the form kind)\n\n// this :not() prevents a style clash with Mermaid.js's\n// diagram labels, which also use .label\n// for more, see https://github.com/just-the-docs/just-the-docs/issues/1272\n// and the accompanying PR\n.label:not(g),\n.label-blue:not(g) {\n display: inline-block;\n padding: 0.16em 0.56em;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $white;\n text-transform: uppercase;\n vertical-align: middle;\n background-color: $blue-100;\n border-radius: 12px;\n\n @include fs-2;\n}\n\n.label-green:not(g) {\n background-color: $green-300;\n}\n\n.label-purple:not(g) {\n background-color: $purple-100;\n}\n\n.label-red:not(g) {\n background-color: $red-300;\n}\n\n.label-yellow:not(g) {\n color: $grey-dk-200;\n background-color: $yellow-200;\n}\n","// Buttons and things that look like buttons\n// stylelint-disable color-named\n\n.btn {\n display: inline-block;\n box-sizing: border-box;\n padding: 0.3em 1em;\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n font-weight: 500;\n line-height: 1.5;\n color: $link-color;\n text-decoration: none;\n vertical-align: baseline;\n cursor: pointer;\n background-color: $base-button-color;\n border-width: 0;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n appearance: none;\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: darken($link-color, 2%);\n }\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n text-decoration: none;\n background-color: darken($base-button-color, 1%);\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($base-button-color, 3%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken(#dcdcdc, 5%);\n }\n\n &:disabled,\n &.disabled {\n &,\n &:hover {\n color: rgba(102, 102, 102, 0.5);\n cursor: default;\n background-color: rgba(229, 229, 229, 0.5);\n background-image: none;\n box-shadow: none;\n }\n }\n}\n\n.btn-outline {\n color: $link-color;\n background: transparent;\n box-shadow: inset 0 0 0 2px $grey-lt-300;\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n color: darken($link-color, 4%);\n text-decoration: none;\n background-color: transparent;\n box-shadow: inset 0 0 0 3px $grey-lt-300;\n }\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow:\n inset 0 0 0 2px $grey-dk-100,\n 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: inset 0 0 0 2px $grey-dk-100;\n }\n}\n\n.btn-primary {\n @include btn-color($white, $btn-primary-color);\n}\n\n.btn-purple {\n @include btn-color($white, $purple-100);\n}\n\n.btn-blue {\n @include btn-color($white, $blue-200);\n}\n\n.btn-green {\n @include btn-color($white, $green-300);\n}\n\n.btn-reset {\n background: none;\n border: none;\n margin: 0;\n text-align: inherit;\n font: inherit;\n border-radius: 0;\n appearance: none;\n}\n","// Colored button\n\n@mixin btn-color($fg, $bg) {\n color: $fg;\n background-color: darken($bg, 2%);\n background-image: linear-gradient(lighten($bg, 5%), darken($bg, 2%));\n box-shadow:\n 0 1px 3px rgba(0, 0, 0, 0.25),\n 0 4px 10px rgba(0, 0, 0, 0.12);\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: $fg;\n background-color: darken($bg, 4%);\n background-image: linear-gradient((lighten($bg, 2%), darken($bg, 4%)));\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($bg, 5%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken($bg, 10%);\n }\n}\n","// Search input and autocomplete\n\n.search {\n position: relative;\n z-index: 2;\n flex-grow: 1;\n height: $sp-10;\n padding: $sp-2;\n transition: padding linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: relative !important;\n width: auto !important;\n height: 100% !important;\n padding: 0;\n transition: none;\n }\n}\n\n.search-input-wrap {\n position: relative;\n z-index: 1;\n height: $sp-8;\n overflow: hidden;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n transition: height linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: absolute;\n width: 100%;\n max-width: $search-results-width;\n height: 100% !important;\n border-radius: 0;\n box-shadow: none;\n transition: width ease $transition-duration;\n }\n}\n\n.search-input {\n position: absolute;\n width: 100%;\n height: 100%;\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing-sm + $sp-5};\n font-size: 1rem;\n color: $body-text-color;\n background-color: $search-background-color;\n border-top: 0;\n border-right: 0;\n border-bottom: 0;\n border-left: 0;\n border-radius: 0;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing + $sp-5};\n font-size: 0.875rem;\n background-color: $body-background-color;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n &:focus {\n outline: 2px solid $link-color;\n outline-offset: -2px;\n\n + .search-label .search-icon {\n color: $link-color;\n }\n }\n}\n\n.search-label {\n position: absolute;\n display: flex;\n height: 100%;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-left: $gutter-spacing;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n .search-icon {\n width: #{$sp-4 * 1.2};\n height: #{$sp-4 * 1.2};\n align-self: center;\n color: $grey-dk-000;\n }\n}\n\n.search-results {\n position: absolute;\n left: 0;\n display: none;\n width: 100%;\n max-height: calc(100% - #{$sp-10});\n overflow-y: auto;\n background-color: $search-background-color;\n border-bottom-right-radius: $border-radius;\n border-bottom-left-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n\n @include mq(md) {\n top: 100%;\n width: $search-results-width;\n max-height: calc(100vh - 200%) !important;\n }\n}\n\n.search-results-list {\n padding-left: 0;\n margin-bottom: $sp-1;\n list-style: none;\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n}\n\n.search-results-list-item {\n padding: 0;\n margin: 0;\n}\n\n.search-result {\n display: block;\n padding: $sp-1 $sp-3;\n\n &:hover,\n &.active {\n background-color: $feedback-color;\n }\n}\n\n.search-result-title {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 40%;\n padding-right: $sp-2;\n vertical-align: top;\n }\n}\n\n.search-result-doc {\n display: flex;\n align-items: center;\n word-wrap: break-word;\n\n &.search-result-doc-parent {\n opacity: 0.5;\n @include fs-3;\n\n @include mq(md) {\n @include fs-2;\n }\n }\n\n .search-result-icon {\n width: $sp-4;\n height: $sp-4;\n margin-right: $sp-2;\n color: $link-color;\n flex-shrink: 0;\n }\n\n .search-result-doc-title {\n overflow: auto;\n }\n}\n\n.search-result-section {\n margin-left: #{$sp-4 + $sp-2};\n word-wrap: break-word;\n}\n\n.search-result-rel-url {\n display: block;\n margin-left: #{$sp-4 + $sp-2};\n overflow: hidden;\n color: $search-result-preview-color;\n text-overflow: ellipsis;\n white-space: nowrap;\n @include fs-1;\n}\n\n.search-result-previews {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n padding-left: $sp-4;\n margin-left: $sp-2;\n color: $search-result-preview-color;\n word-wrap: break-word;\n border-left: $border;\n border-left-color: $border-color;\n @include fs-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 60%;\n padding-left: $sp-2;\n margin-left: 0;\n vertical-align: top;\n }\n}\n\n.search-result-preview + .search-result-preview {\n margin-top: $sp-1;\n}\n\n.search-result-highlight {\n font-weight: bold;\n}\n\n.search-no-result {\n padding: $sp-2 $sp-3;\n @include fs-3;\n}\n\n.search-button {\n position: fixed;\n right: $sp-4;\n bottom: $sp-4;\n display: flex;\n width: $sp-9;\n height: $sp-9;\n background-color: $search-background-color;\n border: 1px solid rgba($link-color, 0.3);\n border-radius: #{$sp-9 * 0.5};\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n align-items: center;\n justify-content: center;\n}\n\n.search-overlay {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1;\n width: 0;\n height: 0;\n background-color: rgba(0, 0, 0, 0.3);\n opacity: 0;\n transition:\n opacity ease $transition-duration,\n width 0s $transition-duration,\n height 0s $transition-duration;\n}\n\n.search-active {\n .search {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .search-input-wrap {\n height: $sp-10;\n border-radius: 0;\n\n @include mq(md) {\n width: $search-results-width;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n }\n }\n\n .search-input {\n background-color: $search-background-color;\n\n @include mq(md) {\n padding-left: 2.3rem;\n }\n }\n\n .search-label {\n @include mq(md) {\n padding-left: 0.6rem;\n }\n }\n\n .search-results {\n display: block;\n }\n\n .search-overlay {\n width: 100%;\n height: 100%;\n opacity: 1;\n transition:\n opacity ease $transition-duration,\n width 0s,\n height 0s;\n }\n\n @include mq(md) {\n .main {\n position: fixed;\n right: 0;\n left: 0;\n }\n }\n\n .main-header {\n padding-top: $sp-10;\n\n @include mq(md) {\n padding-top: 0;\n }\n }\n}\n","// Tables\n// stylelint-disable max-nesting-depth, selector-no-type, selector-max-type\n\n.table-wrapper {\n display: block;\n width: 100%;\n max-width: 100%;\n margin-bottom: $sp-5;\n overflow-x: auto;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n}\n\ntable {\n display: table;\n min-width: 100%;\n border-collapse: separate;\n}\n\nth,\ntd {\n min-width: 7.5rem;\n padding: $sp-2 $sp-3;\n background-color: $table-background-color;\n border-bottom: $border rgba($border-color, 0.5);\n border-left: $border $border-color;\n\n @include fs-3;\n\n &:first-of-type {\n border-left: 0;\n }\n}\n\ntbody {\n tr {\n &:last-of-type {\n th,\n td {\n border-bottom: 0;\n }\n\n td {\n padding-bottom: $sp-3;\n }\n }\n }\n}\n\nthead {\n th {\n border-bottom: $border $border-color;\n }\n}\n","// Code and syntax highlighting\n// stylelint-disable selector-no-qualifying-type, declaration-block-semicolon-newline-after,declaration-block-single-line-max-declarations, selector-no-type, selector-max-type, scss/comment-no-empty\n\n// {% raw %}\n\n// This instruction applies to all queues not within 'pre' or 'figure', avoiding 'code' generated by the highlight.\n:not(pre, figure) {\n & > code {\n padding: 0.2em 0.15em;\n font-weight: 400;\n background-color: $code-background-color;\n border: $border $border-color;\n border-radius: $border-radius;\n }\n}\n\n// Avoid appearance of dark border around visited code links in Safari\na:visited code {\n border-color: $border-color;\n}\n\n// Content structure for highlighted code blocks using fences or Liquid\n//\n// ```[LANG]...```, no kramdown line_numbers:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n//\n// ```[LANG]...```, kramdown line_numbers = true:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.rouge-gutter.gl > pre.lineno\n// | td.rouge-code > pre\n//\n// {% highlight LANG %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n//\n// {% highlight LANG linenos %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.gutter.gl > pre.lineno\n// | td.code > pre\n//\n// ----...---- (AsciiDoc)\n// div.listingblock > div.content > pre.rouge.highlight\n//\n// fix_linenos removes the outermost pre when it encloses table.rouge-table\n//\n// See docs/index-test.md for some tests.\n//\n// No kramdown line_numbers: fences and Liquid highlighting look the same.\n// Kramdown line_numbers = true: fences have a wider gutter than with Liquid?\n\n// ```[LANG]...```\n// or in AsciiDoc:\n//\n// ----\n// ...\n// ----\n\n// the code may appear with 3 different types:\n// container \\ case: default case, code with line number, code with html rendering\n// top level: div.highlighter-rouge, figure.highlight, figure.highlight\n// second level: div.highlight, div.table-wrapper, pre.highlight\n// third level: pre.highlight, td.code, absent\n// last level: code, pre, code (optionality)\n// highlighter level: span, span, span\n// the spacing are only in the second level for case 1, 3 and in the third level for case 2\n// in AsciiDoc, there is a parent container that contains optionally a title and the content.\n\n// select top level container\ndiv.highlighter-rouge,\ndiv.listingblock > div.content,\nfigure.highlight {\n margin-top: 0;\n margin-bottom: $sp-3;\n background-color: $code-background-color;\n border-radius: $border-radius;\n box-shadow: none;\n -webkit-overflow-scrolling: touch;\n position: relative;\n padding: 0;\n\n // copy button (or other button)\n // the button appear only when there is a hover on the code or focus on button\n > button {\n width: $sp-3;\n opacity: 0;\n position: absolute;\n top: 0;\n right: 0;\n padding: $sp-3;\n border: none;\n background: none;\n color: $body-text-color;\n box-sizing: content-box;\n\n svg {\n fill: $body-text-color;\n }\n\n &:active {\n text-decoration: none;\n outline: none;\n opacity: 1;\n }\n\n &:focus {\n opacity: 1;\n outline: 2px solid $link-color;\n }\n }\n\n // the button can be seen by doing a simple hover in the code, there is no need to go over the location of the button\n &:hover {\n > button {\n cursor: copy;\n opacity: 1;\n }\n }\n}\n\n// setting the spacing and scrollbar on the second level for the first case\n// remove all space on the second and third level\n// this is a mixin to accommodate for the slightly different structures generated via Markdown vs AsciiDoc\n@mixin scroll-and-spacing($code-div, $pre-select) {\n #{$code-div} {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n\n #{$pre-select},\n code {\n padding: 0;\n margin: 0;\n border: 0;\n }\n}\n\n// for Markdown\ndiv.highlighter-rouge {\n @include scroll-and-spacing(\"div.highlight\", \"pre.highlight\");\n}\n\n// for AsciiDoc. we also need to fix the margins for its parent container.\ndiv.listingblock {\n margin-top: 0;\n margin-bottom: $sp-3;\n\n @include scroll-and-spacing(\"div.content\", \"div.content > pre\");\n}\n\n// {% highlight LANG %}...{% endhighlight %},\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the second level for the thirt case\n// the css rule are apply only to the last code enviroment\n// setting the scroolbar\nfigure.highlight {\n pre,\n :not(pre) > code {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n}\n\n// ```[LANG]...```, kramdown line_numbers = true,\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the thirt level for the second case\n.highlight .table-wrapper {\n padding: $sp-3 0;\n margin: 0;\n border: 0;\n box-shadow: none;\n\n td,\n pre {\n min-width: 0;\n padding: 0;\n background-color: $code-background-color;\n border: 0;\n\n @include fs-2;\n }\n\n td.gl {\n width: 1em;\n padding-right: $sp-3;\n padding-left: $sp-3;\n }\n\n pre {\n margin: 0;\n line-height: 2;\n }\n}\n\n// Code examples: html render of a code\n.code-example,\n.listingblock > .title {\n padding: $sp-3;\n margin-bottom: $sp-3;\n overflow: auto;\n border: 1px solid $border-color;\n border-radius: $border-radius;\n\n + .highlighter-rouge,\n + .sectionbody .listingblock,\n + .content,\n + figure.highlight {\n position: relative;\n margin-top: -$sp-4;\n border-right: 1px solid $border-color;\n border-bottom: 1px solid $border-color;\n border-left: 1px solid $border-color;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n}\n\n// Mermaid diagram code blocks should be left unstyled.\ncode.language-mermaid {\n padding: 0;\n background-color: inherit;\n border: 0;\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight,\npre.highlight {\n background: $code-background-color; // Code Background\n // For Backwards Compatibility Before $code-linenumber-color was added\n @if variable-exists(code-linenumber-color) {\n color: $code-linenumber-color; // Code Line Numbers\n } @else {\n color: $body-text-color; // Code Line Numbers\n }\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight pre {\n background: $code-background-color; // Code Background\n}\n\n// {% endraw %}\n","// Utility classes for colors\n\n// Text colors\n\n.text-grey-dk-000 {\n color: $grey-dk-000 !important;\n}\n\n.text-grey-dk-100 {\n color: $grey-dk-100 !important;\n}\n\n.text-grey-dk-200 {\n color: $grey-dk-200 !important;\n}\n\n.text-grey-dk-250 {\n color: $grey-dk-250 !important;\n}\n\n.text-grey-dk-300 {\n color: $grey-dk-300 !important;\n}\n\n.text-grey-lt-000 {\n color: $grey-lt-000 !important;\n}\n\n.text-grey-lt-100 {\n color: $grey-lt-100 !important;\n}\n\n.text-grey-lt-200 {\n color: $grey-lt-200 !important;\n}\n\n.text-grey-lt-300 {\n color: $grey-lt-300 !important;\n}\n\n.text-blue-000 {\n color: $blue-000 !important;\n}\n\n.text-blue-100 {\n color: $blue-100 !important;\n}\n\n.text-blue-200 {\n color: $blue-200 !important;\n}\n\n.text-blue-300 {\n color: $blue-300 !important;\n}\n\n.text-green-000 {\n color: $green-000 !important;\n}\n\n.text-green-100 {\n color: $green-100 !important;\n}\n\n.text-green-200 {\n color: $green-200 !important;\n}\n\n.text-green-300 {\n color: $green-300 !important;\n}\n\n.text-purple-000 {\n color: $purple-000 !important;\n}\n\n.text-purple-100 {\n color: $purple-100 !important;\n}\n\n.text-purple-200 {\n color: $purple-200 !important;\n}\n\n.text-purple-300 {\n color: $purple-300 !important;\n}\n\n.text-yellow-000 {\n color: $yellow-000 !important;\n}\n\n.text-yellow-100 {\n color: $yellow-100 !important;\n}\n\n.text-yellow-200 {\n color: $yellow-200 !important;\n}\n\n.text-yellow-300 {\n color: $yellow-300 !important;\n}\n\n.text-red-000 {\n color: $red-000 !important;\n}\n\n.text-red-100 {\n color: $red-100 !important;\n}\n\n.text-red-200 {\n color: $red-200 !important;\n}\n\n.text-red-300 {\n color: $red-300 !important;\n}\n\n// Background colors\n\n.bg-grey-dk-000 {\n background-color: $grey-dk-000 !important;\n}\n\n.bg-grey-dk-100 {\n background-color: $grey-dk-100 !important;\n}\n\n.bg-grey-dk-200 {\n background-color: $grey-dk-200 !important;\n}\n\n.bg-grey-dk-250 {\n background-color: $grey-dk-250 !important;\n}\n\n.bg-grey-dk-300 {\n background-color: $grey-dk-300 !important;\n}\n\n.bg-grey-lt-000 {\n background-color: $grey-lt-000 !important;\n}\n\n.bg-grey-lt-100 {\n background-color: $grey-lt-100 !important;\n}\n\n.bg-grey-lt-200 {\n background-color: $grey-lt-200 !important;\n}\n\n.bg-grey-lt-300 {\n background-color: $grey-lt-300 !important;\n}\n\n.bg-blue-000 {\n background-color: $blue-000 !important;\n}\n\n.bg-blue-100 {\n background-color: $blue-100 !important;\n}\n\n.bg-blue-200 {\n background-color: $blue-200 !important;\n}\n\n.bg-blue-300 {\n background-color: $blue-300 !important;\n}\n\n.bg-green-000 {\n background-color: $green-000 !important;\n}\n\n.bg-green-100 {\n background-color: $green-100 !important;\n}\n\n.bg-green-200 {\n background-color: $green-200 !important;\n}\n\n.bg-green-300 {\n background-color: $green-300 !important;\n}\n\n.bg-purple-000 {\n background-color: $purple-000 !important;\n}\n\n.bg-purple-100 {\n background-color: $purple-100 !important;\n}\n\n.bg-purple-200 {\n background-color: $purple-200 !important;\n}\n\n.bg-purple-300 {\n background-color: $purple-300 !important;\n}\n\n.bg-yellow-000 {\n background-color: $yellow-000 !important;\n}\n\n.bg-yellow-100 {\n background-color: $yellow-100 !important;\n}\n\n.bg-yellow-200 {\n background-color: $yellow-200 !important;\n}\n\n.bg-yellow-300 {\n background-color: $yellow-300 !important;\n}\n\n.bg-red-000 {\n background-color: $red-000 !important;\n}\n\n.bg-red-100 {\n background-color: $red-100 !important;\n}\n\n.bg-red-200 {\n background-color: $red-200 !important;\n}\n\n.bg-red-300 {\n background-color: $red-300 !important;\n}\n","// Utility classes for layout\n\n// Display\n\n.d-block {\n display: block !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n// Screenreader-only\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .d-sm-block, .d-md-none, .d-lg-inline\n .d-#{$media-query}-block {\n display: block !important;\n }\n .d-#{$media-query}-flex {\n display: flex !important;\n }\n .d-#{$media-query}-inline {\n display: inline !important;\n }\n .d-#{$media-query}-inline-block {\n display: inline-block !important;\n }\n .d-#{$media-query}-none {\n display: none !important;\n }\n }\n }\n}\n\n// Horizontal alignment\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.flex-justify-start {\n justify-content: flex-start !important;\n}\n\n.flex-justify-end {\n justify-content: flex-end !important;\n}\n\n.flex-justify-between {\n justify-content: space-between !important;\n}\n\n.flex-justify-around {\n justify-content: space-around !important;\n}\n\n// Vertical alignment\n\n.v-align-baseline {\n vertical-align: baseline !important;\n}\n\n.v-align-bottom {\n vertical-align: bottom !important;\n}\n\n.v-align-middle {\n vertical-align: middle !important;\n}\n\n.v-align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.v-align-text-top {\n vertical-align: text-top !important;\n}\n\n.v-align-top {\n vertical-align: top !important;\n}\n","// Utility classes for typography\n\n.fs-1 {\n @include fs-1;\n}\n\n.fs-2 {\n @include fs-2;\n}\n\n.fs-3 {\n @include fs-3;\n}\n\n.fs-4 {\n @include fs-4;\n}\n\n.fs-5 {\n @include fs-5;\n}\n\n.fs-6 {\n @include fs-6;\n}\n\n.fs-7 {\n @include fs-7;\n}\n\n.fs-8 {\n @include fs-8;\n}\n\n.fs-9 {\n @include fs-9;\n}\n\n.fs-10 {\n @include fs-10;\n}\n\n.fw-300 {\n font-weight: 300 !important;\n}\n\n.fw-400 {\n font-weight: 400 !important;\n}\n\n.fw-500 {\n font-weight: 500 !important;\n}\n\n.fw-700 {\n font-weight: 700 !important;\n}\n\n.lh-0 {\n line-height: 0 !important;\n}\n\n.lh-default {\n line-height: $body-line-height;\n}\n\n.lh-tight {\n line-height: $body-heading-line-height;\n}\n\n.ls-5 {\n letter-spacing: 0.05em !important;\n}\n\n.ls-10 {\n letter-spacing: 0.1em !important;\n}\n\n.ls-0 {\n letter-spacing: 0 !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n","// Utility classes for lists\n\n// stylelint-disable selector-max-type\n\n.list-style-none {\n padding: 0 !important;\n margin: 0 !important;\n list-style: none !important;\n\n li {\n &::before {\n display: none !important;\n }\n }\n}\n","// Utility classes for margins and padding\n\n// stylelint-disable block-opening-brace-space-after, block-opening-brace-space-before\n\n// Margin spacer utilities\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-0, .m-1, .m-2...\n .m-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n .mx-#{$scale}-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-sm-0, .m-md-1, .m-lg-2...\n .m-#{$media-query}-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$media-query}-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$media-query}-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$media-query}-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n }\n }\n}\n\n// Padding spacer utilities\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-0, .p-1, .p-2...\n .p-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @include mq($media-query) {\n @for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-sm-0, .p-md-1, .p-lg-2...\n .p-#{$media-query}-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$media-query}-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$media-query}-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n }\n }\n}\n","// stylelint-disable selector-max-specificity, selector-max-id, selector-max-type, selector-no-qualifying-type\n\n@media print {\n .site-footer,\n .site-button,\n #edit-this-page,\n #back-to-top,\n .site-nav,\n .main-header {\n display: none !important;\n }\n\n hr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n }\n\n .side-bar {\n width: 100%;\n height: auto;\n border-right: 0 !important;\n }\n\n .site-header {\n border-bottom: 1px solid $border-color;\n }\n\n .site-title {\n font-size: 1rem !important;\n font-weight: 700 !important;\n }\n\n .text-small {\n font-size: 8pt !important;\n }\n\n pre.highlight {\n border: 1px solid $border-color;\n }\n\n .main {\n max-width: none;\n margin-left: 0;\n }\n}\n","// Skipnav\n// Skip to main content\n\na.skip-to-main {\n left: -999px;\n position: absolute;\n top: auto;\n width: 1px;\n height: 1px;\n overflow: hidden;\n z-index: -999;\n}\n\na.skip-to-main:focus,\na.skip-to-main:active {\n color: $link-color;\n background-color: $body-background-color;\n left: auto;\n top: auto;\n width: 30%;\n height: auto;\n overflow: auto;\n margin: 10px 35%;\n padding: 5px;\n border-radius: 15px;\n border: 4px solid $btn-primary-color;\n text-align: center;\n font-size: 1.2em;\n z-index: 999;\n}\n","\n@import \"./support/support\";\n@import \"./custom/setup\";\n@import \"./color_schemes/light\";\n\n@import \"./color_schemes/meshtastic-dark\";\n\n@import \"./modules\";\ndiv.opaque {\n background-color: $body-background-color;\n}\n\np.tip, blockquote.tip {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $green-300;\n content: \"Tip\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .tip-title {\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.tip-title, blockquote.tip-title {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.tip {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.tip-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.note, blockquote.note {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $blue-300;\n content: \"Note\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .note-title {\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.note-title, blockquote.note-title {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.note {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.note-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.warning, blockquote.warning {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $yellow-300;\n content: \"Warning\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .warning-title {\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.warning-title, blockquote.warning-title {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.warning {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.warning-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n@import \"./custom/custom\";\n\n\n"],"file":"just-the-docs-meshtastic-dark.css"}
\ No newline at end of file
+{"version":3,"sourceRoot":"","sources":["../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/vendor/accessible-pygments/github-light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/vendor/normalize.scss/normalize.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/base.scss","../../_sass/color_schemes/meshtastic-dark.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/support/mixins/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/support/mixins/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/support/_variables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/content.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/navigation.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/labels.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/support/mixins/_buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/search.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/tables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/code.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/utilities/_colors.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/utilities/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/utilities/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/utilities/_lists.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/utilities/_spacing.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/print.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/skiptomain.scss","just-the-docs-meshtastic-dark.scss"],"names":[],"mappings":"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;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvOF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AbrBE;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAQR;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AdhHA;EACE;;ACYA;EcZJ;IfII;;;;AAKF;EACE;;ACEA;EcRJ;IfUI;;;;AAKF;EACE;;ACRA;EcJJ;IfgBI;;;;AAKF;EACE;;AClBA;EcAJ;IfsBI;;;;AAKF;EACE;;AC5BA;EcIJ;If4BI;;;;AAKF;EACE;;ACtCA;EcQJ;IfkCI;IACA,aEhDuB;;;;AFqDzB;EACE;EACA,aEvDuB;;ADKvB;EcYJ;If0CI;;;;AAKF;EACE;EACA,aElEuB;;ADKvB;EcgBJ;IfiDI;;;;AAKF;EACE;EACA,aE7EuB;;ADKvB;EcoBJ;IfwDI;;;;AAKF;EACE;EACA,aExFuB;;ADKvB;EcwBJ;If+DI;;;;Ae3DJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,abxDiB;;;Aa2DnB;EACE,ab1DyB;;;Aa6D3B;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC/EF;EACE;EACA;EACA;;AAGE;EACE;;;ACLN;EACE;EACA;;;AAQA;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AhBlCA;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAaN;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AhB7GA;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AC3JR;EACE;AAAA;AAAA;AAAA;AAAA;AAAA;IAME;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;;;ACvCJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE,OpBCW;EoBAX,kBpBNsB;EoBOtB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACpBF;EACE,kBrBCsB;;;AqBExB;EACI;EACA;EACA,elB4EY;EkB3EZ;EACA;;AAEA;EACI,OlB8BI;EkB7BJ;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlBoBM;EkBnBN;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBiDY;EkBhDZ;EACA;;AACA;EACE;EACA;EACA,OlBEM;EkBDN;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,elBGY;EkBFZ;EACA;;AAEA;EACI,OlB/CG;EkBgDH;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlBzDK;EkB0DL;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBxBY;EkByBZ;EACA;;AACA;EACE;EACA;EACA,OlB3EK;EkB4EL;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,elBtEY;EkBuEZ;EACA;;AAEA;EACI,OlBhHK;EkBiHL;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlB1HO;EkB2HP;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBjGY;EkBkGZ;EACA;;AACA;EACE;EACA;EACA,OlB5IO;EkB6IP;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE","sourcesContent":["/*\ngenerated by accessible-pygments \nCopyright (c) 2022, Quansight Labs\nLicensed under the BSD license, see LICENSE for details.\n--\ngenerated by Pygments \nCopyright 2006-2025 by the Pygments team.\nLicensed under the BSD license, see LICENSE for details.\n*/\n\n.highlight .hll { background-color: #0969da4a }\n.highlight .c { color: #6E7781 } /* Comment */\n.highlight .err { color: #CF222E } /* Error */\n.highlight .k { color: #CF222E } /* Keyword */\n.highlight .l { color: #953800 } /* Literal */\n.highlight .n { color: #8250DF } /* Name */\n.highlight .o { color: #116329 } /* Operator */\n.highlight .p { color: #24292F } /* Punctuation */\n.highlight .ch { color: #6E7781 } /* Comment.Hashbang */\n.highlight .cm { color: #6E7781 } /* Comment.Multiline */\n.highlight .cp { color: #6E7781 } /* Comment.Preproc */\n.highlight .cpf { color: #6E7781 } /* Comment.PreprocFile */\n.highlight .c1 { color: #6E7781 } /* Comment.Single */\n.highlight .cs { color: #6E7781 } /* Comment.Special */\n.highlight .gd { color: #0550AE } /* Generic.Deleted */\n.highlight .ge { font-style: italic } /* Generic.Emph */\n.highlight .gr { color: #CF222E } /* Generic.Error */\n.highlight .gh { color: #0550AE } /* Generic.Heading */\n.highlight .gs { font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #0550AE } /* Generic.Subheading */\n.highlight .kc { color: #0550AE } /* Keyword.Constant */\n.highlight .kd { color: #CF222E } /* Keyword.Declaration */\n.highlight .kn { color: #CF222E } /* Keyword.Namespace */\n.highlight .kp { color: #CF222E } /* Keyword.Pseudo */\n.highlight .kr { color: #CF222E } /* Keyword.Reserved */\n.highlight .kt { color: #CF222E } /* Keyword.Type */\n.highlight .ld { color: #953800 } /* Literal.Date */\n.highlight .m { color: #953800 } /* Literal.Number */\n.highlight .s { color: #0550AE } /* Literal.String */\n.highlight .na { color: #953800 } /* Name.Attribute */\n.highlight .nb { color: #953800 } /* Name.Builtin */\n.highlight .nc { color: #0550AE } /* Name.Class */\n.highlight .no { color: #0550AE } /* Name.Constant */\n.highlight .nd { color: #953800 } /* Name.Decorator */\n.highlight .ni { color: #116329 } /* Name.Entity */\n.highlight .ne { color: #8250DF } /* Name.Exception */\n.highlight .nf { color: #0550AE } /* Name.Function */\n.highlight .nl { color: #953800 } /* Name.Label */\n.highlight .nn { color: #24292F } /* Name.Namespace */\n.highlight .nx { color: #8250DF } /* Name.Other */\n.highlight .py { color: #0550AE } /* Name.Property */\n.highlight .nt { color: #116329 } /* Name.Tag */\n.highlight .nv { color: #953800 } /* Name.Variable */\n.highlight .ow { color: #8250DF } /* Operator.Word */\n.highlight .pm { color: #24292F } /* Punctuation.Marker */\n.highlight .w { color: #24292F } /* Text.Whitespace */\n.highlight .mb { color: #953800 } /* Literal.Number.Bin */\n.highlight .mf { color: #953800 } /* Literal.Number.Float */\n.highlight .mh { color: #953800 } /* Literal.Number.Hex */\n.highlight .mi { color: #953800 } /* Literal.Number.Integer */\n.highlight .mo { color: #953800 } /* Literal.Number.Oct */\n.highlight .sa { color: #0550AE } /* Literal.String.Affix */\n.highlight .sb { color: #0550AE } /* Literal.String.Backtick */\n.highlight .sc { color: #0550AE } /* Literal.String.Char */\n.highlight .dl { color: #0550AE } /* Literal.String.Delimiter */\n.highlight .sd { color: #0550AE } /* Literal.String.Doc */\n.highlight .s2 { color: #0550AE } /* Literal.String.Double */\n.highlight .se { color: #0550AE } /* Literal.String.Escape */\n.highlight .sh { color: #0550AE } /* Literal.String.Heredoc */\n.highlight .si { color: #0550AE } /* Literal.String.Interpol */\n.highlight .sx { color: #0550AE } /* Literal.String.Other */\n.highlight .sr { color: #0550AE } /* Literal.String.Regex */\n.highlight .s1 { color: #0550AE } /* Literal.String.Single */\n.highlight .ss { color: #0550AE } /* Literal.String.Symbol */\n.highlight .bp { color: #953800 } /* Name.Builtin.Pseudo */\n.highlight .fm { color: #0550AE } /* Name.Function.Magic */\n.highlight .vc { color: #953800 } /* Name.Variable.Class */\n.highlight .vg { color: #953800 } /* Name.Variable.Global */\n.highlight .vi { color: #953800 } /* Name.Variable.Instance */\n.highlight .vm { color: #953800 } /* Name.Variable.Magic */\n.highlight .il { color: #953800 } /* Literal.Number.Integer.Long */\n","/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput {\n /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect {\n /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// Base element style overrides\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\n:root {\n color-scheme: $color-scheme;\n}\n\n* {\n box-sizing: border-box;\n}\n\nhtml {\n scroll-behavior: smooth;\n\n @include fs-4;\n}\n\nbody {\n font-family: $body-font-family;\n font-size: inherit;\n line-height: $body-line-height;\n color: $body-text-color;\n background-color: $body-background-color;\n overflow-wrap: break-word;\n}\n\nol,\nul,\ndl,\npre,\naddress,\nblockquote,\ntable,\ndiv,\nhr,\nform,\nfieldset,\nnoscript .table-wrapper {\n margin-top: 0;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n#toctitle {\n margin-top: 0;\n margin-bottom: 1em;\n font-weight: 500;\n line-height: $body-heading-line-height;\n color: $body-heading-color;\n}\n\np {\n margin-top: 1em;\n margin-bottom: 1em;\n}\n\na {\n color: $link-color;\n text-decoration: none;\n}\n\na:not([class]) {\n text-decoration: underline;\n text-decoration-color: $border-color;\n text-underline-offset: 2px;\n\n &:hover {\n text-decoration-color: rgba($link-color, 0.45);\n }\n}\n\ncode {\n font-family: $mono-font-family;\n font-size: 0.75em;\n line-height: $body-line-height;\n}\n\nfigure,\npre {\n margin: 0;\n}\n\nli {\n margin: 0.25em 0;\n}\n\nimg {\n max-width: 100%;\n height: auto;\n}\n\nhr {\n height: 1px;\n padding: 0;\n margin: $sp-6 0;\n background-color: $border-color;\n border: 0;\n}\n\n// adds a GitHub-style sidebar to blockquotes\nblockquote {\n margin: 10px 0;\n\n // resets user-agent stylesheets for blockquotes\n margin-block-start: 0;\n margin-inline-start: 0;\n padding-left: 1rem;\n border-left: 3px solid $border-color;\n}\n","// Meshtastic Material 3 — Dark color scheme for just-the-docs\n// Source: core/ui/.../Color.kt §8.3 (Dark Scheme)\n//\n// Brand colors:\n// Primary (Dark): #67EA94 (Green 500)\n// Surface (Dark): #1A1B26 (Neutral 900)\n\n$color-scheme: dark;\n\n// Body / page background\n$body-background-color: #1A1B26; // Neutral 900 — surfaceDark\n$sidebar-color: #1A1B26; // Neutral 900\n$body-text-color: #ECEDF3; // Neutral 100 — onSurfaceDark\n$body-heading-color: #ECEDF3; // Neutral 100\n\n// Links\n$link-color: #67EA94; // Green 500 — primaryDark\n$nav-link-color: #67EA94; // Green 500\n\n// Navigation\n$nav-child-link-color: #B8BAC8; // Neutral 300 — secondaryDark\n$search-result-preview-color: #B8BAC8;\n\n// Code\n$code-background-color: #0F1017; // Neutral 950 — surfaceContainerLowestDark\n$code-linenumber-color: #9496A6; // Neutral 400\n\n// Borders\n$border-color: #3D3E50; // Neutral 700 — outlineVariantDark\n$table-background-color: #242533; // Interpolated — surfaceContainerDark\n\n// Buttons\n$btn-primary-color: #67EA94; // Green 500\n$base-button-color: #2C2D3C; // Neutral 800\n\n// Feedback / callouts\n$feedback-color: #242533; // surfaceContainerDark\n\n// Search\n$search-background-color: #242533; // surfaceContainerDark\n","@mixin fs-1 {\n & {\n font-size: $font-size-1 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-1-sm !important;\n }\n}\n\n@mixin fs-2 {\n & {\n font-size: $font-size-2 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-3 !important;\n }\n}\n\n@mixin fs-3 {\n & {\n font-size: $font-size-3 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-4 !important;\n }\n}\n\n@mixin fs-4 {\n & {\n font-size: $font-size-4 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-5 !important;\n }\n}\n\n@mixin fs-5 {\n & {\n font-size: $font-size-5 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-6 !important;\n }\n}\n\n@mixin fs-6 {\n & {\n font-size: $font-size-6 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n}\n\n@mixin fs-7 {\n & {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-8 !important;\n }\n}\n\n@mixin fs-8 {\n & {\n font-size: $font-size-8 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-9 !important;\n }\n}\n\n@mixin fs-9 {\n & {\n font-size: $font-size-9 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10 !important;\n }\n}\n\n@mixin fs-10 {\n & {\n font-size: $font-size-10 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10-sm !important;\n }\n}\n","// Media query\n\n// Media query mixin\n// Usage:\n// @include mq(md) {\n// ..medium and up styles\n// }\n@mixin mq($name) {\n // Retrieves the value from the key\n $value: map-get($media-queries, $name);\n\n // If the key exists in the map\n @if $value {\n // Prints a media query based on the value\n @media (min-width: $value) {\n @content;\n }\n } @else {\n @warn \"No value could be retrieved from `#{$media-query}`. Please make sure it is defined in `$media-queries` map.\";\n }\n}\n\n// Responsive container\n\n@mixin container {\n padding-right: $gutter-spacing-sm;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-right: $gutter-spacing;\n padding-left: $gutter-spacing;\n }\n}\n","// Typography\n\n// prettier-ignore\n$body-font-family: system-ui, -apple-system, blinkmacsystemfont, \"Segoe UI\",\n roboto, \"Helvetica Neue\", arial, sans-serif, \"Segoe UI Emoji\" !default;\n$mono-font-family: \"SFMono-Regular\", menlo, consolas, monospace !default;\n$root-font-size: 16px !default; // DEPRECATED: previously base font-size for rems\n$body-line-height: 1.4 !default;\n$content-line-height: 1.6 !default;\n$body-heading-line-height: 1.25 !default;\n\n// Font size\n// `-sm` suffix is the size at the small (and above) media query\n\n$font-size-1: 0.5625rem !default;\n$font-size-1-sm: 0.625rem !default;\n$font-size-2: 0.6875rem !default; // h4 - uppercased!, h6 not uppercased, text-small\n$font-size-3: 0.75rem !default; // h5\n$font-size-4: 0.875rem !default;\n$font-size-5: 1rem !default; // h3\n$font-size-6: 1.125rem !default; // h2\n$font-size-7: 1.5rem !default;\n$font-size-8: 2rem !default; // h1\n$font-size-9: 2.25rem !default;\n$font-size-10: 2.625rem !default;\n$font-size-10-sm: 3rem !default;\n\n// Colors\n\n$white: #fff !default;\n$grey-dk-000: #959396 !default;\n$grey-dk-100: #5c5962 !default;\n$grey-dk-200: #44434d !default;\n$grey-dk-250: #302d36 !default;\n$grey-dk-300: #27262b !default;\n$grey-lt-000: #f5f6fa !default;\n$grey-lt-100: #eeebee !default;\n$grey-lt-200: #ecebed !default;\n$grey-lt-300: #e6e1e8 !default;\n$purple-000: #7253ed !default;\n$purple-100: #5e41d0 !default;\n$purple-200: #4e26af !default;\n$purple-300: #381885 !default;\n$blue-000: #2c84fa !default;\n$blue-100: #2869e6 !default;\n$blue-200: #264caf !default;\n$blue-300: #183385 !default;\n$green-000: #41d693 !default;\n$green-100: #11b584 !default;\n$green-200: #009c7b !default;\n$green-300: #026e57 !default;\n$yellow-000: #ffeb82 !default;\n$yellow-100: #fadf50 !default;\n$yellow-200: #f7d12e !default;\n$yellow-300: #e7af06 !default;\n$red-000: #f77e7e !default;\n$red-100: #f96e65 !default;\n$red-200: #e94c4c !default;\n$red-300: #dd2e2e !default;\n\n// Spacing\n\n$spacing-unit: 1rem; // 1rem == 16px\n\n$spacers: (\n sp-0: 0,\n sp-1: $spacing-unit * 0.25,\n sp-2: $spacing-unit * 0.5,\n sp-3: $spacing-unit * 0.75,\n sp-4: $spacing-unit,\n sp-5: $spacing-unit * 1.5,\n sp-6: $spacing-unit * 2,\n sp-7: $spacing-unit * 2.5,\n sp-8: $spacing-unit * 3,\n sp-9: $spacing-unit * 3.5,\n sp-10: $spacing-unit * 4,\n) !default;\n$sp-1: map-get($spacers, sp-1) !default; // 0.25 rem == 4px\n$sp-2: map-get($spacers, sp-2) !default; // 0.5 rem == 8px\n$sp-3: map-get($spacers, sp-3) !default; // 0.75 rem == 12px\n$sp-4: map-get($spacers, sp-4) !default; // 1 rem == 16px\n$sp-5: map-get($spacers, sp-5) !default; // 1.5 rem == 24px\n$sp-6: map-get($spacers, sp-6) !default; // 2 rem == 32px\n$sp-7: map-get($spacers, sp-7) !default; // 2.5 rem == 40px\n$sp-8: map-get($spacers, sp-8) !default; // 3 rem == 48px\n$sp-9: map-get($spacers, sp-9) !default; // 3.5 rem == 56px\n$sp-10: map-get($spacers, sp-10) !default; // 4 rem == 64px\n\n// Borders\n\n$border: 1px solid !default;\n$border-radius: 4px !default;\n$border-color: $grey-lt-100 !default;\n\n// Grid system\n\n$gutter-spacing: $sp-6 !default;\n$gutter-spacing-sm: $sp-4 !default;\n$nav-width: 16.5rem !default;\n$nav-width-md: 15.5rem !default;\n$nav-list-item-height: $sp-6 !default;\n$nav-list-item-height-sm: $sp-8 !default;\n$nav-list-expander-right: true;\n$content-width: 50rem !default;\n$header-height: 3.75rem !default;\n$search-results-width: $content-width - $nav-width !default;\n$transition-duration: 400ms;\n\n// Media queries in pixels\n\n$media-queries: (\n xs: 20rem,\n sm: 31.25rem,\n md: $content-width,\n lg: $content-width + $nav-width,\n xl: 87.5rem,\n) !default;\n","// The basic two column layout\n\n.side-bar {\n z-index: 0;\n display: flex;\n flex-wrap: wrap;\n background-color: $sidebar-color;\n\n @include mq(md) {\n flex-flow: column nowrap;\n position: fixed;\n width: $nav-width-md;\n height: 100%;\n border-right: $border $border-color;\n align-items: flex-end;\n }\n\n @include mq(lg) {\n width: calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width});\n min-width: $nav-width;\n }\n\n & + .main {\n @include mq(md) {\n margin-left: $nav-width-md;\n }\n\n @include mq(lg) {\n // stylelint-disable function-name-case\n // disable for Max(), we want to use the CSS max() function\n margin-left: Max(\n #{$nav-width},\n calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width})\n );\n // stylelint-enable function-name-case\n }\n\n .main-header {\n display: none;\n background-color: $sidebar-color;\n\n @include mq(md) {\n display: flex;\n background-color: $body-background-color;\n }\n\n &.nav-open {\n display: block;\n\n @include mq(md) {\n display: flex;\n }\n }\n }\n }\n}\n\n.main {\n margin: auto;\n\n @include mq(md) {\n position: relative;\n max-width: $content-width;\n }\n}\n\n.main-content-wrap {\n padding-top: $gutter-spacing-sm;\n padding-bottom: $gutter-spacing-sm;\n\n @include container;\n\n @include mq(md) {\n padding-top: $gutter-spacing;\n padding-bottom: $gutter-spacing;\n }\n}\n\n.main-header {\n z-index: 0;\n border-bottom: $border $border-color;\n\n @include mq(md) {\n display: flex;\n justify-content: space-between;\n height: $header-height;\n }\n}\n\n.site-nav,\n.site-header,\n.site-footer {\n width: 100%;\n\n @include mq(lg) {\n width: $nav-width;\n }\n}\n\n.site-nav {\n display: none;\n\n &.nav-open {\n display: block;\n }\n\n @include mq(md) {\n display: block;\n padding-top: $sp-8;\n padding-bottom: $gutter-spacing-sm;\n overflow-y: auto;\n flex: 1 1 auto;\n }\n}\n\n.site-header {\n display: flex;\n min-height: $header-height;\n align-items: center;\n\n @include mq(md) {\n height: $header-height;\n max-height: $header-height;\n border-bottom: $border $border-color;\n }\n}\n\n.site-title {\n flex-grow: 1;\n display: flex;\n height: 100%;\n align-items: center;\n padding-top: $sp-3;\n padding-bottom: $sp-3;\n color: $body-heading-color;\n\n @include container;\n\n @include fs-6;\n\n @include mq(md) {\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n }\n}\n\n@if variable-exists(logo) {\n .site-logo {\n width: 100%;\n height: 100%;\n background-image: url($logo);\n background-repeat: no-repeat;\n background-position: left center;\n background-size: contain;\n }\n}\n\n.site-button {\n display: flex;\n height: 100%;\n padding: $gutter-spacing-sm;\n align-items: center;\n}\n\n@include mq(md) {\n .site-header .site-button {\n display: none;\n }\n}\n\n.site-title:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n}\n\n.site-button:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n}\n\n.site-footer {\n position: absolute;\n bottom: 0;\n left: 0;\n padding-top: $sp-4;\n padding-bottom: $sp-4;\n\n @include container;\n\n @include fs-2;\n\n @include mq(md) {\n position: static;\n justify-self: end;\n }\n}\n\n.icon {\n width: $sp-5;\n height: $sp-5;\n color: $link-color;\n}\n","@charset \"UTF-8\";\n\n// Styles for rendered markdown in the .main-content container\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity, selector-max-id\n\n.main-content {\n line-height: $content-line-height;\n\n ol,\n ul,\n dl,\n pre,\n address,\n blockquote,\n .table-wrapper {\n margin-top: 0.5em;\n }\n\n a {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n ul,\n ol {\n padding-left: 1.5em;\n }\n\n li {\n .highlight {\n margin-top: $sp-1;\n }\n }\n\n ol {\n list-style-type: none;\n counter-reset: step-counter;\n\n > li {\n position: relative;\n\n &::before {\n position: absolute;\n top: 0.2em;\n left: -1.6em;\n color: $grey-dk-000;\n content: counter(step-counter);\n counter-increment: step-counter;\n @include fs-3;\n\n @include mq(sm) {\n top: 0.11em;\n }\n }\n\n ol {\n counter-reset: sub-counter;\n\n > li {\n &::before {\n content: counter(sub-counter, lower-alpha);\n counter-increment: sub-counter;\n }\n }\n }\n }\n }\n\n ul {\n list-style: none;\n\n > li {\n &::before {\n position: absolute;\n margin-left: -1.4em;\n color: $grey-dk-000;\n content: \"•\";\n }\n }\n }\n\n .task-list-item {\n &::before {\n content: \"\";\n }\n }\n\n .task-list-item-checkbox {\n margin-right: 0.6em;\n margin-left: -1.4em;\n\n // The same margin-left is used above for ul > li::before\n }\n\n hr + * {\n margin-top: 0;\n }\n\n h1:first-of-type {\n margin-top: 0.5em;\n }\n\n dl {\n display: grid;\n grid-template: auto / 10em 1fr;\n }\n\n dt,\n dd {\n margin: 0.25em 0;\n }\n\n dt {\n grid-column: 1;\n font-weight: 500;\n text-align: right;\n\n &::after {\n content: \":\";\n }\n }\n\n dd {\n grid-column: 2;\n margin-bottom: 0;\n margin-left: 1em;\n\n blockquote,\n div,\n dl,\n dt,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n li,\n ol,\n p,\n pre,\n table,\n ul,\n .table-wrapper {\n &:first-child {\n margin-top: 0;\n }\n }\n }\n\n dd,\n ol,\n ul {\n dl:first-child {\n dt:first-child,\n dd:nth-child(2) {\n margin-top: 0;\n }\n }\n }\n\n .anchor-heading {\n position: absolute;\n right: -$sp-4;\n width: $sp-5;\n height: 100%;\n padding-right: $sp-1;\n padding-left: $sp-1;\n overflow: visible;\n\n @include mq(md) {\n right: auto;\n left: -$sp-5;\n }\n\n svg {\n display: inline-block;\n width: 100%;\n height: 100%;\n color: $link-color;\n visibility: hidden;\n }\n }\n\n .anchor-heading:hover,\n .anchor-heading:focus,\n h1:hover > .anchor-heading,\n h2:hover > .anchor-heading,\n h3:hover > .anchor-heading,\n h4:hover > .anchor-heading,\n h5:hover > .anchor-heading,\n h6:hover > .anchor-heading {\n svg {\n visibility: visible;\n }\n }\n\n summary {\n cursor: pointer;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n #toctitle {\n position: relative;\n margin-top: 1.5em;\n margin-bottom: 0.25em;\n\n + table,\n + .table-wrapper,\n + .code-example,\n + .highlighter-rouge,\n + .sectionbody .listingblock {\n margin-top: 1em;\n }\n\n + p:not(.label) {\n margin-top: 0;\n }\n }\n\n > h1:first-child,\n > h2:first-child,\n > h3:first-child,\n > h4:first-child,\n > h5:first-child,\n > h6:first-child,\n > .sect1:first-child > h2,\n > .sect2:first-child > h3,\n > .sect3:first-child > h4,\n > .sect4:first-child > h5,\n > .sect5:first-child > h6 {\n margin-top: $sp-2;\n }\n}\n","// Main nav, breadcrumb, etc...\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity\n\n.nav-list {\n padding: 0;\n margin-top: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n margin: 0;\n\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n\n .nav-list-link {\n display: block;\n min-height: $nav-list-item-height-sm;\n padding-top: $sp-1;\n padding-bottom: $sp-1;\n line-height: #{$nav-list-item-height-sm - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height-sm;\n padding-left: $gutter-spacing-sm;\n } @else {\n padding-right: $gutter-spacing-sm;\n padding-left: $nav-list-item-height-sm;\n }\n\n @include mq(md) {\n min-height: $nav-list-item-height;\n line-height: #{$nav-list-item-height - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height;\n padding-left: $gutter-spacing;\n } @else {\n padding-right: $gutter-spacing;\n padding-left: $nav-list-item-height;\n }\n }\n\n &.external > svg {\n width: $sp-4;\n height: $sp-4;\n vertical-align: text-bottom;\n }\n\n &.active {\n font-weight: 600;\n text-decoration: none;\n }\n\n &:hover,\n &.active {\n color: darken($link-color, 5%);\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n }\n }\n\n .nav-list-expander {\n position: absolute;\n @if $nav-list-expander-right {\n right: 0;\n }\n\n width: $nav-list-item-height-sm;\n height: $nav-list-item-height-sm;\n padding: #{$nav-list-item-height-sm * 0.25};\n color: $link-color;\n\n @include mq(md) {\n width: $nav-list-item-height;\n height: $nav-list-item-height;\n padding: #{$nav-list-item-height * 0.25};\n }\n\n &:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n }\n\n @if $nav-list-expander-right {\n svg {\n transform: rotate(90deg);\n }\n }\n }\n\n > .nav-list {\n display: none;\n padding-left: $sp-3;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n\n .nav-list-link {\n color: $nav-child-link-color;\n }\n\n .nav-list-expander {\n color: $nav-child-link-color;\n }\n }\n }\n\n &.active {\n > .nav-list-expander svg {\n @if $nav-list-expander-right {\n transform: rotate(-90deg);\n } @else {\n transform: rotate(90deg);\n }\n }\n\n > .nav-list {\n display: block;\n }\n }\n }\n}\n\n.nav-category {\n padding: $sp-2 $gutter-spacing-sm;\n font-weight: 600;\n text-align: start;\n text-transform: uppercase;\n border-bottom: $border $border-color;\n @include fs-2;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing;\n margin-top: $gutter-spacing-sm;\n text-align: start;\n\n &:first-child {\n margin-top: 0;\n }\n }\n}\n\n.nav-list.nav-category-list {\n > .nav-list-item {\n margin: 0;\n\n > .nav-list {\n padding: 0;\n\n > .nav-list-item {\n > .nav-list-link {\n color: $link-color;\n }\n\n > .nav-list-expander {\n color: $link-color;\n }\n }\n }\n }\n}\n\n// Aux nav\n\n.aux-nav {\n height: 100%;\n overflow-x: auto;\n @include fs-2;\n\n .aux-nav-list {\n display: flex;\n height: 100%;\n padding: 0;\n margin: 0;\n list-style: none;\n }\n\n .aux-nav-list-item {\n display: inline-block;\n height: 100%;\n padding: 0;\n margin: 0;\n }\n\n @include mq(md) {\n padding-right: $gutter-spacing-sm;\n }\n}\n\n// Breadcrumb nav\n\n.breadcrumb-nav {\n @include mq(md) {\n margin-top: -$sp-4;\n }\n}\n\n.breadcrumb-nav-list {\n padding-left: 0;\n margin-bottom: $sp-3;\n list-style: none;\n}\n\n.breadcrumb-nav-list-item {\n display: table-cell;\n @include fs-2;\n\n &::before {\n display: none;\n }\n\n &::after {\n display: inline-block;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $grey-dk-000;\n content: \"/\";\n }\n\n &:last-child {\n &::after {\n content: \"\";\n }\n }\n}\n","// Typography\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\nh1,\n.text-alpha {\n font-weight: 300;\n\n @include fs-8;\n}\n\nh2,\n.text-beta,\n#toctitle {\n @include fs-6;\n}\n\nh3,\n.text-gamma {\n @include fs-5;\n}\n\nh4,\n.text-delta {\n font-weight: 400;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n\n @include fs-2;\n}\n\nh4 code {\n text-transform: none;\n}\n\nh5,\n.text-epsilon {\n @include fs-3;\n}\n\nh6,\n.text-zeta {\n @include fs-2;\n}\n\n.text-small {\n @include fs-2;\n}\n\n.text-mono {\n font-family: $mono-font-family !important;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n","// Labels (not the form kind)\n\n// this :not() prevents a style clash with Mermaid.js's\n// diagram labels, which also use .label\n// for more, see https://github.com/just-the-docs/just-the-docs/issues/1272\n// and the accompanying PR\n.label:not(g),\n.label-blue:not(g) {\n display: inline-block;\n padding: 0.16em 0.56em;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $white;\n text-transform: uppercase;\n vertical-align: middle;\n background-color: $blue-100;\n border-radius: 12px;\n\n @include fs-2;\n}\n\n.label-green:not(g) {\n background-color: $green-300;\n}\n\n.label-purple:not(g) {\n background-color: $purple-100;\n}\n\n.label-red:not(g) {\n background-color: $red-300;\n}\n\n.label-yellow:not(g) {\n color: $grey-dk-200;\n background-color: $yellow-200;\n}\n","// Buttons and things that look like buttons\n// stylelint-disable color-named\n\n.btn {\n display: inline-block;\n box-sizing: border-box;\n padding: 0.3em 1em;\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n font-weight: 500;\n line-height: 1.5;\n color: $link-color;\n text-decoration: none;\n vertical-align: baseline;\n cursor: pointer;\n background-color: $base-button-color;\n border-width: 0;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n appearance: none;\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: darken($link-color, 2%);\n }\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n text-decoration: none;\n background-color: darken($base-button-color, 1%);\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($base-button-color, 3%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken(#dcdcdc, 5%);\n }\n\n &:disabled,\n &.disabled {\n &,\n &:hover {\n color: rgba(102, 102, 102, 0.5);\n cursor: default;\n background-color: rgba(229, 229, 229, 0.5);\n background-image: none;\n box-shadow: none;\n }\n }\n}\n\n.btn-outline {\n color: $link-color;\n background: transparent;\n box-shadow: inset 0 0 0 2px $grey-lt-300;\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n color: darken($link-color, 4%);\n text-decoration: none;\n background-color: transparent;\n box-shadow: inset 0 0 0 3px $grey-lt-300;\n }\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow:\n inset 0 0 0 2px $grey-dk-100,\n 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: inset 0 0 0 2px $grey-dk-100;\n }\n}\n\n.btn-primary {\n @include btn-color($white, $btn-primary-color);\n}\n\n.btn-purple {\n @include btn-color($white, $purple-100);\n}\n\n.btn-blue {\n @include btn-color($white, $blue-200);\n}\n\n.btn-green {\n @include btn-color($white, $green-300);\n}\n\n.btn-reset {\n background: none;\n border: none;\n margin: 0;\n text-align: inherit;\n font: inherit;\n border-radius: 0;\n appearance: none;\n}\n","// Colored button\n\n@mixin btn-color($fg, $bg) {\n color: $fg;\n background-color: darken($bg, 2%);\n background-image: linear-gradient(lighten($bg, 5%), darken($bg, 2%));\n box-shadow:\n 0 1px 3px rgba(0, 0, 0, 0.25),\n 0 4px 10px rgba(0, 0, 0, 0.12);\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: $fg;\n background-color: darken($bg, 4%);\n background-image: linear-gradient((lighten($bg, 2%), darken($bg, 4%)));\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($bg, 5%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken($bg, 10%);\n }\n}\n","// Search input and autocomplete\n\n.search {\n position: relative;\n z-index: 2;\n flex-grow: 1;\n height: $sp-10;\n padding: $sp-2;\n transition: padding linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: relative !important;\n width: auto !important;\n height: 100% !important;\n padding: 0;\n transition: none;\n }\n}\n\n.search-input-wrap {\n position: relative;\n z-index: 1;\n height: $sp-8;\n overflow: hidden;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n transition: height linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: absolute;\n width: 100%;\n max-width: $search-results-width;\n height: 100% !important;\n border-radius: 0;\n box-shadow: none;\n transition: width ease $transition-duration;\n }\n}\n\n.search-input {\n position: absolute;\n width: 100%;\n height: 100%;\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing-sm + $sp-5};\n font-size: 1rem;\n color: $body-text-color;\n background-color: $search-background-color;\n border-top: 0;\n border-right: 0;\n border-bottom: 0;\n border-left: 0;\n border-radius: 0;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing + $sp-5};\n font-size: 0.875rem;\n background-color: $body-background-color;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n &:focus {\n outline: 2px solid $link-color;\n outline-offset: -2px;\n\n + .search-label .search-icon {\n color: $link-color;\n }\n }\n}\n\n.search-label {\n position: absolute;\n display: flex;\n height: 100%;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-left: $gutter-spacing;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n .search-icon {\n width: #{$sp-4 * 1.2};\n height: #{$sp-4 * 1.2};\n align-self: center;\n color: $grey-dk-000;\n }\n}\n\n.search-results {\n position: absolute;\n left: 0;\n display: none;\n width: 100%;\n max-height: calc(100% - #{$sp-10});\n overflow-y: auto;\n background-color: $search-background-color;\n border-bottom-right-radius: $border-radius;\n border-bottom-left-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n\n @include mq(md) {\n top: 100%;\n width: $search-results-width;\n max-height: calc(100vh - 200%) !important;\n }\n}\n\n.search-results-list {\n padding-left: 0;\n margin-bottom: $sp-1;\n list-style: none;\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n}\n\n.search-results-list-item {\n padding: 0;\n margin: 0;\n}\n\n.search-result {\n display: block;\n padding: $sp-1 $sp-3;\n\n &:hover,\n &.active {\n background-color: $feedback-color;\n }\n}\n\n.search-result-title {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 40%;\n padding-right: $sp-2;\n vertical-align: top;\n }\n}\n\n.search-result-doc {\n display: flex;\n align-items: center;\n word-wrap: break-word;\n\n &.search-result-doc-parent {\n opacity: 0.5;\n @include fs-3;\n\n @include mq(md) {\n @include fs-2;\n }\n }\n\n .search-result-icon {\n width: $sp-4;\n height: $sp-4;\n margin-right: $sp-2;\n color: $link-color;\n flex-shrink: 0;\n }\n\n .search-result-doc-title {\n overflow: auto;\n }\n}\n\n.search-result-section {\n margin-left: #{$sp-4 + $sp-2};\n word-wrap: break-word;\n}\n\n.search-result-rel-url {\n display: block;\n margin-left: #{$sp-4 + $sp-2};\n overflow: hidden;\n color: $search-result-preview-color;\n text-overflow: ellipsis;\n white-space: nowrap;\n @include fs-1;\n}\n\n.search-result-previews {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n padding-left: $sp-4;\n margin-left: $sp-2;\n color: $search-result-preview-color;\n word-wrap: break-word;\n border-left: $border;\n border-left-color: $border-color;\n @include fs-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 60%;\n padding-left: $sp-2;\n margin-left: 0;\n vertical-align: top;\n }\n}\n\n.search-result-preview + .search-result-preview {\n margin-top: $sp-1;\n}\n\n.search-result-highlight {\n font-weight: bold;\n}\n\n.search-no-result {\n padding: $sp-2 $sp-3;\n @include fs-3;\n}\n\n.search-button {\n position: fixed;\n right: $sp-4;\n bottom: $sp-4;\n display: flex;\n width: $sp-9;\n height: $sp-9;\n background-color: $search-background-color;\n border: 1px solid rgba($link-color, 0.3);\n border-radius: #{$sp-9 * 0.5};\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n align-items: center;\n justify-content: center;\n}\n\n.search-overlay {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1;\n width: 0;\n height: 0;\n background-color: rgba(0, 0, 0, 0.3);\n opacity: 0;\n transition:\n opacity ease $transition-duration,\n width 0s $transition-duration,\n height 0s $transition-duration;\n}\n\n.search-active {\n .search {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .search-input-wrap {\n height: $sp-10;\n border-radius: 0;\n\n @include mq(md) {\n width: $search-results-width;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n }\n }\n\n .search-input {\n background-color: $search-background-color;\n\n @include mq(md) {\n padding-left: 2.3rem;\n }\n }\n\n .search-label {\n @include mq(md) {\n padding-left: 0.6rem;\n }\n }\n\n .search-results {\n display: block;\n }\n\n .search-overlay {\n width: 100%;\n height: 100%;\n opacity: 1;\n transition:\n opacity ease $transition-duration,\n width 0s,\n height 0s;\n }\n\n @include mq(md) {\n .main {\n position: fixed;\n right: 0;\n left: 0;\n }\n }\n\n .main-header {\n padding-top: $sp-10;\n\n @include mq(md) {\n padding-top: 0;\n }\n }\n}\n","// Tables\n// stylelint-disable max-nesting-depth, selector-no-type, selector-max-type\n\n.table-wrapper {\n display: block;\n width: 100%;\n max-width: 100%;\n margin-bottom: $sp-5;\n overflow-x: auto;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n}\n\ntable {\n display: table;\n min-width: 100%;\n border-collapse: separate;\n}\n\nth,\ntd {\n min-width: 7.5rem;\n padding: $sp-2 $sp-3;\n background-color: $table-background-color;\n border-bottom: $border rgba($border-color, 0.5);\n border-left: $border $border-color;\n\n @include fs-3;\n\n &:first-of-type {\n border-left: 0;\n }\n}\n\ntbody {\n tr {\n &:last-of-type {\n th,\n td {\n border-bottom: 0;\n }\n\n td {\n padding-bottom: $sp-3;\n }\n }\n }\n}\n\nthead {\n th {\n border-bottom: $border $border-color;\n }\n}\n","// Code and syntax highlighting\n// stylelint-disable selector-no-qualifying-type, declaration-block-semicolon-newline-after,declaration-block-single-line-max-declarations, selector-no-type, selector-max-type, scss/comment-no-empty\n\n// {% raw %}\n\n// This instruction applies to all queues not within 'pre' or 'figure', avoiding 'code' generated by the highlight.\n:not(pre, figure) {\n & > code {\n padding: 0.2em 0.15em;\n font-weight: 400;\n background-color: $code-background-color;\n border: $border $border-color;\n border-radius: $border-radius;\n }\n}\n\n// Avoid appearance of dark border around visited code links in Safari\na:visited code {\n border-color: $border-color;\n}\n\n// Content structure for highlighted code blocks using fences or Liquid\n//\n// ```[LANG]...```, no kramdown line_numbers:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n//\n// ```[LANG]...```, kramdown line_numbers = true:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.rouge-gutter.gl > pre.lineno\n// | td.rouge-code > pre\n//\n// {% highlight LANG %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n//\n// {% highlight LANG linenos %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.gutter.gl > pre.lineno\n// | td.code > pre\n//\n// ----...---- (AsciiDoc)\n// div.listingblock > div.content > pre.rouge.highlight\n//\n// fix_linenos removes the outermost pre when it encloses table.rouge-table\n//\n// See docs/index-test.md for some tests.\n//\n// No kramdown line_numbers: fences and Liquid highlighting look the same.\n// Kramdown line_numbers = true: fences have a wider gutter than with Liquid?\n\n// ```[LANG]...```\n// or in AsciiDoc:\n//\n// ----\n// ...\n// ----\n\n// the code may appear with 3 different types:\n// container \\ case: default case, code with line number, code with html rendering\n// top level: div.highlighter-rouge, figure.highlight, figure.highlight\n// second level: div.highlight, div.table-wrapper, pre.highlight\n// third level: pre.highlight, td.code, absent\n// last level: code, pre, code (optionality)\n// highlighter level: span, span, span\n// the spacing are only in the second level for case 1, 3 and in the third level for case 2\n// in AsciiDoc, there is a parent container that contains optionally a title and the content.\n\n// select top level container\ndiv.highlighter-rouge,\ndiv.listingblock > div.content,\nfigure.highlight {\n margin-top: 0;\n margin-bottom: $sp-3;\n background-color: $code-background-color;\n border-radius: $border-radius;\n box-shadow: none;\n -webkit-overflow-scrolling: touch;\n position: relative;\n padding: 0;\n\n // copy button (or other button)\n // the button appear only when there is a hover on the code or focus on button\n > button {\n width: $sp-3;\n opacity: 0;\n position: absolute;\n top: 0;\n right: 0;\n padding: $sp-3;\n border: none;\n background: none;\n color: $body-text-color;\n box-sizing: content-box;\n\n svg {\n fill: $body-text-color;\n }\n\n &:active {\n text-decoration: none;\n outline: none;\n opacity: 1;\n }\n\n &:focus {\n opacity: 1;\n outline: 2px solid $link-color;\n }\n }\n\n // the button can be seen by doing a simple hover in the code, there is no need to go over the location of the button\n &:hover {\n > button {\n cursor: copy;\n opacity: 1;\n }\n }\n}\n\n// setting the spacing and scrollbar on the second level for the first case\n// remove all space on the second and third level\n// this is a mixin to accommodate for the slightly different structures generated via Markdown vs AsciiDoc\n@mixin scroll-and-spacing($code-div, $pre-select) {\n #{$code-div} {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n\n #{$pre-select},\n code {\n padding: 0;\n margin: 0;\n border: 0;\n }\n}\n\n// for Markdown\ndiv.highlighter-rouge {\n @include scroll-and-spacing(\"div.highlight\", \"pre.highlight\");\n}\n\n// for AsciiDoc. we also need to fix the margins for its parent container.\ndiv.listingblock {\n margin-top: 0;\n margin-bottom: $sp-3;\n\n @include scroll-and-spacing(\"div.content\", \"div.content > pre\");\n}\n\n// {% highlight LANG %}...{% endhighlight %},\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the second level for the thirt case\n// the css rule are apply only to the last code enviroment\n// setting the scroolbar\nfigure.highlight {\n pre,\n :not(pre) > code {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n}\n\n// ```[LANG]...```, kramdown line_numbers = true,\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the thirt level for the second case\n.highlight .table-wrapper {\n padding: $sp-3 0;\n margin: 0;\n border: 0;\n box-shadow: none;\n\n td,\n pre {\n min-width: 0;\n padding: 0;\n background-color: $code-background-color;\n border: 0;\n\n @include fs-2;\n }\n\n td.gl {\n width: 1em;\n padding-right: $sp-3;\n padding-left: $sp-3;\n }\n\n pre {\n margin: 0;\n line-height: 2;\n }\n}\n\n// Code examples: html render of a code\n.code-example,\n.listingblock > .title {\n padding: $sp-3;\n margin-bottom: $sp-3;\n overflow: auto;\n border: 1px solid $border-color;\n border-radius: $border-radius;\n\n + .highlighter-rouge,\n + .sectionbody .listingblock,\n + .content,\n + figure.highlight {\n position: relative;\n margin-top: -$sp-4;\n border-right: 1px solid $border-color;\n border-bottom: 1px solid $border-color;\n border-left: 1px solid $border-color;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n}\n\n// Mermaid diagram code blocks should be left unstyled.\ncode.language-mermaid {\n padding: 0;\n background-color: inherit;\n border: 0;\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight,\npre.highlight {\n background: $code-background-color; // Code Background\n // For Backwards Compatibility Before $code-linenumber-color was added\n @if variable-exists(code-linenumber-color) {\n color: $code-linenumber-color; // Code Line Numbers\n } @else {\n color: $body-text-color; // Code Line Numbers\n }\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight pre {\n background: $code-background-color; // Code Background\n}\n\n// {% endraw %}\n","// Utility classes for colors\n\n// Text colors\n\n.text-grey-dk-000 {\n color: $grey-dk-000 !important;\n}\n\n.text-grey-dk-100 {\n color: $grey-dk-100 !important;\n}\n\n.text-grey-dk-200 {\n color: $grey-dk-200 !important;\n}\n\n.text-grey-dk-250 {\n color: $grey-dk-250 !important;\n}\n\n.text-grey-dk-300 {\n color: $grey-dk-300 !important;\n}\n\n.text-grey-lt-000 {\n color: $grey-lt-000 !important;\n}\n\n.text-grey-lt-100 {\n color: $grey-lt-100 !important;\n}\n\n.text-grey-lt-200 {\n color: $grey-lt-200 !important;\n}\n\n.text-grey-lt-300 {\n color: $grey-lt-300 !important;\n}\n\n.text-blue-000 {\n color: $blue-000 !important;\n}\n\n.text-blue-100 {\n color: $blue-100 !important;\n}\n\n.text-blue-200 {\n color: $blue-200 !important;\n}\n\n.text-blue-300 {\n color: $blue-300 !important;\n}\n\n.text-green-000 {\n color: $green-000 !important;\n}\n\n.text-green-100 {\n color: $green-100 !important;\n}\n\n.text-green-200 {\n color: $green-200 !important;\n}\n\n.text-green-300 {\n color: $green-300 !important;\n}\n\n.text-purple-000 {\n color: $purple-000 !important;\n}\n\n.text-purple-100 {\n color: $purple-100 !important;\n}\n\n.text-purple-200 {\n color: $purple-200 !important;\n}\n\n.text-purple-300 {\n color: $purple-300 !important;\n}\n\n.text-yellow-000 {\n color: $yellow-000 !important;\n}\n\n.text-yellow-100 {\n color: $yellow-100 !important;\n}\n\n.text-yellow-200 {\n color: $yellow-200 !important;\n}\n\n.text-yellow-300 {\n color: $yellow-300 !important;\n}\n\n.text-red-000 {\n color: $red-000 !important;\n}\n\n.text-red-100 {\n color: $red-100 !important;\n}\n\n.text-red-200 {\n color: $red-200 !important;\n}\n\n.text-red-300 {\n color: $red-300 !important;\n}\n\n// Background colors\n\n.bg-grey-dk-000 {\n background-color: $grey-dk-000 !important;\n}\n\n.bg-grey-dk-100 {\n background-color: $grey-dk-100 !important;\n}\n\n.bg-grey-dk-200 {\n background-color: $grey-dk-200 !important;\n}\n\n.bg-grey-dk-250 {\n background-color: $grey-dk-250 !important;\n}\n\n.bg-grey-dk-300 {\n background-color: $grey-dk-300 !important;\n}\n\n.bg-grey-lt-000 {\n background-color: $grey-lt-000 !important;\n}\n\n.bg-grey-lt-100 {\n background-color: $grey-lt-100 !important;\n}\n\n.bg-grey-lt-200 {\n background-color: $grey-lt-200 !important;\n}\n\n.bg-grey-lt-300 {\n background-color: $grey-lt-300 !important;\n}\n\n.bg-blue-000 {\n background-color: $blue-000 !important;\n}\n\n.bg-blue-100 {\n background-color: $blue-100 !important;\n}\n\n.bg-blue-200 {\n background-color: $blue-200 !important;\n}\n\n.bg-blue-300 {\n background-color: $blue-300 !important;\n}\n\n.bg-green-000 {\n background-color: $green-000 !important;\n}\n\n.bg-green-100 {\n background-color: $green-100 !important;\n}\n\n.bg-green-200 {\n background-color: $green-200 !important;\n}\n\n.bg-green-300 {\n background-color: $green-300 !important;\n}\n\n.bg-purple-000 {\n background-color: $purple-000 !important;\n}\n\n.bg-purple-100 {\n background-color: $purple-100 !important;\n}\n\n.bg-purple-200 {\n background-color: $purple-200 !important;\n}\n\n.bg-purple-300 {\n background-color: $purple-300 !important;\n}\n\n.bg-yellow-000 {\n background-color: $yellow-000 !important;\n}\n\n.bg-yellow-100 {\n background-color: $yellow-100 !important;\n}\n\n.bg-yellow-200 {\n background-color: $yellow-200 !important;\n}\n\n.bg-yellow-300 {\n background-color: $yellow-300 !important;\n}\n\n.bg-red-000 {\n background-color: $red-000 !important;\n}\n\n.bg-red-100 {\n background-color: $red-100 !important;\n}\n\n.bg-red-200 {\n background-color: $red-200 !important;\n}\n\n.bg-red-300 {\n background-color: $red-300 !important;\n}\n","// Utility classes for layout\n\n// Display\n\n.d-block {\n display: block !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n// Screenreader-only\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .d-sm-block, .d-md-none, .d-lg-inline\n .d-#{$media-query}-block {\n display: block !important;\n }\n .d-#{$media-query}-flex {\n display: flex !important;\n }\n .d-#{$media-query}-inline {\n display: inline !important;\n }\n .d-#{$media-query}-inline-block {\n display: inline-block !important;\n }\n .d-#{$media-query}-none {\n display: none !important;\n }\n }\n }\n}\n\n// Horizontal alignment\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.flex-justify-start {\n justify-content: flex-start !important;\n}\n\n.flex-justify-end {\n justify-content: flex-end !important;\n}\n\n.flex-justify-between {\n justify-content: space-between !important;\n}\n\n.flex-justify-around {\n justify-content: space-around !important;\n}\n\n// Vertical alignment\n\n.v-align-baseline {\n vertical-align: baseline !important;\n}\n\n.v-align-bottom {\n vertical-align: bottom !important;\n}\n\n.v-align-middle {\n vertical-align: middle !important;\n}\n\n.v-align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.v-align-text-top {\n vertical-align: text-top !important;\n}\n\n.v-align-top {\n vertical-align: top !important;\n}\n","// Utility classes for typography\n\n.fs-1 {\n @include fs-1;\n}\n\n.fs-2 {\n @include fs-2;\n}\n\n.fs-3 {\n @include fs-3;\n}\n\n.fs-4 {\n @include fs-4;\n}\n\n.fs-5 {\n @include fs-5;\n}\n\n.fs-6 {\n @include fs-6;\n}\n\n.fs-7 {\n @include fs-7;\n}\n\n.fs-8 {\n @include fs-8;\n}\n\n.fs-9 {\n @include fs-9;\n}\n\n.fs-10 {\n @include fs-10;\n}\n\n.fw-300 {\n font-weight: 300 !important;\n}\n\n.fw-400 {\n font-weight: 400 !important;\n}\n\n.fw-500 {\n font-weight: 500 !important;\n}\n\n.fw-700 {\n font-weight: 700 !important;\n}\n\n.lh-0 {\n line-height: 0 !important;\n}\n\n.lh-default {\n line-height: $body-line-height;\n}\n\n.lh-tight {\n line-height: $body-heading-line-height;\n}\n\n.ls-5 {\n letter-spacing: 0.05em !important;\n}\n\n.ls-10 {\n letter-spacing: 0.1em !important;\n}\n\n.ls-0 {\n letter-spacing: 0 !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n","// Utility classes for lists\n\n// stylelint-disable selector-max-type\n\n.list-style-none {\n padding: 0 !important;\n margin: 0 !important;\n list-style: none !important;\n\n li {\n &::before {\n display: none !important;\n }\n }\n}\n","// Utility classes for margins and padding\n\n// stylelint-disable block-opening-brace-space-after, block-opening-brace-space-before\n\n// Margin spacer utilities\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-0, .m-1, .m-2...\n .m-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n .mx-#{$scale}-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-sm-0, .m-md-1, .m-lg-2...\n .m-#{$media-query}-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$media-query}-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$media-query}-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$media-query}-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n }\n }\n}\n\n// Padding spacer utilities\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-0, .p-1, .p-2...\n .p-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @include mq($media-query) {\n @for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-sm-0, .p-md-1, .p-lg-2...\n .p-#{$media-query}-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$media-query}-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$media-query}-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n }\n }\n}\n","// stylelint-disable selector-max-specificity, selector-max-id, selector-max-type, selector-no-qualifying-type\n\n@media print {\n .site-footer,\n .site-button,\n #edit-this-page,\n #back-to-top,\n .site-nav,\n .main-header {\n display: none !important;\n }\n\n hr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n }\n\n .side-bar {\n width: 100%;\n height: auto;\n border-right: 0 !important;\n }\n\n .site-header {\n border-bottom: 1px solid $border-color;\n }\n\n .site-title {\n font-size: 1rem !important;\n font-weight: 700 !important;\n }\n\n .text-small {\n font-size: 8pt !important;\n }\n\n pre.highlight {\n border: 1px solid $border-color;\n }\n\n .main {\n max-width: none;\n margin-left: 0;\n }\n}\n","// Skipnav\n// Skip to main content\n\na.skip-to-main {\n left: -999px;\n position: absolute;\n top: auto;\n width: 1px;\n height: 1px;\n overflow: hidden;\n z-index: -999;\n}\n\na.skip-to-main:focus,\na.skip-to-main:active {\n color: $link-color;\n background-color: $body-background-color;\n left: auto;\n top: auto;\n width: 30%;\n height: auto;\n overflow: auto;\n margin: 10px 35%;\n padding: 5px;\n border-radius: 15px;\n border: 4px solid $btn-primary-color;\n text-align: center;\n font-size: 1.2em;\n z-index: 999;\n}\n","\n@import \"./support/support\";\n@import \"./custom/setup\";\n@import \"./color_schemes/light\";\n\n@import \"./color_schemes/meshtastic-dark\";\n\n@import \"./modules\";\ndiv.opaque {\n background-color: $body-background-color;\n}\n\np.tip, blockquote.tip {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $green-300;\n content: \"Tip\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .tip-title {\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.tip-title, blockquote.tip-title {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.tip {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.tip-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.note, blockquote.note {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $blue-300;\n content: \"Note\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .note-title {\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.note-title, blockquote.note-title {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.note {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.note-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.warning, blockquote.warning {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $yellow-300;\n content: \"Warning\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .warning-title {\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.warning-title, blockquote.warning-title {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.warning {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.warning-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n@import \"./custom/custom\";\n\n\n"],"file":"just-the-docs-meshtastic-dark.css"}
\ No newline at end of file
diff --git a/main/assets/css/just-the-docs-meshtastic.css.map b/main/assets/css/just-the-docs-meshtastic.css.map
index 20380f8545..c4762f21e6 100644
--- a/main/assets/css/just-the-docs-meshtastic.css.map
+++ b/main/assets/css/just-the-docs-meshtastic.css.map
@@ -1 +1 @@
-{"version":3,"sourceRoot":"","sources":["../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/vendor/accessible-pygments/github-light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/vendor/normalize.scss/normalize.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/base.scss","../../_sass/color_schemes/meshtastic.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/support/mixins/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/support/mixins/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/support/_variables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/content.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/navigation.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/labels.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/color_schemes/light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/support/mixins/_buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/search.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/tables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/code.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/utilities/_colors.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/utilities/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/utilities/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/utilities/_lists.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/utilities/_spacing.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/print.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260905-3069-v688xg/_sass/skiptomain.scss","just-the-docs-meshtastic.scss"],"names":[],"mappings":"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AGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvOF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AdrBE;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAQR;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AfhHA;EACE;;ACYA;EeZJ;IhBII;;;;AAKF;EACE;;ACEA;EeRJ;IhBUI;;;;AAKF;EACE;;ACRA;EeJJ;IhBgBI;;;;AAKF;EACE;;AClBA;EeAJ;IhBsBI;;;;AAKF;EACE;;AC5BA;EeIJ;IhB4BI;;;;AAKF;EACE;;ACtCA;EeQJ;IhBkCI;IACA,aEhDuB;;;;AFqDzB;EACE;EACA,aEvDuB;;ADKvB;EeYJ;IhB0CI;;;;AAKF;EACE;EACA,aElEuB;;ADKvB;EegBJ;IhBiDI;;;;AAKF;EACE;EACA,aE7EuB;;ADKvB;EeoBJ;IhBwDI;;;;AAKF;EACE;EACA,aExFuB;;ADKvB;EewBJ;IhB+DI;;;;AgB3DJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,adxDiB;;;Ac2DnB;EACE,ad1DyB;;;Ac6D3B;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC/EF;EACE;EACA;EACA;;AAGE;EACE;;;ACLN;EACE;EACA;;;AAQA;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AjBlCA;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAaN;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AjB7GA;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AC3JR;EACE;AAAA;AAAA;AAAA;AAAA;AAAA;IAME;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;;;ACvCJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE,OrBCW;EqBAX,kBrBNsB;EqBOtB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACpBF;EACE,kBtBCsB;;;AsBExB;EACI;EACA;EACA,enB4EY;EmB3EZ;EACA;;AAEA;EACI,OnB8BI;EmB7BJ;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OnBoBM;EmBnBN;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,enBiDY;EmBhDZ;EACA;;AACA;EACE;EACA;EACA,OnBEM;EmBDN;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,enBGY;EmBFZ;EACA;;AAEA;EACI,OnB/CG;EmBgDH;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OnBzDK;EmB0DL;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,enBxBY;EmByBZ;EACA;;AACA;EACE;EACA;EACA,OnB3EK;EmB4EL;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,enBtEY;EmBuEZ;EACA;;AAEA;EACI,OnBhHK;EmBiHL;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OnB1HO;EmB2HP;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,enBjGY;EmBkGZ;EACA;;AACA;EACE;EACA;EACA,OnB5IO;EmB6IP;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE","sourcesContent":["/*\ngenerated by accessible-pygments \nCopyright (c) 2022, Quansight Labs\nLicensed under the BSD license, see LICENSE for details.\n--\ngenerated by Pygments \nCopyright 2006-2025 by the Pygments team.\nLicensed under the BSD license, see LICENSE for details.\n*/\n\n.highlight .hll { background-color: #0969da4a }\n.highlight .c { color: #6E7781 } /* Comment */\n.highlight .err { color: #CF222E } /* Error */\n.highlight .k { color: #CF222E } /* Keyword */\n.highlight .l { color: #953800 } /* Literal */\n.highlight .n { color: #8250DF } /* Name */\n.highlight .o { color: #116329 } /* Operator */\n.highlight .p { color: #24292F } /* Punctuation */\n.highlight .ch { color: #6E7781 } /* Comment.Hashbang */\n.highlight .cm { color: #6E7781 } /* Comment.Multiline */\n.highlight .cp { color: #6E7781 } /* Comment.Preproc */\n.highlight .cpf { color: #6E7781 } /* Comment.PreprocFile */\n.highlight .c1 { color: #6E7781 } /* Comment.Single */\n.highlight .cs { color: #6E7781 } /* Comment.Special */\n.highlight .gd { color: #0550AE } /* Generic.Deleted */\n.highlight .ge { font-style: italic } /* Generic.Emph */\n.highlight .gr { color: #CF222E } /* Generic.Error */\n.highlight .gh { color: #0550AE } /* Generic.Heading */\n.highlight .gs { font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #0550AE } /* Generic.Subheading */\n.highlight .kc { color: #0550AE } /* Keyword.Constant */\n.highlight .kd { color: #CF222E } /* Keyword.Declaration */\n.highlight .kn { color: #CF222E } /* Keyword.Namespace */\n.highlight .kp { color: #CF222E } /* Keyword.Pseudo */\n.highlight .kr { color: #CF222E } /* Keyword.Reserved */\n.highlight .kt { color: #CF222E } /* Keyword.Type */\n.highlight .ld { color: #953800 } /* Literal.Date */\n.highlight .m { color: #953800 } /* Literal.Number */\n.highlight .s { color: #0550AE } /* Literal.String */\n.highlight .na { color: #953800 } /* Name.Attribute */\n.highlight .nb { color: #953800 } /* Name.Builtin */\n.highlight .nc { color: #0550AE } /* Name.Class */\n.highlight .no { color: #0550AE } /* Name.Constant */\n.highlight .nd { color: #953800 } /* Name.Decorator */\n.highlight .ni { color: #116329 } /* Name.Entity */\n.highlight .ne { color: #8250DF } /* Name.Exception */\n.highlight .nf { color: #0550AE } /* Name.Function */\n.highlight .nl { color: #953800 } /* Name.Label */\n.highlight .nn { color: #24292F } /* Name.Namespace */\n.highlight .nx { color: #8250DF } /* Name.Other */\n.highlight .py { color: #0550AE } /* Name.Property */\n.highlight .nt { color: #116329 } /* Name.Tag */\n.highlight .nv { color: #953800 } /* Name.Variable */\n.highlight .ow { color: #8250DF } /* Operator.Word */\n.highlight .pm { color: #24292F } /* Punctuation.Marker */\n.highlight .w { color: #24292F } /* Text.Whitespace */\n.highlight .mb { color: #953800 } /* Literal.Number.Bin */\n.highlight .mf { color: #953800 } /* Literal.Number.Float */\n.highlight .mh { color: #953800 } /* Literal.Number.Hex */\n.highlight .mi { color: #953800 } /* Literal.Number.Integer */\n.highlight .mo { color: #953800 } /* Literal.Number.Oct */\n.highlight .sa { color: #0550AE } /* Literal.String.Affix */\n.highlight .sb { color: #0550AE } /* Literal.String.Backtick */\n.highlight .sc { color: #0550AE } /* Literal.String.Char */\n.highlight .dl { color: #0550AE } /* Literal.String.Delimiter */\n.highlight .sd { color: #0550AE } /* Literal.String.Doc */\n.highlight .s2 { color: #0550AE } /* Literal.String.Double */\n.highlight .se { color: #0550AE } /* Literal.String.Escape */\n.highlight .sh { color: #0550AE } /* Literal.String.Heredoc */\n.highlight .si { color: #0550AE } /* Literal.String.Interpol */\n.highlight .sx { color: #0550AE } /* Literal.String.Other */\n.highlight .sr { color: #0550AE } /* Literal.String.Regex */\n.highlight .s1 { color: #0550AE } /* Literal.String.Single */\n.highlight .ss { color: #0550AE } /* Literal.String.Symbol */\n.highlight .bp { color: #953800 } /* Name.Builtin.Pseudo */\n.highlight .fm { color: #0550AE } /* Name.Function.Magic */\n.highlight .vc { color: #953800 } /* Name.Variable.Class */\n.highlight .vg { color: #953800 } /* Name.Variable.Global */\n.highlight .vi { color: #953800 } /* Name.Variable.Instance */\n.highlight .vm { color: #953800 } /* Name.Variable.Magic */\n.highlight .il { color: #953800 } /* Literal.Number.Integer.Long */\n","/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput {\n /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect {\n /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// Base element style overrides\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\n:root {\n color-scheme: $color-scheme;\n}\n\n* {\n box-sizing: border-box;\n}\n\nhtml {\n scroll-behavior: smooth;\n\n @include fs-4;\n}\n\nbody {\n font-family: $body-font-family;\n font-size: inherit;\n line-height: $body-line-height;\n color: $body-text-color;\n background-color: $body-background-color;\n overflow-wrap: break-word;\n}\n\nol,\nul,\ndl,\npre,\naddress,\nblockquote,\ntable,\ndiv,\nhr,\nform,\nfieldset,\nnoscript .table-wrapper {\n margin-top: 0;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n#toctitle {\n margin-top: 0;\n margin-bottom: 1em;\n font-weight: 500;\n line-height: $body-heading-line-height;\n color: $body-heading-color;\n}\n\np {\n margin-top: 1em;\n margin-bottom: 1em;\n}\n\na {\n color: $link-color;\n text-decoration: none;\n}\n\na:not([class]) {\n text-decoration: underline;\n text-decoration-color: $border-color;\n text-underline-offset: 2px;\n\n &:hover {\n text-decoration-color: rgba($link-color, 0.45);\n }\n}\n\ncode {\n font-family: $mono-font-family;\n font-size: 0.75em;\n line-height: $body-line-height;\n}\n\nfigure,\npre {\n margin: 0;\n}\n\nli {\n margin: 0.25em 0;\n}\n\nimg {\n max-width: 100%;\n height: auto;\n}\n\nhr {\n height: 1px;\n padding: 0;\n margin: $sp-6 0;\n background-color: $border-color;\n border: 0;\n}\n\n// adds a GitHub-style sidebar to blockquotes\nblockquote {\n margin: 10px 0;\n\n // resets user-agent stylesheets for blockquotes\n margin-block-start: 0;\n margin-inline-start: 0;\n padding-left: 1rem;\n border-left: 3px solid $border-color;\n}\n","// Meshtastic Material 3 — Light color scheme for just-the-docs\n// Source: core/ui/.../Color.kt §8.2 (Light Scheme)\n//\n// Brand colors:\n// Primary (Light): #2D8F52 (Green 700)\n// Surface (Light): #F5F6FA (Neutral 50)\n\n$color-scheme: light;\n\n// Body / page background\n$body-background-color: #F5F6FA; // Neutral 50 — surfaceLight\n$sidebar-color: #ECEDF3; // Neutral 100 — surfaceContainerLight\n$body-text-color: #2C2D3C; // Neutral 800 — onSurfaceLight\n$body-heading-color: #2C2D3C; // Neutral 800\n\n// Links\n$link-color: #2D8F52; // Green 700 — primaryLight\n$nav-link-color: #2D8F52; // Green 700\n\n// Navigation\n$nav-child-link-color: #555668; // Neutral 600 — secondaryLight\n$search-result-preview-color: #555668;\n\n// Code\n$code-background-color: #ECEDF3; // Neutral 100\n$code-linenumber-color: #9496A6; // Neutral 400\n\n// Borders\n$border-color: #D5D6E0; // Neutral 200 — outlineVariantLight\n$table-background-color: #F5F6FA; // Neutral 50\n\n// Buttons\n$btn-primary-color: #2D8F52; // Green 700\n\n// Feedback / callouts\n$feedback-color: #E0E1EB; // surfaceContainerHighLight\n\n// Search\n$search-background-color: #FFFFFF; // surfaceContainerLowestLight\n","@mixin fs-1 {\n & {\n font-size: $font-size-1 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-1-sm !important;\n }\n}\n\n@mixin fs-2 {\n & {\n font-size: $font-size-2 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-3 !important;\n }\n}\n\n@mixin fs-3 {\n & {\n font-size: $font-size-3 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-4 !important;\n }\n}\n\n@mixin fs-4 {\n & {\n font-size: $font-size-4 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-5 !important;\n }\n}\n\n@mixin fs-5 {\n & {\n font-size: $font-size-5 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-6 !important;\n }\n}\n\n@mixin fs-6 {\n & {\n font-size: $font-size-6 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n}\n\n@mixin fs-7 {\n & {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-8 !important;\n }\n}\n\n@mixin fs-8 {\n & {\n font-size: $font-size-8 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-9 !important;\n }\n}\n\n@mixin fs-9 {\n & {\n font-size: $font-size-9 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10 !important;\n }\n}\n\n@mixin fs-10 {\n & {\n font-size: $font-size-10 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10-sm !important;\n }\n}\n","// Media query\n\n// Media query mixin\n// Usage:\n// @include mq(md) {\n// ..medium and up styles\n// }\n@mixin mq($name) {\n // Retrieves the value from the key\n $value: map-get($media-queries, $name);\n\n // If the key exists in the map\n @if $value {\n // Prints a media query based on the value\n @media (min-width: $value) {\n @content;\n }\n } @else {\n @warn \"No value could be retrieved from `#{$media-query}`. Please make sure it is defined in `$media-queries` map.\";\n }\n}\n\n// Responsive container\n\n@mixin container {\n padding-right: $gutter-spacing-sm;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-right: $gutter-spacing;\n padding-left: $gutter-spacing;\n }\n}\n","// Typography\n\n// prettier-ignore\n$body-font-family: system-ui, -apple-system, blinkmacsystemfont, \"Segoe UI\",\n roboto, \"Helvetica Neue\", arial, sans-serif, \"Segoe UI Emoji\" !default;\n$mono-font-family: \"SFMono-Regular\", menlo, consolas, monospace !default;\n$root-font-size: 16px !default; // DEPRECATED: previously base font-size for rems\n$body-line-height: 1.4 !default;\n$content-line-height: 1.6 !default;\n$body-heading-line-height: 1.25 !default;\n\n// Font size\n// `-sm` suffix is the size at the small (and above) media query\n\n$font-size-1: 0.5625rem !default;\n$font-size-1-sm: 0.625rem !default;\n$font-size-2: 0.6875rem !default; // h4 - uppercased!, h6 not uppercased, text-small\n$font-size-3: 0.75rem !default; // h5\n$font-size-4: 0.875rem !default;\n$font-size-5: 1rem !default; // h3\n$font-size-6: 1.125rem !default; // h2\n$font-size-7: 1.5rem !default;\n$font-size-8: 2rem !default; // h1\n$font-size-9: 2.25rem !default;\n$font-size-10: 2.625rem !default;\n$font-size-10-sm: 3rem !default;\n\n// Colors\n\n$white: #fff !default;\n$grey-dk-000: #959396 !default;\n$grey-dk-100: #5c5962 !default;\n$grey-dk-200: #44434d !default;\n$grey-dk-250: #302d36 !default;\n$grey-dk-300: #27262b !default;\n$grey-lt-000: #f5f6fa !default;\n$grey-lt-100: #eeebee !default;\n$grey-lt-200: #ecebed !default;\n$grey-lt-300: #e6e1e8 !default;\n$purple-000: #7253ed !default;\n$purple-100: #5e41d0 !default;\n$purple-200: #4e26af !default;\n$purple-300: #381885 !default;\n$blue-000: #2c84fa !default;\n$blue-100: #2869e6 !default;\n$blue-200: #264caf !default;\n$blue-300: #183385 !default;\n$green-000: #41d693 !default;\n$green-100: #11b584 !default;\n$green-200: #009c7b !default;\n$green-300: #026e57 !default;\n$yellow-000: #ffeb82 !default;\n$yellow-100: #fadf50 !default;\n$yellow-200: #f7d12e !default;\n$yellow-300: #e7af06 !default;\n$red-000: #f77e7e !default;\n$red-100: #f96e65 !default;\n$red-200: #e94c4c !default;\n$red-300: #dd2e2e !default;\n\n// Spacing\n\n$spacing-unit: 1rem; // 1rem == 16px\n\n$spacers: (\n sp-0: 0,\n sp-1: $spacing-unit * 0.25,\n sp-2: $spacing-unit * 0.5,\n sp-3: $spacing-unit * 0.75,\n sp-4: $spacing-unit,\n sp-5: $spacing-unit * 1.5,\n sp-6: $spacing-unit * 2,\n sp-7: $spacing-unit * 2.5,\n sp-8: $spacing-unit * 3,\n sp-9: $spacing-unit * 3.5,\n sp-10: $spacing-unit * 4,\n) !default;\n$sp-1: map-get($spacers, sp-1) !default; // 0.25 rem == 4px\n$sp-2: map-get($spacers, sp-2) !default; // 0.5 rem == 8px\n$sp-3: map-get($spacers, sp-3) !default; // 0.75 rem == 12px\n$sp-4: map-get($spacers, sp-4) !default; // 1 rem == 16px\n$sp-5: map-get($spacers, sp-5) !default; // 1.5 rem == 24px\n$sp-6: map-get($spacers, sp-6) !default; // 2 rem == 32px\n$sp-7: map-get($spacers, sp-7) !default; // 2.5 rem == 40px\n$sp-8: map-get($spacers, sp-8) !default; // 3 rem == 48px\n$sp-9: map-get($spacers, sp-9) !default; // 3.5 rem == 56px\n$sp-10: map-get($spacers, sp-10) !default; // 4 rem == 64px\n\n// Borders\n\n$border: 1px solid !default;\n$border-radius: 4px !default;\n$border-color: $grey-lt-100 !default;\n\n// Grid system\n\n$gutter-spacing: $sp-6 !default;\n$gutter-spacing-sm: $sp-4 !default;\n$nav-width: 16.5rem !default;\n$nav-width-md: 15.5rem !default;\n$nav-list-item-height: $sp-6 !default;\n$nav-list-item-height-sm: $sp-8 !default;\n$nav-list-expander-right: true;\n$content-width: 50rem !default;\n$header-height: 3.75rem !default;\n$search-results-width: $content-width - $nav-width !default;\n$transition-duration: 400ms;\n\n// Media queries in pixels\n\n$media-queries: (\n xs: 20rem,\n sm: 31.25rem,\n md: $content-width,\n lg: $content-width + $nav-width,\n xl: 87.5rem,\n) !default;\n","// The basic two column layout\n\n.side-bar {\n z-index: 0;\n display: flex;\n flex-wrap: wrap;\n background-color: $sidebar-color;\n\n @include mq(md) {\n flex-flow: column nowrap;\n position: fixed;\n width: $nav-width-md;\n height: 100%;\n border-right: $border $border-color;\n align-items: flex-end;\n }\n\n @include mq(lg) {\n width: calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width});\n min-width: $nav-width;\n }\n\n & + .main {\n @include mq(md) {\n margin-left: $nav-width-md;\n }\n\n @include mq(lg) {\n // stylelint-disable function-name-case\n // disable for Max(), we want to use the CSS max() function\n margin-left: Max(\n #{$nav-width},\n calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width})\n );\n // stylelint-enable function-name-case\n }\n\n .main-header {\n display: none;\n background-color: $sidebar-color;\n\n @include mq(md) {\n display: flex;\n background-color: $body-background-color;\n }\n\n &.nav-open {\n display: block;\n\n @include mq(md) {\n display: flex;\n }\n }\n }\n }\n}\n\n.main {\n margin: auto;\n\n @include mq(md) {\n position: relative;\n max-width: $content-width;\n }\n}\n\n.main-content-wrap {\n padding-top: $gutter-spacing-sm;\n padding-bottom: $gutter-spacing-sm;\n\n @include container;\n\n @include mq(md) {\n padding-top: $gutter-spacing;\n padding-bottom: $gutter-spacing;\n }\n}\n\n.main-header {\n z-index: 0;\n border-bottom: $border $border-color;\n\n @include mq(md) {\n display: flex;\n justify-content: space-between;\n height: $header-height;\n }\n}\n\n.site-nav,\n.site-header,\n.site-footer {\n width: 100%;\n\n @include mq(lg) {\n width: $nav-width;\n }\n}\n\n.site-nav {\n display: none;\n\n &.nav-open {\n display: block;\n }\n\n @include mq(md) {\n display: block;\n padding-top: $sp-8;\n padding-bottom: $gutter-spacing-sm;\n overflow-y: auto;\n flex: 1 1 auto;\n }\n}\n\n.site-header {\n display: flex;\n min-height: $header-height;\n align-items: center;\n\n @include mq(md) {\n height: $header-height;\n max-height: $header-height;\n border-bottom: $border $border-color;\n }\n}\n\n.site-title {\n flex-grow: 1;\n display: flex;\n height: 100%;\n align-items: center;\n padding-top: $sp-3;\n padding-bottom: $sp-3;\n color: $body-heading-color;\n\n @include container;\n\n @include fs-6;\n\n @include mq(md) {\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n }\n}\n\n@if variable-exists(logo) {\n .site-logo {\n width: 100%;\n height: 100%;\n background-image: url($logo);\n background-repeat: no-repeat;\n background-position: left center;\n background-size: contain;\n }\n}\n\n.site-button {\n display: flex;\n height: 100%;\n padding: $gutter-spacing-sm;\n align-items: center;\n}\n\n@include mq(md) {\n .site-header .site-button {\n display: none;\n }\n}\n\n.site-title:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n}\n\n.site-button:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n}\n\n.site-footer {\n position: absolute;\n bottom: 0;\n left: 0;\n padding-top: $sp-4;\n padding-bottom: $sp-4;\n\n @include container;\n\n @include fs-2;\n\n @include mq(md) {\n position: static;\n justify-self: end;\n }\n}\n\n.icon {\n width: $sp-5;\n height: $sp-5;\n color: $link-color;\n}\n","@charset \"UTF-8\";\n\n// Styles for rendered markdown in the .main-content container\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity, selector-max-id\n\n.main-content {\n line-height: $content-line-height;\n\n ol,\n ul,\n dl,\n pre,\n address,\n blockquote,\n .table-wrapper {\n margin-top: 0.5em;\n }\n\n a {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n ul,\n ol {\n padding-left: 1.5em;\n }\n\n li {\n .highlight {\n margin-top: $sp-1;\n }\n }\n\n ol {\n list-style-type: none;\n counter-reset: step-counter;\n\n > li {\n position: relative;\n\n &::before {\n position: absolute;\n top: 0.2em;\n left: -1.6em;\n color: $grey-dk-000;\n content: counter(step-counter);\n counter-increment: step-counter;\n @include fs-3;\n\n @include mq(sm) {\n top: 0.11em;\n }\n }\n\n ol {\n counter-reset: sub-counter;\n\n > li {\n &::before {\n content: counter(sub-counter, lower-alpha);\n counter-increment: sub-counter;\n }\n }\n }\n }\n }\n\n ul {\n list-style: none;\n\n > li {\n &::before {\n position: absolute;\n margin-left: -1.4em;\n color: $grey-dk-000;\n content: \"•\";\n }\n }\n }\n\n .task-list-item {\n &::before {\n content: \"\";\n }\n }\n\n .task-list-item-checkbox {\n margin-right: 0.6em;\n margin-left: -1.4em;\n\n // The same margin-left is used above for ul > li::before\n }\n\n hr + * {\n margin-top: 0;\n }\n\n h1:first-of-type {\n margin-top: 0.5em;\n }\n\n dl {\n display: grid;\n grid-template: auto / 10em 1fr;\n }\n\n dt,\n dd {\n margin: 0.25em 0;\n }\n\n dt {\n grid-column: 1;\n font-weight: 500;\n text-align: right;\n\n &::after {\n content: \":\";\n }\n }\n\n dd {\n grid-column: 2;\n margin-bottom: 0;\n margin-left: 1em;\n\n blockquote,\n div,\n dl,\n dt,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n li,\n ol,\n p,\n pre,\n table,\n ul,\n .table-wrapper {\n &:first-child {\n margin-top: 0;\n }\n }\n }\n\n dd,\n ol,\n ul {\n dl:first-child {\n dt:first-child,\n dd:nth-child(2) {\n margin-top: 0;\n }\n }\n }\n\n .anchor-heading {\n position: absolute;\n right: -$sp-4;\n width: $sp-5;\n height: 100%;\n padding-right: $sp-1;\n padding-left: $sp-1;\n overflow: visible;\n\n @include mq(md) {\n right: auto;\n left: -$sp-5;\n }\n\n svg {\n display: inline-block;\n width: 100%;\n height: 100%;\n color: $link-color;\n visibility: hidden;\n }\n }\n\n .anchor-heading:hover,\n .anchor-heading:focus,\n h1:hover > .anchor-heading,\n h2:hover > .anchor-heading,\n h3:hover > .anchor-heading,\n h4:hover > .anchor-heading,\n h5:hover > .anchor-heading,\n h6:hover > .anchor-heading {\n svg {\n visibility: visible;\n }\n }\n\n summary {\n cursor: pointer;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n #toctitle {\n position: relative;\n margin-top: 1.5em;\n margin-bottom: 0.25em;\n\n + table,\n + .table-wrapper,\n + .code-example,\n + .highlighter-rouge,\n + .sectionbody .listingblock {\n margin-top: 1em;\n }\n\n + p:not(.label) {\n margin-top: 0;\n }\n }\n\n > h1:first-child,\n > h2:first-child,\n > h3:first-child,\n > h4:first-child,\n > h5:first-child,\n > h6:first-child,\n > .sect1:first-child > h2,\n > .sect2:first-child > h3,\n > .sect3:first-child > h4,\n > .sect4:first-child > h5,\n > .sect5:first-child > h6 {\n margin-top: $sp-2;\n }\n}\n","// Main nav, breadcrumb, etc...\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity\n\n.nav-list {\n padding: 0;\n margin-top: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n margin: 0;\n\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n\n .nav-list-link {\n display: block;\n min-height: $nav-list-item-height-sm;\n padding-top: $sp-1;\n padding-bottom: $sp-1;\n line-height: #{$nav-list-item-height-sm - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height-sm;\n padding-left: $gutter-spacing-sm;\n } @else {\n padding-right: $gutter-spacing-sm;\n padding-left: $nav-list-item-height-sm;\n }\n\n @include mq(md) {\n min-height: $nav-list-item-height;\n line-height: #{$nav-list-item-height - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height;\n padding-left: $gutter-spacing;\n } @else {\n padding-right: $gutter-spacing;\n padding-left: $nav-list-item-height;\n }\n }\n\n &.external > svg {\n width: $sp-4;\n height: $sp-4;\n vertical-align: text-bottom;\n }\n\n &.active {\n font-weight: 600;\n text-decoration: none;\n }\n\n &:hover,\n &.active {\n color: darken($link-color, 5%);\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n }\n }\n\n .nav-list-expander {\n position: absolute;\n @if $nav-list-expander-right {\n right: 0;\n }\n\n width: $nav-list-item-height-sm;\n height: $nav-list-item-height-sm;\n padding: #{$nav-list-item-height-sm * 0.25};\n color: $link-color;\n\n @include mq(md) {\n width: $nav-list-item-height;\n height: $nav-list-item-height;\n padding: #{$nav-list-item-height * 0.25};\n }\n\n &:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n }\n\n @if $nav-list-expander-right {\n svg {\n transform: rotate(90deg);\n }\n }\n }\n\n > .nav-list {\n display: none;\n padding-left: $sp-3;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n\n .nav-list-link {\n color: $nav-child-link-color;\n }\n\n .nav-list-expander {\n color: $nav-child-link-color;\n }\n }\n }\n\n &.active {\n > .nav-list-expander svg {\n @if $nav-list-expander-right {\n transform: rotate(-90deg);\n } @else {\n transform: rotate(90deg);\n }\n }\n\n > .nav-list {\n display: block;\n }\n }\n }\n}\n\n.nav-category {\n padding: $sp-2 $gutter-spacing-sm;\n font-weight: 600;\n text-align: start;\n text-transform: uppercase;\n border-bottom: $border $border-color;\n @include fs-2;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing;\n margin-top: $gutter-spacing-sm;\n text-align: start;\n\n &:first-child {\n margin-top: 0;\n }\n }\n}\n\n.nav-list.nav-category-list {\n > .nav-list-item {\n margin: 0;\n\n > .nav-list {\n padding: 0;\n\n > .nav-list-item {\n > .nav-list-link {\n color: $link-color;\n }\n\n > .nav-list-expander {\n color: $link-color;\n }\n }\n }\n }\n}\n\n// Aux nav\n\n.aux-nav {\n height: 100%;\n overflow-x: auto;\n @include fs-2;\n\n .aux-nav-list {\n display: flex;\n height: 100%;\n padding: 0;\n margin: 0;\n list-style: none;\n }\n\n .aux-nav-list-item {\n display: inline-block;\n height: 100%;\n padding: 0;\n margin: 0;\n }\n\n @include mq(md) {\n padding-right: $gutter-spacing-sm;\n }\n}\n\n// Breadcrumb nav\n\n.breadcrumb-nav {\n @include mq(md) {\n margin-top: -$sp-4;\n }\n}\n\n.breadcrumb-nav-list {\n padding-left: 0;\n margin-bottom: $sp-3;\n list-style: none;\n}\n\n.breadcrumb-nav-list-item {\n display: table-cell;\n @include fs-2;\n\n &::before {\n display: none;\n }\n\n &::after {\n display: inline-block;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $grey-dk-000;\n content: \"/\";\n }\n\n &:last-child {\n &::after {\n content: \"\";\n }\n }\n}\n","// Typography\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\nh1,\n.text-alpha {\n font-weight: 300;\n\n @include fs-8;\n}\n\nh2,\n.text-beta,\n#toctitle {\n @include fs-6;\n}\n\nh3,\n.text-gamma {\n @include fs-5;\n}\n\nh4,\n.text-delta {\n font-weight: 400;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n\n @include fs-2;\n}\n\nh4 code {\n text-transform: none;\n}\n\nh5,\n.text-epsilon {\n @include fs-3;\n}\n\nh6,\n.text-zeta {\n @include fs-2;\n}\n\n.text-small {\n @include fs-2;\n}\n\n.text-mono {\n font-family: $mono-font-family !important;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n","// Labels (not the form kind)\n\n// this :not() prevents a style clash with Mermaid.js's\n// diagram labels, which also use .label\n// for more, see https://github.com/just-the-docs/just-the-docs/issues/1272\n// and the accompanying PR\n.label:not(g),\n.label-blue:not(g) {\n display: inline-block;\n padding: 0.16em 0.56em;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $white;\n text-transform: uppercase;\n vertical-align: middle;\n background-color: $blue-100;\n border-radius: 12px;\n\n @include fs-2;\n}\n\n.label-green:not(g) {\n background-color: $green-300;\n}\n\n.label-purple:not(g) {\n background-color: $purple-100;\n}\n\n.label-red:not(g) {\n background-color: $red-300;\n}\n\n.label-yellow:not(g) {\n color: $grey-dk-200;\n background-color: $yellow-200;\n}\n","// Buttons and things that look like buttons\n// stylelint-disable color-named\n\n.btn {\n display: inline-block;\n box-sizing: border-box;\n padding: 0.3em 1em;\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n font-weight: 500;\n line-height: 1.5;\n color: $link-color;\n text-decoration: none;\n vertical-align: baseline;\n cursor: pointer;\n background-color: $base-button-color;\n border-width: 0;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n appearance: none;\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: darken($link-color, 2%);\n }\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n text-decoration: none;\n background-color: darken($base-button-color, 1%);\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($base-button-color, 3%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken(#dcdcdc, 5%);\n }\n\n &:disabled,\n &.disabled {\n &,\n &:hover {\n color: rgba(102, 102, 102, 0.5);\n cursor: default;\n background-color: rgba(229, 229, 229, 0.5);\n background-image: none;\n box-shadow: none;\n }\n }\n}\n\n.btn-outline {\n color: $link-color;\n background: transparent;\n box-shadow: inset 0 0 0 2px $grey-lt-300;\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n color: darken($link-color, 4%);\n text-decoration: none;\n background-color: transparent;\n box-shadow: inset 0 0 0 3px $grey-lt-300;\n }\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow:\n inset 0 0 0 2px $grey-dk-100,\n 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: inset 0 0 0 2px $grey-dk-100;\n }\n}\n\n.btn-primary {\n @include btn-color($white, $btn-primary-color);\n}\n\n.btn-purple {\n @include btn-color($white, $purple-100);\n}\n\n.btn-blue {\n @include btn-color($white, $blue-200);\n}\n\n.btn-green {\n @include btn-color($white, $green-300);\n}\n\n.btn-reset {\n background: none;\n border: none;\n margin: 0;\n text-align: inherit;\n font: inherit;\n border-radius: 0;\n appearance: none;\n}\n","$color-scheme: light !default;\n$body-background-color: $white !default;\n$body-heading-color: $grey-dk-300 !default;\n$body-text-color: $grey-dk-100 !default;\n$link-color: $purple-000 !default;\n$nav-child-link-color: $grey-dk-100 !default;\n$sidebar-color: $grey-lt-000 !default;\n$base-button-color: #f7f7f7 !default;\n$btn-primary-color: $purple-100 !default;\n$code-background-color: $white !default;\n$feedback-color: darken($sidebar-color, 3%) !default;\n$table-background-color: $white !default;\n$search-background-color: $white !default;\n$search-result-preview-color: $grey-dk-100 !default;\n\n@import \"./vendor/accessible-pygments/github-light\";\n","// Colored button\n\n@mixin btn-color($fg, $bg) {\n color: $fg;\n background-color: darken($bg, 2%);\n background-image: linear-gradient(lighten($bg, 5%), darken($bg, 2%));\n box-shadow:\n 0 1px 3px rgba(0, 0, 0, 0.25),\n 0 4px 10px rgba(0, 0, 0, 0.12);\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: $fg;\n background-color: darken($bg, 4%);\n background-image: linear-gradient((lighten($bg, 2%), darken($bg, 4%)));\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($bg, 5%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken($bg, 10%);\n }\n}\n","// Search input and autocomplete\n\n.search {\n position: relative;\n z-index: 2;\n flex-grow: 1;\n height: $sp-10;\n padding: $sp-2;\n transition: padding linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: relative !important;\n width: auto !important;\n height: 100% !important;\n padding: 0;\n transition: none;\n }\n}\n\n.search-input-wrap {\n position: relative;\n z-index: 1;\n height: $sp-8;\n overflow: hidden;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n transition: height linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: absolute;\n width: 100%;\n max-width: $search-results-width;\n height: 100% !important;\n border-radius: 0;\n box-shadow: none;\n transition: width ease $transition-duration;\n }\n}\n\n.search-input {\n position: absolute;\n width: 100%;\n height: 100%;\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing-sm + $sp-5};\n font-size: 1rem;\n color: $body-text-color;\n background-color: $search-background-color;\n border-top: 0;\n border-right: 0;\n border-bottom: 0;\n border-left: 0;\n border-radius: 0;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing + $sp-5};\n font-size: 0.875rem;\n background-color: $body-background-color;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n &:focus {\n outline: 2px solid $link-color;\n outline-offset: -2px;\n\n + .search-label .search-icon {\n color: $link-color;\n }\n }\n}\n\n.search-label {\n position: absolute;\n display: flex;\n height: 100%;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-left: $gutter-spacing;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n .search-icon {\n width: #{$sp-4 * 1.2};\n height: #{$sp-4 * 1.2};\n align-self: center;\n color: $grey-dk-000;\n }\n}\n\n.search-results {\n position: absolute;\n left: 0;\n display: none;\n width: 100%;\n max-height: calc(100% - #{$sp-10});\n overflow-y: auto;\n background-color: $search-background-color;\n border-bottom-right-radius: $border-radius;\n border-bottom-left-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n\n @include mq(md) {\n top: 100%;\n width: $search-results-width;\n max-height: calc(100vh - 200%) !important;\n }\n}\n\n.search-results-list {\n padding-left: 0;\n margin-bottom: $sp-1;\n list-style: none;\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n}\n\n.search-results-list-item {\n padding: 0;\n margin: 0;\n}\n\n.search-result {\n display: block;\n padding: $sp-1 $sp-3;\n\n &:hover,\n &.active {\n background-color: $feedback-color;\n }\n}\n\n.search-result-title {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 40%;\n padding-right: $sp-2;\n vertical-align: top;\n }\n}\n\n.search-result-doc {\n display: flex;\n align-items: center;\n word-wrap: break-word;\n\n &.search-result-doc-parent {\n opacity: 0.5;\n @include fs-3;\n\n @include mq(md) {\n @include fs-2;\n }\n }\n\n .search-result-icon {\n width: $sp-4;\n height: $sp-4;\n margin-right: $sp-2;\n color: $link-color;\n flex-shrink: 0;\n }\n\n .search-result-doc-title {\n overflow: auto;\n }\n}\n\n.search-result-section {\n margin-left: #{$sp-4 + $sp-2};\n word-wrap: break-word;\n}\n\n.search-result-rel-url {\n display: block;\n margin-left: #{$sp-4 + $sp-2};\n overflow: hidden;\n color: $search-result-preview-color;\n text-overflow: ellipsis;\n white-space: nowrap;\n @include fs-1;\n}\n\n.search-result-previews {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n padding-left: $sp-4;\n margin-left: $sp-2;\n color: $search-result-preview-color;\n word-wrap: break-word;\n border-left: $border;\n border-left-color: $border-color;\n @include fs-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 60%;\n padding-left: $sp-2;\n margin-left: 0;\n vertical-align: top;\n }\n}\n\n.search-result-preview + .search-result-preview {\n margin-top: $sp-1;\n}\n\n.search-result-highlight {\n font-weight: bold;\n}\n\n.search-no-result {\n padding: $sp-2 $sp-3;\n @include fs-3;\n}\n\n.search-button {\n position: fixed;\n right: $sp-4;\n bottom: $sp-4;\n display: flex;\n width: $sp-9;\n height: $sp-9;\n background-color: $search-background-color;\n border: 1px solid rgba($link-color, 0.3);\n border-radius: #{$sp-9 * 0.5};\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n align-items: center;\n justify-content: center;\n}\n\n.search-overlay {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1;\n width: 0;\n height: 0;\n background-color: rgba(0, 0, 0, 0.3);\n opacity: 0;\n transition:\n opacity ease $transition-duration,\n width 0s $transition-duration,\n height 0s $transition-duration;\n}\n\n.search-active {\n .search {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .search-input-wrap {\n height: $sp-10;\n border-radius: 0;\n\n @include mq(md) {\n width: $search-results-width;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n }\n }\n\n .search-input {\n background-color: $search-background-color;\n\n @include mq(md) {\n padding-left: 2.3rem;\n }\n }\n\n .search-label {\n @include mq(md) {\n padding-left: 0.6rem;\n }\n }\n\n .search-results {\n display: block;\n }\n\n .search-overlay {\n width: 100%;\n height: 100%;\n opacity: 1;\n transition:\n opacity ease $transition-duration,\n width 0s,\n height 0s;\n }\n\n @include mq(md) {\n .main {\n position: fixed;\n right: 0;\n left: 0;\n }\n }\n\n .main-header {\n padding-top: $sp-10;\n\n @include mq(md) {\n padding-top: 0;\n }\n }\n}\n","// Tables\n// stylelint-disable max-nesting-depth, selector-no-type, selector-max-type\n\n.table-wrapper {\n display: block;\n width: 100%;\n max-width: 100%;\n margin-bottom: $sp-5;\n overflow-x: auto;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n}\n\ntable {\n display: table;\n min-width: 100%;\n border-collapse: separate;\n}\n\nth,\ntd {\n min-width: 7.5rem;\n padding: $sp-2 $sp-3;\n background-color: $table-background-color;\n border-bottom: $border rgba($border-color, 0.5);\n border-left: $border $border-color;\n\n @include fs-3;\n\n &:first-of-type {\n border-left: 0;\n }\n}\n\ntbody {\n tr {\n &:last-of-type {\n th,\n td {\n border-bottom: 0;\n }\n\n td {\n padding-bottom: $sp-3;\n }\n }\n }\n}\n\nthead {\n th {\n border-bottom: $border $border-color;\n }\n}\n","// Code and syntax highlighting\n// stylelint-disable selector-no-qualifying-type, declaration-block-semicolon-newline-after,declaration-block-single-line-max-declarations, selector-no-type, selector-max-type, scss/comment-no-empty\n\n// {% raw %}\n\n// This instruction applies to all queues not within 'pre' or 'figure', avoiding 'code' generated by the highlight.\n:not(pre, figure) {\n & > code {\n padding: 0.2em 0.15em;\n font-weight: 400;\n background-color: $code-background-color;\n border: $border $border-color;\n border-radius: $border-radius;\n }\n}\n\n// Avoid appearance of dark border around visited code links in Safari\na:visited code {\n border-color: $border-color;\n}\n\n// Content structure for highlighted code blocks using fences or Liquid\n//\n// ```[LANG]...```, no kramdown line_numbers:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n//\n// ```[LANG]...```, kramdown line_numbers = true:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.rouge-gutter.gl > pre.lineno\n// | td.rouge-code > pre\n//\n// {% highlight LANG %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n//\n// {% highlight LANG linenos %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.gutter.gl > pre.lineno\n// | td.code > pre\n//\n// ----...---- (AsciiDoc)\n// div.listingblock > div.content > pre.rouge.highlight\n//\n// fix_linenos removes the outermost pre when it encloses table.rouge-table\n//\n// See docs/index-test.md for some tests.\n//\n// No kramdown line_numbers: fences and Liquid highlighting look the same.\n// Kramdown line_numbers = true: fences have a wider gutter than with Liquid?\n\n// ```[LANG]...```\n// or in AsciiDoc:\n//\n// ----\n// ...\n// ----\n\n// the code may appear with 3 different types:\n// container \\ case: default case, code with line number, code with html rendering\n// top level: div.highlighter-rouge, figure.highlight, figure.highlight\n// second level: div.highlight, div.table-wrapper, pre.highlight\n// third level: pre.highlight, td.code, absent\n// last level: code, pre, code (optionality)\n// highlighter level: span, span, span\n// the spacing are only in the second level for case 1, 3 and in the third level for case 2\n// in AsciiDoc, there is a parent container that contains optionally a title and the content.\n\n// select top level container\ndiv.highlighter-rouge,\ndiv.listingblock > div.content,\nfigure.highlight {\n margin-top: 0;\n margin-bottom: $sp-3;\n background-color: $code-background-color;\n border-radius: $border-radius;\n box-shadow: none;\n -webkit-overflow-scrolling: touch;\n position: relative;\n padding: 0;\n\n // copy button (or other button)\n // the button appear only when there is a hover on the code or focus on button\n > button {\n width: $sp-3;\n opacity: 0;\n position: absolute;\n top: 0;\n right: 0;\n padding: $sp-3;\n border: none;\n background: none;\n color: $body-text-color;\n box-sizing: content-box;\n\n svg {\n fill: $body-text-color;\n }\n\n &:active {\n text-decoration: none;\n outline: none;\n opacity: 1;\n }\n\n &:focus {\n opacity: 1;\n outline: 2px solid $link-color;\n }\n }\n\n // the button can be seen by doing a simple hover in the code, there is no need to go over the location of the button\n &:hover {\n > button {\n cursor: copy;\n opacity: 1;\n }\n }\n}\n\n// setting the spacing and scrollbar on the second level for the first case\n// remove all space on the second and third level\n// this is a mixin to accommodate for the slightly different structures generated via Markdown vs AsciiDoc\n@mixin scroll-and-spacing($code-div, $pre-select) {\n #{$code-div} {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n\n #{$pre-select},\n code {\n padding: 0;\n margin: 0;\n border: 0;\n }\n}\n\n// for Markdown\ndiv.highlighter-rouge {\n @include scroll-and-spacing(\"div.highlight\", \"pre.highlight\");\n}\n\n// for AsciiDoc. we also need to fix the margins for its parent container.\ndiv.listingblock {\n margin-top: 0;\n margin-bottom: $sp-3;\n\n @include scroll-and-spacing(\"div.content\", \"div.content > pre\");\n}\n\n// {% highlight LANG %}...{% endhighlight %},\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the second level for the thirt case\n// the css rule are apply only to the last code enviroment\n// setting the scroolbar\nfigure.highlight {\n pre,\n :not(pre) > code {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n}\n\n// ```[LANG]...```, kramdown line_numbers = true,\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the thirt level for the second case\n.highlight .table-wrapper {\n padding: $sp-3 0;\n margin: 0;\n border: 0;\n box-shadow: none;\n\n td,\n pre {\n min-width: 0;\n padding: 0;\n background-color: $code-background-color;\n border: 0;\n\n @include fs-2;\n }\n\n td.gl {\n width: 1em;\n padding-right: $sp-3;\n padding-left: $sp-3;\n }\n\n pre {\n margin: 0;\n line-height: 2;\n }\n}\n\n// Code examples: html render of a code\n.code-example,\n.listingblock > .title {\n padding: $sp-3;\n margin-bottom: $sp-3;\n overflow: auto;\n border: 1px solid $border-color;\n border-radius: $border-radius;\n\n + .highlighter-rouge,\n + .sectionbody .listingblock,\n + .content,\n + figure.highlight {\n position: relative;\n margin-top: -$sp-4;\n border-right: 1px solid $border-color;\n border-bottom: 1px solid $border-color;\n border-left: 1px solid $border-color;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n}\n\n// Mermaid diagram code blocks should be left unstyled.\ncode.language-mermaid {\n padding: 0;\n background-color: inherit;\n border: 0;\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight,\npre.highlight {\n background: $code-background-color; // Code Background\n // For Backwards Compatibility Before $code-linenumber-color was added\n @if variable-exists(code-linenumber-color) {\n color: $code-linenumber-color; // Code Line Numbers\n } @else {\n color: $body-text-color; // Code Line Numbers\n }\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight pre {\n background: $code-background-color; // Code Background\n}\n\n// {% endraw %}\n","// Utility classes for colors\n\n// Text colors\n\n.text-grey-dk-000 {\n color: $grey-dk-000 !important;\n}\n\n.text-grey-dk-100 {\n color: $grey-dk-100 !important;\n}\n\n.text-grey-dk-200 {\n color: $grey-dk-200 !important;\n}\n\n.text-grey-dk-250 {\n color: $grey-dk-250 !important;\n}\n\n.text-grey-dk-300 {\n color: $grey-dk-300 !important;\n}\n\n.text-grey-lt-000 {\n color: $grey-lt-000 !important;\n}\n\n.text-grey-lt-100 {\n color: $grey-lt-100 !important;\n}\n\n.text-grey-lt-200 {\n color: $grey-lt-200 !important;\n}\n\n.text-grey-lt-300 {\n color: $grey-lt-300 !important;\n}\n\n.text-blue-000 {\n color: $blue-000 !important;\n}\n\n.text-blue-100 {\n color: $blue-100 !important;\n}\n\n.text-blue-200 {\n color: $blue-200 !important;\n}\n\n.text-blue-300 {\n color: $blue-300 !important;\n}\n\n.text-green-000 {\n color: $green-000 !important;\n}\n\n.text-green-100 {\n color: $green-100 !important;\n}\n\n.text-green-200 {\n color: $green-200 !important;\n}\n\n.text-green-300 {\n color: $green-300 !important;\n}\n\n.text-purple-000 {\n color: $purple-000 !important;\n}\n\n.text-purple-100 {\n color: $purple-100 !important;\n}\n\n.text-purple-200 {\n color: $purple-200 !important;\n}\n\n.text-purple-300 {\n color: $purple-300 !important;\n}\n\n.text-yellow-000 {\n color: $yellow-000 !important;\n}\n\n.text-yellow-100 {\n color: $yellow-100 !important;\n}\n\n.text-yellow-200 {\n color: $yellow-200 !important;\n}\n\n.text-yellow-300 {\n color: $yellow-300 !important;\n}\n\n.text-red-000 {\n color: $red-000 !important;\n}\n\n.text-red-100 {\n color: $red-100 !important;\n}\n\n.text-red-200 {\n color: $red-200 !important;\n}\n\n.text-red-300 {\n color: $red-300 !important;\n}\n\n// Background colors\n\n.bg-grey-dk-000 {\n background-color: $grey-dk-000 !important;\n}\n\n.bg-grey-dk-100 {\n background-color: $grey-dk-100 !important;\n}\n\n.bg-grey-dk-200 {\n background-color: $grey-dk-200 !important;\n}\n\n.bg-grey-dk-250 {\n background-color: $grey-dk-250 !important;\n}\n\n.bg-grey-dk-300 {\n background-color: $grey-dk-300 !important;\n}\n\n.bg-grey-lt-000 {\n background-color: $grey-lt-000 !important;\n}\n\n.bg-grey-lt-100 {\n background-color: $grey-lt-100 !important;\n}\n\n.bg-grey-lt-200 {\n background-color: $grey-lt-200 !important;\n}\n\n.bg-grey-lt-300 {\n background-color: $grey-lt-300 !important;\n}\n\n.bg-blue-000 {\n background-color: $blue-000 !important;\n}\n\n.bg-blue-100 {\n background-color: $blue-100 !important;\n}\n\n.bg-blue-200 {\n background-color: $blue-200 !important;\n}\n\n.bg-blue-300 {\n background-color: $blue-300 !important;\n}\n\n.bg-green-000 {\n background-color: $green-000 !important;\n}\n\n.bg-green-100 {\n background-color: $green-100 !important;\n}\n\n.bg-green-200 {\n background-color: $green-200 !important;\n}\n\n.bg-green-300 {\n background-color: $green-300 !important;\n}\n\n.bg-purple-000 {\n background-color: $purple-000 !important;\n}\n\n.bg-purple-100 {\n background-color: $purple-100 !important;\n}\n\n.bg-purple-200 {\n background-color: $purple-200 !important;\n}\n\n.bg-purple-300 {\n background-color: $purple-300 !important;\n}\n\n.bg-yellow-000 {\n background-color: $yellow-000 !important;\n}\n\n.bg-yellow-100 {\n background-color: $yellow-100 !important;\n}\n\n.bg-yellow-200 {\n background-color: $yellow-200 !important;\n}\n\n.bg-yellow-300 {\n background-color: $yellow-300 !important;\n}\n\n.bg-red-000 {\n background-color: $red-000 !important;\n}\n\n.bg-red-100 {\n background-color: $red-100 !important;\n}\n\n.bg-red-200 {\n background-color: $red-200 !important;\n}\n\n.bg-red-300 {\n background-color: $red-300 !important;\n}\n","// Utility classes for layout\n\n// Display\n\n.d-block {\n display: block !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n// Screenreader-only\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .d-sm-block, .d-md-none, .d-lg-inline\n .d-#{$media-query}-block {\n display: block !important;\n }\n .d-#{$media-query}-flex {\n display: flex !important;\n }\n .d-#{$media-query}-inline {\n display: inline !important;\n }\n .d-#{$media-query}-inline-block {\n display: inline-block !important;\n }\n .d-#{$media-query}-none {\n display: none !important;\n }\n }\n }\n}\n\n// Horizontal alignment\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.flex-justify-start {\n justify-content: flex-start !important;\n}\n\n.flex-justify-end {\n justify-content: flex-end !important;\n}\n\n.flex-justify-between {\n justify-content: space-between !important;\n}\n\n.flex-justify-around {\n justify-content: space-around !important;\n}\n\n// Vertical alignment\n\n.v-align-baseline {\n vertical-align: baseline !important;\n}\n\n.v-align-bottom {\n vertical-align: bottom !important;\n}\n\n.v-align-middle {\n vertical-align: middle !important;\n}\n\n.v-align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.v-align-text-top {\n vertical-align: text-top !important;\n}\n\n.v-align-top {\n vertical-align: top !important;\n}\n","// Utility classes for typography\n\n.fs-1 {\n @include fs-1;\n}\n\n.fs-2 {\n @include fs-2;\n}\n\n.fs-3 {\n @include fs-3;\n}\n\n.fs-4 {\n @include fs-4;\n}\n\n.fs-5 {\n @include fs-5;\n}\n\n.fs-6 {\n @include fs-6;\n}\n\n.fs-7 {\n @include fs-7;\n}\n\n.fs-8 {\n @include fs-8;\n}\n\n.fs-9 {\n @include fs-9;\n}\n\n.fs-10 {\n @include fs-10;\n}\n\n.fw-300 {\n font-weight: 300 !important;\n}\n\n.fw-400 {\n font-weight: 400 !important;\n}\n\n.fw-500 {\n font-weight: 500 !important;\n}\n\n.fw-700 {\n font-weight: 700 !important;\n}\n\n.lh-0 {\n line-height: 0 !important;\n}\n\n.lh-default {\n line-height: $body-line-height;\n}\n\n.lh-tight {\n line-height: $body-heading-line-height;\n}\n\n.ls-5 {\n letter-spacing: 0.05em !important;\n}\n\n.ls-10 {\n letter-spacing: 0.1em !important;\n}\n\n.ls-0 {\n letter-spacing: 0 !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n","// Utility classes for lists\n\n// stylelint-disable selector-max-type\n\n.list-style-none {\n padding: 0 !important;\n margin: 0 !important;\n list-style: none !important;\n\n li {\n &::before {\n display: none !important;\n }\n }\n}\n","// Utility classes for margins and padding\n\n// stylelint-disable block-opening-brace-space-after, block-opening-brace-space-before\n\n// Margin spacer utilities\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-0, .m-1, .m-2...\n .m-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n .mx-#{$scale}-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-sm-0, .m-md-1, .m-lg-2...\n .m-#{$media-query}-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$media-query}-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$media-query}-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$media-query}-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n }\n }\n}\n\n// Padding spacer utilities\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-0, .p-1, .p-2...\n .p-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @include mq($media-query) {\n @for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-sm-0, .p-md-1, .p-lg-2...\n .p-#{$media-query}-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$media-query}-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$media-query}-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n }\n }\n}\n","// stylelint-disable selector-max-specificity, selector-max-id, selector-max-type, selector-no-qualifying-type\n\n@media print {\n .site-footer,\n .site-button,\n #edit-this-page,\n #back-to-top,\n .site-nav,\n .main-header {\n display: none !important;\n }\n\n hr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n }\n\n .side-bar {\n width: 100%;\n height: auto;\n border-right: 0 !important;\n }\n\n .site-header {\n border-bottom: 1px solid $border-color;\n }\n\n .site-title {\n font-size: 1rem !important;\n font-weight: 700 !important;\n }\n\n .text-small {\n font-size: 8pt !important;\n }\n\n pre.highlight {\n border: 1px solid $border-color;\n }\n\n .main {\n max-width: none;\n margin-left: 0;\n }\n}\n","// Skipnav\n// Skip to main content\n\na.skip-to-main {\n left: -999px;\n position: absolute;\n top: auto;\n width: 1px;\n height: 1px;\n overflow: hidden;\n z-index: -999;\n}\n\na.skip-to-main:focus,\na.skip-to-main:active {\n color: $link-color;\n background-color: $body-background-color;\n left: auto;\n top: auto;\n width: 30%;\n height: auto;\n overflow: auto;\n margin: 10px 35%;\n padding: 5px;\n border-radius: 15px;\n border: 4px solid $btn-primary-color;\n text-align: center;\n font-size: 1.2em;\n z-index: 999;\n}\n","\n@import \"./support/support\";\n@import \"./custom/setup\";\n@import \"./color_schemes/light\";\n\n@import \"./color_schemes/meshtastic\";\n\n@import \"./modules\";\ndiv.opaque {\n background-color: $body-background-color;\n}\n\np.tip, blockquote.tip {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $green-300;\n content: \"Tip\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .tip-title {\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.tip-title, blockquote.tip-title {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.tip {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.tip-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.note, blockquote.note {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $blue-300;\n content: \"Note\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .note-title {\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.note-title, blockquote.note-title {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.note {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.note-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.warning, blockquote.warning {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $yellow-300;\n content: \"Warning\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .warning-title {\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.warning-title, blockquote.warning-title {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.warning {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.warning-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n@import \"./custom/custom\";\n\n\n"],"file":"just-the-docs-meshtastic.css"}
\ No newline at end of file
+{"version":3,"sourceRoot":"","sources":["../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/vendor/accessible-pygments/github-light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/vendor/normalize.scss/normalize.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/base.scss","../../_sass/color_schemes/meshtastic.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/support/mixins/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/support/mixins/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/support/_variables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/content.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/navigation.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/labels.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/color_schemes/light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/support/mixins/_buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/search.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/tables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/code.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/utilities/_colors.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/utilities/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/utilities/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/utilities/_lists.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/utilities/_spacing.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/print.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260906-3993-9e487a/_sass/skiptomain.scss","just-the-docs-meshtastic.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;EAAkB;;;AAClB;EAAgB;EAAiB;AACjC;EAAkB;EAAiB;AACnC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAkB;EAAiB;AACnC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAqB;AACtC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAoB;AACrC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AChFlC;AAEA;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;EAGE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AC1VF;EACE,cCGa;;;ADAf;EACE;;;AAGF;EACE;;AEmBA;EACE;;AClBA;EHHJ;IEyBI;;;;AFnBJ;EACE,aIfiB;EJgBjB;EACA,aIbiB;EJcjB,OCTgB;EDUhB,kBCZsB;EDatB;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAYE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;EACA,aI1CyB;EJ2CzB,OCvCmB;;;AD0CrB;EACE;EACA;;;AAGF;EACE,OC7CW;ED8CX;;;AAGF;EACE;EACA,uBCvCa;EDwCb;;AAEA;EACE;;;AAIJ;EACE,aIvEiB;EJwEjB;EACA,aIvEiB;;;AJ0EnB;AAAA;EAEE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,kBCvEa;EDwEb;;;AAIF;EACE;EAGA;EACA;EACA;EACA;;;AK7GF;EACE;EACA;EACA;EACA,kBJKc;;AEGZ;EEZJ;IAOI;IACA;IACA,ODwFW;ICvFX;IACA;IACA;;;AFAA;EEZJ;IAgBI;IACA,WD+EQ;;;ADpFR;EEQF;IAEI,aD2ES;;;ADrFX;EEQF;IAQI;;;AAOF;EACE;EACA,kBJ5BU;;AEGZ;EEuBA;IAKI;IACA,kBJjCgB;;;AIoClB;EACE;;AFjCJ;EEgCE;IAII;;;;AAOV;EACE;;AF5CE;EE2CJ;IAII;IACA,WDyCY;;;;ACrChB;EACE,aDaK;ECZL,gBDYK;EDvDL,eCuDK;EDtDL,cCsDK;;ADlEH;EEoDJ;IFrCI,eCqDG;IDpDH,cCoDG;;;ADpEH;EEoDJ;IAOI,aDSG;ICRH,gBDQG;;;;ACJP;EACE;EACA;;AFlEE;EEgEJ;IAKI;IACA;IACA,QDmBY;;;;ACfhB;AAAA;AAAA;EAGE;;AF9EE;EE2EJ;AAAA;AAAA;IAMI,ODGQ;;;;ACCZ;EACE;;AAEA;EACE;;AFzFA;EEqFJ;IAQI;IACA,aDxBG;ICyBH,gBD7BG;IC8BH;IACA;;;;AAIJ;EACE;EACA,YDbc;ECcd;;AFxGE;EEqGJ;IAMI,QDjBY;ICkBZ,YDlBY;ICmBZ;;;;AAIJ;EACE;EACA;EACA;EACA;EACA,aDrDK;ECsDL,gBDtDK;ECuDL,OJzHmB;EEYnB,eCuDK;EDtDL,cCsDK;;ADlEH;EEiHJ;IFlGI,eCqDG;IDpDH,cCoDG;;;AF/BL;EACE;;ACtCA;EEiHJ;IHvEI;IACA,aEhDuB;;;ADKvB;EEiHJ;IAcI,aD/DG;ICgEH,gBDhEG;;;;AC+EP;EACE;EACA;EACA,SDhFK;ECiFL;;;AFnJE;EEuJF;IACE;;;AAIJ;EACE;;;AAQF;EACE;;;AAOF;EACE;EACA;EACA;EACA,aD/GK;ECgHL,gBDhHK;EDvDL,eCuDK;EDtDL,cCsDK;;ADlEH;EE6KJ;IF9JI,eCqDG;IDpDH,cCoDG;;;AFvEL;EACE;;ACEA;EE6KJ;IH3KI;;;ACFA;EE6KJ;IAYI;IACA;;;;AAIJ;EACE,OD5HK;EC6HL,QD7HK;EC8HL,OJ/LW;;;AKXb;EACE,aFEoB;;AEApB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAIA;EACE,YF+CC;;AE3CL;EACE;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA,OFfM;EEgBN;EACA;;AJ1BN;EACE;;ACRA;EG2BE;IJfF;;;ACZA;EG2BE;IAUI;;;AAIJ;EACE;;AAGE;EACE;EACA;;AAOV;EACE;;AAGE;EACE;EACA;EACA,OF7CM;EE8CN;;AAMJ;EACE;;AAIJ;EACE;EACA;;AAKF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAGF;EACE;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;;AAmBE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AASF;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;;AAKN;EACE;EACA;EACA,OFnFG;EEoFH;EACA,eFzFG;EE0FH,cF1FG;EE2FH;;AH1JA;EGmJF;IAUI;IACA;;;AAGF;EACE;EACA;EACA;EACA,OLnKO;EKoKP;;AAYF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAKE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAWE,YF9JG;;;AG3EP;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;ALoBF;EACE;;AClBA;EILF;IL2BE;;;ACtBA;EDOF;IACE;;;ACRA;EILF;ILiBE;;;AKPA;EACE;EACA,YH+DC;EG9DD,aHuDC;EGtDD,gBHsDC;EGrDD;EAEE,eH0DD;EGzDC,cHqDD;;ADlEH;EIKA;IAeI,YHgDD;IG/CC;IAEE,eH6CH;IG5CG,cH4CH;;;AGrCD;EACE,OHkCD;EGjCC,QHiCD;EGhCC;;AAGF;EACE;EACA;;AAGF;EAEE;EACA;;AASJ;EACE;EAEE;EAGF,OHUC;EGTD,QHSC;EGRD;EACA,ON7DO;;AEFT;EIsDA;IAYI,OHED;IGDC,QHCD;IGAC;;;AAGF;EACE;;AAQA;EACE;;AAKN;EACE;EACA,cHvBC;EGwBD;;AAEA;EACE;;AAEA;EACE,ONzFa;;AM4Ff;EACE,ON7Fa;;AMmGjB;EAEI;;AAMJ;EACE;;;AAMR;EACE;EACA;EACA;EACA;EACA;;ALhIA;EACE;;ACEA;EIwHJ;ILtHI;;;ACFA;EIwHJ;IASI;IACA,YHhEG;IGiEH;;EAEA;IACE;;;;AAMJ;EACE;;AAEA;EACE;;AAGE;EACE,ONlJG;;AMqJL;EACE,ONtJG;;;AM+Jb;EACE;EACA;;ALtKA;EACE;;ACEA;EIiKJ;IL/JI;;;AKoKF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AJlLA;EIiKJ;IAqBI,eHpHG;;;;ADlEH;EI4LJ;IAEI;;;;AAIJ;EACE;EACA,eHnIK;EGoIL;;;AAGF;EACE;;AL5MA;EACE;;ACEA;EIwMJ;ILtMI;;;AK0MF;EACE;;AAGF;EACE;EACA,cHlJG;EGmJH,aHnJG;EGoJH,OHpMU;EGqMV;;AAIA;EACE;;;ACrON;AAAA;EAEE;;ANoEA;AAAA;EACE;EACA,aElEuB;;ADKvB;EKXJ;AAAA;IN4EI;;;;AA5BF;AAAA;AAAA;EACE;;ACtCA;EKJJ;AAAA;AAAA;IN8CI;IACA,aEhDuB;;;;AFgCzB;AAAA;EACE;;AC5BA;EKEJ;AAAA;IN8BI;;;;AMzBJ;AAAA;EAEE;EACA;EACA;;ANdA;AAAA;EACE;;ACEA;EKOJ;AAAA;INLI;;;;AMcJ;EACE;;;ANVA;AAAA;EACE;;ACRA;EKoBJ;AAAA;INRI;;;;AAfF;AAAA;EACE;;ACEA;EKyBJ;AAAA;INvBI;;;;AALF;EACE;;ACEA;EK8BJ;IN5BI;;;;AMgCJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvDF;AAAA;EAEE;EACA;EACA,cLoEK;EKnEL,aLmEK;EKlEL,OLiBM;EKhBN;EACA;EACA,kBL6BS;EK5BT;;APLA;AAAA;EACE;;ACEA;EMRJ;AAAA;IPUI;;;;AOKJ;EACE,kBL4BU;;;AKzBZ;EACE,kBLcW;;;AKXb;EACE,kBL4BQ;;;AKzBV;EACE,OLFY;EKGZ,kBLkBW;;;AMlDb;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OTIW;ESHX;EACA;EACA;EACA,kBCTkB;EDUlB;EACA,eNyEc;EMxEd,YACE;EAEF;;AAEA;EACE;EACA;EACA;;AAGF;EAEE;;AAGF;EAEE;;AAGF;EAIE;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;AAKA;EAEE;EACA;EACA;EACA;EACA;;;AAKN;EACE,OT1DW;ES2DX;EACA;;AAEA;EAIE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA,YACE;;AAIJ;EAEE;;;AAIJ;EEnGE,OR0BM;EQzBN;EACA;EACA,YACE;;AAGF;EAEE,ORiBI;EQhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AFgFJ;EEvGE,OR0BM;EQzBN;EACA;EACA,YACE;;AAGF;EAEE,ORiBI;EQhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AFoFJ;EE3GE,OR0BM;EQzBN;EACA;EACA,YACE;;AAGF;EAEE,ORiBI;EQhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AFwFJ;EE/GE,OR0BM;EQzBN;EACA;EACA,YACE;;AAGF;EAEE,ORiBI;EQhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AF4FJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AG3HF;EACE;EACA;EACA;EACA,QTgFM;ES/EN,STuEK;EStEL;;AVME;EUZJ;IASI;IACA;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA,QT8DK;ES7DL;EACA,eTmEc;ESlEd,YACE;EAEF;;AVdE;EUKJ;IAYI;IACA;IACA,WTwEmB;ISvEnB;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA,OZnCgB;EYoChB,kBZVwB;EYWxB;EACA;EACA;EACA;EACA;;AVvCE;EU2BJ;IAeI;IACA;IACA,kBZhDoB;IYiDpB;;;AAGF;EACE;EACA;;AAEA;EACE,OZnDO;;;AYwDb;EACE;EACA;EACA;EACA,cTIK;;ADlEH;EU0DJ;IAOI,cTGG;ISFH;;;AAGF;EACE;EACA;EACA;EACA,OTzDU;;;AS6Dd;EACE;EACA;EACA;EACA;EACA;EACA;EACA,kBZ5DwB;EY6DxB,4BTRc;ESSd,2BTTc;ESUd,YACE;;AVxFA;EU6EJ;IAeI;IACA,OTFmB;ISGnB;;;;AAIJ;EACE;EACA,eTrCK;ESsCL;;AXpFA;EACE;;AClBA;EUkGJ;IX5EI;;;ACtBA;EDOF;IACE;;;ACRA;EUkGJ;IXtFI;;;;AWiGJ;EACE;EACA;;;AAGF;EACE;EACA;;AAEA;EAEE,kBZnGa;;;AYuGjB;EACE;EACA,aT9DK;ES+DL,gBT/DK;;ADhEH;EU4HJ;IAMI;IACA;IACA,eTpEG;ISqEH;;;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;;AXxIF;EACE;;ACRA;EU8IF;IXlIE;;;ACZA;EDHF;IACE;;;ACEA;EU8IF;IX5IE;;;AWqJF;EACE,OTtFG;ESuFH,QTvFG;ESwFH,cT1FG;ES2FH,OZzJS;EY0JT;;AAGF;EACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,OZtK4B;EYuK5B;EACA;;AX5LA;EACE;;ACYA;EUyKJ;IXjLI;;;;AW2LJ;EACE;EACA,aTrHK;ESsHL,gBTtHK;ESuHL,cTrHK;ESsHL,aTxHK;ESyHL,OZlL4B;EYmL5B;EACA,aT/GO;ESgHP,mBZ9Ka;;ACjBb;EACE;;ACEA;EUmLJ;IXjLI;;;ACFA;EUmLJ;IAaI;IACA;IACA,cTlIG;ISmIH;IACA;;;;AAIJ;EACE,YT1IK;;;AS6IP;EACE;;;AAGF;EACE;;AX1MA;EACE;;ACRA;EUgNJ;IXpMI;;;;AWyMJ;EACE;EACA,OTrJK;ESsJL,QTtJK;ESuJL;EACA,OTnJK;ESoJL,QTpJK;ESqJL,kBZpMwB;EYqMxB;EACA;EACA,YACE;EAEF;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YACE;;;AAMF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE,QTxLI;ESyLJ;;AVjQA;EU+PF;IAKI,OTzKiB;IS0KjB,YACE;;;AAKN;EACE,kBZpPsB;;AExBtB;EU2QF;IAII;;;AV/QF;EUmRF;IAEI;;;AAIJ;EACE;;AAGF;EACE;EACA;EACA;EACA,YACE;;AVlSF;EUwSA;IACE;IACA;IACA;;;AAIJ;EACE,aTxOI;;ADxEJ;EU+SF;IAII;;;;AC9TN;EACE;EACA;EACA;EACA,eV0EK;EUzEL;EACA,eVkFc;EUjFd,YACE;;;AAIJ;EACE;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA,kBbIuB;EaHvB;EACA;;AZNA;AAAA;EACE;;ACRA;EWOJ;AAAA;IZKI;;;AYKF;AAAA;EACE;;;AAOE;AAAA;EAEE;;AAGF;EACE,gBVkCD;;;AU3BL;EACE;;;AC9CF;EACE;EACA;EACA,kBdcoB;EcbpB;EACA,eX+EY;;;AW1EhB;EACE,cdUa;;;AcyCf;AAAA;AAAA;EAGE;EACA,eXMK;EWLL,kBdlDsB;EcmDtB,eXgBc;EWfd;EACA;EACA;EACA;;AAIA;AAAA;AAAA;EACE,OXLG;EWMH;EACA;EACA;EACA;EACA,SXVG;EWWH;EACA;EACA,OdhFc;EciFd;;AAEA;AAAA;AAAA;EACE,MdpFY;;AcuFd;AAAA;AAAA;EACE;EACA;EACA;;AAGF;AAAA;AAAA;EACE;EACA;;AAMF;AAAA;AAAA;EACE;EACA;;;AASJ;EACE;EACA,SX/CG;EWgDH;EACA;EACA,eXtCY;;AWyCd;AAAA;EAEE;EACA;EACA;;;AAUJ;EACE;EACA,eXrEK;;AW6CL;EACE;EACA,SX/CG;EWgDH;EACA;EACA,eXtCY;;AWyCd;AAAA;EAEE;EACA;EACA;;;AAwBF;AAAA;EAEE;EACA,SXpFG;EWqFH;EACA;EACA,eX3EY;;;AWmFhB;EACE;EACA;EACA;EACA;;AAEA;AAAA;EAEE;EACA;EACA,kBdhKoB;EciKpB;;Ab9KF;AAAA;EACE;;ACEA;EYsKF;AAAA;IbpKE;;;Aa8KF;EACE;EACA,eXjHG;EWkHH,cXlHG;;AWqHL;EACE;EACA;;;AAKJ;AAAA;EAEE,SX9HK;EW+HL,eX/HK;EWgIL;EACA;EACA,eXtHc;;AWwHd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAIE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKJ;EACE;EACA;EACA;;;AAIF;AAAA;EAEE,YdnNsB;EcsNpB,OdrNoB;;;Ac4NxB;EACE,Yd9NsB;;;AepBxB;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvOF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AdrBE;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAQR;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AfhHA;EACE;;ACYA;EeZJ;IhBII;;;;AAKF;EACE;;ACEA;EeRJ;IhBUI;;;;AAKF;EACE;;ACRA;EeJJ;IhBgBI;;;;AAKF;EACE;;AClBA;EeAJ;IhBsBI;;;;AAKF;EACE;;AC5BA;EeIJ;IhB4BI;;;;AAKF;EACE;;ACtCA;EeQJ;IhBkCI;IACA,aEhDuB;;;;AFqDzB;EACE;EACA,aEvDuB;;ADKvB;EeYJ;IhB0CI;;;;AAKF;EACE;EACA,aElEuB;;ADKvB;EegBJ;IhBiDI;;;;AAKF;EACE;EACA,aE7EuB;;ADKvB;EeoBJ;IhBwDI;;;;AAKF;EACE;EACA,aExFuB;;ADKvB;EewBJ;IhB+DI;;;;AgB3DJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,adxDiB;;;Ac2DnB;EACE,ad1DyB;;;Ac6D3B;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC/EF;EACE;EACA;EACA;;AAGE;EACE;;;ACLN;EACE;EACA;;;AAQA;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AjBlCA;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAaN;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AjB7GA;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AC3JR;EACE;AAAA;AAAA;AAAA;AAAA;AAAA;IAME;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;;;ACvCJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE,OrBCW;EqBAX,kBrBNsB;EqBOtB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACpBF;EACE,kBtBCsB;;;AsBExB;EACI;EACA;EACA,enB4EY;EmB3EZ;EACA;;AAEA;EACI,OnB8BI;EmB7BJ;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OnBoBM;EmBnBN;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,enBiDY;EmBhDZ;EACA;;AACA;EACE;EACA;EACA,OnBEM;EmBDN;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,enBGY;EmBFZ;EACA;;AAEA;EACI,OnB/CG;EmBgDH;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OnBzDK;EmB0DL;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,enBxBY;EmByBZ;EACA;;AACA;EACE;EACA;EACA,OnB3EK;EmB4EL;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,enBtEY;EmBuEZ;EACA;;AAEA;EACI,OnBhHK;EmBiHL;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OnB1HO;EmB2HP;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,enBjGY;EmBkGZ;EACA;;AACA;EACE;EACA;EACA,OnB5IO;EmB6IP;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE","sourcesContent":["/*\ngenerated by accessible-pygments \nCopyright (c) 2022, Quansight Labs\nLicensed under the BSD license, see LICENSE for details.\n--\ngenerated by Pygments \nCopyright 2006-2025 by the Pygments team.\nLicensed under the BSD license, see LICENSE for details.\n*/\n\n.highlight .hll { background-color: #0969da4a }\n.highlight .c { color: #6E7781 } /* Comment */\n.highlight .err { color: #CF222E } /* Error */\n.highlight .k { color: #CF222E } /* Keyword */\n.highlight .l { color: #953800 } /* Literal */\n.highlight .n { color: #8250DF } /* Name */\n.highlight .o { color: #116329 } /* Operator */\n.highlight .p { color: #24292F } /* Punctuation */\n.highlight .ch { color: #6E7781 } /* Comment.Hashbang */\n.highlight .cm { color: #6E7781 } /* Comment.Multiline */\n.highlight .cp { color: #6E7781 } /* Comment.Preproc */\n.highlight .cpf { color: #6E7781 } /* Comment.PreprocFile */\n.highlight .c1 { color: #6E7781 } /* Comment.Single */\n.highlight .cs { color: #6E7781 } /* Comment.Special */\n.highlight .gd { color: #0550AE } /* Generic.Deleted */\n.highlight .ge { font-style: italic } /* Generic.Emph */\n.highlight .gr { color: #CF222E } /* Generic.Error */\n.highlight .gh { color: #0550AE } /* Generic.Heading */\n.highlight .gs { font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #0550AE } /* Generic.Subheading */\n.highlight .kc { color: #0550AE } /* Keyword.Constant */\n.highlight .kd { color: #CF222E } /* Keyword.Declaration */\n.highlight .kn { color: #CF222E } /* Keyword.Namespace */\n.highlight .kp { color: #CF222E } /* Keyword.Pseudo */\n.highlight .kr { color: #CF222E } /* Keyword.Reserved */\n.highlight .kt { color: #CF222E } /* Keyword.Type */\n.highlight .ld { color: #953800 } /* Literal.Date */\n.highlight .m { color: #953800 } /* Literal.Number */\n.highlight .s { color: #0550AE } /* Literal.String */\n.highlight .na { color: #953800 } /* Name.Attribute */\n.highlight .nb { color: #953800 } /* Name.Builtin */\n.highlight .nc { color: #0550AE } /* Name.Class */\n.highlight .no { color: #0550AE } /* Name.Constant */\n.highlight .nd { color: #953800 } /* Name.Decorator */\n.highlight .ni { color: #116329 } /* Name.Entity */\n.highlight .ne { color: #8250DF } /* Name.Exception */\n.highlight .nf { color: #0550AE } /* Name.Function */\n.highlight .nl { color: #953800 } /* Name.Label */\n.highlight .nn { color: #24292F } /* Name.Namespace */\n.highlight .nx { color: #8250DF } /* Name.Other */\n.highlight .py { color: #0550AE } /* Name.Property */\n.highlight .nt { color: #116329 } /* Name.Tag */\n.highlight .nv { color: #953800 } /* Name.Variable */\n.highlight .ow { color: #8250DF } /* Operator.Word */\n.highlight .pm { color: #24292F } /* Punctuation.Marker */\n.highlight .w { color: #24292F } /* Text.Whitespace */\n.highlight .mb { color: #953800 } /* Literal.Number.Bin */\n.highlight .mf { color: #953800 } /* Literal.Number.Float */\n.highlight .mh { color: #953800 } /* Literal.Number.Hex */\n.highlight .mi { color: #953800 } /* Literal.Number.Integer */\n.highlight .mo { color: #953800 } /* Literal.Number.Oct */\n.highlight .sa { color: #0550AE } /* Literal.String.Affix */\n.highlight .sb { color: #0550AE } /* Literal.String.Backtick */\n.highlight .sc { color: #0550AE } /* Literal.String.Char */\n.highlight .dl { color: #0550AE } /* Literal.String.Delimiter */\n.highlight .sd { color: #0550AE } /* Literal.String.Doc */\n.highlight .s2 { color: #0550AE } /* Literal.String.Double */\n.highlight .se { color: #0550AE } /* Literal.String.Escape */\n.highlight .sh { color: #0550AE } /* Literal.String.Heredoc */\n.highlight .si { color: #0550AE } /* Literal.String.Interpol */\n.highlight .sx { color: #0550AE } /* Literal.String.Other */\n.highlight .sr { color: #0550AE } /* Literal.String.Regex */\n.highlight .s1 { color: #0550AE } /* Literal.String.Single */\n.highlight .ss { color: #0550AE } /* Literal.String.Symbol */\n.highlight .bp { color: #953800 } /* Name.Builtin.Pseudo */\n.highlight .fm { color: #0550AE } /* Name.Function.Magic */\n.highlight .vc { color: #953800 } /* Name.Variable.Class */\n.highlight .vg { color: #953800 } /* Name.Variable.Global */\n.highlight .vi { color: #953800 } /* Name.Variable.Instance */\n.highlight .vm { color: #953800 } /* Name.Variable.Magic */\n.highlight .il { color: #953800 } /* Literal.Number.Integer.Long */\n","/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput {\n /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect {\n /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// Base element style overrides\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\n:root {\n color-scheme: $color-scheme;\n}\n\n* {\n box-sizing: border-box;\n}\n\nhtml {\n scroll-behavior: smooth;\n\n @include fs-4;\n}\n\nbody {\n font-family: $body-font-family;\n font-size: inherit;\n line-height: $body-line-height;\n color: $body-text-color;\n background-color: $body-background-color;\n overflow-wrap: break-word;\n}\n\nol,\nul,\ndl,\npre,\naddress,\nblockquote,\ntable,\ndiv,\nhr,\nform,\nfieldset,\nnoscript .table-wrapper {\n margin-top: 0;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n#toctitle {\n margin-top: 0;\n margin-bottom: 1em;\n font-weight: 500;\n line-height: $body-heading-line-height;\n color: $body-heading-color;\n}\n\np {\n margin-top: 1em;\n margin-bottom: 1em;\n}\n\na {\n color: $link-color;\n text-decoration: none;\n}\n\na:not([class]) {\n text-decoration: underline;\n text-decoration-color: $border-color;\n text-underline-offset: 2px;\n\n &:hover {\n text-decoration-color: rgba($link-color, 0.45);\n }\n}\n\ncode {\n font-family: $mono-font-family;\n font-size: 0.75em;\n line-height: $body-line-height;\n}\n\nfigure,\npre {\n margin: 0;\n}\n\nli {\n margin: 0.25em 0;\n}\n\nimg {\n max-width: 100%;\n height: auto;\n}\n\nhr {\n height: 1px;\n padding: 0;\n margin: $sp-6 0;\n background-color: $border-color;\n border: 0;\n}\n\n// adds a GitHub-style sidebar to blockquotes\nblockquote {\n margin: 10px 0;\n\n // resets user-agent stylesheets for blockquotes\n margin-block-start: 0;\n margin-inline-start: 0;\n padding-left: 1rem;\n border-left: 3px solid $border-color;\n}\n","// Meshtastic Material 3 — Light color scheme for just-the-docs\n// Source: core/ui/.../Color.kt §8.2 (Light Scheme)\n//\n// Brand colors:\n// Primary (Light): #2D8F52 (Green 700)\n// Surface (Light): #F5F6FA (Neutral 50)\n\n$color-scheme: light;\n\n// Body / page background\n$body-background-color: #F5F6FA; // Neutral 50 — surfaceLight\n$sidebar-color: #ECEDF3; // Neutral 100 — surfaceContainerLight\n$body-text-color: #2C2D3C; // Neutral 800 — onSurfaceLight\n$body-heading-color: #2C2D3C; // Neutral 800\n\n// Links\n$link-color: #2D8F52; // Green 700 — primaryLight\n$nav-link-color: #2D8F52; // Green 700\n\n// Navigation\n$nav-child-link-color: #555668; // Neutral 600 — secondaryLight\n$search-result-preview-color: #555668;\n\n// Code\n$code-background-color: #ECEDF3; // Neutral 100\n$code-linenumber-color: #9496A6; // Neutral 400\n\n// Borders\n$border-color: #D5D6E0; // Neutral 200 — outlineVariantLight\n$table-background-color: #F5F6FA; // Neutral 50\n\n// Buttons\n$btn-primary-color: #2D8F52; // Green 700\n\n// Feedback / callouts\n$feedback-color: #E0E1EB; // surfaceContainerHighLight\n\n// Search\n$search-background-color: #FFFFFF; // surfaceContainerLowestLight\n","@mixin fs-1 {\n & {\n font-size: $font-size-1 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-1-sm !important;\n }\n}\n\n@mixin fs-2 {\n & {\n font-size: $font-size-2 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-3 !important;\n }\n}\n\n@mixin fs-3 {\n & {\n font-size: $font-size-3 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-4 !important;\n }\n}\n\n@mixin fs-4 {\n & {\n font-size: $font-size-4 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-5 !important;\n }\n}\n\n@mixin fs-5 {\n & {\n font-size: $font-size-5 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-6 !important;\n }\n}\n\n@mixin fs-6 {\n & {\n font-size: $font-size-6 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n}\n\n@mixin fs-7 {\n & {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-8 !important;\n }\n}\n\n@mixin fs-8 {\n & {\n font-size: $font-size-8 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-9 !important;\n }\n}\n\n@mixin fs-9 {\n & {\n font-size: $font-size-9 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10 !important;\n }\n}\n\n@mixin fs-10 {\n & {\n font-size: $font-size-10 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10-sm !important;\n }\n}\n","// Media query\n\n// Media query mixin\n// Usage:\n// @include mq(md) {\n// ..medium and up styles\n// }\n@mixin mq($name) {\n // Retrieves the value from the key\n $value: map-get($media-queries, $name);\n\n // If the key exists in the map\n @if $value {\n // Prints a media query based on the value\n @media (min-width: $value) {\n @content;\n }\n } @else {\n @warn \"No value could be retrieved from `#{$media-query}`. Please make sure it is defined in `$media-queries` map.\";\n }\n}\n\n// Responsive container\n\n@mixin container {\n padding-right: $gutter-spacing-sm;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-right: $gutter-spacing;\n padding-left: $gutter-spacing;\n }\n}\n","// Typography\n\n// prettier-ignore\n$body-font-family: system-ui, -apple-system, blinkmacsystemfont, \"Segoe UI\",\n roboto, \"Helvetica Neue\", arial, sans-serif, \"Segoe UI Emoji\" !default;\n$mono-font-family: \"SFMono-Regular\", menlo, consolas, monospace !default;\n$root-font-size: 16px !default; // DEPRECATED: previously base font-size for rems\n$body-line-height: 1.4 !default;\n$content-line-height: 1.6 !default;\n$body-heading-line-height: 1.25 !default;\n\n// Font size\n// `-sm` suffix is the size at the small (and above) media query\n\n$font-size-1: 0.5625rem !default;\n$font-size-1-sm: 0.625rem !default;\n$font-size-2: 0.6875rem !default; // h4 - uppercased!, h6 not uppercased, text-small\n$font-size-3: 0.75rem !default; // h5\n$font-size-4: 0.875rem !default;\n$font-size-5: 1rem !default; // h3\n$font-size-6: 1.125rem !default; // h2\n$font-size-7: 1.5rem !default;\n$font-size-8: 2rem !default; // h1\n$font-size-9: 2.25rem !default;\n$font-size-10: 2.625rem !default;\n$font-size-10-sm: 3rem !default;\n\n// Colors\n\n$white: #fff !default;\n$grey-dk-000: #959396 !default;\n$grey-dk-100: #5c5962 !default;\n$grey-dk-200: #44434d !default;\n$grey-dk-250: #302d36 !default;\n$grey-dk-300: #27262b !default;\n$grey-lt-000: #f5f6fa !default;\n$grey-lt-100: #eeebee !default;\n$grey-lt-200: #ecebed !default;\n$grey-lt-300: #e6e1e8 !default;\n$purple-000: #7253ed !default;\n$purple-100: #5e41d0 !default;\n$purple-200: #4e26af !default;\n$purple-300: #381885 !default;\n$blue-000: #2c84fa !default;\n$blue-100: #2869e6 !default;\n$blue-200: #264caf !default;\n$blue-300: #183385 !default;\n$green-000: #41d693 !default;\n$green-100: #11b584 !default;\n$green-200: #009c7b !default;\n$green-300: #026e57 !default;\n$yellow-000: #ffeb82 !default;\n$yellow-100: #fadf50 !default;\n$yellow-200: #f7d12e !default;\n$yellow-300: #e7af06 !default;\n$red-000: #f77e7e !default;\n$red-100: #f96e65 !default;\n$red-200: #e94c4c !default;\n$red-300: #dd2e2e !default;\n\n// Spacing\n\n$spacing-unit: 1rem; // 1rem == 16px\n\n$spacers: (\n sp-0: 0,\n sp-1: $spacing-unit * 0.25,\n sp-2: $spacing-unit * 0.5,\n sp-3: $spacing-unit * 0.75,\n sp-4: $spacing-unit,\n sp-5: $spacing-unit * 1.5,\n sp-6: $spacing-unit * 2,\n sp-7: $spacing-unit * 2.5,\n sp-8: $spacing-unit * 3,\n sp-9: $spacing-unit * 3.5,\n sp-10: $spacing-unit * 4,\n) !default;\n$sp-1: map-get($spacers, sp-1) !default; // 0.25 rem == 4px\n$sp-2: map-get($spacers, sp-2) !default; // 0.5 rem == 8px\n$sp-3: map-get($spacers, sp-3) !default; // 0.75 rem == 12px\n$sp-4: map-get($spacers, sp-4) !default; // 1 rem == 16px\n$sp-5: map-get($spacers, sp-5) !default; // 1.5 rem == 24px\n$sp-6: map-get($spacers, sp-6) !default; // 2 rem == 32px\n$sp-7: map-get($spacers, sp-7) !default; // 2.5 rem == 40px\n$sp-8: map-get($spacers, sp-8) !default; // 3 rem == 48px\n$sp-9: map-get($spacers, sp-9) !default; // 3.5 rem == 56px\n$sp-10: map-get($spacers, sp-10) !default; // 4 rem == 64px\n\n// Borders\n\n$border: 1px solid !default;\n$border-radius: 4px !default;\n$border-color: $grey-lt-100 !default;\n\n// Grid system\n\n$gutter-spacing: $sp-6 !default;\n$gutter-spacing-sm: $sp-4 !default;\n$nav-width: 16.5rem !default;\n$nav-width-md: 15.5rem !default;\n$nav-list-item-height: $sp-6 !default;\n$nav-list-item-height-sm: $sp-8 !default;\n$nav-list-expander-right: true;\n$content-width: 50rem !default;\n$header-height: 3.75rem !default;\n$search-results-width: $content-width - $nav-width !default;\n$transition-duration: 400ms;\n\n// Media queries in pixels\n\n$media-queries: (\n xs: 20rem,\n sm: 31.25rem,\n md: $content-width,\n lg: $content-width + $nav-width,\n xl: 87.5rem,\n) !default;\n","// The basic two column layout\n\n.side-bar {\n z-index: 0;\n display: flex;\n flex-wrap: wrap;\n background-color: $sidebar-color;\n\n @include mq(md) {\n flex-flow: column nowrap;\n position: fixed;\n width: $nav-width-md;\n height: 100%;\n border-right: $border $border-color;\n align-items: flex-end;\n }\n\n @include mq(lg) {\n width: calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width});\n min-width: $nav-width;\n }\n\n & + .main {\n @include mq(md) {\n margin-left: $nav-width-md;\n }\n\n @include mq(lg) {\n // stylelint-disable function-name-case\n // disable for Max(), we want to use the CSS max() function\n margin-left: Max(\n #{$nav-width},\n calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width})\n );\n // stylelint-enable function-name-case\n }\n\n .main-header {\n display: none;\n background-color: $sidebar-color;\n\n @include mq(md) {\n display: flex;\n background-color: $body-background-color;\n }\n\n &.nav-open {\n display: block;\n\n @include mq(md) {\n display: flex;\n }\n }\n }\n }\n}\n\n.main {\n margin: auto;\n\n @include mq(md) {\n position: relative;\n max-width: $content-width;\n }\n}\n\n.main-content-wrap {\n padding-top: $gutter-spacing-sm;\n padding-bottom: $gutter-spacing-sm;\n\n @include container;\n\n @include mq(md) {\n padding-top: $gutter-spacing;\n padding-bottom: $gutter-spacing;\n }\n}\n\n.main-header {\n z-index: 0;\n border-bottom: $border $border-color;\n\n @include mq(md) {\n display: flex;\n justify-content: space-between;\n height: $header-height;\n }\n}\n\n.site-nav,\n.site-header,\n.site-footer {\n width: 100%;\n\n @include mq(lg) {\n width: $nav-width;\n }\n}\n\n.site-nav {\n display: none;\n\n &.nav-open {\n display: block;\n }\n\n @include mq(md) {\n display: block;\n padding-top: $sp-8;\n padding-bottom: $gutter-spacing-sm;\n overflow-y: auto;\n flex: 1 1 auto;\n }\n}\n\n.site-header {\n display: flex;\n min-height: $header-height;\n align-items: center;\n\n @include mq(md) {\n height: $header-height;\n max-height: $header-height;\n border-bottom: $border $border-color;\n }\n}\n\n.site-title {\n flex-grow: 1;\n display: flex;\n height: 100%;\n align-items: center;\n padding-top: $sp-3;\n padding-bottom: $sp-3;\n color: $body-heading-color;\n\n @include container;\n\n @include fs-6;\n\n @include mq(md) {\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n }\n}\n\n@if variable-exists(logo) {\n .site-logo {\n width: 100%;\n height: 100%;\n background-image: url($logo);\n background-repeat: no-repeat;\n background-position: left center;\n background-size: contain;\n }\n}\n\n.site-button {\n display: flex;\n height: 100%;\n padding: $gutter-spacing-sm;\n align-items: center;\n}\n\n@include mq(md) {\n .site-header .site-button {\n display: none;\n }\n}\n\n.site-title:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n}\n\n.site-button:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n}\n\n.site-footer {\n position: absolute;\n bottom: 0;\n left: 0;\n padding-top: $sp-4;\n padding-bottom: $sp-4;\n\n @include container;\n\n @include fs-2;\n\n @include mq(md) {\n position: static;\n justify-self: end;\n }\n}\n\n.icon {\n width: $sp-5;\n height: $sp-5;\n color: $link-color;\n}\n","@charset \"UTF-8\";\n\n// Styles for rendered markdown in the .main-content container\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity, selector-max-id\n\n.main-content {\n line-height: $content-line-height;\n\n ol,\n ul,\n dl,\n pre,\n address,\n blockquote,\n .table-wrapper {\n margin-top: 0.5em;\n }\n\n a {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n ul,\n ol {\n padding-left: 1.5em;\n }\n\n li {\n .highlight {\n margin-top: $sp-1;\n }\n }\n\n ol {\n list-style-type: none;\n counter-reset: step-counter;\n\n > li {\n position: relative;\n\n &::before {\n position: absolute;\n top: 0.2em;\n left: -1.6em;\n color: $grey-dk-000;\n content: counter(step-counter);\n counter-increment: step-counter;\n @include fs-3;\n\n @include mq(sm) {\n top: 0.11em;\n }\n }\n\n ol {\n counter-reset: sub-counter;\n\n > li {\n &::before {\n content: counter(sub-counter, lower-alpha);\n counter-increment: sub-counter;\n }\n }\n }\n }\n }\n\n ul {\n list-style: none;\n\n > li {\n &::before {\n position: absolute;\n margin-left: -1.4em;\n color: $grey-dk-000;\n content: \"•\";\n }\n }\n }\n\n .task-list-item {\n &::before {\n content: \"\";\n }\n }\n\n .task-list-item-checkbox {\n margin-right: 0.6em;\n margin-left: -1.4em;\n\n // The same margin-left is used above for ul > li::before\n }\n\n hr + * {\n margin-top: 0;\n }\n\n h1:first-of-type {\n margin-top: 0.5em;\n }\n\n dl {\n display: grid;\n grid-template: auto / 10em 1fr;\n }\n\n dt,\n dd {\n margin: 0.25em 0;\n }\n\n dt {\n grid-column: 1;\n font-weight: 500;\n text-align: right;\n\n &::after {\n content: \":\";\n }\n }\n\n dd {\n grid-column: 2;\n margin-bottom: 0;\n margin-left: 1em;\n\n blockquote,\n div,\n dl,\n dt,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n li,\n ol,\n p,\n pre,\n table,\n ul,\n .table-wrapper {\n &:first-child {\n margin-top: 0;\n }\n }\n }\n\n dd,\n ol,\n ul {\n dl:first-child {\n dt:first-child,\n dd:nth-child(2) {\n margin-top: 0;\n }\n }\n }\n\n .anchor-heading {\n position: absolute;\n right: -$sp-4;\n width: $sp-5;\n height: 100%;\n padding-right: $sp-1;\n padding-left: $sp-1;\n overflow: visible;\n\n @include mq(md) {\n right: auto;\n left: -$sp-5;\n }\n\n svg {\n display: inline-block;\n width: 100%;\n height: 100%;\n color: $link-color;\n visibility: hidden;\n }\n }\n\n .anchor-heading:hover,\n .anchor-heading:focus,\n h1:hover > .anchor-heading,\n h2:hover > .anchor-heading,\n h3:hover > .anchor-heading,\n h4:hover > .anchor-heading,\n h5:hover > .anchor-heading,\n h6:hover > .anchor-heading {\n svg {\n visibility: visible;\n }\n }\n\n summary {\n cursor: pointer;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n #toctitle {\n position: relative;\n margin-top: 1.5em;\n margin-bottom: 0.25em;\n\n + table,\n + .table-wrapper,\n + .code-example,\n + .highlighter-rouge,\n + .sectionbody .listingblock {\n margin-top: 1em;\n }\n\n + p:not(.label) {\n margin-top: 0;\n }\n }\n\n > h1:first-child,\n > h2:first-child,\n > h3:first-child,\n > h4:first-child,\n > h5:first-child,\n > h6:first-child,\n > .sect1:first-child > h2,\n > .sect2:first-child > h3,\n > .sect3:first-child > h4,\n > .sect4:first-child > h5,\n > .sect5:first-child > h6 {\n margin-top: $sp-2;\n }\n}\n","// Main nav, breadcrumb, etc...\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity\n\n.nav-list {\n padding: 0;\n margin-top: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n margin: 0;\n\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n\n .nav-list-link {\n display: block;\n min-height: $nav-list-item-height-sm;\n padding-top: $sp-1;\n padding-bottom: $sp-1;\n line-height: #{$nav-list-item-height-sm - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height-sm;\n padding-left: $gutter-spacing-sm;\n } @else {\n padding-right: $gutter-spacing-sm;\n padding-left: $nav-list-item-height-sm;\n }\n\n @include mq(md) {\n min-height: $nav-list-item-height;\n line-height: #{$nav-list-item-height - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height;\n padding-left: $gutter-spacing;\n } @else {\n padding-right: $gutter-spacing;\n padding-left: $nav-list-item-height;\n }\n }\n\n &.external > svg {\n width: $sp-4;\n height: $sp-4;\n vertical-align: text-bottom;\n }\n\n &.active {\n font-weight: 600;\n text-decoration: none;\n }\n\n &:hover,\n &.active {\n color: darken($link-color, 5%);\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n }\n }\n\n .nav-list-expander {\n position: absolute;\n @if $nav-list-expander-right {\n right: 0;\n }\n\n width: $nav-list-item-height-sm;\n height: $nav-list-item-height-sm;\n padding: #{$nav-list-item-height-sm * 0.25};\n color: $link-color;\n\n @include mq(md) {\n width: $nav-list-item-height;\n height: $nav-list-item-height;\n padding: #{$nav-list-item-height * 0.25};\n }\n\n &:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n }\n\n @if $nav-list-expander-right {\n svg {\n transform: rotate(90deg);\n }\n }\n }\n\n > .nav-list {\n display: none;\n padding-left: $sp-3;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n\n .nav-list-link {\n color: $nav-child-link-color;\n }\n\n .nav-list-expander {\n color: $nav-child-link-color;\n }\n }\n }\n\n &.active {\n > .nav-list-expander svg {\n @if $nav-list-expander-right {\n transform: rotate(-90deg);\n } @else {\n transform: rotate(90deg);\n }\n }\n\n > .nav-list {\n display: block;\n }\n }\n }\n}\n\n.nav-category {\n padding: $sp-2 $gutter-spacing-sm;\n font-weight: 600;\n text-align: start;\n text-transform: uppercase;\n border-bottom: $border $border-color;\n @include fs-2;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing;\n margin-top: $gutter-spacing-sm;\n text-align: start;\n\n &:first-child {\n margin-top: 0;\n }\n }\n}\n\n.nav-list.nav-category-list {\n > .nav-list-item {\n margin: 0;\n\n > .nav-list {\n padding: 0;\n\n > .nav-list-item {\n > .nav-list-link {\n color: $link-color;\n }\n\n > .nav-list-expander {\n color: $link-color;\n }\n }\n }\n }\n}\n\n// Aux nav\n\n.aux-nav {\n height: 100%;\n overflow-x: auto;\n @include fs-2;\n\n .aux-nav-list {\n display: flex;\n height: 100%;\n padding: 0;\n margin: 0;\n list-style: none;\n }\n\n .aux-nav-list-item {\n display: inline-block;\n height: 100%;\n padding: 0;\n margin: 0;\n }\n\n @include mq(md) {\n padding-right: $gutter-spacing-sm;\n }\n}\n\n// Breadcrumb nav\n\n.breadcrumb-nav {\n @include mq(md) {\n margin-top: -$sp-4;\n }\n}\n\n.breadcrumb-nav-list {\n padding-left: 0;\n margin-bottom: $sp-3;\n list-style: none;\n}\n\n.breadcrumb-nav-list-item {\n display: table-cell;\n @include fs-2;\n\n &::before {\n display: none;\n }\n\n &::after {\n display: inline-block;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $grey-dk-000;\n content: \"/\";\n }\n\n &:last-child {\n &::after {\n content: \"\";\n }\n }\n}\n","// Typography\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\nh1,\n.text-alpha {\n font-weight: 300;\n\n @include fs-8;\n}\n\nh2,\n.text-beta,\n#toctitle {\n @include fs-6;\n}\n\nh3,\n.text-gamma {\n @include fs-5;\n}\n\nh4,\n.text-delta {\n font-weight: 400;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n\n @include fs-2;\n}\n\nh4 code {\n text-transform: none;\n}\n\nh5,\n.text-epsilon {\n @include fs-3;\n}\n\nh6,\n.text-zeta {\n @include fs-2;\n}\n\n.text-small {\n @include fs-2;\n}\n\n.text-mono {\n font-family: $mono-font-family !important;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n","// Labels (not the form kind)\n\n// this :not() prevents a style clash with Mermaid.js's\n// diagram labels, which also use .label\n// for more, see https://github.com/just-the-docs/just-the-docs/issues/1272\n// and the accompanying PR\n.label:not(g),\n.label-blue:not(g) {\n display: inline-block;\n padding: 0.16em 0.56em;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $white;\n text-transform: uppercase;\n vertical-align: middle;\n background-color: $blue-100;\n border-radius: 12px;\n\n @include fs-2;\n}\n\n.label-green:not(g) {\n background-color: $green-300;\n}\n\n.label-purple:not(g) {\n background-color: $purple-100;\n}\n\n.label-red:not(g) {\n background-color: $red-300;\n}\n\n.label-yellow:not(g) {\n color: $grey-dk-200;\n background-color: $yellow-200;\n}\n","// Buttons and things that look like buttons\n// stylelint-disable color-named\n\n.btn {\n display: inline-block;\n box-sizing: border-box;\n padding: 0.3em 1em;\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n font-weight: 500;\n line-height: 1.5;\n color: $link-color;\n text-decoration: none;\n vertical-align: baseline;\n cursor: pointer;\n background-color: $base-button-color;\n border-width: 0;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n appearance: none;\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: darken($link-color, 2%);\n }\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n text-decoration: none;\n background-color: darken($base-button-color, 1%);\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($base-button-color, 3%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken(#dcdcdc, 5%);\n }\n\n &:disabled,\n &.disabled {\n &,\n &:hover {\n color: rgba(102, 102, 102, 0.5);\n cursor: default;\n background-color: rgba(229, 229, 229, 0.5);\n background-image: none;\n box-shadow: none;\n }\n }\n}\n\n.btn-outline {\n color: $link-color;\n background: transparent;\n box-shadow: inset 0 0 0 2px $grey-lt-300;\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n color: darken($link-color, 4%);\n text-decoration: none;\n background-color: transparent;\n box-shadow: inset 0 0 0 3px $grey-lt-300;\n }\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow:\n inset 0 0 0 2px $grey-dk-100,\n 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: inset 0 0 0 2px $grey-dk-100;\n }\n}\n\n.btn-primary {\n @include btn-color($white, $btn-primary-color);\n}\n\n.btn-purple {\n @include btn-color($white, $purple-100);\n}\n\n.btn-blue {\n @include btn-color($white, $blue-200);\n}\n\n.btn-green {\n @include btn-color($white, $green-300);\n}\n\n.btn-reset {\n background: none;\n border: none;\n margin: 0;\n text-align: inherit;\n font: inherit;\n border-radius: 0;\n appearance: none;\n}\n","$color-scheme: light !default;\n$body-background-color: $white !default;\n$body-heading-color: $grey-dk-300 !default;\n$body-text-color: $grey-dk-100 !default;\n$link-color: $purple-000 !default;\n$nav-child-link-color: $grey-dk-100 !default;\n$sidebar-color: $grey-lt-000 !default;\n$base-button-color: #f7f7f7 !default;\n$btn-primary-color: $purple-100 !default;\n$code-background-color: $white !default;\n$feedback-color: darken($sidebar-color, 3%) !default;\n$table-background-color: $white !default;\n$search-background-color: $white !default;\n$search-result-preview-color: $grey-dk-100 !default;\n\n@import \"./vendor/accessible-pygments/github-light\";\n","// Colored button\n\n@mixin btn-color($fg, $bg) {\n color: $fg;\n background-color: darken($bg, 2%);\n background-image: linear-gradient(lighten($bg, 5%), darken($bg, 2%));\n box-shadow:\n 0 1px 3px rgba(0, 0, 0, 0.25),\n 0 4px 10px rgba(0, 0, 0, 0.12);\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: $fg;\n background-color: darken($bg, 4%);\n background-image: linear-gradient((lighten($bg, 2%), darken($bg, 4%)));\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($bg, 5%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken($bg, 10%);\n }\n}\n","// Search input and autocomplete\n\n.search {\n position: relative;\n z-index: 2;\n flex-grow: 1;\n height: $sp-10;\n padding: $sp-2;\n transition: padding linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: relative !important;\n width: auto !important;\n height: 100% !important;\n padding: 0;\n transition: none;\n }\n}\n\n.search-input-wrap {\n position: relative;\n z-index: 1;\n height: $sp-8;\n overflow: hidden;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n transition: height linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: absolute;\n width: 100%;\n max-width: $search-results-width;\n height: 100% !important;\n border-radius: 0;\n box-shadow: none;\n transition: width ease $transition-duration;\n }\n}\n\n.search-input {\n position: absolute;\n width: 100%;\n height: 100%;\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing-sm + $sp-5};\n font-size: 1rem;\n color: $body-text-color;\n background-color: $search-background-color;\n border-top: 0;\n border-right: 0;\n border-bottom: 0;\n border-left: 0;\n border-radius: 0;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing + $sp-5};\n font-size: 0.875rem;\n background-color: $body-background-color;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n &:focus {\n outline: 2px solid $link-color;\n outline-offset: -2px;\n\n + .search-label .search-icon {\n color: $link-color;\n }\n }\n}\n\n.search-label {\n position: absolute;\n display: flex;\n height: 100%;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-left: $gutter-spacing;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n .search-icon {\n width: #{$sp-4 * 1.2};\n height: #{$sp-4 * 1.2};\n align-self: center;\n color: $grey-dk-000;\n }\n}\n\n.search-results {\n position: absolute;\n left: 0;\n display: none;\n width: 100%;\n max-height: calc(100% - #{$sp-10});\n overflow-y: auto;\n background-color: $search-background-color;\n border-bottom-right-radius: $border-radius;\n border-bottom-left-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n\n @include mq(md) {\n top: 100%;\n width: $search-results-width;\n max-height: calc(100vh - 200%) !important;\n }\n}\n\n.search-results-list {\n padding-left: 0;\n margin-bottom: $sp-1;\n list-style: none;\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n}\n\n.search-results-list-item {\n padding: 0;\n margin: 0;\n}\n\n.search-result {\n display: block;\n padding: $sp-1 $sp-3;\n\n &:hover,\n &.active {\n background-color: $feedback-color;\n }\n}\n\n.search-result-title {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 40%;\n padding-right: $sp-2;\n vertical-align: top;\n }\n}\n\n.search-result-doc {\n display: flex;\n align-items: center;\n word-wrap: break-word;\n\n &.search-result-doc-parent {\n opacity: 0.5;\n @include fs-3;\n\n @include mq(md) {\n @include fs-2;\n }\n }\n\n .search-result-icon {\n width: $sp-4;\n height: $sp-4;\n margin-right: $sp-2;\n color: $link-color;\n flex-shrink: 0;\n }\n\n .search-result-doc-title {\n overflow: auto;\n }\n}\n\n.search-result-section {\n margin-left: #{$sp-4 + $sp-2};\n word-wrap: break-word;\n}\n\n.search-result-rel-url {\n display: block;\n margin-left: #{$sp-4 + $sp-2};\n overflow: hidden;\n color: $search-result-preview-color;\n text-overflow: ellipsis;\n white-space: nowrap;\n @include fs-1;\n}\n\n.search-result-previews {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n padding-left: $sp-4;\n margin-left: $sp-2;\n color: $search-result-preview-color;\n word-wrap: break-word;\n border-left: $border;\n border-left-color: $border-color;\n @include fs-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 60%;\n padding-left: $sp-2;\n margin-left: 0;\n vertical-align: top;\n }\n}\n\n.search-result-preview + .search-result-preview {\n margin-top: $sp-1;\n}\n\n.search-result-highlight {\n font-weight: bold;\n}\n\n.search-no-result {\n padding: $sp-2 $sp-3;\n @include fs-3;\n}\n\n.search-button {\n position: fixed;\n right: $sp-4;\n bottom: $sp-4;\n display: flex;\n width: $sp-9;\n height: $sp-9;\n background-color: $search-background-color;\n border: 1px solid rgba($link-color, 0.3);\n border-radius: #{$sp-9 * 0.5};\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n align-items: center;\n justify-content: center;\n}\n\n.search-overlay {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1;\n width: 0;\n height: 0;\n background-color: rgba(0, 0, 0, 0.3);\n opacity: 0;\n transition:\n opacity ease $transition-duration,\n width 0s $transition-duration,\n height 0s $transition-duration;\n}\n\n.search-active {\n .search {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .search-input-wrap {\n height: $sp-10;\n border-radius: 0;\n\n @include mq(md) {\n width: $search-results-width;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n }\n }\n\n .search-input {\n background-color: $search-background-color;\n\n @include mq(md) {\n padding-left: 2.3rem;\n }\n }\n\n .search-label {\n @include mq(md) {\n padding-left: 0.6rem;\n }\n }\n\n .search-results {\n display: block;\n }\n\n .search-overlay {\n width: 100%;\n height: 100%;\n opacity: 1;\n transition:\n opacity ease $transition-duration,\n width 0s,\n height 0s;\n }\n\n @include mq(md) {\n .main {\n position: fixed;\n right: 0;\n left: 0;\n }\n }\n\n .main-header {\n padding-top: $sp-10;\n\n @include mq(md) {\n padding-top: 0;\n }\n }\n}\n","// Tables\n// stylelint-disable max-nesting-depth, selector-no-type, selector-max-type\n\n.table-wrapper {\n display: block;\n width: 100%;\n max-width: 100%;\n margin-bottom: $sp-5;\n overflow-x: auto;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n}\n\ntable {\n display: table;\n min-width: 100%;\n border-collapse: separate;\n}\n\nth,\ntd {\n min-width: 7.5rem;\n padding: $sp-2 $sp-3;\n background-color: $table-background-color;\n border-bottom: $border rgba($border-color, 0.5);\n border-left: $border $border-color;\n\n @include fs-3;\n\n &:first-of-type {\n border-left: 0;\n }\n}\n\ntbody {\n tr {\n &:last-of-type {\n th,\n td {\n border-bottom: 0;\n }\n\n td {\n padding-bottom: $sp-3;\n }\n }\n }\n}\n\nthead {\n th {\n border-bottom: $border $border-color;\n }\n}\n","// Code and syntax highlighting\n// stylelint-disable selector-no-qualifying-type, declaration-block-semicolon-newline-after,declaration-block-single-line-max-declarations, selector-no-type, selector-max-type, scss/comment-no-empty\n\n// {% raw %}\n\n// This instruction applies to all queues not within 'pre' or 'figure', avoiding 'code' generated by the highlight.\n:not(pre, figure) {\n & > code {\n padding: 0.2em 0.15em;\n font-weight: 400;\n background-color: $code-background-color;\n border: $border $border-color;\n border-radius: $border-radius;\n }\n}\n\n// Avoid appearance of dark border around visited code links in Safari\na:visited code {\n border-color: $border-color;\n}\n\n// Content structure for highlighted code blocks using fences or Liquid\n//\n// ```[LANG]...```, no kramdown line_numbers:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n//\n// ```[LANG]...```, kramdown line_numbers = true:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.rouge-gutter.gl > pre.lineno\n// | td.rouge-code > pre\n//\n// {% highlight LANG %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n//\n// {% highlight LANG linenos %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.gutter.gl > pre.lineno\n// | td.code > pre\n//\n// ----...---- (AsciiDoc)\n// div.listingblock > div.content > pre.rouge.highlight\n//\n// fix_linenos removes the outermost pre when it encloses table.rouge-table\n//\n// See docs/index-test.md for some tests.\n//\n// No kramdown line_numbers: fences and Liquid highlighting look the same.\n// Kramdown line_numbers = true: fences have a wider gutter than with Liquid?\n\n// ```[LANG]...```\n// or in AsciiDoc:\n//\n// ----\n// ...\n// ----\n\n// the code may appear with 3 different types:\n// container \\ case: default case, code with line number, code with html rendering\n// top level: div.highlighter-rouge, figure.highlight, figure.highlight\n// second level: div.highlight, div.table-wrapper, pre.highlight\n// third level: pre.highlight, td.code, absent\n// last level: code, pre, code (optionality)\n// highlighter level: span, span, span\n// the spacing are only in the second level for case 1, 3 and in the third level for case 2\n// in AsciiDoc, there is a parent container that contains optionally a title and the content.\n\n// select top level container\ndiv.highlighter-rouge,\ndiv.listingblock > div.content,\nfigure.highlight {\n margin-top: 0;\n margin-bottom: $sp-3;\n background-color: $code-background-color;\n border-radius: $border-radius;\n box-shadow: none;\n -webkit-overflow-scrolling: touch;\n position: relative;\n padding: 0;\n\n // copy button (or other button)\n // the button appear only when there is a hover on the code or focus on button\n > button {\n width: $sp-3;\n opacity: 0;\n position: absolute;\n top: 0;\n right: 0;\n padding: $sp-3;\n border: none;\n background: none;\n color: $body-text-color;\n box-sizing: content-box;\n\n svg {\n fill: $body-text-color;\n }\n\n &:active {\n text-decoration: none;\n outline: none;\n opacity: 1;\n }\n\n &:focus {\n opacity: 1;\n outline: 2px solid $link-color;\n }\n }\n\n // the button can be seen by doing a simple hover in the code, there is no need to go over the location of the button\n &:hover {\n > button {\n cursor: copy;\n opacity: 1;\n }\n }\n}\n\n// setting the spacing and scrollbar on the second level for the first case\n// remove all space on the second and third level\n// this is a mixin to accommodate for the slightly different structures generated via Markdown vs AsciiDoc\n@mixin scroll-and-spacing($code-div, $pre-select) {\n #{$code-div} {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n\n #{$pre-select},\n code {\n padding: 0;\n margin: 0;\n border: 0;\n }\n}\n\n// for Markdown\ndiv.highlighter-rouge {\n @include scroll-and-spacing(\"div.highlight\", \"pre.highlight\");\n}\n\n// for AsciiDoc. we also need to fix the margins for its parent container.\ndiv.listingblock {\n margin-top: 0;\n margin-bottom: $sp-3;\n\n @include scroll-and-spacing(\"div.content\", \"div.content > pre\");\n}\n\n// {% highlight LANG %}...{% endhighlight %},\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the second level for the thirt case\n// the css rule are apply only to the last code enviroment\n// setting the scroolbar\nfigure.highlight {\n pre,\n :not(pre) > code {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n}\n\n// ```[LANG]...```, kramdown line_numbers = true,\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the thirt level for the second case\n.highlight .table-wrapper {\n padding: $sp-3 0;\n margin: 0;\n border: 0;\n box-shadow: none;\n\n td,\n pre {\n min-width: 0;\n padding: 0;\n background-color: $code-background-color;\n border: 0;\n\n @include fs-2;\n }\n\n td.gl {\n width: 1em;\n padding-right: $sp-3;\n padding-left: $sp-3;\n }\n\n pre {\n margin: 0;\n line-height: 2;\n }\n}\n\n// Code examples: html render of a code\n.code-example,\n.listingblock > .title {\n padding: $sp-3;\n margin-bottom: $sp-3;\n overflow: auto;\n border: 1px solid $border-color;\n border-radius: $border-radius;\n\n + .highlighter-rouge,\n + .sectionbody .listingblock,\n + .content,\n + figure.highlight {\n position: relative;\n margin-top: -$sp-4;\n border-right: 1px solid $border-color;\n border-bottom: 1px solid $border-color;\n border-left: 1px solid $border-color;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n}\n\n// Mermaid diagram code blocks should be left unstyled.\ncode.language-mermaid {\n padding: 0;\n background-color: inherit;\n border: 0;\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight,\npre.highlight {\n background: $code-background-color; // Code Background\n // For Backwards Compatibility Before $code-linenumber-color was added\n @if variable-exists(code-linenumber-color) {\n color: $code-linenumber-color; // Code Line Numbers\n } @else {\n color: $body-text-color; // Code Line Numbers\n }\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight pre {\n background: $code-background-color; // Code Background\n}\n\n// {% endraw %}\n","// Utility classes for colors\n\n// Text colors\n\n.text-grey-dk-000 {\n color: $grey-dk-000 !important;\n}\n\n.text-grey-dk-100 {\n color: $grey-dk-100 !important;\n}\n\n.text-grey-dk-200 {\n color: $grey-dk-200 !important;\n}\n\n.text-grey-dk-250 {\n color: $grey-dk-250 !important;\n}\n\n.text-grey-dk-300 {\n color: $grey-dk-300 !important;\n}\n\n.text-grey-lt-000 {\n color: $grey-lt-000 !important;\n}\n\n.text-grey-lt-100 {\n color: $grey-lt-100 !important;\n}\n\n.text-grey-lt-200 {\n color: $grey-lt-200 !important;\n}\n\n.text-grey-lt-300 {\n color: $grey-lt-300 !important;\n}\n\n.text-blue-000 {\n color: $blue-000 !important;\n}\n\n.text-blue-100 {\n color: $blue-100 !important;\n}\n\n.text-blue-200 {\n color: $blue-200 !important;\n}\n\n.text-blue-300 {\n color: $blue-300 !important;\n}\n\n.text-green-000 {\n color: $green-000 !important;\n}\n\n.text-green-100 {\n color: $green-100 !important;\n}\n\n.text-green-200 {\n color: $green-200 !important;\n}\n\n.text-green-300 {\n color: $green-300 !important;\n}\n\n.text-purple-000 {\n color: $purple-000 !important;\n}\n\n.text-purple-100 {\n color: $purple-100 !important;\n}\n\n.text-purple-200 {\n color: $purple-200 !important;\n}\n\n.text-purple-300 {\n color: $purple-300 !important;\n}\n\n.text-yellow-000 {\n color: $yellow-000 !important;\n}\n\n.text-yellow-100 {\n color: $yellow-100 !important;\n}\n\n.text-yellow-200 {\n color: $yellow-200 !important;\n}\n\n.text-yellow-300 {\n color: $yellow-300 !important;\n}\n\n.text-red-000 {\n color: $red-000 !important;\n}\n\n.text-red-100 {\n color: $red-100 !important;\n}\n\n.text-red-200 {\n color: $red-200 !important;\n}\n\n.text-red-300 {\n color: $red-300 !important;\n}\n\n// Background colors\n\n.bg-grey-dk-000 {\n background-color: $grey-dk-000 !important;\n}\n\n.bg-grey-dk-100 {\n background-color: $grey-dk-100 !important;\n}\n\n.bg-grey-dk-200 {\n background-color: $grey-dk-200 !important;\n}\n\n.bg-grey-dk-250 {\n background-color: $grey-dk-250 !important;\n}\n\n.bg-grey-dk-300 {\n background-color: $grey-dk-300 !important;\n}\n\n.bg-grey-lt-000 {\n background-color: $grey-lt-000 !important;\n}\n\n.bg-grey-lt-100 {\n background-color: $grey-lt-100 !important;\n}\n\n.bg-grey-lt-200 {\n background-color: $grey-lt-200 !important;\n}\n\n.bg-grey-lt-300 {\n background-color: $grey-lt-300 !important;\n}\n\n.bg-blue-000 {\n background-color: $blue-000 !important;\n}\n\n.bg-blue-100 {\n background-color: $blue-100 !important;\n}\n\n.bg-blue-200 {\n background-color: $blue-200 !important;\n}\n\n.bg-blue-300 {\n background-color: $blue-300 !important;\n}\n\n.bg-green-000 {\n background-color: $green-000 !important;\n}\n\n.bg-green-100 {\n background-color: $green-100 !important;\n}\n\n.bg-green-200 {\n background-color: $green-200 !important;\n}\n\n.bg-green-300 {\n background-color: $green-300 !important;\n}\n\n.bg-purple-000 {\n background-color: $purple-000 !important;\n}\n\n.bg-purple-100 {\n background-color: $purple-100 !important;\n}\n\n.bg-purple-200 {\n background-color: $purple-200 !important;\n}\n\n.bg-purple-300 {\n background-color: $purple-300 !important;\n}\n\n.bg-yellow-000 {\n background-color: $yellow-000 !important;\n}\n\n.bg-yellow-100 {\n background-color: $yellow-100 !important;\n}\n\n.bg-yellow-200 {\n background-color: $yellow-200 !important;\n}\n\n.bg-yellow-300 {\n background-color: $yellow-300 !important;\n}\n\n.bg-red-000 {\n background-color: $red-000 !important;\n}\n\n.bg-red-100 {\n background-color: $red-100 !important;\n}\n\n.bg-red-200 {\n background-color: $red-200 !important;\n}\n\n.bg-red-300 {\n background-color: $red-300 !important;\n}\n","// Utility classes for layout\n\n// Display\n\n.d-block {\n display: block !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n// Screenreader-only\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .d-sm-block, .d-md-none, .d-lg-inline\n .d-#{$media-query}-block {\n display: block !important;\n }\n .d-#{$media-query}-flex {\n display: flex !important;\n }\n .d-#{$media-query}-inline {\n display: inline !important;\n }\n .d-#{$media-query}-inline-block {\n display: inline-block !important;\n }\n .d-#{$media-query}-none {\n display: none !important;\n }\n }\n }\n}\n\n// Horizontal alignment\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.flex-justify-start {\n justify-content: flex-start !important;\n}\n\n.flex-justify-end {\n justify-content: flex-end !important;\n}\n\n.flex-justify-between {\n justify-content: space-between !important;\n}\n\n.flex-justify-around {\n justify-content: space-around !important;\n}\n\n// Vertical alignment\n\n.v-align-baseline {\n vertical-align: baseline !important;\n}\n\n.v-align-bottom {\n vertical-align: bottom !important;\n}\n\n.v-align-middle {\n vertical-align: middle !important;\n}\n\n.v-align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.v-align-text-top {\n vertical-align: text-top !important;\n}\n\n.v-align-top {\n vertical-align: top !important;\n}\n","// Utility classes for typography\n\n.fs-1 {\n @include fs-1;\n}\n\n.fs-2 {\n @include fs-2;\n}\n\n.fs-3 {\n @include fs-3;\n}\n\n.fs-4 {\n @include fs-4;\n}\n\n.fs-5 {\n @include fs-5;\n}\n\n.fs-6 {\n @include fs-6;\n}\n\n.fs-7 {\n @include fs-7;\n}\n\n.fs-8 {\n @include fs-8;\n}\n\n.fs-9 {\n @include fs-9;\n}\n\n.fs-10 {\n @include fs-10;\n}\n\n.fw-300 {\n font-weight: 300 !important;\n}\n\n.fw-400 {\n font-weight: 400 !important;\n}\n\n.fw-500 {\n font-weight: 500 !important;\n}\n\n.fw-700 {\n font-weight: 700 !important;\n}\n\n.lh-0 {\n line-height: 0 !important;\n}\n\n.lh-default {\n line-height: $body-line-height;\n}\n\n.lh-tight {\n line-height: $body-heading-line-height;\n}\n\n.ls-5 {\n letter-spacing: 0.05em !important;\n}\n\n.ls-10 {\n letter-spacing: 0.1em !important;\n}\n\n.ls-0 {\n letter-spacing: 0 !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n","// Utility classes for lists\n\n// stylelint-disable selector-max-type\n\n.list-style-none {\n padding: 0 !important;\n margin: 0 !important;\n list-style: none !important;\n\n li {\n &::before {\n display: none !important;\n }\n }\n}\n","// Utility classes for margins and padding\n\n// stylelint-disable block-opening-brace-space-after, block-opening-brace-space-before\n\n// Margin spacer utilities\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-0, .m-1, .m-2...\n .m-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n .mx-#{$scale}-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-sm-0, .m-md-1, .m-lg-2...\n .m-#{$media-query}-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$media-query}-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$media-query}-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$media-query}-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n }\n }\n}\n\n// Padding spacer utilities\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-0, .p-1, .p-2...\n .p-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @include mq($media-query) {\n @for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-sm-0, .p-md-1, .p-lg-2...\n .p-#{$media-query}-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$media-query}-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$media-query}-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n }\n }\n}\n","// stylelint-disable selector-max-specificity, selector-max-id, selector-max-type, selector-no-qualifying-type\n\n@media print {\n .site-footer,\n .site-button,\n #edit-this-page,\n #back-to-top,\n .site-nav,\n .main-header {\n display: none !important;\n }\n\n hr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n }\n\n .side-bar {\n width: 100%;\n height: auto;\n border-right: 0 !important;\n }\n\n .site-header {\n border-bottom: 1px solid $border-color;\n }\n\n .site-title {\n font-size: 1rem !important;\n font-weight: 700 !important;\n }\n\n .text-small {\n font-size: 8pt !important;\n }\n\n pre.highlight {\n border: 1px solid $border-color;\n }\n\n .main {\n max-width: none;\n margin-left: 0;\n }\n}\n","// Skipnav\n// Skip to main content\n\na.skip-to-main {\n left: -999px;\n position: absolute;\n top: auto;\n width: 1px;\n height: 1px;\n overflow: hidden;\n z-index: -999;\n}\n\na.skip-to-main:focus,\na.skip-to-main:active {\n color: $link-color;\n background-color: $body-background-color;\n left: auto;\n top: auto;\n width: 30%;\n height: auto;\n overflow: auto;\n margin: 10px 35%;\n padding: 5px;\n border-radius: 15px;\n border: 4px solid $btn-primary-color;\n text-align: center;\n font-size: 1.2em;\n z-index: 999;\n}\n","\n@import \"./support/support\";\n@import \"./custom/setup\";\n@import \"./color_schemes/light\";\n\n@import \"./color_schemes/meshtastic\";\n\n@import \"./modules\";\ndiv.opaque {\n background-color: $body-background-color;\n}\n\np.tip, blockquote.tip {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $green-300;\n content: \"Tip\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .tip-title {\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.tip-title, blockquote.tip-title {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.tip {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.tip-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.note, blockquote.note {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $blue-300;\n content: \"Note\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .note-title {\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.note-title, blockquote.note-title {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.note {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.note-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.warning, blockquote.warning {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $yellow-300;\n content: \"Warning\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .warning-title {\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.warning-title, blockquote.warning-title {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.warning {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.warning-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n@import \"./custom/custom\";\n\n\n"],"file":"just-the-docs-meshtastic.css"}
\ No newline at end of file
diff --git a/main/assets/js/search-data.json b/main/assets/js/search-data.json
index d4e75a5efd..1a5af70a1e 100644
--- a/main/assets/js/search-data.json
+++ b/main/assets/js/search-data.json
@@ -25719,7 +25719,7 @@
},"3674": {
"doc": "Nodes",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | Descripció | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | Descripció | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/ca-rES/user/nodes.html#node-list",
"relUrl": "/ca-rES/user/nodes.html#node-list"
@@ -25782,7 +25782,7 @@
},"3683": {
"doc": "Noder",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Roll | Beskrivning | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Hittegods | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Roll | Beskrivning | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Hittegods | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/sv-rSE/user/nodes.html#node-list",
"relUrl": "/sv-rSE/user/nodes.html#node-list"
@@ -25845,7 +25845,7 @@
},"3692": {
"doc": "Knoten",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Rolle | Beschreibung | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client - Versteckt | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router mit Verzögerung | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Tracker | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Behandelt Datenverkehr von/zu Ihren bevorzugten Knoten mit der Priorität „Router Late“ (wodurch sichergestellt wird, dass diese Nachrichten eine zusätzliche Relaisabdeckung erhalten), während der übrige Verkehr wie bei einem normalen Client gehandhabt wird. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Symbol | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Rolle | Beschreibung | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client - Versteckt | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router mit Verzögerung | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Tracker | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Behandelt Datenverkehr von/zu Ihren bevorzugten Knoten mit der Priorität „Router Late“ (wodurch sichergestellt wird, dass diese Nachrichten eine zusätzliche Relaisabdeckung erhalten), während der übrige Verkehr wie bei einem normalen Client gehandhabt wird. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Symbol | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/de-rDE/user/nodes.html#node-list",
"relUrl": "/de-rDE/user/nodes.html#node-list"
@@ -25908,7 +25908,7 @@
},"3701": {
"doc": "Nodes",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Functie | Beschrijving | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Functie | Beschrijving | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/nl-rNL/user/nodes.html#node-list",
"relUrl": "/nl-rNL/user/nodes.html#node-list"
@@ -25971,7 +25971,7 @@
},"3710": {
"doc": "Nodes",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | Cur síos | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | Cur síos | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/ga-rIE/user/nodes.html#node-list",
"relUrl": "/ga-rIE/user/nodes.html#node-list"
@@ -26034,7 +26034,7 @@
},"3719": {
"doc": "Węzły",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Rola | Opis | . | Klient | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Klient pasywny | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Czujnik | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Rola | Opis | . | Klient | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Klient pasywny | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Czujnik | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/pl-rPL/user/nodes.html#node-list",
"relUrl": "/pl-rPL/user/nodes.html#node-list"
@@ -26097,7 +26097,7 @@
},"3728": {
"doc": "Чворови",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Улога | Опис | . | Клијент | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Клијент мутиран | Receives but doesn’t retransmit | . | Скривени клијент | Like Client Mute, plus hides from node list | . | Рутер | Prioritizes message forwarding; stays awake to relay | . | Рутер са кашњењем | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Трекер | Optimized for position reporting at regular intervals | . | Сензор | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | ТАК Трекер | TAK position reporting only | . | Изгубљено и нађено | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Иконица | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Улога | Опис | . | Клијент | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Клијент мутиран | Receives but doesn’t retransmit | . | Скривени клијент | Like Client Mute, plus hides from node list | . | Рутер | Prioritizes message forwarding; stays awake to relay | . | Рутер са кашњењем | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Трекер | Optimized for position reporting at regular intervals | . | Сензор | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | ТАК Трекер | TAK position reporting only | . | Изгубљено и нађено | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Иконица | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/sr-rLatn/user/nodes.html#node-list",
"relUrl": "/sr-rLatn/user/nodes.html#node-list"
@@ -26160,7 +26160,7 @@
},"3737": {
"doc": "Nodes",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | Aprašymas | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | Aprašymas | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/lt-rLT/user/nodes.html#node-list",
"relUrl": "/lt-rLT/user/nodes.html#node-list"
@@ -26223,7 +26223,7 @@
},"3746": {
"doc": "节点",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | 角色 | 说明 | . | 客户端 | Standard end-user node | . | 客户群 | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | 客户端静默 | Receives but doesn’t retransmit | . | 客户端隐藏 | Like Client Mute, plus hides from node list | . | 路由 | Prioritizes message forwarding; stays awake to relay | . | 延迟时间 | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | 追踪器 | Optimized for position reporting at regular intervals | . | 传感器 | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK 追踪器 | TAK position reporting only | . | 失物招领 | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | 图标 | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | 角色 | 说明 | . | 客户端 | Standard end-user node | . | 客户群 | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | 客户端静默 | Receives but doesn’t retransmit | . | 客户端隐藏 | Like Client Mute, plus hides from node list | . | 路由 | Prioritizes message forwarding; stays awake to relay | . | 延迟时间 | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | 追踪器 | Optimized for position reporting at regular intervals | . | 传感器 | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK 追踪器 | TAK position reporting only | . | 失物招领 | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | 图标 | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/zh-rCN/user/nodes.html#node-list",
"relUrl": "/zh-rCN/user/nodes.html#node-list"
@@ -26286,7 +26286,7 @@
},"3755": {
"doc": "Чворови",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Улога | Опис | . | Клијент | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Клијент мутиран | Receives but doesn’t retransmit | . | Скривени клијент | Like Client Mute, plus hides from node list | . | Рутер | Prioritizes message forwarding; stays awake to relay | . | Рутер са кашњењем | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Трекер | Optimized for position reporting at regular intervals | . | Сензор | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | ТАК Трекер | TAK position reporting only | . | Изгубљено и нађено | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Иконица | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Улога | Опис | . | Клијент | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Клијент мутиран | Receives but doesn’t retransmit | . | Скривени клијент | Like Client Mute, plus hides from node list | . | Рутер | Prioritizes message forwarding; stays awake to relay | . | Рутер са кашњењем | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Трекер | Optimized for position reporting at regular intervals | . | Сензор | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | ТАК Трекер | TAK position reporting only | . | Изгубљено и нађено | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Иконица | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/srp/user/nodes.html#node-list",
"relUrl": "/srp/user/nodes.html#node-list"
@@ -26349,7 +26349,7 @@
},"3764": {
"doc": "ノード",
"title": "ノードリスト",
- "content": "ノードリストには、無線機が受信したすべてのノードが、次の情報とともに表示されます: . | ノード名: ユーザーが設定した正式名称 | 短縮名: 4 文字の識別子 | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | 最後の通信: 最後に通信してからの経過時間 | 距離: 推定距離(位置情報が共有されている場合) | バッテリー: リモートノードのバッテリー残量(テレメトリが有効な場合) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. ノードのステータス表示 . | 指標 | 意味 | . | Green last-heard time | 過去 2 時間以内に受信したノード | . | Plain last-heard time | 2 時間を超えて受信していないノード | . | ⭐ お気に入り | Node you marked as a favorite. | . There is no separate “away” tier. ノードの役割 . ノードには、メッシュ上での動作に影響するさまざまな役割を設定できます: . | 役割 | 説明 | . | クライアント | Standard end-user node | . | クライアント・ベース | お気に入りノードの通信をルーター・レイトの優先度で扱い、それ以外の通信はクライアントとして扱います | . | クライアント・ミュート | 受信しますが、再送信はしません | . | クライアント・非表示 | クライアント・ミュートと同様で、さらにノードリストから隠れます | . | ルーター | メッセージの転送を優先し、中継のために起動し続けます | . | ルーター・レイト | 1 回だけ再送信するインフラノードですが、他のすべてのモードの後にのみ行います(補助的なカバレッジを提供します) | . | ルーター・クライアント | ⚠️ 非推奨(ファームウェア 2.3.15 で削除)。選択できなくなりました。代わりにルーターまたはクライアントを使用してください | . | リピーター | ⚠️ 非推奨(ファームウェア 2.7.11 で削除)。選択できなくなりました。代わりにルーターを使用してください | . | トラッカー | 一定間隔での位置報告に最適化されています | . | センサー | テレメトリ報告に最適化されています | . | TAK | TAK システムと相互運用します(CoT を送受信) | . | TAK Tracker | TAK の位置報告のみ | . | 紛失モード | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . 役割を選ぶ . ほとんどのユーザーは、デフォルトのクライアント役割のままにしてください。 次のような場合は、別の役割を検討してください: . | ルーター: 電源が安定した、固定された高所(屋上、丘の上など)にノードを設置している場合。 ルーターは他のノードのメッセージを中継するために常に起動し続け、メッシュのカバレッジ拡大に不可欠です。 Don’t use Router on battery-powered handheld radios. | ルーター・レイト: パケットを常に 1 回だけ再送信するインフラノードですが、他のすべてのルーティングモードの番が終わった後にのみ行います。 主要なルーターと競合することなく、ローカルのクラスターに補助的なカバレッジを提供します。 | クライアント・ベース: お気に入りノードとの間の通信をルーター・レイトの優先度で扱い(それらのメッセージが追加の中継カバレッジを得られるようにします)、それ以外はすべて通常のクライアントとして処理します。 | クライアント・ミュート: メッシュの通信を受信したいが、中継には貢献したくない場合。 Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). 発信の合間はスリープしてバッテリーを節約します。 | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). 電力プロファイルはトラッカーと同様です。 | TAK/TAK Tracker: ATAK/WinTAK システムと相互運用する場合にのみ必要です。 詳しくは TAK 連携 を参照してください。 | . 💡 ヒント: メッシュは、ほとんどのノードがクライアントまたはルーターのときに最も良く機能します。 Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. 目安としては、地域内のクライアント 5〜10 台につきルーター 1 台です。 . 暗号化の表示 . ノードは、名前の横に暗号化ステータスのアイコンを表示します: . | アイコン | 意味 | . | 🔒 ロック | 通信は PKI(公開鍵基盤)を使用します。本人性が検証された、エンドツーエンドの暗号化です | . | 🔓 ロック解除 | 通信は共有チャンネルの PSK を使用します。暗号化されていますが、本人性は個別には検証されていません | . | ⚠️ 不一致 | 公開鍵の不一致。前回確認時からノードの鍵が変わっています(信頼する前に調べてください) | . 💡 ヒント: PKI 暗号化(ファームウェア 2.5 以降)は、各ノードが固有の鍵ペアを持つため、チャンネル PSK より強力なセキュリティを提供します。 鍵の不一致の警告が表示された場合、そのノードはリセットされたか、侵害された可能性があります。 . To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "ノードリストには、無線機が受信したすべてのノードが、次の情報とともに表示されます: . | ノード名: ユーザーが設定した正式名称 | 短縮名: 4 文字の識別子 | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | 最後の通信: 最後に通信してからの経過時間 | 距離: 推定距離(位置情報が共有されている場合) | バッテリー: リモートノードのバッテリー残量(テレメトリが有効な場合) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. ノードのステータス表示 . | 指標 | 意味 | . | Green last-heard time | 過去 2 時間以内に受信したノード | . | Plain last-heard time | 2 時間を超えて受信していないノード | . | ⭐ お気に入り | Node you marked as a favorite. | . There is no separate “away” tier. ノードの役割 . ノードには、メッシュ上での動作に影響するさまざまな役割を設定できます: . | 役割 | 説明 | . | クライアント | Standard end-user node | . | クライアント・ベース | お気に入りノードの通信をルーター・レイトの優先度で扱い、それ以外の通信はクライアントとして扱います | . | クライアント・ミュート | 受信しますが、再送信はしません | . | クライアント・非表示 | クライアント・ミュートと同様で、さらにノードリストから隠れます | . | ルーター | メッセージの転送を優先し、中継のために起動し続けます | . | ルーター・レイト | 1 回だけ再送信するインフラノードですが、他のすべてのモードの後にのみ行います(補助的なカバレッジを提供します) | . | ルーター・クライアント | ⚠️ 非推奨(ファームウェア 2.3.15 で削除)。選択できなくなりました。代わりにルーターまたはクライアントを使用してください | . | リピーター | ⚠️ 非推奨(ファームウェア 2.7.11 で削除)。選択できなくなりました。代わりにルーターを使用してください | . | トラッカー | 一定間隔での位置報告に最適化されています | . | センサー | テレメトリ報告に最適化されています | . | TAK | TAK システムと相互運用します(CoT を送受信) | . | TAK Tracker | TAK の位置報告のみ | . | 紛失モード | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . 役割を選ぶ . ほとんどのユーザーは、デフォルトのクライアント役割のままにしてください。 次のような場合は、別の役割を検討してください: . | ルーター: 電源が安定した、固定された高所(屋上、丘の上など)にノードを設置している場合。 ルーターは他のノードのメッセージを中継するために常に起動し続け、メッシュのカバレッジ拡大に不可欠です。 Don’t use Router on battery-powered handheld radios. | ルーター・レイト: パケットを常に 1 回だけ再送信するインフラノードですが、他のすべてのルーティングモードの番が終わった後にのみ行います。 主要なルーターと競合することなく、ローカルのクラスターに補助的なカバレッジを提供します。 | クライアント・ベース: お気に入りノードとの間の通信をルーター・レイトの優先度で扱い(それらのメッセージが追加の中継カバレッジを得られるようにします)、それ以外はすべて通常のクライアントとして処理します。 | クライアント・ミュート: メッシュの通信を受信したいが、中継には貢献したくない場合。 Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). 発信の合間はスリープしてバッテリーを節約します。 | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). 電力プロファイルはトラッカーと同様です。 | TAK/TAK Tracker: ATAK/WinTAK システムと相互運用する場合にのみ必要です。 詳しくは TAK 連携 を参照してください。 | . 💡 ヒント: メッシュは、ほとんどのノードがクライアントまたはルーターのときに最も良く機能します。 Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. 目安としては、地域内のクライアント 5〜10 台につきルーター 1 台です。 . 暗号化の表示 . ノードは、名前の横に暗号化ステータスのアイコンを表示します: . | アイコン | 意味 | . | 🔒 ロック | 通信は PKI(公開鍵基盤)を使用します。本人性が検証された、エンドツーエンドの暗号化です | . | 🔓 ロック解除 | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ 不一致 | 公開鍵の不一致。前回確認時からノードの鍵が変わっています(信頼する前に調べてください) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. 鍵の不一致の警告が表示された場合、そのノードはリセットされたか、侵害された可能性があります。 . To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/ja-rJP/user/nodes.html#%E3%83%8E%E3%83%BC%E3%83%89%E3%83%AA%E3%82%B9%E3%83%88",
"relUrl": "/ja-rJP/user/nodes.html#ノードリスト"
@@ -26412,7 +26412,7 @@
},"3773": {
"doc": "節點",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | 角色 | 描述說明 | . | 用戶端 | Standard end-user node | . | 客戶端基礎模式 | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Repeater | Optimized for position reporting at regular intervals | . | 感測器 | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | 角色 | 描述說明 | . | 用戶端 | Standard end-user node | . | 客戶端基礎模式 | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Repeater | Optimized for position reporting at regular intervals | . | 感測器 | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/zh-rTW/user/nodes.html#node-list",
"relUrl": "/zh-rTW/user/nodes.html#node-list"
@@ -26475,7 +26475,7 @@
},"3782": {
"doc": "Uzly",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | Popis | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Senzor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | Popis | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Senzor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/cs-rCZ/user/nodes.html#node-list",
"relUrl": "/cs-rCZ/user/nodes.html#node-list"
@@ -26538,7 +26538,7 @@
},"3791": {
"doc": "Nodes",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Rola | Popis | . | Klient | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Stlmený Klient | Receives but doesn’t retransmit | . | Skrytý Klient | Like Client Mute, plus hides from node list | . | Smerovač | Prioritizes message forwarding; stays awake to relay | . | Smerovač s Oneskorením | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Sledovač | Optimized for position reporting at regular intervals | . | Senzor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Sledovač | TAK position reporting only | . | Straty a nálezy | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Rola | Popis | . | Klient | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Stlmený Klient | Receives but doesn’t retransmit | . | Skrytý Klient | Like Client Mute, plus hides from node list | . | Smerovač | Prioritizes message forwarding; stays awake to relay | . | Smerovač s Oneskorením | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Sledovač | Optimized for position reporting at regular intervals | . | Senzor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Sledovač | TAK position reporting only | . | Straty a nálezy | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/sk-rSK/user/nodes.html#node-list",
"relUrl": "/sk-rSK/user/nodes.html#node-list"
@@ -26601,7 +26601,7 @@
},"3800": {
"doc": "Ноды",
"title": "Список узлов",
- "content": "Список нод показывает все ноды, которые услышало твоё радиоустройство, включая: . | Имя ноды — длинное имя, настроенное пользователем | Короткое имя — 4-символьный идентификатор | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Последнее услышанное — время с последнего общения | Расстояние — предполагаемое расстояние (если позиции общие) | Батарея — уровень заряда батареи удалённой ноды (если включена телеметрия) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Индикаторы состояния ноды . | Индикатор | Значение | . | Green last-heard time | Нода слышна за последние 2 часа | . | Plain last-heard time | Нода не отвечала больше 2 часов | . | ⭐ Избранный | Node you marked as a favorite. | . There is no separate “away” tier. Роли ноды . У нод можно настраивать разные роли, которые влияют на их поведение в сети: . | Роль | Описание | . | Client | Standard end-user node | . | Client Base | Обрабатывает трафик избранных нод как приоритет Router Late; весь остальной трафик как Client | . | Client Mute | Принимает, но не ретранслирует | . | Client Hidden | Как Client Mute, плюс скрыт из списка нод | . | Router | Ставит в приоритет пересылку сообщений; не засыпает чтобы передавать их | . | Router Late | Инфраструктурная нода, которая ретранслирует один раз, но только после всех остальных режимов (обеспечивает дополнительное покрытие) | . | Router Client | ⚠️ Устарело (удалено в прошивке 2.3.15) — больше не выбирается; используй вместо этого Router или Client | . | Repeater | ⚠️ Устарело (удалено в прошивке 2.7.11) — больше не выбирается; используй вместо этого Router | . | Tracker | Оптимизировано для передачи данных о местоположении через регулярные промежутки времени | . | Sensor | Оптимизировано для данных телеметрии | . | Тактический | Взаимодействует с системами TAK (отправляет/принимает CoT) | . | TAK Tracker | Только отчет о позиции TAK | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Выбор роли . Большинству пользователей стоит оставить роль Client по умолчанию. Рассмотри другую роль, когда: . | Router — У тебя есть узел в фиксированном, высоком месте с надежным источником питания (крыша, вершина холма). Router постоянно бодрствуют, чтобы пересылать сообщения для других, и они необходимы для расширения покрытия сети. Don’t use Router on battery-powered handheld radios. | Router Late — инфраструктурная нода, которая всегда пересылает пакеты только один раз, но только после того, как все другие режимы маршрутизации выполнили свои ходы. Обеспечивает дополнительное покрытие для локальных кластеров, не конкурируя с основными роутерами. | Client Base — обрабатывает трафик от/к вашим избранным нодам с приоритетом Router Late (обеспечивая этим сообщениям дополнительное ретранслирование), а всё остальное обрабатывает как обычный Client. | Client Mute — хочешь принимать трафик сети, но не участвовать в его ретрансляции. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Спит между передачами для экономии батареи. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Похожий профиль мощности на Tracker. | TAK / TAK Tracker — нужно только если работать с системами ATAK/WinTAK. Смотри Интеграция TAK для подробностей. | . 💡 Совет: Сеть работает лучше, когда большинство нод Client или Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. Хорошее практическое правило: один роутер на 5–10 клиентов в вашей зоне. Индикаторы шифрования . У нод рядом с именем отображаются значки статуса шифрования: . | Значок | Значение | . | 🔒 Заблокировано | Связь использует PKI (инфраструктуру публичных ключей) — сквозное шифрование с проверкой идентичности | . | 🔓 Разблокировано | Связь использует общий канал PSK — зашифровано, но личность не проверяется индивидуально | . | ⚠️ Несовпадение | Несовпадение открытого ключа — ключ ноды изменился с последнего раза (разберитесь, прежде чем доверять) | . 💡 Совет: Шифрование PKI (прошивка 2.5+) обеспечивает более надёжную защиту, чем общий PSK для канала, потому что у каждой ноды есть уникальная пара ключей. Если видишь предупреждение о несоответствии ключа, нода могла быть сброшена или скомпрометирована. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "Список нод показывает все ноды, которые услышало твоё радиоустройство, включая: . | Имя ноды — длинное имя, настроенное пользователем | Короткое имя — 4-символьный идентификатор | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Последнее услышанное — время с последнего общения | Расстояние — предполагаемое расстояние (если позиции общие) | Батарея — уровень заряда батареи удалённой ноды (если включена телеметрия) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Индикаторы состояния ноды . | Индикатор | Значение | . | Green last-heard time | Нода слышна за последние 2 часа | . | Plain last-heard time | Нода не отвечала больше 2 часов | . | ⭐ Избранный | Node you marked as a favorite. | . There is no separate “away” tier. Роли ноды . У нод можно настраивать разные роли, которые влияют на их поведение в сети: . | Роль | Описание | . | Client | Standard end-user node | . | Client Base | Обрабатывает трафик избранных нод как приоритет Router Late; весь остальной трафик как Client | . | Client Mute | Принимает, но не ретранслирует | . | Client Hidden | Как Client Mute, плюс скрыт из списка нод | . | Router | Ставит в приоритет пересылку сообщений; не засыпает чтобы передавать их | . | Router Late | Инфраструктурная нода, которая ретранслирует один раз, но только после всех остальных режимов (обеспечивает дополнительное покрытие) | . | Router Client | ⚠️ Устарело (удалено в прошивке 2.3.15) — больше не выбирается; используй вместо этого Router или Client | . | Repeater | ⚠️ Устарело (удалено в прошивке 2.7.11) — больше не выбирается; используй вместо этого Router | . | Tracker | Оптимизировано для передачи данных о местоположении через регулярные промежутки времени | . | Sensor | Оптимизировано для данных телеметрии | . | Тактический | Взаимодействует с системами TAK (отправляет/принимает CoT) | . | TAK Tracker | Только отчет о позиции TAK | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Выбор роли . Большинству пользователей стоит оставить роль Client по умолчанию. Рассмотри другую роль, когда: . | Router — У тебя есть узел в фиксированном, высоком месте с надежным источником питания (крыша, вершина холма). Router постоянно бодрствуют, чтобы пересылать сообщения для других, и они необходимы для расширения покрытия сети. Don’t use Router on battery-powered handheld radios. | Router Late — инфраструктурная нода, которая всегда пересылает пакеты только один раз, но только после того, как все другие режимы маршрутизации выполнили свои ходы. Обеспечивает дополнительное покрытие для локальных кластеров, не конкурируя с основными роутерами. | Client Base — обрабатывает трафик от/к вашим избранным нодам с приоритетом Router Late (обеспечивая этим сообщениям дополнительное ретранслирование), а всё остальное обрабатывает как обычный Client. | Client Mute — хочешь принимать трафик сети, но не участвовать в его ретрансляции. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Спит между передачами для экономии батареи. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Похожий профиль мощности на Tracker. | TAK / TAK Tracker — нужно только если работать с системами ATAK/WinTAK. Смотри Интеграция TAK для подробностей. | . 💡 Совет: Сеть работает лучше, когда большинство нод Client или Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. Хорошее практическое правило: один роутер на 5–10 клиентов в вашей зоне. Индикаторы шифрования . У нод рядом с именем отображаются значки статуса шифрования: . | Значок | Значение | . | 🔒 Заблокировано | Связь использует PKI (инфраструктуру публичных ключей) — сквозное шифрование с проверкой идентичности | . | 🔓 Разблокировано | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Несовпадение | Несовпадение открытого ключа — ключ ноды изменился с последнего раза (разберитесь, прежде чем доверять) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. Если видишь предупреждение о несоответствии ключа, нода могла быть сброшена или скомпрометирована. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/ru-rRU/user/nodes.html#%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA-%D1%83%D0%B7%D0%BB%D0%BE%D0%B2",
"relUrl": "/ru-rRU/user/nodes.html#список-узлов"
@@ -26664,7 +26664,7 @@
},"3809": {
"doc": "Laitteet",
"title": "Radiolista",
- "content": "Radioluettelo näyttää kaikki radiot, joista radiosi on vastaanottanut tietoja, mukaan lukien: . | Radion nimi — käyttäjän määrittämä pitkä nimi | Lyhyt nimi — 4-merkkinen tunniste | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Viimeksi kuultu — aika viimeisimmästä yhteydestä | Etäisyys — arvioitu etäisyys (jos sijaintitiedot jaetaan) | Akku — etäradion akun varaustaso (jos telemetria on käytössä) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Radion tilailmaisimet . | Ilmaisin | Tarkoitus | . | Green last-heard time | Radio kuultu viimeisen 2 tunnin aikana | . | Plain last-heard time | Radiosta ei ole kuultu yli 2 tuntiin | . | ⭐ Suosikki | Radio, jonka olet merkinnyt suosikiksi. | . Erillistä “poissa”-tilaa ei ole. Radion roolit . Radioille voidaan määrittää erilaisia rooleja, jotka vaikuttavat niiden toimintaan verkossa: . | Rooli | Kuvaus | . | Client | Tavallinen käyttäjäradio | . | Client Base | Käsittelee suosikkiradioiden liikenteen Router Late -prioriteetilla, kaiken muun liikenteen Client -prioriteetilla | . | Client Mute | Vastaanottaa viestejä, mutta ei lähetä niitä edelleen | . | Client Hidden | Kuten Client Mute, mutta piilotetaan myös radioluettelosta | . | Router | Priorisoi viestien välittämistä; pysyy hereillä välittääkseen viestejä | . | Router Late | Infrastruktuuriradio, joka lähettää viestin uudelleen kerran, mutta vasta kaikkien muiden tilojen jälkeen (tarjoaa lisäpeittoa) | . | Router Client | ⚠️ Vanhentunut (poistettu laiteohjelmistossa 2.3.15) — ei enää valittavissa; käytä sen sijaan Router- tai Client-roolia | . | Repeater | ⚠️ Vanhentunut (poistettu laiteohjelmistossa 2.7.11) — ei enää valittavissa; käytä sen sijaan Router-roolia | . | Tracker | Optimoitu sijainnin raportointiin säännöllisin väliajoin | . | Sensor | Optimoitu telemetrian raportointiin | . | TAK | Yhteensopiva TAK-järjestelmien kanssa (lähettää ja vastaanottaa CoT-viestejä) | . | TAK Tracker | Vain TAK-sijainnin raportointi | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Roolin valitseminen . Useimpien käyttäjien kannattaa käyttää oletusarvoista Client-roolia. Harkitse muuta roolia seuraavissa tilanteissa: . | Router — Sinulla on radio kiinteässä, korkealla sijaitsevassa paikassa, jossa on luotettava virransyöttö (katto, mäki). Routerit pysyvät jatkuvasti hereillä välittääkseen muiden viestejä ja ovat tärkeitä verkon peittoalueen laajentamisessa. Älä käytä Reititin-roolia akkukäyttöisissä käsiradioissa. | Router Late — Infrastruktuuriradio, joka lähettää paketit uudelleen kerran, mutta vasta kaikkien muiden reititystilojen jälkeen. Tarjoaa lisäpeittoa paikallisille ryhmille kilpailematta ensisijaisten Routerien kanssa. | Client Base — Käsittelee suosikkiradioihisi menevän tai niistä tulevan liikenteen Router Late -prioriteetilla (varmistaen näille viesteille ylimääräisen välityspeiton), samalla kun kaikki muu käsitellään tavallisen Client-roolin tavoin. | Client Mute — Voit vastaanottaa verkkoliikennettä, mutta et osallistu viestien välittämiseen. Hyödyllinen vain kuunteluun tarkoitetuissa radioissa tai ruuhkan vähentämiseen tiheillä alueilla. | Tracker “seurantalaite” — miehittämätön radio, jonka ainoa tehtävä on lähettää GPS-sijaintiaan (esimerkiksi ajoneuvo, henkilö tai muu kohde). Nukkuu lähetysten välillä akun säästämiseksi. | Anturi — miehittämätön radio, joka lähettää ympäristötelemetriaa (lämpötila, ilmankosteus, ilmanlaatu). Samanlainen virrankulutusprofiili kuin Tracker-roolissa. | TAK / TAK Tracker — Tarvitaan vain yhteensopivuuteen ATAK-/WinTAK-järjestelmien kanssa. Katso TAK-integraatio lisätietoja varten. | . 💡 Vinkki: Verkko toimii parhaiten, kun suurin osa radioista käyttää Client- tai Router-roolia. Liian suuri määrä Client Mute (mykistetty) -radioita heikentää mesh-verkon vikasietoisuutta. Liian useat Router -roolin radiot tiheällä alueella voivat aiheuttaa ruuhkaa. Hyvä nyrkkisääntö on yksi Router jokaista 5–10 Client-roolia kohden alueellasi. Salausilmaisimet . Radiot näyttävät nimensä vieressä salauksen tilaa kuvaavat kuvakkeet: . | Kuvake | Merkitys | . | 🔒 Lukittu | Yhteys käyttää PKI:tä (julkisen avaimen infrastruktuuria) — päästä päähän salattu ja varmennetulla identiteetillä suojattu. | . | 🔓 Lukitsematon | Yhteys käyttää PKI:tä (julkisen avaimen infrastruktuuria) — päästä päähän salattu ja varmennetulla identiteetillä suojattu. | . | ⚠️ Ei täsmää | Julkinen avain ei täsmää — radion avain on muuttunut viime näkemän jälkeen (tutki ennen luottamista). | . 💡 Vinkki: PKI-salaus (laiteohjelmisto 2.5+) tarjoaa vahvemman suojauksen kuin kanavan PSK-avain, koska jokaisella radiolla on oma yksilöllinen avainparinsa. Jos näet avaimen täsmäämättömyysvaroituksen, radio on voitu nollata tai sen tietoturva on voinut vaarantua. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "Radioluettelo näyttää kaikki radiot, joista radiosi on vastaanottanut tietoja, mukaan lukien: . | Radion nimi — käyttäjän määrittämä pitkä nimi | Lyhyt nimi — 4-merkkinen tunniste | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Viimeksi kuultu — aika viimeisimmästä yhteydestä | Etäisyys — arvioitu etäisyys (jos sijaintitiedot jaetaan) | Akku — etäradion akun varaustaso (jos telemetria on käytössä) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Radion tilailmaisimet . | Ilmaisin | Tarkoitus | . | Green last-heard time | Radio kuultu viimeisen 2 tunnin aikana | . | Plain last-heard time | Radiosta ei ole kuultu yli 2 tuntiin | . | ⭐ Suosikki | Radio, jonka olet merkinnyt suosikiksi. | . Erillistä “poissa”-tilaa ei ole. Radion roolit . Radioille voidaan määrittää erilaisia rooleja, jotka vaikuttavat niiden toimintaan verkossa: . | Rooli | Kuvaus | . | Client | Tavallinen käyttäjäradio | . | Client Base | Käsittelee suosikkiradioiden liikenteen Router Late -prioriteetilla, kaiken muun liikenteen Client -prioriteetilla | . | Client Mute | Vastaanottaa viestejä, mutta ei lähetä niitä edelleen | . | Client Hidden | Kuten Client Mute, mutta piilotetaan myös radioluettelosta | . | Router | Priorisoi viestien välittämistä; pysyy hereillä välittääkseen viestejä | . | Router Late | Infrastruktuuriradio, joka lähettää viestin uudelleen kerran, mutta vasta kaikkien muiden tilojen jälkeen (tarjoaa lisäpeittoa) | . | Router Client | ⚠️ Vanhentunut (poistettu laiteohjelmistossa 2.3.15) — ei enää valittavissa; käytä sen sijaan Router- tai Client-roolia | . | Repeater | ⚠️ Vanhentunut (poistettu laiteohjelmistossa 2.7.11) — ei enää valittavissa; käytä sen sijaan Router-roolia | . | Tracker | Optimoitu sijainnin raportointiin säännöllisin väliajoin | . | Sensor | Optimoitu telemetrian raportointiin | . | TAK | Yhteensopiva TAK-järjestelmien kanssa (lähettää ja vastaanottaa CoT-viestejä) | . | TAK Tracker | Vain TAK-sijainnin raportointi | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Roolin valitseminen . Useimpien käyttäjien kannattaa käyttää oletusarvoista Client-roolia. Harkitse muuta roolia seuraavissa tilanteissa: . | Router — Sinulla on radio kiinteässä, korkealla sijaitsevassa paikassa, jossa on luotettava virransyöttö (katto, mäki). Routerit pysyvät jatkuvasti hereillä välittääkseen muiden viestejä ja ovat tärkeitä verkon peittoalueen laajentamisessa. Älä käytä Reititin-roolia akkukäyttöisissä käsiradioissa. | Router Late — Infrastruktuuriradio, joka lähettää paketit uudelleen kerran, mutta vasta kaikkien muiden reititystilojen jälkeen. Tarjoaa lisäpeittoa paikallisille ryhmille kilpailematta ensisijaisten Routerien kanssa. | Client Base — Käsittelee suosikkiradioihisi menevän tai niistä tulevan liikenteen Router Late -prioriteetilla (varmistaen näille viesteille ylimääräisen välityspeiton), samalla kun kaikki muu käsitellään tavallisen Client-roolin tavoin. | Client Mute — Voit vastaanottaa verkkoliikennettä, mutta et osallistu viestien välittämiseen. Hyödyllinen vain kuunteluun tarkoitetuissa radioissa tai ruuhkan vähentämiseen tiheillä alueilla. | Tracker “seurantalaite” — miehittämätön radio, jonka ainoa tehtävä on lähettää GPS-sijaintiaan (esimerkiksi ajoneuvo, henkilö tai muu kohde). Nukkuu lähetysten välillä akun säästämiseksi. | Anturi — miehittämätön radio, joka lähettää ympäristötelemetriaa (lämpötila, ilmankosteus, ilmanlaatu). Samanlainen virrankulutusprofiili kuin Tracker-roolissa. | TAK / TAK Tracker — Tarvitaan vain yhteensopivuuteen ATAK-/WinTAK-järjestelmien kanssa. Katso TAK-integraatio lisätietoja varten. | . 💡 Vinkki: Verkko toimii parhaiten, kun suurin osa radioista käyttää Client- tai Router-roolia. Liian suuri määrä Client Mute (mykistetty) -radioita heikentää mesh-verkon vikasietoisuutta. Liian useat Router -roolin radiot tiheällä alueella voivat aiheuttaa ruuhkaa. Hyvä nyrkkisääntö on yksi Router jokaista 5–10 Client-roolia kohden alueellasi. Salausilmaisimet . Radiot näyttävät nimensä vieressä salauksen tilaa kuvaavat kuvakkeet: . | Kuvake | Merkitys | . | 🔒 Lukittu | Yhteys käyttää PKI:tä (julkisen avaimen infrastruktuuria) — päästä päähän salattu ja varmennetulla identiteetillä suojattu. | . | 🔓 Lukitsematon | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Ei täsmää | Julkinen avain ei täsmää — radion avain on muuttunut viime näkemän jälkeen (tutki ennen luottamista). | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. Jos näet avaimen täsmäämättömyysvaroituksen, radio on voitu nollata tai sen tietoturva on voinut vaarantua. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/fi-rFI/user/nodes.html#radiolista",
"relUrl": "/fi-rFI/user/nodes.html#radiolista"
@@ -26727,7 +26727,7 @@
},"3818": {
"doc": "Nodelar",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Rol | Açıklaması | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Rol | Açıklaması | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/tr-rTR/user/nodes.html#node-list",
"relUrl": "/tr-rTR/user/nodes.html#node-list"
@@ -26790,7 +26790,7 @@
},"3827": {
"doc": "Noduri",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | Descriere | . | Client | Standard end-user node | . | Client bază | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client mut | Receives but doesn’t retransmit | . | Client ascuns | Like Client Mute, plus hides from node list | . | Ruter | Prioritizes message forwarding; stays awake to relay | . | Ruter cu întârziere | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Senzor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | Tracker TAK | TAK position reporting only | . | Pierdut și găsit | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | Descriere | . | Client | Standard end-user node | . | Client bază | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client mut | Receives but doesn’t retransmit | . | Client ascuns | Like Client Mute, plus hides from node list | . | Ruter | Prioritizes message forwarding; stays awake to relay | . | Ruter cu întârziere | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Senzor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | Tracker TAK | TAK position reporting only | . | Pierdut și găsit | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/ro-rRO/user/nodes.html#node-list",
"relUrl": "/ro-rRO/user/nodes.html#node-list"
@@ -26853,7 +26853,7 @@
},"3836": {
"doc": "Nodes",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | Opis | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | Opis | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/sl-rSI/user/nodes.html#node-list",
"relUrl": "/sl-rSI/user/nodes.html#node-list"
@@ -26916,7 +26916,7 @@
},"3845": {
"doc": "Nodes",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Papel | Descrição | . | Cliente | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Cliente silenciado | Receives but doesn’t retransmit | . | Cliente oculto | Like Client Mute, plus hides from node list | . | Roteador | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Monitor | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK — ‘Kit’ de Consciencialização da Equipa | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Perdidos e Achados | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Papel | Descrição | . | Cliente | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Cliente silenciado | Receives but doesn’t retransmit | . | Cliente oculto | Like Client Mute, plus hides from node list | . | Roteador | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Monitor | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK — ‘Kit’ de Consciencialização da Equipa | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Perdidos e Achados | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/pt-rPT/user/nodes.html#node-list",
"relUrl": "/pt-rPT/user/nodes.html#node-list"
@@ -26979,7 +26979,7 @@
},"3854": {
"doc": "Nodes",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | Beskrivelse | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | Beskrivelse | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/no-rNO/user/nodes.html#node-list",
"relUrl": "/no-rNO/user/nodes.html#node-list"
@@ -27042,7 +27042,7 @@
},"3863": {
"doc": "Sõlmed",
"title": "Sõlmede loend",
- "content": "Sõlmede loend näitab kõiki sõlmi, mida raadio on kuulnud, sealhulgas: . | Sõlme nimi — kasutaja pandud pikk nimi | Lühinimi — 4-tähemärgiline identifikaator | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Vahemaa — hinnanguline vahemaa (kui asukohta jagatakse) | Aku — kaugsõlme aku tase (kui telemeetria on lubatud) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Sõlme oleku indikaatorid . | Indicator | Tähendus | . | Green last-heard time | Viimase 2 tunni jooksul kuuldud sõlm | . | Plain last-heard time | Viimase 2 tunni jooksul kuuldud sõlm | . | ⭐ Lemmik | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Sõlmedele saab määrata erinevaid rolle, mis mõjutavad nende kärgvõrgus käitumist: . | Roll | Kirjeldus | . | Klient | Standard end-user node | . | Klient-baas | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Vaikne klient | Receives but doesn’t retransmit | . | Peidetud klient | Like Client Mute, plus hides from node list | . | Ruuter | Prioriseerib sõnumi edastamist; jääb edastamiseks ärkvele | . | Hiline ruuter | Infrastruktuurisõlm, mis levitab signaali ühe korra, kuid alles pärast kõiki teisi režiime (pakub täiendavat leviala) | . | Ruuteri klient | ⚠️ Vananenud (eemaldatud püsivara versioonis 2.3.15) — enam mitte valitav; kasuta hoopis ruuterint või kliendina | . | Repiiter | ⚠️ Vananenud (eemaldatud püsivara versioonis 2.7.11) — enam mitte valitav; kasuta hoopis ruuterina | . | Jälgitav | Optimized for position reporting at regular intervals | . | Andur | Optimized for telemetry reporting | . | TAK | Ühildub TAK süsteemidega (saadab/võtab vastu CoT) | . | Jälgitav TAK | Ainult TAK asukoha aruandlus | . | Kaotud ja leitud | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Ruuter — Teil on sõlm fikseeritud, kõrgemal asuvas asukohas, millel on usaldusväärne toide (katusel, mäetipul). Ruuterid püsivad pidevalt ärkvel, et vahendada teistele sõnumeid ja on võrguühenduse laiendamiseks hädavajalikud. Don’t use Router on battery-powered handheld radios. | Ruuter hiline – infrastruktuurisõlm, mis levitab pakette alati üks kord uuesti, aga alles pärast seda, kui kõik teised marsruutimisrežiimid on oma käigu teinud. Provides supplemental coverage for local clusters without competing with primary routers. | Baas klient – käsitleb lemmiksõlmedesse suunduvat ja sealt tulevaid liiklusi ruuteri hilinemise prioriteediga (tagades, et need sõnumid saavad täiendava edastuskatte), samal ajal kui kõike muud käsitletakse tavalise kliendina. | Kliendi vaigistatud — Soovid vastu võtta võrguliiklust, aga mitte edastamisse panustada. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Aku säästmiseks magab saadete vahel. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Sarnane võimsusprofiil jälgimisseadmele. | TAK / TAK jälgimisseade — Vajalik ainult ATAK/WinTAK süsteemidega koostööl. Üksikasjade saamiseks vaata TAK integratsioon. | . 💡 Vihje: Kärgvõrk töötab kõige paremini, kui enamik sõlmi on klient või ruuter. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Sõlmed kuvavad oma nime kõrval krüpteerimisoleku ikoone: . | Ikoon | Tähendus | . | 🔒 Lukustatud | Suhtlus kasutab PKI-d (avaliku võtme infrastruktuuri) – otsast lõpuni krüpteeritud kontrollitud identiteediga | . | 🔓 Lukust lahti | Suhtlus kasutab jagatud kanali PSK – krüpteeritud, kuid isikut pole individuaalselt kontrollitud | . | ⚠️ Ebakõla | Avaliku võtme mittevastavus — sõlme võti on viimasest nägemisest saadik muutunud (enne usaldamist uuri) | . 💡 Vihje: PKI krüpteering (püsivara 2,5+) pakub tugevamat turvalisust kui kanali PSK, kuna igal sõlmel on unikaalne võtmepaar. Kui näed võtme mittevastavuse hoiatust, võib sõlm olla lähtestatud või ohustatud. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "Sõlmede loend näitab kõiki sõlmi, mida raadio on kuulnud, sealhulgas: . | Sõlme nimi — kasutaja pandud pikk nimi | Lühinimi — 4-tähemärgiline identifikaator | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Vahemaa — hinnanguline vahemaa (kui asukohta jagatakse) | Aku — kaugsõlme aku tase (kui telemeetria on lubatud) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Sõlme oleku indikaatorid . | Indicator | Tähendus | . | Green last-heard time | Viimase 2 tunni jooksul kuuldud sõlm | . | Plain last-heard time | Viimase 2 tunni jooksul kuuldud sõlm | . | ⭐ Lemmik | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Sõlmedele saab määrata erinevaid rolle, mis mõjutavad nende kärgvõrgus käitumist: . | Roll | Kirjeldus | . | Klient | Standard end-user node | . | Klient-baas | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Vaikne klient | Receives but doesn’t retransmit | . | Peidetud klient | Like Client Mute, plus hides from node list | . | Ruuter | Prioriseerib sõnumi edastamist; jääb edastamiseks ärkvele | . | Hiline ruuter | Infrastruktuurisõlm, mis levitab signaali ühe korra, kuid alles pärast kõiki teisi režiime (pakub täiendavat leviala) | . | Ruuteri klient | ⚠️ Vananenud (eemaldatud püsivara versioonis 2.3.15) — enam mitte valitav; kasuta hoopis ruuterint või kliendina | . | Repiiter | ⚠️ Vananenud (eemaldatud püsivara versioonis 2.7.11) — enam mitte valitav; kasuta hoopis ruuterina | . | Jälgitav | Optimized for position reporting at regular intervals | . | Andur | Optimized for telemetry reporting | . | TAK | Ühildub TAK süsteemidega (saadab/võtab vastu CoT) | . | Jälgitav TAK | Ainult TAK asukoha aruandlus | . | Kaotud ja leitud | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Ruuter — Teil on sõlm fikseeritud, kõrgemal asuvas asukohas, millel on usaldusväärne toide (katusel, mäetipul). Ruuterid püsivad pidevalt ärkvel, et vahendada teistele sõnumeid ja on võrguühenduse laiendamiseks hädavajalikud. Don’t use Router on battery-powered handheld radios. | Ruuter hiline – infrastruktuurisõlm, mis levitab pakette alati üks kord uuesti, aga alles pärast seda, kui kõik teised marsruutimisrežiimid on oma käigu teinud. Provides supplemental coverage for local clusters without competing with primary routers. | Baas klient – käsitleb lemmiksõlmedesse suunduvat ja sealt tulevaid liiklusi ruuteri hilinemise prioriteediga (tagades, et need sõnumid saavad täiendava edastuskatte), samal ajal kui kõike muud käsitletakse tavalise kliendina. | Kliendi vaigistatud — Soovid vastu võtta võrguliiklust, aga mitte edastamisse panustada. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Aku säästmiseks magab saadete vahel. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Sarnane võimsusprofiil jälgimisseadmele. | TAK / TAK jälgimisseade — Vajalik ainult ATAK/WinTAK süsteemidega koostööl. Üksikasjade saamiseks vaata TAK integratsioon. | . 💡 Vihje: Kärgvõrk töötab kõige paremini, kui enamik sõlmi on klient või ruuter. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Sõlmed kuvavad oma nime kõrval krüpteerimisoleku ikoone: . | Ikoon | Tähendus | . | 🔒 Lukustatud | Suhtlus kasutab PKI-d (avaliku võtme infrastruktuuri) – otsast lõpuni krüpteeritud kontrollitud identiteediga | . | 🔓 Lukust lahti | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Ebakõla | Avaliku võtme mittevastavus — sõlme võti on viimasest nägemisest saadik muutunud (enne usaldamist uuri) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. Kui näed võtme mittevastavuse hoiatust, võib sõlm olla lähtestatud või ohustatud. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/et-rEE/user/nodes.html#s%C3%B5lmede-loend",
"relUrl": "/et-rEE/user/nodes.html#sõlmede-loend"
@@ -27105,7 +27105,7 @@
},"3872": {
"doc": "노드",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | 역할 | 설명 | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | 역할 | 설명 | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/ko-rKR/user/nodes.html#node-list",
"relUrl": "/ko-rKR/user/nodes.html#node-list"
@@ -27168,7 +27168,7 @@
},"3881": {
"doc": "Nœuds",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Rôle | Description | . | Client | Standard end-user node | . | Base Client | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client muet | Receives but doesn’t retransmit | . | Client masqué | Like Client Mute, plus hides from node list | . | Routeur | Prioritizes message forwarding; stays awake to relay | . | Routeur avec retard | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Traqueur | Optimized for position reporting at regular intervals | . | Capteur | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | Traqueur TAK | TAK position reporting only | . | Objets trouvés | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Rôle | Description | . | Client | Standard end-user node | . | Base Client | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client muet | Receives but doesn’t retransmit | . | Client masqué | Like Client Mute, plus hides from node list | . | Routeur | Prioritizes message forwarding; stays awake to relay | . | Routeur avec retard | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Traqueur | Optimized for position reporting at regular intervals | . | Capteur | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | Traqueur TAK | TAK position reporting only | . | Objets trouvés | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/fr-rFR/user/nodes.html#node-list",
"relUrl": "/fr-rFR/user/nodes.html#node-list"
@@ -27231,7 +27231,7 @@
},"3890": {
"doc": "Nodes",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | Descrición | . | Cliente | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | Descrición | . | Cliente | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/gl-rES/user/nodes.html#node-list",
"relUrl": "/gl-rES/user/nodes.html#node-list"
@@ -27294,7 +27294,7 @@
},"3899": {
"doc": "Nodi",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Ruolo | Descrizione | . | Client | Standard end-user node | . | Base Client | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Nascosto | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensore | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Oggetti Smarriti | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Ruolo | Descrizione | . | Client | Standard end-user node | . | Base Client | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Nascosto | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensore | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Oggetti Smarriti | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/it-rIT/user/nodes.html#node-list",
"relUrl": "/it-rIT/user/nodes.html#node-list"
@@ -27357,7 +27357,7 @@
},"3908": {
"doc": "Nodes",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | Апісанне | . | CLIENT | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | CLIENT MUTE | Receives but doesn’t retransmit | . | CLIENT HIDDEN | Like Client Mute, plus hides from node list | . | ROUTER | Prioritizes message forwarding; stays awake to relay | . | ROUTER LATE | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | TRACKER | Optimized for position reporting at regular intervals | . | SENSOR | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK TRACKER | TAK position reporting only | . | LOST AND FOUND | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | Апісанне | . | CLIENT | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | CLIENT MUTE | Receives but doesn’t retransmit | . | CLIENT HIDDEN | Like Client Mute, plus hides from node list | . | ROUTER | Prioritizes message forwarding; stays awake to relay | . | ROUTER LATE | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | TRACKER | Optimized for position reporting at regular intervals | . | SENSOR | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK TRACKER | TAK position reporting only | . | LOST AND FOUND | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/be-rBY/user/nodes.html#node-list",
"relUrl": "/be-rBY/user/nodes.html#node-list"
@@ -27420,7 +27420,7 @@
},"3917": {
"doc": "Nodes",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | Përshkrimi | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | Përshkrimi | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/sq-rAL/user/nodes.html#node-list",
"relUrl": "/sq-rAL/user/nodes.html#node-list"
@@ -27483,7 +27483,7 @@
},"3926": {
"doc": "Nodos",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Rol | Descripción | . | Cliente | Standard end-user node | . | Base cliente | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Cliente silenciado | Receives but doesn’t retransmit | . | Cliente oculto | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Rastreador | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | Rastreador TAK | TAK position reporting only | . | Perdido y encontrado | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Rol | Descripción | . | Cliente | Standard end-user node | . | Base cliente | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Cliente silenciado | Receives but doesn’t retransmit | . | Cliente oculto | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Rastreador | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | Rastreador TAK | TAK position reporting only | . | Perdido y encontrado | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/es-rES/user/nodes.html#node-list",
"relUrl": "/es-rES/user/nodes.html#node-list"
@@ -27546,7 +27546,7 @@
},"3935": {
"doc": "Csomópontok",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Szerepkör | Leírás | . | Kliens | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Néma Kliens | Receives but doesn’t retransmit | . | Rejtett Kliens | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Késő Router | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Szenzor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Elveszett és Megkerült | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Szerepkör | Leírás | . | Kliens | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Néma Kliens | Receives but doesn’t retransmit | . | Rejtett Kliens | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Késő Router | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Szenzor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Elveszett és Megkerült | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/hu-rHU/user/nodes.html#node-list",
"relUrl": "/hu-rHU/user/nodes.html#node-list"
@@ -27609,7 +27609,7 @@
},"3944": {
"doc": "Възли",
"title": "Списък с възли",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Роля | Описание | . | Клиент | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Скрит клиент | Like Client Mute, plus hides from node list | . | Рутер | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Тракер | Optimized for position reporting at regular intervals | . | Сензор | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Загубено и намерено | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Роля | Описание | . | Клиент | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Скрит клиент | Like Client Mute, plus hides from node list | . | Рутер | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Тракер | Optimized for position reporting at regular intervals | . | Сензор | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Загубено и намерено | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/bg-rBG/user/nodes.html#%D1%81%D0%BF%D0%B8%D1%81%D1%8A%D0%BA-%D1%81-%D0%B2%D1%8A%D0%B7%D0%BB%D0%B8",
"relUrl": "/bg-rBG/user/nodes.html#списък-с-възли"
@@ -27672,7 +27672,7 @@
},"3953": {
"doc": "Nœuds",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Rôle | Description | . | Client | Standard end-user node | . | Base Client | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client muet | Receives but doesn’t retransmit | . | Client masqué | Like Client Mute, plus hides from node list | . | Routeur | Prioritizes message forwarding; stays awake to relay | . | Routeur avec retard | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Traqueur | Optimized for position reporting at regular intervals | . | Capteur | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | Traqueur TAK | TAK position reporting only | . | Objets trouvés | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Rôle | Description | . | Client | Standard end-user node | . | Base Client | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client muet | Receives but doesn’t retransmit | . | Client masqué | Like Client Mute, plus hides from node list | . | Routeur | Prioritizes message forwarding; stays awake to relay | . | Routeur avec retard | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Traqueur | Optimized for position reporting at regular intervals | . | Capteur | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | Traqueur TAK | TAK position reporting only | . | Objets trouvés | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/fr-rCA/user/nodes.html#node-list",
"relUrl": "/fr-rCA/user/nodes.html#node-list"
@@ -27735,7 +27735,7 @@
},"3962": {
"doc": "Nodes",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | Opis | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | Opis | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/hr-rHR/user/nodes.html#node-list",
"relUrl": "/hr-rHR/user/nodes.html#node-list"
@@ -27798,7 +27798,7 @@
},"3971": {
"doc": "Nodes",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | Περιγραφή | . | Client | Standard end-user node | . | Πελάτης Βάση | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | Περιγραφή | . | Client | Standard end-user node | . | Πελάτης Βάση | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/el-rGR/user/nodes.html#node-list",
"relUrl": "/el-rGR/user/nodes.html#node-list"
@@ -27861,7 +27861,7 @@
},"3980": {
"doc": "Nodes",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | الوصف | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | الوصف | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/ar-rSA/user/nodes.html#node-list",
"relUrl": "/ar-rSA/user/nodes.html#node-list"
@@ -27924,7 +27924,7 @@
},"3989": {
"doc": "Nós",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Função | Descrição | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Função | Descrição | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/pt-rBR/user/nodes.html#node-list",
"relUrl": "/pt-rBR/user/nodes.html#node-list"
@@ -27987,7 +27987,7 @@
},"3998": {
"doc": "Nodes",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | Deskripsyon | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | Deskripsyon | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/ht-rHT/user/nodes.html#node-list",
"relUrl": "/ht-rHT/user/nodes.html#node-list"
@@ -28050,7 +28050,7 @@
},"4007": {
"doc": "Вузли",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Роль | Опис | . | Клієнт | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Трекер | Optimized for position reporting at regular intervals | . | Датчик | Optimized for telemetry reporting | . | ТАК | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Loast and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Роль | Опис | . | Клієнт | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Трекер | Optimized for position reporting at regular intervals | . | Датчик | Optimized for telemetry reporting | . | ТАК | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Loast and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/uk-rUA/user/nodes.html#node-list",
"relUrl": "/uk-rUA/user/nodes.html#node-list"
@@ -28113,7 +28113,7 @@
},"4016": {
"doc": "Nodes",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | Lýsing | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | Lýsing | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/is-rIS/user/nodes.html#node-list",
"relUrl": "/is-rIS/user/nodes.html#node-list"
@@ -28176,7 +28176,7 @@
},"4025": {
"doc": "Nodes",
"title": "Node List",
- "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | תיאור | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
+ "content": "The node list shows every node your radio has heard, including: . | Node name — user-configured long name | Short name — 4-character identifier | Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither | Last heard — time since last communication | Distance — estimated distance (if positions are shared) | Battery — remote node battery level (if telemetry is enabled) | . Choosing What the List Shows . The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen. Node Status Indicators . | Indicator | Meaning | . | Green last-heard time | Node heard within the last 2 hours | . | Plain last-heard time | Node not heard for over 2 hours | . | ⭐ Favorite | Node you marked as a favorite. | . There is no separate “away” tier. Node Roles . Nodes can be configured with different roles that affect their mesh behavior: . | Role | תיאור | . | Client | Standard end-user node | . | Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | . | Client Mute | Receives but doesn’t retransmit | . | Client Hidden | Like Client Mute, plus hides from node list | . | Router | Prioritizes message forwarding; stays awake to relay | . | Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | . | Router Client | ⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | . | Repeater | ⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead | . | Tracker | Optimized for position reporting at regular intervals | . | Sensor | Optimized for telemetry reporting | . | TAK | Interoperates with TAK systems (sends/receives CoT) | . | TAK Tracker | TAK position reporting only | . | Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio | . Choosing a Role . Most users should keep the default Client role. Consider a different role when: . | Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios. | Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. | Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. | Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas. | Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. | Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. | TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details. | . 💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. Encryption Indicators . Nodes display encryption status icons next to their name: . | Icon | Meaning | . | 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | . | 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one | . | ⚠️ Mismatch | Public key mismatch — the node’s key has changed since last seen (investigate before trusting) | . 💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it. ",
"url": "/Meshtastic-Android/main/iw-rIL/user/nodes.html#node-list",
"relUrl": "/iw-rIL/user/nodes.html#node-list"
diff --git a/main/be-rBY/user/nodes.html b/main/be-rBY/user/nodes.html
index c2b79b365a..e21231f232 100644
--- a/main/be-rBY/user/nodes.html
+++ b/main/be-rBY/user/nodes.html
@@ -1 +1 @@
- Nodes | Meshtastic AndroidSkip to main contentLinkMenuExpand(external link)DocumentSearchCopyCopied
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
Апісанне
CLIENT
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
CLIENT MUTE
Receives but doesn’t retransmit
CLIENT HIDDEN
Like Client Mute, plus hides from node list
ROUTER
Prioritizes message forwarding; stays awake to relay
ROUTER LATE
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
TRACKER
Optimized for position reporting at regular intervals
SENSOR
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK TRACKER
TAK position reporting only
LOST AND FOUND
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Прыбраць
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Фільтраваць
Апісанне
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Апісанне
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Апошні раз пачуты
Адлегласць
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
Апісанне
CLIENT
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
CLIENT MUTE
Receives but doesn’t retransmit
CLIENT HIDDEN
Like Client Mute, plus hides from node list
ROUTER
Prioritizes message forwarding; stays awake to relay
ROUTER LATE
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
TRACKER
Optimized for position reporting at regular intervals
SENSOR
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK TRACKER
TAK position reporting only
LOST AND FOUND
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Прыбраць
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Фільтраваць
Апісанне
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Апісанне
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Апошні раз пачуты
Адлегласць
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Списък с възли
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Роля
Описание
Клиент
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Скрит клиент
Like Client Mute, plus hides from node list
Рутер
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Тракер
Optimized for position reporting at regular intervals
Сензор
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Загубено и намерено
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Изтрий
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Филтър
Описание
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Описание
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Екранна снимка
Signal quality
Ниво на батерията
Hop count
Последно чут
Разстояние
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Списък с възли
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Роля
Описание
Клиент
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Скрит клиент
Like Client Mute, plus hides from node list
Рутер
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Тракер
Optimized for position reporting at regular intervals
Сензор
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Загубено и намерено
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Изтрий
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Филтър
Описание
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Описание
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Екранна снимка
Signal quality
Ниво на батерията
Hop count
Последно чут
Разстояние
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
Descripció
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Eliminar
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtre
Descripció
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Descripció
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Última notícia
Distància
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
Descripció
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Eliminar
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtre
Descripció
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Descripció
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Última notícia
Distància
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
Popis
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Senzor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Odstranit
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtr
Popis
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Popis
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Naposledy slyšen
Vzdálenost
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
Popis
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Senzor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Odstranit
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtr
Popis
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Popis
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Naposledy slyšen
Vzdálenost
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Rolle
Beschreibung
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client - Versteckt
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router mit Verzögerung
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Tracker
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Behandelt Datenverkehr von/zu Ihren bevorzugten Knoten mit der Priorität „Router Late“ (wodurch sichergestellt wird, dass diese Nachrichten eine zusätzliche Relaisabdeckung erhalten), während der übrige Verkehr wie bei einem normalen Client gehandhabt wird.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Symbol
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Entfernen
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filter
Beschreibung
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sortieren
Beschreibung
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Bildschirmfoto
Signal quality
Akkustand
Hop count
Zuletzt gehört
Distanz
Device Links (“I want one”)
Sobald die Hardware eines Knotens erkannt wird, zeigt die Detailansicht einen ausklappbaren Bereich mit der Bezeichnung „Ich möchte eins“ an. Dieser enthält Links zu Bezugsquellen oder weiterführenden Informationen zu dem jeweiligen Gerät – etwa zur Produktseite des Herstellers, zu Produktvarianten sowie zu Angeboten auf regionalen Marktplätzen (wie AliExpress, Amazon und unterstützten Händlern), gefiltert nach Ihrem Land. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Rolle
Beschreibung
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client - Versteckt
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router mit Verzögerung
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Tracker
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Behandelt Datenverkehr von/zu Ihren bevorzugten Knoten mit der Priorität „Router Late“ (wodurch sichergestellt wird, dass diese Nachrichten eine zusätzliche Relaisabdeckung erhalten), während der übrige Verkehr wie bei einem normalen Client gehandhabt wird.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Symbol
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Entfernen
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filter
Beschreibung
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sortieren
Beschreibung
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Bildschirmfoto
Signal quality
Akkustand
Hop count
Zuletzt gehört
Distanz
Device Links (“I want one”)
Sobald die Hardware eines Knotens erkannt wird, zeigt die Detailansicht einen ausklappbaren Bereich mit der Bezeichnung „Ich möchte eins“ an. Dieser enthält Links zu Bezugsquellen oder weiterführenden Informationen zu dem jeweiligen Gerät – etwa zur Produktseite des Herstellers, zu Produktvarianten sowie zu Angeboten auf regionalen Marktplätzen (wie AliExpress, Amazon und unterstützten Händlern), gefiltert nach Ihrem Land. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
Signal Meter — understand what the signal bars mean
diff --git a/main/docs/ar-rSA/user/nodes.html b/main/docs/ar-rSA/user/nodes.html
index 1c57f2c516..9fe372df25 100644
--- a/main/docs/ar-rSA/user/nodes.html
+++ b/main/docs/ar-rSA/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/be-rBY/user/nodes.html b/main/docs/be-rBY/user/nodes.html
index 0d3029d6f9..27bf036849 100644
--- a/main/docs/be-rBY/user/nodes.html
+++ b/main/docs/be-rBY/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/bg-rBG/user/nodes.html b/main/docs/bg-rBG/user/nodes.html
index ba262b5a46..a874787c4d 100644
--- a/main/docs/bg-rBG/user/nodes.html
+++ b/main/docs/bg-rBG/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/ca-rES/user/nodes.html b/main/docs/ca-rES/user/nodes.html
index b78c66c4f9..c9c9d5cc41 100644
--- a/main/docs/ca-rES/user/nodes.html
+++ b/main/docs/ca-rES/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/cs-rCZ/user/nodes.html b/main/docs/cs-rCZ/user/nodes.html
index b8979188a5..3438988ff2 100644
--- a/main/docs/cs-rCZ/user/nodes.html
+++ b/main/docs/cs-rCZ/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/de-rDE/user/nodes.html b/main/docs/de-rDE/user/nodes.html
index 0222f6fbe9..3ef5a85224 100644
--- a/main/docs/de-rDE/user/nodes.html
+++ b/main/docs/de-rDE/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Symbol | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Symbol | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/el-rGR/user/nodes.html b/main/docs/el-rGR/user/nodes.html
index f2435dad71..7155c8935f 100644
--- a/main/docs/el-rGR/user/nodes.html
+++ b/main/docs/el-rGR/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/es-rES/user/nodes.html b/main/docs/es-rES/user/nodes.html
index 9f2219e022..8d61d815af 100644
--- a/main/docs/es-rES/user/nodes.html
+++ b/main/docs/es-rES/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/et-rEE/user/nodes.html b/main/docs/et-rEE/user/nodes.html
index a093606c21..e7888992bd 100644
--- a/main/docs/et-rEE/user/nodes.html
+++ b/main/docs/et-rEE/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Sõlmed kuvavad oma nime kõrval krüpteerimisoleku ikoone:
- Ikoon | Tähendus |
- --------------- | -------------------------------------------------------------------------------------------------------------------------------- |
- 🔒 Lukustatud | Suhtlus kasutab PKI-d (avaliku võtme infrastruktuuri) – otsast lõpuni krüpteeritud kontrollitud identiteediga |
- 🔓 Lukust lahti | Suhtlus kasutab jagatud kanali PSK – krüpteeritud, kuid isikut pole individuaalselt kontrollitud |
- ⚠️ Ebakõla | Avaliku võtme mittevastavus — sõlme võti on viimasest nägemisest saadik muutunud (enne usaldamist uuri) |
+ Ikoon | Tähendus |
+ --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Lukustatud | Suhtlus kasutab PKI-d (avaliku võtme infrastruktuuri) – otsast lõpuni krüpteeritud kontrollitud identiteediga |
+ 🔓 Lukust lahti | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Ebakõla | Avaliku võtme mittevastavus — sõlme võti on viimasest nägemisest saadik muutunud (enne usaldamist uuri) |
-> 💡 **Vihje:** PKI krüpteering (püsivara 2,5+) pakub tugevamat turvalisust kui kanali PSK, kuna igal sõlmel on unikaalne võtmepaar. Kui näed võtme mittevastavuse hoiatust, võib sõlm olla lähtestatud või ohustatud.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. Kui näed võtme mittevastavuse hoiatust, võib sõlm olla lähtestatud või ohustatud.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/fi-rFI/user/nodes.html b/main/docs/fi-rFI/user/nodes.html
index ee7f657ad5..a1727673ef 100644
--- a/main/docs/fi-rFI/user/nodes.html
+++ b/main/docs/fi-rFI/user/nodes.html
@@ -77,10 +77,10 @@ Radiot näyttävät nimensä vieressä salauksen tilaa kuvaavat kuvakkeet:
Kuvake | Merkitys |
--------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
🔒 Lukittu | Yhteys käyttää PKI:tä (julkisen avaimen infrastruktuuria) — päästä päähän salattu ja varmennetulla identiteetillä suojattu. |
- 🔓 Lukitsematon | Yhteys käyttää PKI:tä (julkisen avaimen infrastruktuuria) — päästä päähän salattu ja varmennetulla identiteetillä suojattu. |
+ 🔓 Lukitsematon | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
⚠️ Ei täsmää | Julkinen avain ei täsmää — radion avain on muuttunut viime näkemän jälkeen (tutki ennen luottamista). |
-> 💡 **Vinkki:** PKI-salaus (laiteohjelmisto 2.5+) tarjoaa vahvemman suojauksen kuin kanavan PSK-avain, koska jokaisella radiolla on oma yksilöllinen avainparinsa. Jos näet avaimen täsmäämättömyysvaroituksen, radio on voitu nollata tai sen tietoturva on voinut vaarantua.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. Jos näet avaimen täsmäämättömyysvaroituksen, radio on voitu nollata tai sen tietoturva on voinut vaarantua.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/fr-rCA/user/nodes.html b/main/docs/fr-rCA/user/nodes.html
index 9f5b89c5a4..30ec16db55 100644
--- a/main/docs/fr-rCA/user/nodes.html
+++ b/main/docs/fr-rCA/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/fr-rFR/user/nodes.html b/main/docs/fr-rFR/user/nodes.html
index fbd2de5496..fac020dad7 100644
--- a/main/docs/fr-rFR/user/nodes.html
+++ b/main/docs/fr-rFR/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/ga-rIE/user/nodes.html b/main/docs/ga-rIE/user/nodes.html
index a8a826abb5..e6ddd6ecbc 100644
--- a/main/docs/ga-rIE/user/nodes.html
+++ b/main/docs/ga-rIE/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/gl-rES/user/nodes.html b/main/docs/gl-rES/user/nodes.html
index 5089907d1e..c6cd759962 100644
--- a/main/docs/gl-rES/user/nodes.html
+++ b/main/docs/gl-rES/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/hr-rHR/user/nodes.html b/main/docs/hr-rHR/user/nodes.html
index 378959a8b6..18920894a2 100644
--- a/main/docs/hr-rHR/user/nodes.html
+++ b/main/docs/hr-rHR/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/ht-rHT/user/nodes.html b/main/docs/ht-rHT/user/nodes.html
index c699fdfe2e..9618c44f1b 100644
--- a/main/docs/ht-rHT/user/nodes.html
+++ b/main/docs/ht-rHT/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/hu-rHU/user/nodes.html b/main/docs/hu-rHU/user/nodes.html
index 2c7e4f808b..3c69a16167 100644
--- a/main/docs/hu-rHU/user/nodes.html
+++ b/main/docs/hu-rHU/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/is-rIS/user/nodes.html b/main/docs/is-rIS/user/nodes.html
index 51a4893155..b2da0826c2 100644
--- a/main/docs/is-rIS/user/nodes.html
+++ b/main/docs/is-rIS/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/it-rIT/user/nodes.html b/main/docs/it-rIT/user/nodes.html
index b52bee0103..fe04cf1430 100644
--- a/main/docs/it-rIT/user/nodes.html
+++ b/main/docs/it-rIT/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/iw-rIL/user/nodes.html b/main/docs/iw-rIL/user/nodes.html
index 19592abd6e..6a3e59c3bf 100644
--- a/main/docs/iw-rIL/user/nodes.html
+++ b/main/docs/iw-rIL/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/ja-rJP/user/nodes.html b/main/docs/ja-rJP/user/nodes.html
index f83cc2b75f..64e0d66caa 100644
--- a/main/docs/ja-rJP/user/nodes.html
+++ b/main/docs/ja-rJP/user/nodes.html
@@ -74,13 +74,13 @@ There is no separate "away" tier.
ノードは、名前の横に暗号化ステータスのアイコンを表示します:
- アイコン | 意味 |
- -------- | --------------------------------------------------- |
- 🔒 ロック | 通信は PKI(公開鍵基盤)を使用します。本人性が検証された、エンドツーエンドの暗号化です |
- 🔓 ロック解除 | 通信は共有チャンネルの PSK を使用します。暗号化されていますが、本人性は個別には検証されていません |
- ⚠️ 不一致 | 公開鍵の不一致。前回確認時からノードの鍵が変わっています(信頼する前に調べてください) |
+ アイコン | 意味 |
+ -------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 ロック | 通信は PKI(公開鍵基盤)を使用します。本人性が検証された、エンドツーエンドの暗号化です |
+ 🔓 ロック解除 | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ 不一致 | 公開鍵の不一致。前回確認時からノードの鍵が変わっています(信頼する前に調べてください) |
-> 💡 **ヒント:** PKI 暗号化(ファームウェア 2.5 以降)は、各ノードが固有の鍵ペアを持つため、チャンネル PSK より強力なセキュリティを提供します。 鍵の不一致の警告が表示された場合、そのノードはリセットされたか、侵害された可能性があります。
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. 鍵の不一致の警告が表示された場合、そのノードはリセットされたか、侵害された可能性があります。
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/ko-rKR/user/nodes.html b/main/docs/ko-rKR/user/nodes.html
index d5d695b038..7014348022 100644
--- a/main/docs/ko-rKR/user/nodes.html
+++ b/main/docs/ko-rKR/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/lt-rLT/user/nodes.html b/main/docs/lt-rLT/user/nodes.html
index cf5d7d1739..6d21b27637 100644
--- a/main/docs/lt-rLT/user/nodes.html
+++ b/main/docs/lt-rLT/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/nl-rNL/user/nodes.html b/main/docs/nl-rNL/user/nodes.html
index 0ddf7083e6..85afdad03b 100644
--- a/main/docs/nl-rNL/user/nodes.html
+++ b/main/docs/nl-rNL/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/no-rNO/user/nodes.html b/main/docs/no-rNO/user/nodes.html
index 78f5b7b1b5..211120e52b 100644
--- a/main/docs/no-rNO/user/nodes.html
+++ b/main/docs/no-rNO/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/pl-rPL/user/nodes.html b/main/docs/pl-rPL/user/nodes.html
index 07addddf30..de0f562240 100644
--- a/main/docs/pl-rPL/user/nodes.html
+++ b/main/docs/pl-rPL/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/pt-rBR/user/nodes.html b/main/docs/pt-rBR/user/nodes.html
index df2b842ba5..4c6805b84e 100644
--- a/main/docs/pt-rBR/user/nodes.html
+++ b/main/docs/pt-rBR/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/pt-rPT/user/nodes.html b/main/docs/pt-rPT/user/nodes.html
index 8a4d0b5f4f..c45887c077 100644
--- a/main/docs/pt-rPT/user/nodes.html
+++ b/main/docs/pt-rPT/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/ro-rRO/user/nodes.html b/main/docs/ro-rRO/user/nodes.html
index 9d74e8f6bd..c446668d1d 100644
--- a/main/docs/ro-rRO/user/nodes.html
+++ b/main/docs/ro-rRO/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/ru-rRU/user/nodes.html b/main/docs/ru-rRU/user/nodes.html
index 37b41b1763..4ec0216e16 100644
--- a/main/docs/ru-rRU/user/nodes.html
+++ b/main/docs/ru-rRU/user/nodes.html
@@ -74,13 +74,13 @@ There is no separate "away" tier.
У нод рядом с именем отображаются значки статуса шифрования:
- Значок | Значение |
- ----------------- | -------------------------------------------------------------------------------------------------------------------------- |
- 🔒 Заблокировано | Связь использует PKI (инфраструктуру публичных ключей) — сквозное шифрование с проверкой идентичности |
- 🔓 Разблокировано | Связь использует общий канал PSK — зашифровано, но личность не проверяется индивидуально |
- ⚠️ Несовпадение | Несовпадение открытого ключа — ключ ноды изменился с последнего раза (разберитесь, прежде чем доверять) |
+ Значок | Значение |
+ ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Заблокировано | Связь использует PKI (инфраструктуру публичных ключей) — сквозное шифрование с проверкой идентичности |
+ 🔓 Разблокировано | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Несовпадение | Несовпадение открытого ключа — ключ ноды изменился с последнего раза (разберитесь, прежде чем доверять) |
-> 💡 **Совет:** Шифрование PKI (прошивка 2.5+) обеспечивает более надёжную защиту, чем общий PSK для канала, потому что у каждой ноды есть уникальная пара ключей. Если видишь предупреждение о несоответствии ключа, нода могла быть сброшена или скомпрометирована.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. Если видишь предупреждение о несоответствии ключа, нода могла быть сброшена или скомпрометирована.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/sk-rSK/user/nodes.html b/main/docs/sk-rSK/user/nodes.html
index cfbed8cba2..93b911a7f4 100644
--- a/main/docs/sk-rSK/user/nodes.html
+++ b/main/docs/sk-rSK/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/sl-rSI/user/nodes.html b/main/docs/sl-rSI/user/nodes.html
index d9de31ba88..bc970f227a 100644
--- a/main/docs/sl-rSI/user/nodes.html
+++ b/main/docs/sl-rSI/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/sq-rAL/user/nodes.html b/main/docs/sq-rAL/user/nodes.html
index 6219630813..20dbd29f89 100644
--- a/main/docs/sq-rAL/user/nodes.html
+++ b/main/docs/sq-rAL/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/srp/user/nodes.html b/main/docs/srp/user/nodes.html
index d650e3c4c1..40300e48b7 100644
--- a/main/docs/srp/user/nodes.html
+++ b/main/docs/srp/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Иконица | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Иконица | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/sv-rSE/user/nodes.html b/main/docs/sv-rSE/user/nodes.html
index b52ae7e785..32278b3316 100644
--- a/main/docs/sv-rSE/user/nodes.html
+++ b/main/docs/sv-rSE/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/tr-rTR/user/nodes.html b/main/docs/tr-rTR/user/nodes.html
index bf1678eeef..12c4d52a54 100644
--- a/main/docs/tr-rTR/user/nodes.html
+++ b/main/docs/tr-rTR/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/uk-rUA/user/nodes.html b/main/docs/uk-rUA/user/nodes.html
index 6b74a6e97f..97d0295d2b 100644
--- a/main/docs/uk-rUA/user/nodes.html
+++ b/main/docs/uk-rUA/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/zh-rCN/user/nodes.html b/main/docs/zh-rCN/user/nodes.html
index 17f2a4beca..fb38b7ee17 100644
--- a/main/docs/zh-rCN/user/nodes.html
+++ b/main/docs/zh-rCN/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- 图标 | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ 图标 | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/docs/zh-rTW/user/nodes.html b/main/docs/zh-rTW/user/nodes.html
index 44a4747374..e3bb901fad 100644
--- a/main/docs/zh-rTW/user/nodes.html
+++ b/main/docs/zh-rTW/user/nodes.html
@@ -74,13 +74,13 @@ Most users should keep the default **Client** role. Consider a different role wh
Nodes display encryption status icons next to their name:
- Icon | Meaning |
- ----------- | ------------------------------------------------------------------------------------------------------------------- |
- 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
- 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified |
- ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
+ Icon | Meaning |
+ ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+ 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity |
+ 🔓 Unlocked | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one |
+ ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) |
-> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+> 💡 **Tip:** Direct messages always use PKI, so the radio needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/el-rGR/user/nodes.html b/main/el-rGR/user/nodes.html
index bca23783e1..7d63582eba 100644
--- a/main/el-rGR/user/nodes.html
+++ b/main/el-rGR/user/nodes.html
@@ -1 +1 @@
- Nodes | Meshtastic AndroidSkip to main contentLinkMenuExpand(external link)DocumentSearchCopyCopied
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
Περιγραφή
Client
Standard end-user node
Πελάτης Βάση
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Διαγραφή
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Φίλτρο
Περιγραφή
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Περιγραφή
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Last heard
Απόσταση
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
Περιγραφή
Client
Standard end-user node
Πελάτης Βάση
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Διαγραφή
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Φίλτρο
Περιγραφή
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Περιγραφή
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Last heard
Απόσταση
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Rol
Descripción
Cliente
Standard end-user node
Base cliente
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Cliente silenciado
Receives but doesn’t retransmit
Cliente oculto
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Rastreador
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
Rastreador TAK
TAK position reporting only
Perdido y encontrado
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Quitar
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtro
Descripción
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Descripción
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Última escucha
Distancia
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Rol
Descripción
Cliente
Standard end-user node
Base cliente
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Cliente silenciado
Receives but doesn’t retransmit
Cliente oculto
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Rastreador
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
Rastreador TAK
TAK position reporting only
Perdido y encontrado
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Quitar
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtro
Descripción
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Descripción
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Última escucha
Distancia
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Sõlmede loend
Sõlmede loend näitab kõiki sõlmi, mida raadio on kuulnud, sealhulgas:
Sõlme nimi — kasutaja pandud pikk nimi
Lühinimi — 4-tähemärgiline identifikaator
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Aku — kaugsõlme aku tase (kui telemeetria on lubatud)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Sõlme oleku indikaatorid
Indicator
Tähendus
Green last-heard time
Viimase 2 tunni jooksul kuuldud sõlm
Plain last-heard time
Viimase 2 tunni jooksul kuuldud sõlm
⭐ Lemmik
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Sõlmedele saab määrata erinevaid rolle, mis mõjutavad nende kärgvõrgus käitumist:
Roll
Kirjeldus
Klient
Standard end-user node
Klient-baas
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Vaikne klient
Receives but doesn’t retransmit
Peidetud klient
Like Client Mute, plus hides from node list
Ruuter
Prioriseerib sõnumi edastamist; jääb edastamiseks ärkvele
Hiline ruuter
Infrastruktuurisõlm, mis levitab signaali ühe korra, kuid alles pärast kõiki teisi režiime (pakub täiendavat leviala)
Ruuteri klient
⚠️ Vananenud (eemaldatud püsivara versioonis 2.3.15) — enam mitte valitav; kasuta hoopis ruuterint või kliendina
Repiiter
⚠️ Vananenud (eemaldatud püsivara versioonis 2.7.11) — enam mitte valitav; kasuta hoopis ruuterina
Jälgitav
Optimized for position reporting at regular intervals
Andur
Optimized for telemetry reporting
TAK
Ühildub TAK süsteemidega (saadab/võtab vastu CoT)
Jälgitav TAK
Ainult TAK asukoha aruandlus
Kaotud ja leitud
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Ruuter — Teil on sõlm fikseeritud, kõrgemal asuvas asukohas, millel on usaldusväärne toide (katusel, mäetipul). Ruuterid püsivad pidevalt ärkvel, et vahendada teistele sõnumeid ja on võrguühenduse laiendamiseks hädavajalikud. Don’t use Router on battery-powered handheld radios.
Ruuter hiline – infrastruktuurisõlm, mis levitab pakette alati üks kord uuesti, aga alles pärast seda, kui kõik teised marsruutimisrežiimid on oma käigu teinud. Provides supplemental coverage for local clusters without competing with primary routers.
Baas klient – käsitleb lemmiksõlmedesse suunduvat ja sealt tulevaid liiklusi ruuteri hilinemise prioriteediga (tagades, et need sõnumid saavad täiendava edastuskatte), samal ajal kui kõike muud käsitletakse tavalise kliendina.
Kliendi vaigistatud — Soovid vastu võtta võrguliiklust, aga mitte edastamisse panustada. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Aku säästmiseks magab saadete vahel.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Sarnane võimsusprofiil jälgimisseadmele.
TAK / TAK jälgimisseade — Vajalik ainult ATAK/WinTAK süsteemidega koostööl. Üksikasjade saamiseks vaata TAK integratsioon.
💡 Vihje: Kärgvõrk töötab kõige paremini, kui enamik sõlmi on klient või ruuter. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Sõlmed kuvavad oma nime kõrval krüpteerimisoleku ikoone:
Ikoon
Tähendus
🔒 Lukustatud
Suhtlus kasutab PKI-d (avaliku võtme infrastruktuuri) – otsast lõpuni krüpteeritud kontrollitud identiteediga
🔓 Lukust lahti
Suhtlus kasutab jagatud kanali PSK – krüpteeritud, kuid isikut pole individuaalselt kontrollitud
⚠️ Ebakõla
Avaliku võtme mittevastavus — sõlme võti on viimasest nägemisest saadik muutunud (enne usaldamist uuri)
💡 Vihje: PKI krüpteering (püsivara 2,5+) pakub tugevamat turvalisust kui kanali PSK, kuna igal sõlmel on unikaalne võtmepaar. Kui näed võtme mittevastavuse hoiatust, võib sõlm olla lähtestatud või ohustatud.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Puuduta sõlmel, et vaadata üksikasjade lehte
Touch & hold for quick actions:
Mark/remove favorite
Teavituste vaigistamine/vaigistuse tühistamine
Saada otsesõnum
Trace route
Ignore/unignore
Eemalda
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Teksti otsing
Sõlmede filtreerimiseks nime või lühinime järgi tipi otsinguväljal. Filter uueneb reaalajas kirjutamise ajal.
Filter Toggles
Filtreeri
Kirjeldus
Hide offline nodes
Näita ainult viimase 2 tunni jooksul kuuldud sõlmi
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Välista MQTT
Peida ainult MQTT internetisilla kaudu kuuldavad sõlmed
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sorteerimisvalikud
Sorteeri
Kirjeldus
Last heard
Viimati kuuldud sõlmed esimesena
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hüppe kaugusel
Vähim vahendatud hüppeid esimesena
Kanal
Rühmitatud kanali loendi alusel
via MQTT
Rühmitatud MQTT ver raadiost kuuldud järgi
via Favorite (default)
Favorited nodes first, then the rest
Sõlme hüppe kohta
Puuduta sõlmede loendi rakenduse ribal hüppehistogrammi ikooni, et avada tulpdiagramm, mis näitab, mitu sõlme asub igal hüppekaugusel (0 = otse, 1 = ühe relee kaugusel jne). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Sõlmel klõpsamine avab detailvaate koos põhjaliku teabega. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Tekstisisesed olekuindikaatorid näitavad peamisi mõõdikuid lühidalt:
Indikaator
Screenshot
Signal quality
Aku tase
Hüppete loendur
Viimati kuuldud
Kaugus
Seadme lingid (“Soovin ühte”)
Kui sõlme riistvara tuvastatakse, kuvatakse detailvaates kokkupandav jaotis „Soovin ühte”, mis lingib kohtadele, kust seadet osta või selle kohta lisateavet saada: müüja tooteleht, tootevariandid ja piirkondlike marketplace loendid (nt AliExpress, Amazon ja toetatud jaemüüjad), mis on filtreeritud sinu riigi järgi. Iga link avaneb ümbersuunamisteenuse msh.to kaudu. Seadmed, millel pole vastavaid linke, seda jaotist ei kuva.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Seotud teemad
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Sõlmede loend
Sõlmede loend näitab kõiki sõlmi, mida raadio on kuulnud, sealhulgas:
Sõlme nimi — kasutaja pandud pikk nimi
Lühinimi — 4-tähemärgiline identifikaator
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Aku — kaugsõlme aku tase (kui telemeetria on lubatud)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Sõlme oleku indikaatorid
Indicator
Tähendus
Green last-heard time
Viimase 2 tunni jooksul kuuldud sõlm
Plain last-heard time
Viimase 2 tunni jooksul kuuldud sõlm
⭐ Lemmik
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Sõlmedele saab määrata erinevaid rolle, mis mõjutavad nende kärgvõrgus käitumist:
Roll
Kirjeldus
Klient
Standard end-user node
Klient-baas
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Vaikne klient
Receives but doesn’t retransmit
Peidetud klient
Like Client Mute, plus hides from node list
Ruuter
Prioriseerib sõnumi edastamist; jääb edastamiseks ärkvele
Hiline ruuter
Infrastruktuurisõlm, mis levitab signaali ühe korra, kuid alles pärast kõiki teisi režiime (pakub täiendavat leviala)
Ruuteri klient
⚠️ Vananenud (eemaldatud püsivara versioonis 2.3.15) — enam mitte valitav; kasuta hoopis ruuterint või kliendina
Repiiter
⚠️ Vananenud (eemaldatud püsivara versioonis 2.7.11) — enam mitte valitav; kasuta hoopis ruuterina
Jälgitav
Optimized for position reporting at regular intervals
Andur
Optimized for telemetry reporting
TAK
Ühildub TAK süsteemidega (saadab/võtab vastu CoT)
Jälgitav TAK
Ainult TAK asukoha aruandlus
Kaotud ja leitud
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Ruuter — Teil on sõlm fikseeritud, kõrgemal asuvas asukohas, millel on usaldusväärne toide (katusel, mäetipul). Ruuterid püsivad pidevalt ärkvel, et vahendada teistele sõnumeid ja on võrguühenduse laiendamiseks hädavajalikud. Don’t use Router on battery-powered handheld radios.
Ruuter hiline – infrastruktuurisõlm, mis levitab pakette alati üks kord uuesti, aga alles pärast seda, kui kõik teised marsruutimisrežiimid on oma käigu teinud. Provides supplemental coverage for local clusters without competing with primary routers.
Baas klient – käsitleb lemmiksõlmedesse suunduvat ja sealt tulevaid liiklusi ruuteri hilinemise prioriteediga (tagades, et need sõnumid saavad täiendava edastuskatte), samal ajal kui kõike muud käsitletakse tavalise kliendina.
Kliendi vaigistatud — Soovid vastu võtta võrguliiklust, aga mitte edastamisse panustada. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Aku säästmiseks magab saadete vahel.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Sarnane võimsusprofiil jälgimisseadmele.
TAK / TAK jälgimisseade — Vajalik ainult ATAK/WinTAK süsteemidega koostööl. Üksikasjade saamiseks vaata TAK integratsioon.
💡 Vihje: Kärgvõrk töötab kõige paremini, kui enamik sõlmi on klient või ruuter. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Sõlmed kuvavad oma nime kõrval krüpteerimisoleku ikoone:
Ikoon
Tähendus
🔒 Lukustatud
Suhtlus kasutab PKI-d (avaliku võtme infrastruktuuri) – otsast lõpuni krüpteeritud kontrollitud identiteediga
🔓 Lukust lahti
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Ebakõla
Avaliku võtme mittevastavus — sõlme võti on viimasest nägemisest saadik muutunud (enne usaldamist uuri)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. Kui näed võtme mittevastavuse hoiatust, võib sõlm olla lähtestatud või ohustatud.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Puuduta sõlmel, et vaadata üksikasjade lehte
Touch & hold for quick actions:
Mark/remove favorite
Teavituste vaigistamine/vaigistuse tühistamine
Saada otsesõnum
Trace route
Ignore/unignore
Eemalda
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Teksti otsing
Sõlmede filtreerimiseks nime või lühinime järgi tipi otsinguväljal. Filter uueneb reaalajas kirjutamise ajal.
Filter Toggles
Filtreeri
Kirjeldus
Hide offline nodes
Näita ainult viimase 2 tunni jooksul kuuldud sõlmi
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Välista MQTT
Peida ainult MQTT internetisilla kaudu kuuldavad sõlmed
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sorteerimisvalikud
Sorteeri
Kirjeldus
Last heard
Viimati kuuldud sõlmed esimesena
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hüppe kaugusel
Vähim vahendatud hüppeid esimesena
Kanal
Rühmitatud kanali loendi alusel
via MQTT
Rühmitatud MQTT ver raadiost kuuldud järgi
via Favorite (default)
Favorited nodes first, then the rest
Sõlme hüppe kohta
Puuduta sõlmede loendi rakenduse ribal hüppehistogrammi ikooni, et avada tulpdiagramm, mis näitab, mitu sõlme asub igal hüppekaugusel (0 = otse, 1 = ühe relee kaugusel jne). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Sõlmel klõpsamine avab detailvaate koos põhjaliku teabega. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Tekstisisesed olekuindikaatorid näitavad peamisi mõõdikuid lühidalt:
Indikaator
Screenshot
Signal quality
Aku tase
Hüppete loendur
Viimati kuuldud
Kaugus
Seadme lingid (“Soovin ühte”)
Kui sõlme riistvara tuvastatakse, kuvatakse detailvaates kokkupandav jaotis „Soovin ühte”, mis lingib kohtadele, kust seadet osta või selle kohta lisateavet saada: müüja tooteleht, tootevariandid ja piirkondlike marketplace loendid (nt AliExpress, Amazon ja toetatud jaemüüjad), mis on filtreeritud sinu riigi järgi. Iga link avaneb ümbersuunamisteenuse msh.to kaudu. Seadmed, millel pole vastavaid linke, seda jaotist ei kuva.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Seotud teemad
Node Metrics — detailed telemetry dashboards for each node
Radionäkymässä luetellaan kaikki mesh-verkossasi näkyvät radiot.
Radiolista
Radioluettelo näyttää kaikki radiot, joista radiosi on vastaanottanut tietoja, mukaan lukien:
Radion nimi — käyttäjän määrittämä pitkä nimi
Lyhyt nimi — 4-merkkinen tunniste
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Viimeksi kuultu — aika viimeisimmästä yhteydestä
Etäisyys — arvioitu etäisyys (jos sijaintitiedot jaetaan)
Akku — etäradion akun varaustaso (jos telemetria on käytössä)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Radion tilailmaisimet
Ilmaisin
Tarkoitus
Green last-heard time
Radio kuultu viimeisen 2 tunnin aikana
Plain last-heard time
Radiosta ei ole kuultu yli 2 tuntiin
⭐ Suosikki
Radio, jonka olet merkinnyt suosikiksi.
Erillistä “poissa”-tilaa ei ole.
Radion roolit
Radioille voidaan määrittää erilaisia rooleja, jotka vaikuttavat niiden toimintaan verkossa:
Rooli
Kuvaus
Client
Tavallinen käyttäjäradio
Client Base
Käsittelee suosikkiradioiden liikenteen Router Late -prioriteetilla, kaiken muun liikenteen Client -prioriteetilla
Client Mute
Vastaanottaa viestejä, mutta ei lähetä niitä edelleen
Client Hidden
Kuten Client Mute, mutta piilotetaan myös radioluettelosta
Router
Priorisoi viestien välittämistä; pysyy hereillä välittääkseen viestejä
Router Late
Infrastruktuuriradio, joka lähettää viestin uudelleen kerran, mutta vasta kaikkien muiden tilojen jälkeen (tarjoaa lisäpeittoa)
Router Client
⚠️ Vanhentunut (poistettu laiteohjelmistossa 2.3.15) — ei enää valittavissa; käytä sen sijaan Router- tai Client-roolia
Repeater
⚠️ Vanhentunut (poistettu laiteohjelmistossa 2.7.11) — ei enää valittavissa; käytä sen sijaan Router-roolia
Yhteensopiva TAK-järjestelmien kanssa (lähettää ja vastaanottaa CoT-viestejä)
TAK Tracker
Vain TAK-sijainnin raportointi
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Roolin valitseminen
Useimpien käyttäjien kannattaa käyttää oletusarvoista Client-roolia. Harkitse muuta roolia seuraavissa tilanteissa:
Router — Sinulla on radio kiinteässä, korkealla sijaitsevassa paikassa, jossa on luotettava virransyöttö (katto, mäki). Routerit pysyvät jatkuvasti hereillä välittääkseen muiden viestejä ja ovat tärkeitä verkon peittoalueen laajentamisessa. Älä käytä Reititin-roolia akkukäyttöisissä käsiradioissa.
Router Late — Infrastruktuuriradio, joka lähettää paketit uudelleen kerran, mutta vasta kaikkien muiden reititystilojen jälkeen. Tarjoaa lisäpeittoa paikallisille ryhmille kilpailematta ensisijaisten Routerien kanssa.
Client Base — Käsittelee suosikkiradioihisi menevän tai niistä tulevan liikenteen Router Late -prioriteetilla (varmistaen näille viesteille ylimääräisen välityspeiton), samalla kun kaikki muu käsitellään tavallisen Client-roolin tavoin.
Client Mute — Voit vastaanottaa verkkoliikennettä, mutta et osallistu viestien välittämiseen. Hyödyllinen vain kuunteluun tarkoitetuissa radioissa tai ruuhkan vähentämiseen tiheillä alueilla.
Tracker “seurantalaite” — miehittämätön radio, jonka ainoa tehtävä on lähettää GPS-sijaintiaan (esimerkiksi ajoneuvo, henkilö tai muu kohde). Nukkuu lähetysten välillä akun säästämiseksi.
Anturi — miehittämätön radio, joka lähettää ympäristötelemetriaa (lämpötila, ilmankosteus, ilmanlaatu). Samanlainen virrankulutusprofiili kuin Tracker-roolissa.
TAK / TAK Tracker — Tarvitaan vain yhteensopivuuteen ATAK-/WinTAK-järjestelmien kanssa. Katso TAK-integraatio lisätietoja varten.
💡 Vinkki: Verkko toimii parhaiten, kun suurin osa radioista käyttää Client- tai Router-roolia. Liian suuri määrä Client Mute (mykistetty) -radioita heikentää mesh-verkon vikasietoisuutta. Liian useat Router -roolin radiot tiheällä alueella voivat aiheuttaa ruuhkaa. Hyvä nyrkkisääntö on yksi Router jokaista 5–10 Client-roolia kohden alueellasi.
Salausilmaisimet
Radiot näyttävät nimensä vieressä salauksen tilaa kuvaavat kuvakkeet:
Kuvake
Merkitys
🔒 Lukittu
Yhteys käyttää PKI:tä (julkisen avaimen infrastruktuuria) — päästä päähän salattu ja varmennetulla identiteetillä suojattu.
🔓 Lukitsematon
Yhteys käyttää PKI:tä (julkisen avaimen infrastruktuuria) — päästä päähän salattu ja varmennetulla identiteetillä suojattu.
⚠️ Ei täsmää
Julkinen avain ei täsmää — radion avain on muuttunut viime näkemän jälkeen (tutki ennen luottamista).
💡 Vinkki: PKI-salaus (laiteohjelmisto 2.5+) tarjoaa vahvemman suojauksen kuin kanavan PSK-avain, koska jokaisella radiolla on oma yksilöllinen avainparinsa. Jos näet avaimen täsmäämättömyysvaroituksen, radio on voitu nollata tai sen tietoturva on voinut vaarantua.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Pikatoiminnot
Radioluettelosta voit:
Napauttaa radiota avataksesi sen tietosivun
Kosketa ja pidä painettuna nähdäksesi pikatoiminnot:
Merkitse tai poista suosikki
Mykistä tai poista mykistys ilmoituksista
Lähetä yksityisviesti
Reitinselvitys
Ohita tai poista ohitus
Poista
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Suodatus ja lajittelu
Tekstihaku
Kirjoita hakukenttään suodattaaksesi radioita nimen tai lyhyen nimen perusteella. Suodatus päivittyy reaaliajassa kirjoittaessasi.
Suodatusvalinnat
Suodatus
Kuvaus
Hide offline nodes
Näytä vain radiot, joista on kuultu viimeisten 2 tunnin aikana
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Näytä tuntemattomat
Näytä radiot, jotka eivät ole vielä lähettäneet käyttäjätietoja. Oletuksena käytössä, joten radio, joka on kuultu ennen käyttäjätietojensa saapumista, pysyy näkyvissä ja sille voi lähettää viestejä. Tällaiset radiot merkitään keskeneräisiksi
Ohita infrastruktuurilaitteet
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Rajaa MQTT pois
Piilottaa radiot, joista on kuultu vain MQTT-internetsillan kautta
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Lajitteluvaihtoehdot
Lajittelu
Kuvaus
Last heard
Näytä viimeksi kuullut radiot ensin
A-Z
Lajiteltu radion pitkän nimen mukaan
Etäisyys
Lähimpänä olevat radiot ensin (edellyttää sijainnin jakamista)
Hyppyjä
Vähiten välityshyppyjä vaativat radiot ensin
Kanava
Ryhmitelty kanavaindeksin mukaan
via MQTT
Ryhmitelty MQTT:n kautta kuultuihin ja radiolla kuultuihin
via Favorite (default)
Favorited nodes first, then the rest
Radiot hyppymäärän mukaan
Avaa pylväskaavio, joka näyttää radioiden määrän kullakin hyppyetäisyydellä, napauttamalla radioluettelon sovelluspalkissa olevaa hyppyhistogrammikuvaketta (0 = suora yhteys, 1 = yksi välityshyppy ja niin edelleen). Suodata kaavio Viimeksi kuultu -ajanjakson mukaan — Kaikki ajat, 1 tunti, 8 tuntia tai 24 tuntia — nähdäksesi, miltä mesh-verkko näyttää juuri nyt verrattuna pidempään ajanjaksoon. Tämä on nopea tapa arvioida, kuinka laaja ja kuormittunut paikallinen mesh-verkkosi on.
Radion tiedot
Radion napauttaminen avaa tietonäkymän, jossa on kattavat tiedot. Katso Radion mittarit saadaksesi täydelliset tiedot mittareista ja telemetriasta.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Rivinsisäiset tilailmaisimet näyttävät tärkeimmät tiedot yhdellä silmäyksellä:
Ilmaisin
Kuvakaappaus
Signaalin laatu
Akun varaus
Hyppymäärä
Viimeksi kuultu
Etäisyys
Laite-linkit (“Haluan sellaisen”)
Kun radion laitteisto tunnistetaan, tietonäkymä näyttää avattavan “Haluan sellaisen” -osion, jossa on linkkejä laitteen ostamiseen tai lisätietojen hankkimiseen: valmistajan tuotesivu, tuoteversiot sekä alueelliset kauppapaikkalistaukset (esim. AliExpress, Amazon ja tuetut jälleenmyyjät), suodatettuna maasi mukaan. Jokainen linkki avautuu mesh.to -uudelleenohjauspalvelun kautta. Laitteet, joille ei löydy vastaavia linkkejä, eivät näytä tätä osiota.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Aiheeseen liittyvät aiheet
Radion mittarit — yksityiskohtaiset telemetriakoontinäytöt jokaiselle radiolle
Radionäkymässä luetellaan kaikki mesh-verkossasi näkyvät radiot.
Radiolista
Radioluettelo näyttää kaikki radiot, joista radiosi on vastaanottanut tietoja, mukaan lukien:
Radion nimi — käyttäjän määrittämä pitkä nimi
Lyhyt nimi — 4-merkkinen tunniste
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Viimeksi kuultu — aika viimeisimmästä yhteydestä
Etäisyys — arvioitu etäisyys (jos sijaintitiedot jaetaan)
Akku — etäradion akun varaustaso (jos telemetria on käytössä)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Radion tilailmaisimet
Ilmaisin
Tarkoitus
Green last-heard time
Radio kuultu viimeisen 2 tunnin aikana
Plain last-heard time
Radiosta ei ole kuultu yli 2 tuntiin
⭐ Suosikki
Radio, jonka olet merkinnyt suosikiksi.
Erillistä “poissa”-tilaa ei ole.
Radion roolit
Radioille voidaan määrittää erilaisia rooleja, jotka vaikuttavat niiden toimintaan verkossa:
Rooli
Kuvaus
Client
Tavallinen käyttäjäradio
Client Base
Käsittelee suosikkiradioiden liikenteen Router Late -prioriteetilla, kaiken muun liikenteen Client -prioriteetilla
Client Mute
Vastaanottaa viestejä, mutta ei lähetä niitä edelleen
Client Hidden
Kuten Client Mute, mutta piilotetaan myös radioluettelosta
Router
Priorisoi viestien välittämistä; pysyy hereillä välittääkseen viestejä
Router Late
Infrastruktuuriradio, joka lähettää viestin uudelleen kerran, mutta vasta kaikkien muiden tilojen jälkeen (tarjoaa lisäpeittoa)
Router Client
⚠️ Vanhentunut (poistettu laiteohjelmistossa 2.3.15) — ei enää valittavissa; käytä sen sijaan Router- tai Client-roolia
Repeater
⚠️ Vanhentunut (poistettu laiteohjelmistossa 2.7.11) — ei enää valittavissa; käytä sen sijaan Router-roolia
Yhteensopiva TAK-järjestelmien kanssa (lähettää ja vastaanottaa CoT-viestejä)
TAK Tracker
Vain TAK-sijainnin raportointi
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Roolin valitseminen
Useimpien käyttäjien kannattaa käyttää oletusarvoista Client-roolia. Harkitse muuta roolia seuraavissa tilanteissa:
Router — Sinulla on radio kiinteässä, korkealla sijaitsevassa paikassa, jossa on luotettava virransyöttö (katto, mäki). Routerit pysyvät jatkuvasti hereillä välittääkseen muiden viestejä ja ovat tärkeitä verkon peittoalueen laajentamisessa. Älä käytä Reititin-roolia akkukäyttöisissä käsiradioissa.
Router Late — Infrastruktuuriradio, joka lähettää paketit uudelleen kerran, mutta vasta kaikkien muiden reititystilojen jälkeen. Tarjoaa lisäpeittoa paikallisille ryhmille kilpailematta ensisijaisten Routerien kanssa.
Client Base — Käsittelee suosikkiradioihisi menevän tai niistä tulevan liikenteen Router Late -prioriteetilla (varmistaen näille viesteille ylimääräisen välityspeiton), samalla kun kaikki muu käsitellään tavallisen Client-roolin tavoin.
Client Mute — Voit vastaanottaa verkkoliikennettä, mutta et osallistu viestien välittämiseen. Hyödyllinen vain kuunteluun tarkoitetuissa radioissa tai ruuhkan vähentämiseen tiheillä alueilla.
Tracker “seurantalaite” — miehittämätön radio, jonka ainoa tehtävä on lähettää GPS-sijaintiaan (esimerkiksi ajoneuvo, henkilö tai muu kohde). Nukkuu lähetysten välillä akun säästämiseksi.
Anturi — miehittämätön radio, joka lähettää ympäristötelemetriaa (lämpötila, ilmankosteus, ilmanlaatu). Samanlainen virrankulutusprofiili kuin Tracker-roolissa.
TAK / TAK Tracker — Tarvitaan vain yhteensopivuuteen ATAK-/WinTAK-järjestelmien kanssa. Katso TAK-integraatio lisätietoja varten.
💡 Vinkki: Verkko toimii parhaiten, kun suurin osa radioista käyttää Client- tai Router-roolia. Liian suuri määrä Client Mute (mykistetty) -radioita heikentää mesh-verkon vikasietoisuutta. Liian useat Router -roolin radiot tiheällä alueella voivat aiheuttaa ruuhkaa. Hyvä nyrkkisääntö on yksi Router jokaista 5–10 Client-roolia kohden alueellasi.
Salausilmaisimet
Radiot näyttävät nimensä vieressä salauksen tilaa kuvaavat kuvakkeet:
Kuvake
Merkitys
🔒 Lukittu
Yhteys käyttää PKI:tä (julkisen avaimen infrastruktuuria) — päästä päähän salattu ja varmennetulla identiteetillä suojattu.
🔓 Lukitsematon
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Ei täsmää
Julkinen avain ei täsmää — radion avain on muuttunut viime näkemän jälkeen (tutki ennen luottamista).
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. Jos näet avaimen täsmäämättömyysvaroituksen, radio on voitu nollata tai sen tietoturva on voinut vaarantua.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Pikatoiminnot
Radioluettelosta voit:
Napauttaa radiota avataksesi sen tietosivun
Kosketa ja pidä painettuna nähdäksesi pikatoiminnot:
Merkitse tai poista suosikki
Mykistä tai poista mykistys ilmoituksista
Lähetä yksityisviesti
Reitinselvitys
Ohita tai poista ohitus
Poista
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Suodatus ja lajittelu
Tekstihaku
Kirjoita hakukenttään suodattaaksesi radioita nimen tai lyhyen nimen perusteella. Suodatus päivittyy reaaliajassa kirjoittaessasi.
Suodatusvalinnat
Suodatus
Kuvaus
Hide offline nodes
Näytä vain radiot, joista on kuultu viimeisten 2 tunnin aikana
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Näytä tuntemattomat
Näytä radiot, jotka eivät ole vielä lähettäneet käyttäjätietoja. Oletuksena käytössä, joten radio, joka on kuultu ennen käyttäjätietojensa saapumista, pysyy näkyvissä ja sille voi lähettää viestejä. Tällaiset radiot merkitään keskeneräisiksi
Ohita infrastruktuurilaitteet
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Rajaa MQTT pois
Piilottaa radiot, joista on kuultu vain MQTT-internetsillan kautta
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Lajitteluvaihtoehdot
Lajittelu
Kuvaus
Last heard
Näytä viimeksi kuullut radiot ensin
A-Z
Lajiteltu radion pitkän nimen mukaan
Etäisyys
Lähimpänä olevat radiot ensin (edellyttää sijainnin jakamista)
Hyppyjä
Vähiten välityshyppyjä vaativat radiot ensin
Kanava
Ryhmitelty kanavaindeksin mukaan
via MQTT
Ryhmitelty MQTT:n kautta kuultuihin ja radiolla kuultuihin
via Favorite (default)
Favorited nodes first, then the rest
Radiot hyppymäärän mukaan
Avaa pylväskaavio, joka näyttää radioiden määrän kullakin hyppyetäisyydellä, napauttamalla radioluettelon sovelluspalkissa olevaa hyppyhistogrammikuvaketta (0 = suora yhteys, 1 = yksi välityshyppy ja niin edelleen). Suodata kaavio Viimeksi kuultu -ajanjakson mukaan — Kaikki ajat, 1 tunti, 8 tuntia tai 24 tuntia — nähdäksesi, miltä mesh-verkko näyttää juuri nyt verrattuna pidempään ajanjaksoon. Tämä on nopea tapa arvioida, kuinka laaja ja kuormittunut paikallinen mesh-verkkosi on.
Radion tiedot
Radion napauttaminen avaa tietonäkymän, jossa on kattavat tiedot. Katso Radion mittarit saadaksesi täydelliset tiedot mittareista ja telemetriasta.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Rivinsisäiset tilailmaisimet näyttävät tärkeimmät tiedot yhdellä silmäyksellä:
Ilmaisin
Kuvakaappaus
Signaalin laatu
Akun varaus
Hyppymäärä
Viimeksi kuultu
Etäisyys
Laite-linkit (“Haluan sellaisen”)
Kun radion laitteisto tunnistetaan, tietonäkymä näyttää avattavan “Haluan sellaisen” -osion, jossa on linkkejä laitteen ostamiseen tai lisätietojen hankkimiseen: valmistajan tuotesivu, tuoteversiot sekä alueelliset kauppapaikkalistaukset (esim. AliExpress, Amazon ja tuetut jälleenmyyjät), suodatettuna maasi mukaan. Jokainen linkki avautuu mesh.to -uudelleenohjauspalvelun kautta. Laitteet, joille ei löydy vastaavia linkkejä, eivät näytä tätä osiota.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Aiheeseen liittyvät aiheet
Radion mittarit — yksityiskohtaiset telemetriakoontinäytöt jokaiselle radiolle
Communication uses shared channel PSK — encrypted but identity not individually verified
+
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
@@ -159,7 +159,7 @@
-
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
+
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
diff --git a/main/fr-rFR/user/nodes.html b/main/fr-rFR/user/nodes.html
index f482d446cf..f0f8043a30 100644
--- a/main/fr-rFR/user/nodes.html
+++ b/main/fr-rFR/user/nodes.html
@@ -1 +1 @@
- Nœuds | Meshtastic AndroidSkip to main contentLinkMenuExpand(external link)DocumentSearchCopyCopied
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Rôle
Description
Client
Standard end-user node
Base Client
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client muet
Receives but doesn’t retransmit
Client masqué
Like Client Mute, plus hides from node list
Routeur
Prioritizes message forwarding; stays awake to relay
Routeur avec retard
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Traqueur
Optimized for position reporting at regular intervals
Capteur
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
Traqueur TAK
TAK position reporting only
Objets trouvés
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Supprimer
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtre
Description
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Description
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Niveau de batterie
Hop count
Dernière écoute
Distance
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Rôle
Description
Client
Standard end-user node
Base Client
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client muet
Receives but doesn’t retransmit
Client masqué
Like Client Mute, plus hides from node list
Routeur
Prioritizes message forwarding; stays awake to relay
Routeur avec retard
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Traqueur
Optimized for position reporting at regular intervals
Capteur
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
Traqueur TAK
TAK position reporting only
Objets trouvés
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Supprimer
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtre
Description
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Description
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Niveau de batterie
Hop count
Dernière écoute
Distance
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
Cur síos
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Bain
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Scagaire
Cur síos
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Cur síos
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Deiridh chluinmhu
Sáth
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
Cur síos
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Bain
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Scagaire
Cur síos
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Cur síos
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Deiridh chluinmhu
Sáth
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
Descrición
Cliente
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Eliminar
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtro
Descrición
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Descrición
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Última escoita
Distancia
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
Descrición
Cliente
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Eliminar
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtro
Descrición
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Descrición
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Última escoita
Distancia
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
Opis
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Ukloni
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtriraj
Opis
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Opis
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Posljednje čuo
Udaljenost
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
Opis
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Ukloni
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtriraj
Opis
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Opis
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Posljednje čuo
Udaljenost
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
Deskripsyon
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Retire
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtre
Deskripsyon
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Deskripsyon
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Dènye fwa li tande
Distans
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
Deskripsyon
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Retire
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtre
Deskripsyon
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Deskripsyon
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Dènye fwa li tande
Distans
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Szerepkör
Leírás
Kliens
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Néma Kliens
Receives but doesn’t retransmit
Rejtett Kliens
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Késő Router
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Szenzor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Elveszett és Megkerült
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Törlés
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filter
Leírás
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Leírás
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Utoljára hallott
Távolság
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Szerepkör
Leírás
Kliens
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Néma Kliens
Receives but doesn’t retransmit
Rejtett Kliens
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Késő Router
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Szenzor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Elveszett és Megkerült
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Törlés
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filter
Leírás
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Leírás
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Utoljára hallott
Távolság
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
Lýsing
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Remove
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filter
Lýsing
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Lýsing
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Last heard
Distance
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
Lýsing
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Remove
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filter
Lýsing
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Lýsing
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Last heard
Distance
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Ruolo
Descrizione
Client
Standard end-user node
Base Client
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Nascosto
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensore
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Oggetti Smarriti
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Elimina
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtro
Descrizione
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Descrizione
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Livello batteria
Hop count
Ricevuto più di recente
Distanza
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Ruolo
Descrizione
Client
Standard end-user node
Base Client
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Nascosto
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensore
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Oggetti Smarriti
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Elimina
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtro
Descrizione
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Descrizione
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Livello batteria
Hop count
Ricevuto più di recente
Distanza
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
תיאור
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Remove
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
פילטר
תיאור
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
תיאור
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Last heard
מרחק
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
תיאור
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Remove
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
פילטר
תיאור
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
תיאור
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Last heard
מרחק
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
ノードリスト
ノードリストには、無線機が受信したすべてのノードが、次の情報とともに表示されます:
ノード名: ユーザーが設定した正式名称
短縮名: 4 文字の識別子
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
最後の通信: 最後に通信してからの経過時間
距離: 推定距離(位置情報が共有されている場合)
バッテリー: リモートノードのバッテリー残量(テレメトリが有効な場合)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
クライアント・ミュート: メッシュの通信を受信したいが、中継には貢献したくない場合。 Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). 発信の合間はスリープしてバッテリーを節約します。
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). 電力プロファイルはトラッカーと同様です。
TAK/TAK Tracker: ATAK/WinTAK システムと相互運用する場合にのみ必要です。 詳しくは TAK 連携 を参照してください。
💡 ヒント: メッシュは、ほとんどのノードがクライアントまたはルーターのときに最も良く機能します。 Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. 目安としては、地域内のクライアント 5〜10 台につきルーター 1 台です。
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
クイック操作
ノードリストから、次のことができます:
ノードをタップすると詳細ページを表示します
Touch & hold for quick actions:
お気に入りに追加/解除
通知のミュート/解除
ダイレクトメッセージを送信
経路をトレース
無視/無視の解除
削除
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Show only nodes your radio heard directly, with no relay in between
不明なノードを含む
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
インフラを除外
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
MQTT を除外
MQTT のインターネットブリッジ経由でのみ受信したノードを非表示にします
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
The Nodes screen lists every node visible on your mesh.
ノードリスト
ノードリストには、無線機が受信したすべてのノードが、次の情報とともに表示されます:
ノード名: ユーザーが設定した正式名称
短縮名: 4 文字の識別子
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
最後の通信: 最後に通信してからの経過時間
距離: 推定距離(位置情報が共有されている場合)
バッテリー: リモートノードのバッテリー残量(テレメトリが有効な場合)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
クライアント・ミュート: メッシュの通信を受信したいが、中継には貢献したくない場合。 Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). 発信の合間はスリープしてバッテリーを節約します。
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). 電力プロファイルはトラッカーと同様です。
TAK/TAK Tracker: ATAK/WinTAK システムと相互運用する場合にのみ必要です。 詳しくは TAK 連携 を参照してください。
💡 ヒント: メッシュは、ほとんどのノードがクライアントまたはルーターのときに最も良く機能します。 Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. 目安としては、地域内のクライアント 5〜10 台につきルーター 1 台です。
暗号化の表示
ノードは、名前の横に暗号化ステータスのアイコンを表示します:
アイコン
意味
🔒 ロック
通信は PKI(公開鍵基盤)を使用します。本人性が検証された、エンドツーエンドの暗号化です
🔓 ロック解除
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ 不一致
公開鍵の不一致。前回確認時からノードの鍵が変わっています(信頼する前に調べてください)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. 鍵の不一致の警告が表示された場合、そのノードはリセットされたか、侵害された可能性があります。
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
クイック操作
ノードリストから、次のことができます:
ノードをタップすると詳細ページを表示します
Touch & hold for quick actions:
お気に入りに追加/解除
通知のミュート/解除
ダイレクトメッセージを送信
経路をトレース
無視/無視の解除
削除
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Show only nodes your radio heard directly, with no relay in between
不明なノードを含む
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
インフラを除外
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
MQTT を除外
MQTT のインターネットブリッジ経由でのみ受信したノードを非表示にします
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
역할
설명
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
지우기
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
필터
설명
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
설명
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
최근 수신
거리
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
역할
설명
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
지우기
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
필터
설명
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
설명
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
최근 수신
거리
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
Aprašymas
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Pašalinti
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtras
Aprašymas
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Aprašymas
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Seniausiai girdėtas
Atstumas
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
Aprašymas
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Pašalinti
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtras
Aprašymas
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Aprašymas
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Seniausiai girdėtas
Atstumas
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Functie
Beschrijving
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Verwijder
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filter
Beschrijving
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Beschrijving
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Laatst gehoord
Afstand
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Functie
Beschrijving
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Verwijder
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filter
Beschrijving
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Beschrijving
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Laatst gehoord
Afstand
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
Beskrivelse
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Fjern
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filter
Beskrivelse
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Beskrivelse
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Sist hørt
Distanse
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
Beskrivelse
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Fjern
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filter
Beskrivelse
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Beskrivelse
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Sist hørt
Distanse
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Rola
Opis
Klient
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Klient pasywny
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Czujnik
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Usuń
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtr
Opis
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Opis
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Poziom naładowania baterii
Hop count
Aktywność
Odległość
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Rola
Opis
Klient
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Klient pasywny
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Czujnik
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Usuń
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtr
Opis
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Opis
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Poziom naładowania baterii
Hop count
Aktywność
Odległość
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
🌐 Português (Brasil) — Community translation View in English
Nós
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Função
Descrição
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Excluir
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtro
Descrição
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Descrição
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Visto pela última vez
Distância
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
🌐 Português (Brasil) — Community translation View in English
Nós
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Função
Descrição
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Excluir
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtro
Descrição
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Descrição
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Visto pela última vez
Distância
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Papel
Descrição
Cliente
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Cliente silenciado
Receives but doesn’t retransmit
Cliente oculto
Like Client Mute, plus hides from node list
Roteador
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Monitor
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK — ‘Kit’ de Consciencialização da Equipa
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Perdidos e Achados
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Remover
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtrar
Descrição
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Descrição
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Último recebido
Distância
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Papel
Descrição
Cliente
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Cliente silenciado
Receives but doesn’t retransmit
Cliente oculto
Like Client Mute, plus hides from node list
Roteador
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Monitor
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK — ‘Kit’ de Consciencialização da Equipa
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Perdidos e Achados
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Remover
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtrar
Descrição
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Descrição
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Último recebido
Distância
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
Descriere
Client
Standard end-user node
Client bază
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client mut
Receives but doesn’t retransmit
Client ascuns
Like Client Mute, plus hides from node list
Ruter
Prioritizes message forwarding; stays awake to relay
Ruter cu întârziere
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Senzor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
Tracker TAK
TAK position reporting only
Pierdut și găsit
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Eliminare
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtru
Descriere
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Descriere
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Ultima recepție
Distanță
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
Descriere
Client
Standard end-user node
Client bază
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client mut
Receives but doesn’t retransmit
Client ascuns
Like Client Mute, plus hides from node list
Ruter
Prioritizes message forwarding; stays awake to relay
Ruter cu întârziere
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Senzor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
Tracker TAK
TAK position reporting only
Pierdut și găsit
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Eliminare
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtru
Descriere
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Descriere
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Ultima recepție
Distanță
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Список узлов
Список нод показывает все ноды, которые услышало твоё радиоустройство, включая:
Имя ноды — длинное имя, настроенное пользователем
Короткое имя — 4-символьный идентификатор
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Последнее услышанное — время с последнего общения
Расстояние — предполагаемое расстояние (если позиции общие)
Батарея — уровень заряда батареи удалённой ноды (если включена телеметрия)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Индикаторы состояния ноды
Индикатор
Значение
Green last-heard time
Нода слышна за последние 2 часа
Plain last-heard time
Нода не отвечала больше 2 часов
⭐ Избранный
Node you marked as a favorite.
There is no separate “away” tier.
Роли ноды
У нод можно настраивать разные роли, которые влияют на их поведение в сети:
Роль
Описание
Client
Standard end-user node
Client Base
Обрабатывает трафик избранных нод как приоритет Router Late; весь остальной трафик как Client
Client Mute
Принимает, но не ретранслирует
Client Hidden
Как Client Mute, плюс скрыт из списка нод
Router
Ставит в приоритет пересылку сообщений; не засыпает чтобы передавать их
Router Late
Инфраструктурная нода, которая ретранслирует один раз, но только после всех остальных режимов (обеспечивает дополнительное покрытие)
Router Client
⚠️ Устарело (удалено в прошивке 2.3.15) — больше не выбирается; используй вместо этого Router или Client
Repeater
⚠️ Устарело (удалено в прошивке 2.7.11) — больше не выбирается; используй вместо этого Router
Tracker
Оптимизировано для передачи данных о местоположении через регулярные промежутки времени
Sensor
Оптимизировано для данных телеметрии
Тактический
Взаимодействует с системами TAK (отправляет/принимает CoT)
TAK Tracker
Только отчет о позиции TAK
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Выбор роли
Большинству пользователей стоит оставить роль Client по умолчанию. Рассмотри другую роль, когда:
Router — У тебя есть узел в фиксированном, высоком месте с надежным источником питания (крыша, вершина холма). Router постоянно бодрствуют, чтобы пересылать сообщения для других, и они необходимы для расширения покрытия сети. Don’t use Router on battery-powered handheld radios.
Router Late — инфраструктурная нода, которая всегда пересылает пакеты только один раз, но только после того, как все другие режимы маршрутизации выполнили свои ходы. Обеспечивает дополнительное покрытие для локальных кластеров, не конкурируя с основными роутерами.
Client Base — обрабатывает трафик от/к вашим избранным нодам с приоритетом Router Late (обеспечивая этим сообщениям дополнительное ретранслирование), а всё остальное обрабатывает как обычный Client.
Client Mute — хочешь принимать трафик сети, но не участвовать в его ретрансляции. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Спит между передачами для экономии батареи.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Похожий профиль мощности на Tracker.
TAK / TAK Tracker — нужно только если работать с системами ATAK/WinTAK. Смотри Интеграция TAK для подробностей.
💡 Совет: Сеть работает лучше, когда большинство нод Client или Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. Хорошее практическое правило: один роутер на 5–10 клиентов в вашей зоне.
Индикаторы шифрования
У нод рядом с именем отображаются значки статуса шифрования:
Значок
Значение
🔒 Заблокировано
Связь использует PKI (инфраструктуру публичных ключей) — сквозное шифрование с проверкой идентичности
🔓 Разблокировано
Связь использует общий канал PSK — зашифровано, но личность не проверяется индивидуально
⚠️ Несовпадение
Несовпадение открытого ключа — ключ ноды изменился с последнего раза (разберитесь, прежде чем доверять)
💡 Совет: Шифрование PKI (прошивка 2.5+) обеспечивает более надёжную защиту, чем общий PSK для канала, потому что у каждой ноды есть уникальная пара ключей. Если видишь предупреждение о несоответствии ключа, нода могла быть сброшена или скомпрометирована.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Быстрые действия
Из списка нод ты можешь:
Нажмите на ноду, чтобы увидеть её страницу с деталями
Touch & hold for quick actions:
Отметить/убрать из избранного
Отключить/включить уведомления
Отправить личное сообщение
Трассировка
Игнорировать/разблокировать
Удалить
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Фильтрация и сортировка
Поиск текста
Введи в поле поиска, чтобы отфильтровать ноды по имени или короткому имени. Фильтр обновляется в реальном времени по мере набора текста.
Переключатели фильтра
Фильтр
Описание
Hide offline nodes
Показывать только ноды, услышанные за последние 2 часа
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Включить неизвестные
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Исключить инфраструктуру
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Исключить MQTT
Скрыть ноды, слышимые только через интернет-мост MQTT
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Параметры сортировки
Сортировка
Описание
Last heard
Сначала недавно слышимые ноды
A-Z
Сортировать по полному имени ноды
Расстояние
Сначала ближайшие ноды (требуется обмен позициями)
Меньше хопов
Сначала с наименьшим количеством ретрансляций
Канал
Группировать по индексу канала
via MQTT
Сгруппировать по MQTT и радиоприему
via Favorite (default)
Favorited nodes first, then the rest
Нод на хоп
Нажми на значок гистограммы хопов в панели приложений списка нод, чтобы открыть столбчатую диаграмму того, сколько нод находится на каждом расстоянии хопа (0 = напрямую, 1 = через один ретранслятор и так далее). Отфильтруй график по окну последнего услышанного — за всё время, 1 час, 8 часов или 24 часа — чтобы посмотреть, как сейчас выглядит сеть по сравнению с более длительным периодом. Это быстрый способ понять, насколько занята и разветвлена твоя местная сеть.
Детали ноды
Нажатие на ноду открывает подробный вид с полной информацией. Смотри Метрики ноды для полной информации о метриках и телеметрии.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Встроенные индикаторы статуса показывают ключевые показатели с первого взгляда:
Индикатор
Снимок экрана
Качество сигнала
Уровень заряда батареи
Количество хопов
Последний раз слышен
Расстояние
Ссылки на устройства (“Хочу такое”)
Когда оборудование ноды распознано, в детальном просмотре появляется сворачиваемый раздел “Хочу такой”, содержащий ссылки на места, где можно купить или узнать больше об этом устройстве: страницу продукта у производителя, варианты продукта и объявления на региональных торговых площадках (например, AliExpress, Amazon и у поддерживаемых продавцов), отфильтрованные по твоей стране. Каждая ссылка открывается через сервис перенаправления msh.to. Устройства без подходящих ссылок не показывают этот раздел.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Связанные темы
Метрики ноды — подробные телеметрические панели для каждой ноды
The Nodes screen lists every node visible on your mesh.
Список узлов
Список нод показывает все ноды, которые услышало твоё радиоустройство, включая:
Имя ноды — длинное имя, настроенное пользователем
Короткое имя — 4-символьный идентификатор
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Последнее услышанное — время с последнего общения
Расстояние — предполагаемое расстояние (если позиции общие)
Батарея — уровень заряда батареи удалённой ноды (если включена телеметрия)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Индикаторы состояния ноды
Индикатор
Значение
Green last-heard time
Нода слышна за последние 2 часа
Plain last-heard time
Нода не отвечала больше 2 часов
⭐ Избранный
Node you marked as a favorite.
There is no separate “away” tier.
Роли ноды
У нод можно настраивать разные роли, которые влияют на их поведение в сети:
Роль
Описание
Client
Standard end-user node
Client Base
Обрабатывает трафик избранных нод как приоритет Router Late; весь остальной трафик как Client
Client Mute
Принимает, но не ретранслирует
Client Hidden
Как Client Mute, плюс скрыт из списка нод
Router
Ставит в приоритет пересылку сообщений; не засыпает чтобы передавать их
Router Late
Инфраструктурная нода, которая ретранслирует один раз, но только после всех остальных режимов (обеспечивает дополнительное покрытие)
Router Client
⚠️ Устарело (удалено в прошивке 2.3.15) — больше не выбирается; используй вместо этого Router или Client
Repeater
⚠️ Устарело (удалено в прошивке 2.7.11) — больше не выбирается; используй вместо этого Router
Tracker
Оптимизировано для передачи данных о местоположении через регулярные промежутки времени
Sensor
Оптимизировано для данных телеметрии
Тактический
Взаимодействует с системами TAK (отправляет/принимает CoT)
TAK Tracker
Только отчет о позиции TAK
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Выбор роли
Большинству пользователей стоит оставить роль Client по умолчанию. Рассмотри другую роль, когда:
Router — У тебя есть узел в фиксированном, высоком месте с надежным источником питания (крыша, вершина холма). Router постоянно бодрствуют, чтобы пересылать сообщения для других, и они необходимы для расширения покрытия сети. Don’t use Router on battery-powered handheld radios.
Router Late — инфраструктурная нода, которая всегда пересылает пакеты только один раз, но только после того, как все другие режимы маршрутизации выполнили свои ходы. Обеспечивает дополнительное покрытие для локальных кластеров, не конкурируя с основными роутерами.
Client Base — обрабатывает трафик от/к вашим избранным нодам с приоритетом Router Late (обеспечивая этим сообщениям дополнительное ретранслирование), а всё остальное обрабатывает как обычный Client.
Client Mute — хочешь принимать трафик сети, но не участвовать в его ретрансляции. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Спит между передачами для экономии батареи.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Похожий профиль мощности на Tracker.
TAK / TAK Tracker — нужно только если работать с системами ATAK/WinTAK. Смотри Интеграция TAK для подробностей.
💡 Совет: Сеть работает лучше, когда большинство нод Client или Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. Хорошее практическое правило: один роутер на 5–10 клиентов в вашей зоне.
Индикаторы шифрования
У нод рядом с именем отображаются значки статуса шифрования:
Значок
Значение
🔒 Заблокировано
Связь использует PKI (инфраструктуру публичных ключей) — сквозное шифрование с проверкой идентичности
🔓 Разблокировано
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Несовпадение
Несовпадение открытого ключа — ключ ноды изменился с последнего раза (разберитесь, прежде чем доверять)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. Если видишь предупреждение о несоответствии ключа, нода могла быть сброшена или скомпрометирована.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Быстрые действия
Из списка нод ты можешь:
Нажмите на ноду, чтобы увидеть её страницу с деталями
Touch & hold for quick actions:
Отметить/убрать из избранного
Отключить/включить уведомления
Отправить личное сообщение
Трассировка
Игнорировать/разблокировать
Удалить
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Фильтрация и сортировка
Поиск текста
Введи в поле поиска, чтобы отфильтровать ноды по имени или короткому имени. Фильтр обновляется в реальном времени по мере набора текста.
Переключатели фильтра
Фильтр
Описание
Hide offline nodes
Показывать только ноды, услышанные за последние 2 часа
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Включить неизвестные
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Исключить инфраструктуру
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Исключить MQTT
Скрыть ноды, слышимые только через интернет-мост MQTT
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Параметры сортировки
Сортировка
Описание
Last heard
Сначала недавно слышимые ноды
A-Z
Сортировать по полному имени ноды
Расстояние
Сначала ближайшие ноды (требуется обмен позициями)
Меньше хопов
Сначала с наименьшим количеством ретрансляций
Канал
Группировать по индексу канала
via MQTT
Сгруппировать по MQTT и радиоприему
via Favorite (default)
Favorited nodes first, then the rest
Нод на хоп
Нажми на значок гистограммы хопов в панели приложений списка нод, чтобы открыть столбчатую диаграмму того, сколько нод находится на каждом расстоянии хопа (0 = напрямую, 1 = через один ретранслятор и так далее). Отфильтруй график по окну последнего услышанного — за всё время, 1 час, 8 часов или 24 часа — чтобы посмотреть, как сейчас выглядит сеть по сравнению с более длительным периодом. Это быстрый способ понять, насколько занята и разветвлена твоя местная сеть.
Детали ноды
Нажатие на ноду открывает подробный вид с полной информацией. Смотри Метрики ноды для полной информации о метриках и телеметрии.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Встроенные индикаторы статуса показывают ключевые показатели с первого взгляда:
Индикатор
Снимок экрана
Качество сигнала
Уровень заряда батареи
Количество хопов
Последний раз слышен
Расстояние
Ссылки на устройства (“Хочу такое”)
Когда оборудование ноды распознано, в детальном просмотре появляется сворачиваемый раздел “Хочу такой”, содержащий ссылки на места, где можно купить или узнать больше об этом устройстве: страницу продукта у производителя, варианты продукта и объявления на региональных торговых площадках (например, AliExpress, Amazon и у поддерживаемых продавцов), отфильтрованные по твоей стране. Каждая ссылка открывается через сервис перенаправления msh.to. Устройства без подходящих ссылок не показывают этот раздел.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Связанные темы
Метрики ноды — подробные телеметрические панели для каждой ноды
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Rola
Popis
Klient
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Stlmený Klient
Receives but doesn’t retransmit
Skrytý Klient
Like Client Mute, plus hides from node list
Smerovač
Prioritizes message forwarding; stays awake to relay
Smerovač s Oneskorením
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Sledovač
Optimized for position reporting at regular intervals
Senzor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Sledovač
TAK position reporting only
Straty a nálezy
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Odstrániť
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filter
Popis
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Popis
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Posledný príjem
Vzdialenosť
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Rola
Popis
Klient
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Stlmený Klient
Receives but doesn’t retransmit
Skrytý Klient
Like Client Mute, plus hides from node list
Smerovač
Prioritizes message forwarding; stays awake to relay
Smerovač s Oneskorením
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Sledovač
Optimized for position reporting at regular intervals
Senzor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Sledovač
TAK position reporting only
Straty a nálezy
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Odstrániť
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filter
Popis
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Popis
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Posledný príjem
Vzdialenosť
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
Opis
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Odstrani
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filter
Opis
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Opis
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Nazadnje slišano
Razdalja
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
Opis
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Odstrani
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filter
Opis
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Opis
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Nazadnje slišano
Razdalja
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
Përshkrimi
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Hiq
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtrimi
Përshkrimi
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Përshkrimi
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
I fundit që u dëgjua
Distanca
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Role
Përshkrimi
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Hiq
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtrimi
Përshkrimi
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Përshkrimi
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
I fundit që u dëgjua
Distanca
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Улога
Опис
Клијент
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Клијент мутиран
Receives but doesn’t retransmit
Скривени клијент
Like Client Mute, plus hides from node list
Рутер
Prioritizes message forwarding; stays awake to relay
Рутер са кашњењем
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Трекер
Optimized for position reporting at regular intervals
Сензор
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
ТАК Трекер
TAK position reporting only
Изгубљено и нађено
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Иконица
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Уклони
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filter
Опис
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Опис
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Poslednji put viđeno
Udaljenost
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Улога
Опис
Клијент
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Клијент мутиран
Receives but doesn’t retransmit
Скривени клијент
Like Client Mute, plus hides from node list
Рутер
Prioritizes message forwarding; stays awake to relay
Рутер са кашњењем
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Трекер
Optimized for position reporting at regular intervals
Сензор
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
ТАК Трекер
TAK position reporting only
Изгубљено и нађено
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Иконица
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Уклони
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filter
Опис
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Опис
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Poslednji put viđeno
Udaljenost
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Улога
Опис
Клијент
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Клијент мутиран
Receives but doesn’t retransmit
Скривени клијент
Like Client Mute, plus hides from node list
Рутер
Prioritizes message forwarding; stays awake to relay
Рутер са кашњењем
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Трекер
Optimized for position reporting at regular intervals
Сензор
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
ТАК Трекер
TAK position reporting only
Изгубљено и нађено
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Иконица
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Уклони
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Филтер
Опис
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Опис
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Последње откривање
Раздаљина
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Улога
Опис
Клијент
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Клијент мутиран
Receives but doesn’t retransmit
Скривени клијент
Like Client Mute, plus hides from node list
Рутер
Prioritizes message forwarding; stays awake to relay
Рутер са кашњењем
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Трекер
Optimized for position reporting at regular intervals
Сензор
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
ТАК Трекер
TAK position reporting only
Изгубљено и нађено
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Иконица
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Уклони
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Филтер
Опис
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Опис
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Последње откривање
Раздаљина
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Roll
Beskrivning
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Hittegods
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Ta bort
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filter
Beskrivning
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Beskrivning
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Batterinivå
Hop count
Senast hörd
Avstånd
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Roll
Beskrivning
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Hittegods
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Ta bort
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filter
Beskrivning
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Beskrivning
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Batterinivå
Hop count
Senast hörd
Avstånd
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Rol
Açıklaması
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Kaldır
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtre
Açıklaması
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Açıklaması
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Son duyulma
Mesafe
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Rol
Açıklaması
Client
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Tracker
Optimized for position reporting at regular intervals
Sensor
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Kaldır
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Filtre
Açıklaması
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Açıklaması
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Battery level
Hop count
Son duyulma
Mesafe
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Роль
Опис
Клієнт
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Трекер
Optimized for position reporting at regular intervals
Датчик
Optimized for telemetry reporting
ТАК
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Loast and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Видалити
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Фільтри
Опис
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Опис
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Стрибків
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Рівень заряду батареї
Hop count
Востаннє в мережі
Відстань
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
Роль
Опис
Клієнт
Standard end-user node
Client Base
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Трекер
Optimized for position reporting at regular intervals
Датчик
Optimized for telemetry reporting
ТАК
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Loast and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
Видалити
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
Фільтри
Опис
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
Опис
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Стрибків
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
Рівень заряду батареї
Hop count
Востаннє в мережі
Відстань
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
角色
说明
客户端
Standard end-user node
客户群
Treats favorited-node traffic as Router Late priority; all other traffic as Client
客户端静默
Receives but doesn’t retransmit
客户端隐藏
Like Client Mute, plus hides from node list
路由
Prioritizes message forwarding; stays awake to relay
延迟时间
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
追踪器
Optimized for position reporting at regular intervals
传感器
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK 追踪器
TAK position reporting only
失物招领
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
图标
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
移除
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
搜索节点
说明
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
说明
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
电池电量
Hop count
最后听到
距离
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
角色
说明
客户端
Standard end-user node
客户群
Treats favorited-node traffic as Router Late priority; all other traffic as Client
客户端静默
Receives but doesn’t retransmit
客户端隐藏
Like Client Mute, plus hides from node list
路由
Prioritizes message forwarding; stays awake to relay
延迟时间
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
追踪器
Optimized for position reporting at regular intervals
传感器
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK 追踪器
TAK position reporting only
失物招领
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
图标
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
移除
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
搜索节点
说明
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
说明
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
Screenshot
Signal quality
电池电量
Hop count
最后听到
距离
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
角色
描述說明
用戶端
Standard end-user node
客戶端基礎模式
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Repeater
Optimized for position reporting at regular intervals
感測器
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
Communication uses shared channel PSK — encrypted but identity not individually verified
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
移除
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
過濾器
描述說明
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
描述說明
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
螢幕截圖
Signal quality
電池電量
Hop count
最近一次收到排序
距離
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node
The Nodes screen lists every node visible on your mesh.
Node List
The node list shows every node your radio has heard, including:
Node name — user-configured long name
Short name — 4-character identifier
Signal quality — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
Last heard — time since last communication
Distance — estimated distance (if positions are shared)
Battery — remote node battery level (if telemetry is enabled)
Choosing What the List Shows
The list has two densities, set at Settings → Node Layout. Complete shows every field a node has reported and hides the ones it hasn’t. Compact fits more nodes on screen and lets you pick the fields yourself — Power, Last Heard Time, Relative Last Heard Time, Distance and Bearing, Hops Away, Signal (Direct Only), Channel, and Device & Role. The Environment Metrics toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
Node Status Indicators
Indicator
Meaning
Green last-heard time
Node heard within the last 2 hours
Plain last-heard time
Node not heard for over 2 hours
⭐ Favorite
Node you marked as a favorite.
There is no separate “away” tier.
Node Roles
Nodes can be configured with different roles that affect their mesh behavior:
角色
描述說明
用戶端
Standard end-user node
客戶端基礎模式
Treats favorited-node traffic as Router Late priority; all other traffic as Client
Client Mute
Receives but doesn’t retransmit
Client Hidden
Like Client Mute, plus hides from node list
Router
Prioritizes message forwarding; stays awake to relay
Router Late
Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage)
Router Client
⚠️ Deprecated (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead
Repeater
⚠️ Deprecated (removed in firmware 2.7.11) — no longer selectable; use Router instead
Repeater
Optimized for position reporting at regular intervals
感測器
Optimized for telemetry reporting
TAK
Interoperates with TAK systems (sends/receives CoT)
TAK Tracker
TAK position reporting only
Lost and Found
Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio
Choosing a Role
Most users should keep the default Client role. Consider a different role when:
Router — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don’t use Router on battery-powered handheld radios.
Router Late — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
Client Base — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
Client Mute — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
Tracker — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
Sensor — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
TAK / TAK Tracker — Only needed if interoperating with ATAK/WinTAK systems. See TAK Integration for details.
💡 Tip: The mesh works best when most nodes are Client or Router. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
Encryption Indicators
Nodes display encryption status icons next to their name:
Icon
Meaning
🔒 Locked
Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity
🔓 Unlocked
No public key has been received for this node, so it cannot be direct messaged — use Request User Info on the node detail page to ask for one
⚠️ Mismatch
Public key mismatch — the node’s key has changed since last seen (investigate before trusting)
💡 Tip: Direct messages always use PKI, so the radio needs the other node’s public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose Remove, and let the two radios exchange keys again the next time yours hears it.
Quick Actions
From the node list, you can:
Tap a node to view its detail page
Touch & hold for quick actions:
Mark/remove favorite
Mute/unmute notifications
Send a direct message
Trace route
Ignore/unignore
移除
Touch & hold your own node instead and you get one action, Update status, which opens the User settings screen with the cursor already in the Status Message field. It only appears while the radio is connected and running firmware 2.8 or newer — see Settings — Radio & User for the field itself.
Sharing a Contact
On a node’s detail screen, tap Share Contact to produce a link and a QR code for that node. From the same dialog, Write to NFC tag saves the link to a writable NFC tag that anyone can tap to open.
To add someone else’s contact, use the import button on the node list and choose Scan Shared Contact QR Code, Scan Shared Contact NFC, or Input Shared Contact URL. The app asks you to confirm with Import Shared Contact?, and warns you when the contact is one you already have.
Filtering & Sorting
Text Search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
Filter Toggles
過濾器
描述說明
Hide offline nodes
Show only nodes heard within the last 2 hours
Only show direct nodes
Show only nodes your radio heard directly, with no relay in between
Include unknown
Show nodes that haven’t sent user info yet. On by default, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete
Exclude infrastructure
Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role
Exclude MQTT
Hide nodes heard only via MQTT internet bridge
Only show ignored Nodes
Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back
Sort Options
Sort
描述說明
Last heard
Most recently heard nodes first
A-Z
Sorted by node long name
Distance
Nearest nodes first (requires position sharing)
Hops away
Fewest relay hops first
Channel
Grouped by channel index
via MQTT
Grouped by MQTT vs. radio-heard
via Favorite (default)
Favorited nodes first, then the rest
Nodes per Hop
Tap the hop-histogram icon in the node list’s app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a last heard window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It’s a quick way to gauge how busy and spread out your local mesh is.
Node Detail
Tapping a node opens the detail view with comprehensive information. See Node Metrics for full details on metrics and telemetry.
The Details card carries the node’s short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
Inline status indicators show key metrics at a glance:
Indicator
螢幕截圖
Signal quality
電池電量
Hop count
最近一次收到排序
距離
Device Links (“I want one”)
When a node’s hardware is recognized, the detail view shows a collapsible “I want one” section linking to places to buy or learn more about that device: the vendor’s product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the msh.to redirect service. Devices with no matching links don’t show the section.
A full, browsable directory of every link is also available at Settings → Device Links. The item is hidden while you have Settings open for a remote node.
When No Nodes Appear
The list stays empty until your radio hears another node.
No device connected — the app is not connected to a radio. See Connections.
Searching for nodes — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave Include unknown on so a node that has not yet sent its name still appears. See Settings — Radio & User.
A node you expect is missing — check the filter toggles. Only show direct nodes, Exclude MQTT, and Exclude infrastructure each hide a whole category of node.
Related Topics
Node Metrics — detailed telemetry dashboards for each node