diff --git a/.properties b/.properties
index 9d29de5604..3eed56a6f7 100644
--- a/.properties
+++ b/.properties
@@ -1,6 +1,6 @@
id=com.silabs.sdk.stack.super
-version=4.1.0
+version=4.1.1
label=Gecko SDK Suite
description=Gecko SDK Suite
@@ -15,7 +15,7 @@ buildNumber=0
# Look in these locations for extra properties
# note that the single .properties input is a hack so that this will work while the stacks are updated
-extendedProperties=app/bluetooth/find_my.properties app/amazon/app_amazon.properties app/mcu_example/app_mcu.properties .studio/efm32.properties app/bluetooth/esf.properties app/bluetooth/btmesh.properties app/flex/esf.properties extension/homekit/app/esf.properties app/common/app_common.properties platform/bootloader/esf.properties platform/halconfig/halconfig.properties platform/base/base.properties platform/micrium_os/micrium-krnx.properties protocol/openthread/esf.properties protocol/zigbee/esf.properties protocol/z-wave/esf.properties protocol/usb/usb.properties hardware/kit/kit.properties hardware/reference_design/ref_design.properties util/plugin/plugin.properties app/wisun/esf.properties util/third_party/tensorflow_extra/apack.properties extension/wiseconnect/esf.properties
+extendedProperties=app/bluetooth/bluetooth_esl.properties app/bluetooth/find_my.properties app/amazon/app_amazon.properties app/mcu_example/app_mcu.properties .studio/efm32.properties app/bluetooth/esf.properties app/bluetooth/btmesh.properties app/flex/esf.properties extension/homekit/app/esf.properties app/common/app_common.properties platform/bootloader/esf.properties platform/halconfig/halconfig.properties platform/base/base.properties platform/micrium_os/micrium-krnx.properties protocol/openthread/esf.properties protocol/zigbee/esf.properties protocol/z-wave/esf.properties protocol/usb/usb.properties hardware/kit/kit.properties hardware/reference_design/ref_design.properties util/plugin/plugin.properties app/wisun/esf.properties util/third_party/tensorflow_extra/apack.properties extension/wiseconnect/esf.properties
# ISD options
baseDirectory=platform/base
diff --git a/app/amazon/amazon_bluetooth_alpha_templates.xml b/app/amazon/amazon_bluetooth_alpha_templates.xml
index 951c7ee6b9..4aebedc10f 100644
--- a/app/amazon/amazon_bluetooth_alpha_templates.xml
+++ b/app/amazon/amazon_bluetooth_alpha_templates.xml
@@ -6,8 +6,8 @@
-
-
+
+
@@ -21,8 +21,8 @@
-
-
+
+
@@ -36,9 +36,9 @@
-
-
-
+
+
+
diff --git a/app/amazon/amazon_platform_alpha_templates.xml b/app/amazon/amazon_platform_alpha_templates.xml
index 7960371b5e..bcefc38dab 100644
--- a/app/amazon/amazon_platform_alpha_templates.xml
+++ b/app/amazon/amazon_platform_alpha_templates.xml
@@ -6,9 +6,9 @@
-
-
-
+
+
+
diff --git a/app/amazon/example/amazon_aws_demos/amazon_aws_soc_gatt_server.slcp b/app/amazon/example/amazon_aws_demos/amazon_aws_soc_gatt_server.slcp
index 9429eab0dc..dbb0d7806d 100644
--- a/app/amazon/example/amazon_aws_demos/amazon_aws_soc_gatt_server.slcp
+++ b/app/amazon/example/amazon_aws_demos/amazon_aws_soc_gatt_server.slcp
@@ -75,7 +75,7 @@ configuration:
tag:
- hardware:device:ram:64
- hardware:rf:band:2400
- - hardware:device:sdid:200|205
+ - hardware:device:sdid:200|205|215
ui_hints:
highlight: config/aws_clientcredential.h
diff --git a/app/amazon/example/amazon_aws_demos/amazon_aws_soc_mqtt_over_ble.slcp b/app/amazon/example/amazon_aws_demos/amazon_aws_soc_mqtt_over_ble.slcp
index cf8c687e5a..bffb1388d7 100644
--- a/app/amazon/example/amazon_aws_demos/amazon_aws_soc_mqtt_over_ble.slcp
+++ b/app/amazon/example/amazon_aws_demos/amazon_aws_soc_mqtt_over_ble.slcp
@@ -75,7 +75,7 @@ configuration:
tag:
- hardware:device:ram:64
- hardware:rf:band:2400
- - hardware:device:sdid:200|205
+ - hardware:device:sdid:200|205|215
ui_hints:
highlight: config/aws_clientcredential.h
diff --git a/app/amazon/example/amazon_aws_tests/amazon_aws_soc_bt_tests.slcp b/app/amazon/example/amazon_aws_tests/amazon_aws_soc_bt_tests.slcp
index a72e522d61..3806cdac95 100644
--- a/app/amazon/example/amazon_aws_tests/amazon_aws_soc_bt_tests.slcp
+++ b/app/amazon/example/amazon_aws_tests/amazon_aws_soc_bt_tests.slcp
@@ -80,7 +80,7 @@ configuration:
tag:
- hardware:device:ram:64
- hardware:rf:band:2400
- - hardware:device:sdid:200|205
+ - hardware:device:sdid:200|205|215
filter:
- name: "Wireless Technology"
diff --git a/app/bluetooth/bluetooth_production_demos.xml b/app/bluetooth/bluetooth_production_demos.xml
index 025c6b1391..42dd8bc29d 100644
--- a/app/bluetooth/bluetooth_production_demos.xml
+++ b/app/bluetooth/bluetooth_production_demos.xml
@@ -1,1599 +1,1659 @@
+
+ Network Co-Processor (NCP) target application. Runs the Bluetooth stack dynamically and provides access to it via Bluetooth API (BGAPI) using UART connection. NCP mode makes it possible to run your application on a host controller or PC.
+
+
+
+
+
+
+
+
+
+
+
+ Network Co-Processor (NCP) target application. Runs the Bluetooth stack dynamically and provides access to it via Bluetooth API (BGAPI) using UART connection. NCP mode makes it possible to run your application on a host controller or PC.
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Network Co-Processor (NCP) target application. Runs the Bluetooth stack dynamically and provides access to it via Bluetooth API (BGAPI) using UART connection. NCP mode makes it possible to run your application on a host controller or PC.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Network Co-Processor (NCP) target application. Runs the Bluetooth stack dynamically and provides access to it via Bluetooth API (BGAPI) using UART connection. NCP mode makes it possible to run your application on a host controller or PC.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Network Co-Processor (NCP) target application. Runs the Bluetooth stack dynamically and provides access to it via Bluetooth API (BGAPI) using UART connection. NCP mode makes it possible to run your application on a host controller or PC.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Network Co-Processor (NCP) target application. Runs the Bluetooth stack dynamically and provides access to it via Bluetooth API (BGAPI) using UART connection. NCP mode makes it possible to run your application on a host controller or PC.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Network Co-Processor (NCP) target application. Runs the Bluetooth stack dynamically and provides access to it via Bluetooth API (BGAPI) using UART connection. NCP mode makes it possible to run your application on a host controller or PC.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Network Co-Processor (NCP) target application. Runs the Bluetooth stack dynamically and provides access to it via Bluetooth API (BGAPI) using UART connection. NCP mode makes it possible to run your application on a host controller or PC.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Network Co-Processor (NCP) target application. Runs the Bluetooth stack dynamically and provides access to it via Bluetooth API (BGAPI) using UART connection. NCP mode makes it possible to run your application on a host controller or PC.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Network Co-Processor (NCP) target application. Runs the Bluetooth stack dynamically and provides access to it via Bluetooth API (BGAPI) using UART connection. NCP mode makes it possible to run your application on a host controller or PC.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Network Co-Processor (NCP) target application. Runs the Bluetooth stack dynamically and provides access to it via Bluetooth API (BGAPI) using UART connection. NCP mode makes it possible to run your application on a host controller or PC.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Network Co-Processor (NCP) target application. Runs the Bluetooth stack dynamically and provides access to it via Bluetooth API (BGAPI) using UART connection. NCP mode makes it possible to run your application on a host controller or PC.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Network Co-Processor (NCP) target application. Runs the Bluetooth stack dynamically and provides access to it via Bluetooth API (BGAPI) using UART connection. NCP mode makes it possible to run your application on a host controller or PC.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Network Co-Processor (NCP) target application. Runs the Bluetooth stack dynamically and provides access to it via Bluetooth API (BGAPI) using UART connection. NCP mode makes it possible to run your application on a host controller or PC.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Network Co-Processor (NCP) target application. Runs the Bluetooth stack dynamically and provides access to it via Bluetooth API (BGAPI) using UART connection. NCP mode makes it possible to run your application on a host controller or PC.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Network Co-Processor (NCP) target application. Runs the Bluetooth stack dynamically and provides access to it via Bluetooth API (BGAPI) using UART connection. NCP mode makes it possible to run your application on a host controller or PC.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Network Co-Processor (NCP) target application. Runs the Bluetooth stack dynamically and provides access to it via Bluetooth API (BGAPI) using UART connection. NCP mode makes it possible to run your application on a host controller or PC.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Network Co-Processor (NCP) target application. Runs the Bluetooth stack dynamically and provides access to it via Bluetooth API (BGAPI) using UART connection. NCP mode makes it possible to run your application on a host controller or PC.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Network Co-Processor (NCP) target application. Runs the Bluetooth stack dynamically and provides access to it via Bluetooth API (BGAPI) using UART connection. NCP mode makes it possible to run your application on a host controller or PC.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Network Co-Processor (NCP) target application. Runs the Bluetooth stack dynamically and provides access to it via Bluetooth API (BGAPI) using UART connection. NCP mode makes it possible to run your application on a host controller or PC.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Network Co-Processor (NCP) target application. Runs the Bluetooth stack dynamically and provides access to it via Bluetooth API (BGAPI) using UART connection. NCP mode makes it possible to run your application on a host controller or PC.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Network Co-Processor (NCP) target application. Runs the Bluetooth stack dynamically and provides access to it via Bluetooth API (BGAPI) using UART connection. NCP mode makes it possible to run your application on a host controller or PC.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Network Co-Processor (NCP) target application. Runs the Bluetooth stack dynamically and provides access to it via Bluetooth API (BGAPI) using UART connection. NCP mode makes it possible to run your application on a host controller or PC.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Network Co-Processor (NCP) target application. Runs the Bluetooth stack dynamically and provides access to it via Bluetooth API (BGAPI) using UART connection. NCP mode makes it possible to run your application on a host controller or PC.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Network Co-Processor (NCP) target application. Runs the Bluetooth stack dynamically and provides access to it via Bluetooth API (BGAPI) using UART connection. NCP mode makes it possible to run your application on a host controller or PC.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
The classic blinky example using Bluetooth communication. Demonstrates a simple two-way data exchange over GATT. This can be tested with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
+
+
+ The classic blinky example using Bluetooth communication. Demonstrates a simple two-way data exchange over GATT. This can be tested with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
The classic blinky example using Bluetooth communication. Demonstrates a simple two-way data exchange over GATT. This can be tested with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
The classic blinky example using Bluetooth communication. Demonstrates a simple two-way data exchange over GATT. This can be tested with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
The classic blinky example using Bluetooth communication. Demonstrates a simple two-way data exchange over GATT. This can be tested with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
The classic blinky example using Bluetooth communication. Demonstrates a simple two-way data exchange over GATT. This can be tested with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
The classic blinky example using Bluetooth communication. Demonstrates a simple two-way data exchange over GATT. This can be tested with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
The classic blinky example using Bluetooth communication. Demonstrates a simple two-way data exchange over GATT. This can be tested with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
The classic blinky example using Bluetooth communication. Demonstrates a simple two-way data exchange over GATT. This can be tested with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
The classic blinky example using Bluetooth communication. Demonstrates a simple two-way data exchange over GATT. This can be tested with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
The classic blinky example using Bluetooth communication. Demonstrates a simple two-way data exchange over GATT. This can be tested with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
The classic blinky example using Bluetooth communication. Demonstrates a simple two-way data exchange over GATT. This can be tested with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
The classic blinky example using Bluetooth communication. Demonstrates a simple two-way data exchange over GATT. This can be tested with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
The classic blinky example using Bluetooth communication. Demonstrates a simple two-way data exchange over GATT. This can be tested with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
The classic blinky example using Bluetooth communication. Demonstrates a simple two-way data exchange over GATT. This can be tested with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
The classic blinky example using Bluetooth communication. Demonstrates a simple two-way data exchange over GATT. This can be tested with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
The classic blinky example using Bluetooth communication. Demonstrates a simple two-way data exchange over GATT. This can be tested with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
The classic blinky example using Bluetooth communication. Demonstrates a simple two-way data exchange over GATT. This can be tested with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
The classic blinky example using Bluetooth communication. Demonstrates a simple two-way data exchange over GATT. This can be tested with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
The classic blinky example using Bluetooth communication. Demonstrates a simple two-way data exchange over GATT. This can be tested with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
The classic blinky example using Bluetooth communication. Demonstrates a simple two-way data exchange over GATT. This can be tested with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
The classic blinky example using Bluetooth communication. Demonstrates a simple two-way data exchange over GATT. This can be tested with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
The classic blinky example using Bluetooth communication. Demonstrates a simple two-way data exchange over GATT. This can be tested with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
The classic blinky example using Bluetooth communication. Demonstrates a simple two-way data exchange over GATT. This can be tested with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
The classic blinky example using Bluetooth communication. Demonstrates a simple two-way data exchange over GATT. This can be tested with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Demonstrates the features of the EFR32xG24 Dev Kit Board. This can be tested with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Implements a GATT Server with the Health Thermometer Profile, which enables a Client device to connect and get temperature data. Temperature is read from the mock relative humidity and temperature sensor.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Implements a GATT Server with the Health Thermometer Profile, which enables a Client device to connect and get temperature data. Temperature is read from the mock relative humidity and temperature sensor.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Implements a GATT Server with the Health Thermometer Profile, which enables a Client device to connect and get temperature data. Temperature is read from the mock relative humidity and temperature sensor.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Implements a GATT Server with the Health Thermometer Profile, which enables a Client device to connect and get temperature data. Temperature is read from the mock relative humidity and temperature sensor.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Implements a GATT Server with the Health Thermometer Profile, which enables a Client device to connect and get temperature data. Temperature is read from the mock relative humidity and temperature sensor.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Implements a GATT Server with the Health Thermometer Profile, which enables a Client device to connect and get temperature data. Temperature is read from the mock relative humidity and temperature sensor.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Implements a GATT Server with the Health Thermometer Profile, which enables a Client device to connect and get temperature data. Temperature is read from the mock relative humidity and temperature sensor.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Implements a GATT Server with the Health Thermometer Profile, which enables a Client device to connect and get temperature data. Temperature is read from the mock relative humidity and temperature sensor.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Implements a GATT Server with the Health Thermometer Profile, which enables a Client device to connect and get temperature data. Temperature is read from the mock relative humidity and temperature sensor.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Implements a GATT Server with the Health Thermometer Profile, which enables a Client device to connect and get temperature data. Temperature is read from the mock relative humidity and temperature sensor.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Implements a GATT Server with the Health Thermometer Profile, which enables a Client device to connect and get temperature data. Temperature is read from the mock relative humidity and temperature sensor.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Implements a GATT Server with the Health Thermometer Profile, which enables a Client device to connect and get temperature data. Temperature is read from the Si7021 digital relative humidity and temperature sensor of the WSTK or of the Thunderboard.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Implements a GATT Server with the Health Thermometer Profile, which enables a Client device to connect and get temperature data. Temperature is read from the Si7021 digital relative humidity and temperature sensor of the WSTK or of the Thunderboard.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Implements a GATT Server with the Health Thermometer Profile, which enables a Client device to connect and get temperature data. Temperature is read from the Si7021 digital relative humidity and temperature sensor of the WSTK or of the Thunderboard.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Implements a GATT Server with the Health Thermometer Profile, which enables a Client device to connect and get temperature data. Temperature is read from the Si7021 digital relative humidity and temperature sensor of the WSTK or of the Thunderboard.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Implements a GATT Server with the Health Thermometer Profile, which enables a Client device to connect and get temperature data. Temperature is read from the Si7021 digital relative humidity and temperature sensor of the WSTK or of the Thunderboard.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Implements a GATT Server with the Health Thermometer Profile, which enables a Client device to connect and get temperature data. Temperature is read from the Si7021 digital relative humidity and temperature sensor of the WSTK or of the Thunderboard.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Implements a GATT Server with the Health Thermometer Profile, which enables a Client device to connect and get temperature data. Temperature is read from the Si7021 digital relative humidity and temperature sensor of the WSTK or of the Thunderboard.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Implements a GATT Server with the Health Thermometer Profile, which enables a Client device to connect and get temperature data. Temperature is read from the Si7021 digital relative humidity and temperature sensor of the WSTK or of the Thunderboard.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Implements a GATT Server with the Health Thermometer Profile, which enables a Client device to connect and get temperature data. Temperature is read from the Si7021 digital relative humidity and temperature sensor of the WSTK or of the Thunderboard.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Implements a GATT Server with the Health Thermometer Profile, which enables a Client device to connect and get temperature data. Temperature is read from the Si7021 digital relative humidity and temperature sensor of the WSTK or of the Thunderboard.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Implements a GATT Server with the Health Thermometer Profile, which enables a Client device to connect and get temperature data. Temperature is read from the Si7021 digital relative humidity and temperature sensor of the WSTK or of the Thunderboard.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Implements a GATT Server with the Health Thermometer Profile, which enables a Client device to connect and get temperature data. Temperature is read from the Si7021 digital relative humidity and temperature sensor of the WSTK or of the Thunderboard.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Implements a GATT Server with the Health Thermometer Profile, which enables a Client device to connect and get temperature data. Temperature is read from the Si7021 digital relative humidity and temperature sensor of the WSTK or of the Thunderboard.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Implements a GATT Server with the Health Thermometer Profile, which enables a Client device to connect and get temperature data. Temperature is read from the Si7021 digital relative humidity and temperature sensor of the WSTK or of the Thunderboard.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example tests the throughput capabilities of the device and can be used to measure throughput between 2 *EFR32* devices, as well as between a device and a smartphone using EFR Connect mobile app, through the Throughput demo tile.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example tests the throughput capabilities of the device and can be used to measure throughput between 2 *EFR32* devices, as well as between a device and a smartphone using EFR Connect mobile app, through the Throughput demo tile.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example tests the throughput capabilities of the device and can be used to measure throughput between 2 *EFR32* devices, as well as between a device and a smartphone using EFR Connect mobile app, through the Throughput demo tile.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example tests the throughput capabilities of the device and can be used to measure throughput between 2 *EFR32* devices, as well as between a device and a smartphone using EFR Connect mobile app, through the Throughput demo tile.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example tests the throughput capabilities of the device and can be used to measure throughput between 2 *EFR32* devices, as well as between a device and a smartphone using EFR Connect mobile app, through the Throughput demo tile.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example tests the throughput capabilities of the device and can be used to measure throughput between 2 *EFR32* devices, as well as between a device and a smartphone using EFR Connect mobile app, through the Throughput demo tile.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example tests the throughput capabilities of the device and can be used to measure throughput between 2 *EFR32* devices, as well as between a device and a smartphone using EFR Connect mobile app, through the Throughput demo tile.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example tests the throughput capabilities of the device and can be used to measure throughput between 2 *EFR32* devices, as well as between a device and a smartphone using EFR Connect mobile app, through the Throughput demo tile.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example tests the throughput capabilities of the device and can be used to measure throughput between 2 *EFR32* devices, as well as between a device and a smartphone using EFR Connect mobile app, through the Throughput demo tile.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example tests the throughput capabilities of the device and can be used to measure throughput between 2 *EFR32* devices, as well as between a device and a smartphone using EFR Connect mobile app, through the Throughput demo tile.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example tests the throughput capabilities of the device and can be used to measure throughput between 2 *EFR32* devices, as well as between a device and a smartphone using EFR Connect mobile app, through the Throughput demo tile.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example tests the throughput capabilities of the device and can be used to measure throughput between 2 *EFR32* devices, as well as between a device and a smartphone using EFR Connect mobile app, through the Throughput demo tile.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example tests the throughput capabilities of the device and can be used to measure throughput between 2 *EFR32* devices, as well as between a device and a smartphone using EFR Connect mobile app, through the Throughput demo tile.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example tests the throughput capabilities of the device and can be used to measure throughput between 2 *EFR32* devices, as well as between a device and a smartphone using EFR Connect mobile app, through the Throughput demo tile.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example tests the throughput capabilities of the device and can be used to measure throughput between 2 *EFR32* devices, as well as between a device and a smartphone using EFR Connect mobile app, through the Throughput demo tile.
+
+
+
+
+
+
+
+
+
+
+ This example tests the throughput capabilities of the device and can be used to measure throughput between 2 *EFR32* devices, as well as between a device and a smartphone using EFR Connect mobile app, through the Throughput demo tile.
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example tests the throughput capabilities of the device and can be used to measure throughput between 2 *EFR32* devices, as well as between a device and a smartphone using EFR Connect mobile app, through the Throughput demo tile.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example tests the throughput capabilities of the device and can be used to measure throughput between 2 *EFR32* devices, as well as between a device and a smartphone using EFR Connect mobile app, through the Throughput demo tile.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example tests the throughput capabilities of the device and can be used to measure throughput between 2 *EFR32* devices, as well as between a device and a smartphone using EFR Connect mobile app, through the Throughput demo tile.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example tests the throughput capabilities of the device and can be used to measure throughput between 2 *EFR32* devices, as well as between a device and a smartphone using EFR Connect mobile app, through the Throughput demo tile.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example tests the throughput capabilities of the device and can be used to measure throughput between 2 *EFR32* devices, as well as between a device and a smartphone using EFR Connect mobile app, through the Throughput demo tile.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example tests the throughput capabilities of the device and can be used to measure throughput between 2 *EFR32* devices, as well as between a device and a smartphone using EFR Connect mobile app, through the Throughput demo tile.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example tests the throughput capabilities of the device and can be used to measure throughput between 2 *EFR32* devices, as well as between a device and a smartphone using EFR Connect mobile app, through the Throughput demo tile.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example tests the throughput capabilities of the device and can be used to measure throughput between 2 *EFR32* devices, as well as between a device and a smartphone using EFR Connect mobile app, through the Throughput demo tile.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Demonstrates the features of the Thunderboard EFR32BG22 Kit. This can be tested with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Demonstrates the features of the Thunderboard EFR32BG22 Kit. This can be tested with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Demonstrates the features of the Thunderboard Sense 2 Kit. This can be tested with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Voice over Bluetooth Low Energy sample application. It is supported by Thunderboard Sense 2 and Thunderboard EFR32BG22 boards and demonstrates how to send voice data over GATT, which is acquired from the on-board microphones.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Voice over Bluetooth Low Energy sample application. It is supported by Thunderboard Sense 2 and Thunderboard EFR32BG22 boards and demonstrates how to send voice data over GATT, which is acquired from the on-board microphones.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Voice over Bluetooth Low Energy sample application. It is supported by Thunderboard Sense 2 and Thunderboard EFR32BG22 boards and demonstrates how to send voice data over GATT, which is acquired from the on-board microphones.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Sends non-connectable advertisements in iBeacon format. The iBeacon Service gives Bluetooth accessories a simple and convenient way to send iBeacons to smartphones. This example can be tested together with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Sends non-connectable advertisements in iBeacon format. The iBeacon Service gives Bluetooth accessories a simple and convenient way to send iBeacons to smartphones. This example can be tested together with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Sends non-connectable advertisements in iBeacon format. The iBeacon Service gives Bluetooth accessories a simple and convenient way to send iBeacons to smartphones. This example can be tested together with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Sends non-connectable advertisements in iBeacon format. The iBeacon Service gives Bluetooth accessories a simple and convenient way to send iBeacons to smartphones. This example can be tested together with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Sends non-connectable advertisements in iBeacon format. The iBeacon Service gives Bluetooth accessories a simple and convenient way to send iBeacons to smartphones. This example can be tested together with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Sends non-connectable advertisements in iBeacon format. The iBeacon Service gives Bluetooth accessories a simple and convenient way to send iBeacons to smartphones. This example can be tested together with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Sends non-connectable advertisements in iBeacon format. The iBeacon Service gives Bluetooth accessories a simple and convenient way to send iBeacons to smartphones. This example can be tested together with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Sends non-connectable advertisements in iBeacon format. The iBeacon Service gives Bluetooth accessories a simple and convenient way to send iBeacons to smartphones. This example can be tested together with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Sends non-connectable advertisements in iBeacon format. The iBeacon Service gives Bluetooth accessories a simple and convenient way to send iBeacons to smartphones. This example can be tested together with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Sends non-connectable advertisements in iBeacon format. The iBeacon Service gives Bluetooth accessories a simple and convenient way to send iBeacons to smartphones. This example can be tested together with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Sends non-connectable advertisements in iBeacon format. The iBeacon Service gives Bluetooth accessories a simple and convenient way to send iBeacons to smartphones. This example can be tested together with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Sends non-connectable advertisements in iBeacon format. The iBeacon Service gives Bluetooth accessories a simple and convenient way to send iBeacons to smartphones. This example can be tested together with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Sends non-connectable advertisements in iBeacon format. The iBeacon Service gives Bluetooth accessories a simple and convenient way to send iBeacons to smartphones. This example can be tested together with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Sends non-connectable advertisements in iBeacon format. The iBeacon Service gives Bluetooth accessories a simple and convenient way to send iBeacons to smartphones. This example can be tested together with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Sends non-connectable advertisements in iBeacon format. The iBeacon Service gives Bluetooth accessories a simple and convenient way to send iBeacons to smartphones. This example can be tested together with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Sends non-connectable advertisements in iBeacon format. The iBeacon Service gives Bluetooth accessories a simple and convenient way to send iBeacons to smartphones. This example can be tested together with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Sends non-connectable advertisements in iBeacon format. The iBeacon Service gives Bluetooth accessories a simple and convenient way to send iBeacons to smartphones. This example can be tested together with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Sends non-connectable advertisements in iBeacon format. The iBeacon Service gives Bluetooth accessories a simple and convenient way to send iBeacons to smartphones. This example can be tested together with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Sends non-connectable advertisements in iBeacon format. The iBeacon Service gives Bluetooth accessories a simple and convenient way to send iBeacons to smartphones. This example can be tested together with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Sends non-connectable advertisements in iBeacon format. The iBeacon Service gives Bluetooth accessories a simple and convenient way to send iBeacons to smartphones. This example can be tested together with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Sends non-connectable advertisements in iBeacon format. The iBeacon Service gives Bluetooth accessories a simple and convenient way to send iBeacons to smartphones. This example can be tested together with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Sends non-connectable advertisements in iBeacon format. The iBeacon Service gives Bluetooth accessories a simple and convenient way to send iBeacons to smartphones. This example can be tested together with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Sends non-connectable advertisements in iBeacon format. The iBeacon Service gives Bluetooth accessories a simple and convenient way to send iBeacons to smartphones. This example can be tested together with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Sends non-connectable advertisements in iBeacon format. The iBeacon Service gives Bluetooth accessories a simple and convenient way to send iBeacons to smartphones. This example can be tested together with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Sends non-connectable advertisements in iBeacon format. The iBeacon Service gives Bluetooth accessories a simple and convenient way to send iBeacons to smartphones. This example can be tested together with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Sends non-connectable advertisements in iBeacon format. The iBeacon Service gives Bluetooth accessories a simple and convenient way to send iBeacons to smartphones. This example can be tested together with the EFR Connect mobile app.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Network Co-Processor (NCP) target application extended with CTE Receiver support. It enables Angle of Arrival (AoA) calculation. Use this application with Direction Finding host examples.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Network Co-Processor (NCP) target application extended with CTE Receiver support. It enables Angle of Arrival (AoA) calculation. Use this application with Direction Finding host examples.
+
+
+
+
+
+
+
+
+
+
+ This sample app demonstrates a CTE (Constant Tone Extension) transmitter that can be used as an asset tag in a Direction Finding setup estimating Angle of Arrival (AoA).
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This sample app demonstrates a CTE (Constant Tone Extension) transmitter that can be used as an asset tag in a Direction Finding setup estimating Angle of Arrival (AoA).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This sample app demonstrates a CTE (Constant Tone Extension) transmitter that can be used as an asset tag in a Direction Finding setup estimating Angle of Arrival (AoA).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This is a Dynamic Multiprotocol reference application demonstrating a light bulb that can be switched both via Bluetooth and via a Proprietary protocol. Can be tested with the EFR Connect mobile app and Flex (RAIL) Switch sample app.
+
+
+
+
+
+
+
+
diff --git a/app/bluetooth/bluetooth_production_templates.xml b/app/bluetooth/bluetooth_production_templates.xml
index 1dcf3b31c1..2411aca05c 100644
--- a/app/bluetooth/bluetooth_production_templates.xml
+++ b/app/bluetooth/bluetooth_production_templates.xml
@@ -7,8 +7,8 @@
-
-
+
+
@@ -21,9 +21,9 @@
-
-
-
+
+
+
@@ -36,9 +36,9 @@
-
+
-
+
@@ -53,7 +53,7 @@
-
+
@@ -66,9 +66,9 @@
-
+
-
+
@@ -81,9 +81,9 @@
-
+
-
+
@@ -96,9 +96,9 @@
-
+
-
+
@@ -111,9 +111,9 @@
-
+
-
+
@@ -126,9 +126,9 @@
-
+
-
+
@@ -143,7 +143,7 @@
-
+
@@ -158,7 +158,7 @@
-
+
@@ -173,7 +173,7 @@
-
+
@@ -188,7 +188,7 @@
-
+
@@ -201,9 +201,9 @@
-
+
-
+
@@ -216,9 +216,9 @@
-
+
-
+
@@ -233,7 +233,7 @@
-
+
@@ -248,7 +248,7 @@
-
+
@@ -263,7 +263,7 @@
-
+
@@ -276,9 +276,9 @@
-
+
-
+
@@ -293,7 +293,7 @@
-
+
@@ -306,9 +306,9 @@
-
-
-
+
+
+
@@ -321,9 +321,9 @@
-
-
-
+
+
+
@@ -336,9 +336,9 @@
-
+
-
+
@@ -351,9 +351,9 @@
-
+
-
+
@@ -366,9 +366,9 @@
-
+
-
+
@@ -383,7 +383,7 @@
-
+
@@ -396,9 +396,9 @@
-
+
-
+
@@ -413,7 +413,7 @@
-
+
@@ -428,7 +428,7 @@
-
+
@@ -441,9 +441,9 @@
-
+
-
+
@@ -458,7 +458,7 @@
-
+
@@ -471,9 +471,9 @@
-
+
-
+
@@ -486,9 +486,9 @@
-
+
-
+
@@ -501,9 +501,9 @@
-
+
-
+
@@ -516,9 +516,9 @@
-
+
-
+
@@ -531,9 +531,9 @@
-
+
-
+
@@ -548,7 +548,7 @@
-
+
@@ -563,7 +563,7 @@
-
+
@@ -578,7 +578,7 @@
-
+
@@ -593,7 +593,7 @@
-
+
@@ -608,7 +608,7 @@
-
+
@@ -623,7 +623,7 @@
-
+
diff --git a/app/bluetooth/btmesh.properties b/app/bluetooth/btmesh.properties
index f851d36fd6..512cb7500c 100644
--- a/app/bluetooth/btmesh.properties
+++ b/app/bluetooth/btmesh.properties
@@ -2,8 +2,8 @@
id=com.silabs.stack.btMesh
label=Bluetooth Mesh SDK
description=Bluetooth Mesh Software Development Kit
-version=3.0.0.0
-prop.subLabel=Bluetooth\\ Mesh\\ 3.0.0
+version=3.0.1.0
+prop.subLabel=Bluetooth\\ Mesh\\ 3.0.1
# Default compatibility of the BT Mesh SDK (This is needed for the documentation only)
prop.boardCompatibility=.*
diff --git a/app/bluetooth/btmesh_internal_demos.xml b/app/bluetooth/btmesh_internal_demos.xml
index b4e147e970..43cda56d0a 100644
--- a/app/bluetooth/btmesh_internal_demos.xml
+++ b/app/bluetooth/btmesh_internal_demos.xml
@@ -1,159 +1,159 @@
-
-
-
-
-
-
-
-
Friend example for IOP test. This node acts as a friend for the low power node and caches messages sent to it when the low power node is sleeping.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Friend example for IOP test. This node acts as a friend for the low power node and caches messages sent to it when the low power node is sleeping.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Friend example for IOP test. This node acts as a friend for the low power node and caches messages sent to it when the low power node is sleeping.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Low power node example for IOP test. This node acts as a typical low power device and sleeps most of the time. It needs a friend node to cache messages and forward them when polled.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Low power node example for IOP test. This node acts as a typical low power device and sleeps most of the time. It needs a friend node to cache messages and forward them when polled.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Low power node example for IOP test. This node acts as a typical low power device and sleeps most of the time. It needs a friend node to cache messages and forward them when polled.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Low power node example for IOP test. This node acts as a typical low power device and sleeps most of the time. It needs a friend node to cache messages and forward them when polled.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Proxy example for IOP test. This node forwards/relays messages between GATT and advertising bearers in the network.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Proxy example for IOP test. This node forwards/relays messages between GATT and advertising bearers in the network.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Proxy example for IOP test. This node forwards/relays messages between GATT and advertising bearers in the network.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Relay example for IOP test. This node acts as a relay, i.e. if a node is out of range for another node, it relays messages between the two, provided the relay node is in range for both.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Relay example for IOP test. This node acts as a relay, i.e. if a node is out of range for another node, it relays messages between the two, provided the relay node is in range for both.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Relay example for IOP test. This node acts as a relay, i.e. if a node is out of range for another node, it relays messages between the two, provided the relay node is in range for both.
+
+
+
+
+
+
+
+
diff --git a/app/bluetooth/btmesh_production_demos.xml b/app/bluetooth/btmesh_production_demos.xml
index 65b240a015..b0033b0baa 100644
--- a/app/bluetooth/btmesh_production_demos.xml
+++ b/app/bluetooth/btmesh_production_demos.xml
@@ -1,1803 +1,1803 @@
-
-
-
-
-
-
-
-
An NCP Target C application that makes it possible for the NCP Host Controller to access the Bluetooth Mesh stack via UART. It provides access to the host layer via BGAPI and not to the link layer via HCI.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An NCP Target C application that makes it possible for the NCP Host Controller to access the Bluetooth Mesh stack via UART. It provides access to the host layer via BGAPI and not to the link layer via HCI.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Demonstrates the bare minimum needed for an NCP Target C application. This example is recommended for EFR32xG22, which has limited RAM and flash, and therefore some of the stack classes are disabled by default.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An NCP Target C application that makes it possible for the NCP Host Controller to access the Bluetooth Mesh stack via UART. It provides access to the host layer via BGAPI and not to the link layer via HCI.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An NCP Target C application that makes it possible for the NCP Host Controller to access the Bluetooth Mesh stack via UART. It provides access to the host layer via BGAPI and not to the link layer via HCI.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An NCP Target C application that makes it possible for the NCP Host Controller to access the Bluetooth Mesh stack via UART. It provides access to the host layer via BGAPI and not to the link layer via HCI.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An NCP Target C application that makes it possible for the NCP Host Controller to access the Bluetooth Mesh stack via UART. It provides access to the host layer via BGAPI and not to the link layer via HCI.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Demonstrates the bare minimum needed for an NCP Target C application. This example is recommended for EFR32xG22, which has limited RAM and flash, and therefore some of the stack classes are disabled by default.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Demonstrates the bare minimum needed for an NCP Target C application. This example is recommended for EFR32xG22, which has limited RAM and flash, and therefore some of the stack classes are disabled by default.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Demonstrates the bare minimum needed for an NCP Target C application. This example is recommended for EFR32xG22, which has limited RAM and flash, and therefore some of the stack classes are disabled by default.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Demonstrates the bare minimum needed for an NCP Target C application. This example is recommended for EFR32xG22, which has limited RAM and flash, and therefore some of the stack classes are disabled by default.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Demonstrates the bare minimum needed for an NCP Target C application. This example is recommended for EFR32xG22, which has limited RAM and flash, and therefore some of the stack classes are disabled by default.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An NCP Target C application that makes it possible for the NCP Host Controller to access the Bluetooth Mesh stack via UART. It provides access to the host layer via BGAPI and not to the link layer via HCI.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An NCP Target C application that makes it possible for the NCP Host Controller to access the Bluetooth Mesh stack via UART. It provides access to the host layer via BGAPI and not to the link layer via HCI.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An NCP Target C application that makes it possible for the NCP Host Controller to access the Bluetooth Mesh stack via UART. It provides access to the host layer via BGAPI and not to the link layer via HCI.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An NCP Target C application that makes it possible for the NCP Host Controller to access the Bluetooth Mesh stack via UART. It provides access to the host layer via BGAPI and not to the link layer via HCI.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An NCP Target C application that makes it possible for the NCP Host Controller to access the Bluetooth Mesh stack via UART. It provides access to the host layer via BGAPI and not to the link layer via HCI.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An NCP Target C application that makes it possible for the NCP Host Controller to access the Bluetooth Mesh stack via UART. It provides access to the host layer via BGAPI and not to the link layer via HCI.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An NCP Target C application that makes it possible for the NCP Host Controller to access the Bluetooth Mesh stack via UART. It provides access to the host layer via BGAPI and not to the link layer via HCI.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An NCP Target C application that makes it possible for the NCP Host Controller to access the Bluetooth Mesh stack via UART. It provides access to the host layer via BGAPI and not to the link layer via HCI.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An NCP Target C application that makes it possible for the NCP Host Controller to access the Bluetooth Mesh stack via UART. It provides access to the host layer via BGAPI and not to the link layer via HCI.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Demonstrates the bare minimum needed for an NCP Target C application. This example is recommended for EFR32xG22, which has limited RAM and flash, and therefore some of the stack classes are disabled by default.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Demonstrates the bare minimum needed for an NCP Target C application. This example is recommended for EFR32xG22, which has limited RAM and flash, and therefore some of the stack classes are disabled by default.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Demonstrates the bare minimum needed for an NCP Target C application. This example is recommended for EFR32xG22, which has limited RAM and flash, and therefore some of the stack classes are disabled by default.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the mainboard can be switched on and off, and their lighting intensity, hue, and saturation can be set. The example also tries to establish friendship as a Friend node.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the mainboard can be switched on and off, and their lighting intensity, hue, and saturation can be set. The example also tries to establish friendship as a Friend node.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the Thunderboard Sense 2 can be switched on and off, and their lighting intensity, hue, and saturation can be set. The example also tries to establish friendship as a Friend node.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the mainboard can be switched on and off, and their lighting intensity, hue, and saturation can be set. The example also tries to establish friendship as a Friend node.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the mainboard can be switched on and off, and their lighting intensity, hue, and saturation can be set. The example also tries to establish friendship as a Friend node.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the mainboard can be switched on and off, and their lighting intensity, hue, and saturation can be set. The example also tries to establish friendship as a Friend node.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the mainboard can be switched on and off, and their lighting intensity, hue, and saturation can be set. The example also tries to establish friendship as a Friend node.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the mainboard can be switched on and off, and their lighting intensity, hue, and saturation can be set. The example also tries to establish friendship as a Friend node.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the mainboard can be switched on and off, and their lighting intensity, hue, and saturation can be set. The example also tries to establish friendship as a Friend node.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the mainboard can be switched on and off, and their lighting intensity, hue, and saturation can be set. The example also tries to establish friendship as a Friend node.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the mainboard can be switched on and off, and their lighting intensity, hue, and saturation can be set. The example also tries to establish friendship as a Friend node.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the mainboard can be switched on and off, and their lighting intensity, hue, and saturation can be set. The example also tries to establish friendship as a Friend node.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the mainboard can be switched on and off, and their lighting intensity, hue, and saturation can be set. The example also tries to establish friendship as a Friend node.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the mainboard can be switched on and off, and their lighting intensity, hue, and saturation can be set. The example also tries to establish friendship as a Friend node.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the mainboard can be switched on and off, and their lighting intensity, hue, and saturation can be set. The example also tries to establish friendship as a Friend node.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the mainboard can be switched on and off, and their lighting intensity, color temperature, and delta UV can be set.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the WSTK can be switched on and off, and their lighting intensity, color temperature, and delta UV can be set.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the Thunderboard Sense 2 board can be switched on and off, and their lighting intensity, color temperature, and delta UV can be set.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the WSTK can be switched on and off, and their lighting intensity, color temperature, and delta UV can be set.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the WSTK can be switched on and off, and their lighting intensity, color temperature, and delta UV can be set.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the WSTK can be switched on and off, and their lighting intensity, color temperature, and delta UV can be set.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the WSTK can be switched on and off, and their lighting intensity, color temperature, and delta UV can be set.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the WSTK can be switched on and off, and their lighting intensity, color temperature, and delta UV can be set.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the WSTK can be switched on and off, and their lighting intensity, color temperature, and delta UV can be set.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the WSTK can be switched on and off, and their lighting intensity, color temperature, and delta UV can be set.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the WSTK can be switched on and off, and their lighting intensity, color temperature, and delta UV can be set.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the WSTK can be switched on and off, and their lighting intensity, color temperature, and delta UV can be set.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the WSTK can be switched on and off, and their lighting intensity, color temperature, and delta UV can be set.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the WSTK can be switched on and off, and their lighting intensity, color temperature, and delta UV can be set.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box software demo where the LEDs of the WSTK can be switched on and off, and their lighting intensity, color temperature, and delta UV can be set.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Client Model. It collects and displays sensor measurement data from remote device(s) (e.g., btmesh_soc_sensor_server).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Client Model. It collects and displays sensor measurement data from remote device(s) (e.g., btmesh_soc_sensor_server).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Client Model. It collects and displays sensor measurement data from remote device(s) (e.g., btmesh_soc_sensor_server).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Client Model. It collects and displays sensor measurement data from remote device(s) (e.g., btmesh_soc_sensor_server).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Client Model. It collects and displays sensor measurement data from remote device(s) (e.g., btmesh_soc_sensor_server).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Client Model. It collects and displays sensor measurement data from remote device(s) (e.g., btmesh_soc_sensor_server).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Client Model. It collects and displays sensor measurement data from remote device(s) (e.g., btmesh_soc_sensor_server).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Client Model. It collects and displays sensor measurement data from remote device(s) (e.g., btmesh_soc_sensor_server).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Client Model. It collects and displays sensor measurement data from remote device(s) (e.g., btmesh_soc_sensor_server).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Client Model. It collects and displays sensor measurement data from remote device(s) (e.g., btmesh_soc_sensor_server).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Client Model. It collects and displays sensor measurement data from remote device(s) (e.g., btmesh_soc_sensor_server).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Client Model. It collects and displays sensor measurement data from remote device(s) (e.g., btmesh_soc_sensor_server).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Client Model. It collects and displays sensor measurement data from remote device(s) (e.g., btmesh_soc_sensor_server).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Client Model. It collects and displays sensor measurement data from remote device(s) (e.g., btmesh_soc_sensor_server).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Client Model. It collects and displays sensor measurement data from remote device(s) (e.g., btmesh_soc_sensor_server).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Client Model. It collects and displays sensor measurement data from remote device(s) (e.g., btmesh_soc_sensor_server).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Client Model. It collects and displays sensor measurement data from remote device(s) (e.g., btmesh_soc_sensor_server).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Client Model. It collects and displays sensor measurement data from remote device(s) (e.g., btmesh_soc_sensor_server).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Client Model. It collects and displays sensor measurement data from remote device(s) (e.g., btmesh_soc_sensor_server).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Client Model. It collects and displays sensor measurement data from remote device(s) (e.g., btmesh_soc_sensor_server).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Client Model. It collects and displays sensor measurement data from remote device(s) (e.g., btmesh_soc_sensor_server).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Client Model. It collects and displays sensor measurement data from remote device(s) (e.g., btmesh_soc_sensor_server).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Client Model. It collects and displays sensor measurement data from remote device(s) (e.g., btmesh_soc_sensor_server).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Client Model. It collects and displays sensor measurement data from remote device(s) (e.g., btmesh_soc_sensor_server).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Server Model and Sensor Setup Server Model. It measures temperature, people count, and illuminance, and sends the measurement data to a remote device (e.g., btmesh_soc_sensor_client).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Server Model and Sensor Setup Server Model. It measures temperature and people count, and sends the measurement data to a remote device (e.g., btmesh_soc_sensor_client).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Server Model and Sensor Setup Server Model. It measures temperature and people count, and sends the measurement data to a remote device (e.g., btmesh_soc_sensor_client).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Server Model and Sensor Setup Server Model. It measures temperature, people count, and illuminance, and sends the measurement data to a remote device (e.g., btmesh_soc_sensor_client).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Server Model and Sensor Setup Server Model. It measures temperature and people count, and sends the measurement data to a remote device (e.g., btmesh_soc_sensor_client).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Server Model and Sensor Setup Server Model. It measures temperature and people count, and sends the measurement data to a remote device (e.g., btmesh_soc_sensor_client).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Server Model and Sensor Setup Server Model. It measures temperature and people count, and sends the measurement data to a remote device (e.g., btmesh_soc_sensor_client).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Server Model and Sensor Setup Server Model. It measures temperature and people count, and sends the measurement data to a remote device (e.g., btmesh_soc_sensor_client).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Server Model and Sensor Setup Server Model. It measures temperature and people count, and sends the measurement data to a remote device (e.g., btmesh_soc_sensor_client).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Server Model and Sensor Setup Server Model. It measures temperature and people count, and sends the measurement data to a remote device (e.g., btmesh_soc_sensor_client).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Server Model and Sensor Setup Server Model. It measures temperature, people count, and illuminance, and sends the measurement data to a remote device (e.g., btmesh_soc_sensor_client).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Server Model and Sensor Setup Server Model. It measures temperature, people count, and illuminance, and sends the measurement data to a remote device (e.g., btmesh_soc_sensor_client).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Server Model and Sensor Setup Server Model. It measures temperature and people count, and sends the measurement data to a remote device (e.g., btmesh_soc_sensor_client).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Server Model and Sensor Setup Server Model. It measures temperature and people count, and sends the measurement data to a remote device (e.g., btmesh_soc_sensor_client).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Server Model and Sensor Setup Server Model. It measures temperature and people count, and sends the measurement data to a remote device (e.g., btmesh_soc_sensor_client).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Server Model and Sensor Setup Server Model. It measures temperature and people count, and sends the measurement data to a remote device (e.g., btmesh_soc_sensor_client).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Server Model and Sensor Setup Server Model. It measures temperature and people count, and sends the measurement data to a remote device (e.g., btmesh_soc_sensor_client).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Server Model and Sensor Setup Server Model. It measures temperature and people count, and sends the measurement data to a remote device (e.g., btmesh_soc_sensor_client).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Server Model and Sensor Setup Server Model. It measures temperature and people count, and sends the measurement data to a remote device (e.g., btmesh_soc_sensor_client).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Server Model and Sensor Setup Server Model. It measures temperature and people count, and sends the measurement data to a remote device (e.g., btmesh_soc_sensor_client).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Server Model and Sensor Setup Server Model. It measures temperature and people count, and sends the measurement data to a remote device (e.g., btmesh_soc_sensor_client).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Server Model and Sensor Setup Server Model. It measures temperature and people count, and sends the measurement data to a remote device (e.g., btmesh_soc_sensor_client).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Server Model and Sensor Setup Server Model. It measures temperature and people count, and sends the measurement data to a remote device (e.g., btmesh_soc_sensor_client).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This example demonstrates the Bluetooth Mesh Sensor Server Model and Sensor Setup Server Model. It measures temperature and people count, and sends the measurement data to a remote device (e.g., btmesh_soc_sensor_client).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. It is optimized for low current consumption with disabled CLI, logging, and LCD.Push Button presses can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. It is optimized for low current consumption with disabled CLI, logging, and LCD.Push Button presses can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
A Software Demo where the device acts as a switch. It is optimized for low current consumption with disabled CLI, logging, and LCD. Button presses (only PB0 is functional) can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. It is optimized for low current consumption with disabled CLI, logging, and LCD.Push Button presses can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. It is optimized for low current consumption with disabled CLI, logging, and LCD.Push Button presses can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. It is optimized for low current consumption with disabled CLI, logging, and LCD.Push Button presses can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. It is optimized for low current consumption with disabled CLI, logging, and LCD.Push Button presses can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. It is optimized for low current consumption with disabled CLI, logging, and LCD.Push Button presses can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
A Software Demo where the device acts as a switch. It is optimized for low current consumption with disabled CLI, logging, and LCD. Button presses (only PB0 is functional) can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
A Software Demo where the device acts as a switch. It is optimized for low current consumption with disabled CLI, logging, and LCD. Button presses (only PB0 is functional) can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
A Software Demo where the device acts as a switch. It is optimized for low current consumption with disabled CLI, logging, and LCD. Button presses (only PB0 is functional) can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
A Software Demo where the device acts as a switch. It is optimized for low current consumption with disabled CLI, logging, and LCD. Button presses (only PB0 is functional) can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. It is optimized for low current consumption with disabled CLI, logging, and LCD.Push Button presses can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. It is optimized for low current consumption with disabled CLI, logging, and LCD.Push Button presses can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. It is optimized for low current consumption with disabled CLI, logging, and LCD.Push Button presses can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. It is optimized for low current consumption with disabled CLI, logging, and LCD.Push Button presses can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. It is optimized for low current consumption with disabled CLI, logging, and LCD.Push Button presses can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. It is optimized for low current consumption with disabled CLI, logging, and LCD.Push Button presses can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. It is optimized for low current consumption with disabled CLI, logging, and LCD.Push Button presses can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. It is optimized for low current consumption with disabled CLI, logging, and LCD.Push Button presses can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. It is optimized for low current consumption with disabled CLI, logging, and LCD.Push Button presses can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. It is optimized for low current consumption with disabled CLI, logging, and LCD.Push Button presses can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. It is optimized for low current consumption with disabled CLI, logging, and LCD.Push Button presses can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
A Software Demo where the device acts as a switch. It is optimized for low current consumption with disabled CLI, logging, and LCD. Button presses (only PB0 is functional) can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. Push Button presses or CLI commands can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. Push Button presses or CLI commands can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. Push Button presses (only PB0 is functional) or CLI commands can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. Push Button presses or CLI commands can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. Push Button presses or CLI commands can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. Push Button presses or CLI commands can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. Push Button presses or CLI commands can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. Push Button presses or CLI commands can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. Push Button presses (only PB0 is functional) or CLI commands can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. Push Button presses (only PB0 is functional) or CLI commands can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. Push Button presses (only PB0 is functional) or CLI commands can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. Push Button presses (only PB0 is functional) or CLI commands can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. Push Button presses or CLI commands can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. Push Button presses or CLI commands can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. Push Button presses or CLI commands can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. Push Button presses or CLI commands can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. Push Button presses or CLI commands can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. Push Button presses or CLI commands can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. Push Button presses or CLI commands can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. Push Button presses or CLI commands can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. Push Button presses or CLI commands can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. Push Button presses or CLI commands can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. Push Button presses or CLI commands can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
An out-of-the-box Software Demo where the device acts as a switch. Push Button presses (only PB0 is functional) or CLI commands can control the state, lightness, and color temperature of the LEDs and scenes on a remote device.
+
+
+
+
+
+
+
+
diff --git a/app/bluetooth/common/btmesh_dcd_configuration/dcd_config.btmeshconf b/app/bluetooth/common/btmesh_dcd_configuration/dcd_config.btmeshconf
index 843b1d37aa..02db9b46e5 100644
--- a/app/bluetooth/common/btmesh_dcd_configuration/dcd_config.btmeshconf
+++ b/app/bluetooth/common/btmesh_dcd_configuration/dcd_config.btmeshconf
@@ -2,7 +2,7 @@
"composition_data": {
"cid": "0x02ff",
"pid": "0xffff",
- "vid": "0x0300",
+ "vid": "0x0301",
"elements": [
{
"name": "Main",
diff --git a/app/bluetooth/common/cbap/config/sl_bt_cbap_root_cert.h b/app/bluetooth/common/cbap/config/sl_bt_cbap_root_cert.h
index 453038a6c3..67b6761cbc 100644
--- a/app/bluetooth/common/cbap/config/sl_bt_cbap_root_cert.h
+++ b/app/bluetooth/common/cbap/config/sl_bt_cbap_root_cert.h
@@ -1,7 +1,6 @@
/***************************************************************************//**
* @file
* @brief Root certificate definition in PEM format.
- * Autogenerated file, do not edit.
*******************************************************************************
* # License
* Copyright 2022 Silicon Laboratories Inc. www.silabs.com
diff --git a/app/bluetooth/common/cbap/sl_bt_cbap.c b/app/bluetooth/common/cbap/sl_bt_cbap.c
index a3dda776d8..c478ffa3e1 100644
--- a/app/bluetooth/common/cbap/sl_bt_cbap.c
+++ b/app/bluetooth/common/cbap/sl_bt_cbap.c
@@ -52,15 +52,20 @@
// Defines
#if defined(SL_CATALOG_APP_LOG_PRESENT) && SL_BT_CBAP_LOG
-#define app_log_cbap_info(...) app_log_info(__VA_ARGS__)
-#define app_log_cbap_debug(...) app_log_debug(__VA_ARGS__)
-#define app_log_cbap_hexdump(p_data, len) app_log_hexdump_debug(p_data, len)
+#define sl_bt_cbap_log_debug(...) app_log_debug(__VA_ARGS__)
+#define sl_bt_cbap_log_info(...) app_log_info(__VA_ARGS__)
+#define sl_bt_cbap_log_error(...) app_log_error(__VA_ARGS__)
+#define sl_bt_cbap_log_hexdump(p_data, len) app_log_hexdump_debug(p_data, len)
#else
-#define app_log_cbap_info(...)
-#define app_log_cbap_debug(...)
-#define app_log_cbap_hexdump(p_data, len)
+#define sl_bt_cbap_log_debug(...)
+#define sl_bt_cbap_log_info(...)
+#define sl_bt_cbap_log_error(...)
+#define sl_bt_cbap_log_hexdump(p_data, len)
#endif
+#define IS_PERIPHERAL_IN_PROGRESS (cbap_peripheral_state > 0 && cbap_peripheral_state < SL_BT_CBAP_PERIPHERAL_STATE_NUM - 1)
+#define IS_CENTRAL_IN_PROGRESS (cbap_central_state > 0 && cbap_central_state < SL_BT_CBAP_CENTRAL_STATE_NUM - 1)
+
#define UUID_16_LEN 2
#define UUID_128_LEN 16
#define HANDLE_NOT_INITIALIZED 0
@@ -107,8 +112,8 @@ typedef enum {
// Device role
static sl_bt_cbap_role_t role;
-// Connection handle
-static uint8_t connection;
+// Handle of the active connection.
+static uint8_t connection = SL_BT_INVALID_CONNECTION_HANDLE;
// Root certificate in PEM format.
const char *root_certificate_pem = SL_BT_CBAP_ROOT_CERT;
@@ -184,6 +189,9 @@ static void on_event_peripheral(sl_bt_msg_t *evt);
// Peripheral device bluetooth event handler.
static void on_event_central(sl_bt_msg_t *evt);
+// Reset CBAP process states, flags and timers.
+static void cbap_reset(void);
+
// Search for a Service UUID in scan report.
static bool find_service_in_advertisement(const uint8_t *scan_data,
uint8_t scan_data_len,
@@ -206,32 +214,23 @@ void sl_bt_cbap_init(void)
device_certificate_der,
&device_certificate_der_len);
app_assert_status(sc);
- app_log_cbap_info("Device certificate verified." APP_LOG_NL);
+ sl_bt_cbap_log_info("Device certificate verified." APP_LOG_NL);
+
+ cbap_reset();
}
// Start CBAP procedure.
-sl_status_t sl_bt_cbap_start(sl_bt_cbap_role_t cbap_role, uint8_t connection_handle)
+sl_status_t sl_bt_cbap_start(sl_bt_cbap_role_t cbap_role,
+ uint8_t connection_handle)
{
sl_status_t sc;
- if (((cbap_central_state != 0)
- && (cbap_central_state != SL_BT_CBAP_CENTRAL_STATE_NUM - 1))
- || ((cbap_peripheral_state != 0)
- && (cbap_peripheral_state != SL_BT_CBAP_PERIPHERAL_STATE_NUM - 1))) {
+ if (IS_PERIPHERAL_IN_PROGRESS || IS_CENTRAL_IN_PROGRESS) {
return SL_STATUS_IN_PROGRESS;
}
role = cbap_role;
connection = connection_handle;
- // Reset variables
- remote_cert_arrived = false;
- device_cert_sent = false;
- remote_certificate_der_len = 0;
- dev_cert_sending_progression = 0;
- cbap_central_state = SL_BT_CBAP_CENTRAL_SCANNING;
- char_state = (characteristics_t)0;
- cbap_peripheral_state = SL_BT_CBAP_PERIPHERAL_IDLE;
-
if (role == SL_BT_CBAP_ROLE_CENTRAL) {
// Discover CBAP service on the peripheral device
sc = sl_bt_gatt_discover_primary_services_by_uuid(connection,
@@ -296,21 +295,21 @@ static void on_event_peripheral(sl_bt_msg_t *evt)
break;
}
- app_log_cbap_debug("Security mode: %i" APP_LOG_NL,
- evt->data.evt_connection_parameters.security_mode);
+ sl_bt_cbap_log_debug("Security mode: %i" APP_LOG_NL,
+ evt->data.evt_connection_parameters.security_mode);
if (evt->data.evt_connection_parameters.security_mode > sl_bt_connection_mode1_level1
&& cbap_peripheral_state != SL_BT_CBAP_PERIPHERAL_CENTRAL_OOB_OK) {
- app_log_cbap_info("The central device increased the security level with " \
- "no CBAP. Disconnecting." APP_LOG_NL);
- sc = sl_bt_connection_close(connection);
- app_assert_status(sc);
+ sl_bt_cbap_log_error("The central device increased the security level with " \
+ "no CBAP. Disconnecting." APP_LOG_NL);
+ sl_bt_on_cbap_error();
+ cbap_reset();
break;
}
if (evt->data.evt_connection_parameters.security_mode == sl_bt_connection_mode1_level4) {
cbap_peripheral_state = SL_BT_CBAP_PERIPHERAL_DONE;
sl_bt_cbap_peripheral_on_event(cbap_peripheral_state);
- set_timeout(false); // Last state. Stop timer.
+ cbap_reset();
}
break;
@@ -332,7 +331,7 @@ static void on_event_peripheral(sl_bt_msg_t *evt)
sc = SL_STATUS_OK;
if (evt->data.evt_gatt_server_user_write_request.value.data[0] == 0) {
// Last packet of the remote cert arrived
- app_log_cbap_info("Getting certificate from central." APP_LOG_NL);
+ sl_bt_cbap_log_info("Getting certificate from central." APP_LOG_NL);
remote_cert_arrived = true;
sc = sl_bt_cbap_lib_process_remote_cert(remote_certificate_der,
remote_certificate_der_len);
@@ -343,10 +342,10 @@ static void on_event_peripheral(sl_bt_msg_t *evt)
sl_bt_cbap_peripheral_on_event(cbap_peripheral_state);
set_timeout(true);
} else {
- app_log_cbap_info("Remote certificate verification failed. " \
- "Disconnecting." APP_LOG_NL);
- sc = sl_bt_connection_close(connection);
- app_assert_status(sc);
+ sl_bt_cbap_log_error("Remote certificate verification failed. " \
+ "Disconnecting." APP_LOG_NL);
+ sl_bt_on_cbap_error();
+ cbap_reset();
break;
}
}
@@ -363,7 +362,7 @@ static void on_event_peripheral(sl_bt_msg_t *evt)
}
// Receiving OOB data from central device
else if (evt->data.evt_gatt_server_user_write_request.characteristic == gattdb_central_oob ) {
- app_log_cbap_info("Getting OOB data from central." APP_LOG_NL);
+ sl_bt_cbap_log_info("Getting OOB data from central." APP_LOG_NL);
aes_key_128 remote_random;
aes_key_128 remote_confirm;
uint8_t remote_oob_signature[OOB_SIGNATURE_LEN];
@@ -382,21 +381,24 @@ static void on_event_peripheral(sl_bt_msg_t *evt)
SL_STATUS_OK);
app_assert_status(sc);
- app_log_cbap_debug("Remote OOB data:" APP_LOG_NL);
- app_log_cbap_hexdump(&remote_random, sizeof(aes_key_128));
- app_log_cbap_debug(APP_LOG_NL);
- app_log_cbap_hexdump(&remote_confirm, sizeof(aes_key_128));
- app_log_cbap_debug(APP_LOG_NL);
- app_log_cbap_debug("Remote OOB signature:" APP_LOG_NL);
- app_log_cbap_hexdump(&remote_oob_signature, OOB_SIGNATURE_LEN);
- app_log_cbap_debug(APP_LOG_NL);
+ sl_bt_cbap_log_debug("Remote OOB data:" APP_LOG_NL);
+ sl_bt_cbap_log_hexdump(&remote_random, sizeof(aes_key_128));
+ sl_bt_cbap_log_debug(APP_LOG_NL);
+ sl_bt_cbap_log_hexdump(&remote_confirm, sizeof(aes_key_128));
+ sl_bt_cbap_log_debug(APP_LOG_NL);
+ sl_bt_cbap_log_debug("Remote OOB signature:" APP_LOG_NL);
+ sl_bt_cbap_log_hexdump(&remote_oob_signature, OOB_SIGNATURE_LEN);
+ sl_bt_cbap_log_debug(APP_LOG_NL);
sc = sl_bt_cbap_lib_verify_remote_oob_data(remote_random.data,
remote_confirm.data,
remote_oob_signature);
app_assert_status(sc);
+ sl_bt_cbap_log_info("Remote OOB data verified." APP_LOG_NL);
sc = sl_bt_sm_set_remote_oob(1, remote_random, remote_confirm);
app_assert_status(sc);
+ sc = sl_bt_cbap_destroy_key();
+ app_assert_status(sc);
app_assert(cbap_peripheral_state == SL_BT_CBAP_PERIPHERAL_CENTRAL_CERT_OK,
"Unexpected peripheral state.");
@@ -413,18 +415,17 @@ static void on_event_peripheral(sl_bt_msg_t *evt)
if (gattdb_peripheral_cert == evt->data.evt_gatt_server_characteristic_status.characteristic) {
if (sl_bt_gatt_server_client_config == (sl_bt_gatt_server_characteristic_status_flag_t)evt->data.evt_gatt_server_characteristic_status.status_flags) {
- if (sl_bt_gatt_indication == (sl_bt_gatt_client_config_flag_t)evt->data.evt_gatt_server_characteristic_status.client_config_flags) {
- if (device_cert_sent == false) {
- uint8_t buff[CERT_IND_CHUNK_LEN + 1];
- buff[0] = 1;
- memcpy(&buff[1], device_certificate_der, CERT_IND_CHUNK_LEN);
- sc = sl_bt_gatt_server_send_indication(connection,
- gattdb_peripheral_cert,
- CERT_IND_CHUNK_LEN + 1,
- buff);
- app_assert_status(sc);
- dev_cert_sending_progression += CERT_IND_CHUNK_LEN;
- }
+ if (sl_bt_gatt_indication == (sl_bt_gatt_client_config_flag_t)evt->data.evt_gatt_server_characteristic_status.client_config_flags
+ && device_cert_sent == false) {
+ uint8_t buff[CERT_IND_CHUNK_LEN + 1];
+ buff[0] = 1;
+ memcpy(&buff[1], device_certificate_der, CERT_IND_CHUNK_LEN);
+ sc = sl_bt_gatt_server_send_indication(connection,
+ gattdb_peripheral_cert,
+ CERT_IND_CHUNK_LEN + 1,
+ buff);
+ app_assert_status(sc);
+ dev_cert_sending_progression += CERT_IND_CHUNK_LEN;
}
}
// Sending Peripheral certificate to Central device
@@ -454,38 +455,37 @@ static void on_event_peripheral(sl_bt_msg_t *evt)
}
// Sending Peripheral OOB data to Central device
else if (gattdb_peripheral_oob == evt->data.evt_gatt_server_characteristic_status.characteristic ) {
- if (sl_bt_gatt_server_client_config == (sl_bt_gatt_server_characteristic_status_flag_t)evt->data.evt_gatt_server_characteristic_status.status_flags) {
- if (sl_bt_gatt_indication == (sl_bt_gatt_client_config_flag_t)evt->data.evt_gatt_server_characteristic_status.client_config_flags) {
- aes_key_128 device_random;
- aes_key_128 device_confirm;
- // Generate device oob data and send over GATT
- sc = sl_bt_sm_set_oob(1, &device_random, &device_confirm);
- app_assert_status(sc);
+ if (sl_bt_gatt_server_client_config == (sl_bt_gatt_server_characteristic_status_flag_t)evt->data.evt_gatt_server_characteristic_status.status_flags
+ && sl_bt_gatt_indication == (sl_bt_gatt_client_config_flag_t)evt->data.evt_gatt_server_characteristic_status.client_config_flags) {
+ aes_key_128 device_random;
+ aes_key_128 device_confirm;
+ // Generate device oob data and send over GATT
+ sc = sl_bt_sm_set_oob(1, &device_random, &device_confirm);
+ app_assert_status(sc);
- app_log_cbap_debug("Device OOB Data:" APP_LOG_NL);
- app_log_cbap_hexdump(&device_random, OOB_RANDOM_LEN);
- app_log_cbap_debug(APP_LOG_NL);
- app_log_cbap_hexdump(&device_confirm, OOB_RANDOM_LEN);
- app_log_cbap_debug(APP_LOG_NL);
+ sl_bt_cbap_log_debug("Device OOB Data:" APP_LOG_NL);
+ sl_bt_cbap_log_hexdump(&device_random, OOB_RANDOM_LEN);
+ sl_bt_cbap_log_debug(APP_LOG_NL);
+ sl_bt_cbap_log_hexdump(&device_confirm, OOB_RANDOM_LEN);
+ sl_bt_cbap_log_debug(APP_LOG_NL);
- sc = sl_bt_cbap_lib_sign_device_oob_data(device_random.data,
- device_confirm.data,
- signed_device_oob_data,
- &signed_device_oob_len);
- app_assert_status(sc);
+ sc = sl_bt_cbap_lib_sign_device_oob_data(device_random.data,
+ device_confirm.data,
+ signed_device_oob_data,
+ &signed_device_oob_len);
+ app_assert_status(sc);
- app_log_cbap_debug("Device OOB Signature:" APP_LOG_NL);
- app_log_cbap_hexdump(&signed_device_oob_data[OOB_DATA_LEN],
+ sl_bt_cbap_log_debug("Device OOB Signature:" APP_LOG_NL);
+ sl_bt_cbap_log_hexdump(&signed_device_oob_data[OOB_DATA_LEN],
OOB_SIGNATURE_LEN);
- app_log_cbap_debug(APP_LOG_NL);
+ sl_bt_cbap_log_debug(APP_LOG_NL);
- sc = sl_bt_gatt_server_send_indication(connection,
- gattdb_peripheral_oob,
- signed_device_oob_len,
- signed_device_oob_data);
- app_assert_status(sc);
- }
+ sc = sl_bt_gatt_server_send_indication(connection,
+ gattdb_peripheral_oob,
+ signed_device_oob_len,
+ signed_device_oob_data);
+ app_assert_status(sc);
}
}
break;
@@ -507,20 +507,20 @@ static void on_event_central(sl_bt_msg_t *evt)
break;
}
- app_log_cbap_debug("Security mode: %i" APP_LOG_NL, evt->data.evt_connection_parameters.security_mode);
+ sl_bt_cbap_log_debug("Security mode: %i" APP_LOG_NL, evt->data.evt_connection_parameters.security_mode);
if (evt->data.evt_connection_parameters.security_mode > sl_bt_connection_mode1_level1
&& cbap_central_state != SL_BT_CBAP_CENTRAL_INCREASE_SECURITY) {
- app_log_cbap_info("Security level has been increased with no CBAP. " \
- "Disconnecting." APP_LOG_NL);
- sc = sl_bt_connection_close(connection);
- app_assert_status(sc);
+ sl_bt_cbap_log_error("Security level has been increased with no CBAP. " \
+ "Disconnecting." APP_LOG_NL);
+ sl_bt_on_cbap_error();
+ cbap_reset();
break;
}
if (evt->data.evt_connection_parameters.security_mode == sl_bt_connection_mode1_level4) {
cbap_central_state = SL_BT_CBAP_CENTRAL_DONE;
sl_bt_cbap_central_on_event(cbap_central_state);
- set_timeout(false); // Last state. Stop timer.
+ cbap_reset();
}
break;
@@ -534,7 +534,7 @@ static void on_event_central(sl_bt_msg_t *evt)
if (cbap_service_handle == HANDLE_NOT_INITIALIZED) {
// Save service handle for future reference
cbap_service_handle = evt->data.evt_gatt_service.service;
- app_log_cbap_debug("Service handle found: %i" APP_LOG_NL, cbap_service_handle);
+ sl_bt_cbap_log_debug("Service handle found: %i" APP_LOG_NL, cbap_service_handle);
}
break;
@@ -548,8 +548,8 @@ static void on_event_central(sl_bt_msg_t *evt)
if (cbap_characteristics[char_state].handle == HANDLE_NOT_INITIALIZED) {
// Save characteristic handle for future reference
cbap_characteristics[char_state].handle = evt->data.evt_gatt_characteristic.characteristic;
- app_log_cbap_debug("Characteristic handle found: %i" APP_LOG_NL,
- cbap_characteristics[char_state].handle);
+ sl_bt_cbap_log_debug("Characteristic handle found: %i" APP_LOG_NL,
+ cbap_characteristics[char_state].handle);
}
break;
@@ -563,10 +563,10 @@ static void on_event_central(sl_bt_msg_t *evt)
// Check result
if (evt->data.evt_gatt_procedure_completed.result != 0) {
- app_log_cbap_info("GATT procedure failed [E:%i]. Disconnecting." APP_LOG_NL,
- evt->data.evt_gatt_procedure_completed.result);
- sc = sl_bt_connection_close(connection);
- app_assert_status(sc);
+ sl_bt_cbap_log_error("GATT procedure failed [E:%i]. Disconnecting." APP_LOG_NL,
+ evt->data.evt_gatt_procedure_completed.result);
+ sl_bt_on_cbap_error();
+ cbap_reset();
break;
}
@@ -646,11 +646,11 @@ static void on_event_central(sl_bt_msg_t *evt)
sc = sl_bt_sm_set_oob(1, &device_random, &device_confirm);
app_assert_status(sc);
- app_log_cbap_debug("Device OOB Data:" APP_LOG_NL);
- app_log_cbap_hexdump(&device_random, OOB_RANDOM_LEN);
- app_log_cbap_debug(APP_LOG_NL);
- app_log_cbap_hexdump(&device_confirm, OOB_RANDOM_LEN);
- app_log_cbap_debug(APP_LOG_NL);
+ sl_bt_cbap_log_debug("Device OOB Data:" APP_LOG_NL);
+ sl_bt_cbap_log_hexdump(&device_random, OOB_RANDOM_LEN);
+ sl_bt_cbap_log_debug(APP_LOG_NL);
+ sl_bt_cbap_log_hexdump(&device_confirm, OOB_RANDOM_LEN);
+ sl_bt_cbap_log_debug(APP_LOG_NL);
sc = sl_bt_cbap_lib_sign_device_oob_data(device_random.data,
device_confirm.data,
@@ -658,10 +658,10 @@ static void on_event_central(sl_bt_msg_t *evt)
&signed_device_oob_len);
app_assert_status(sc);
- app_log_cbap_debug("Device OOB Signature:" APP_LOG_NL);
- app_log_cbap_hexdump(&signed_device_oob_data[OOB_DATA_LEN],
- OOB_SIGNATURE_LEN);
- app_log_cbap_debug(APP_LOG_NL);
+ sl_bt_cbap_log_debug("Device OOB Signature:" APP_LOG_NL);
+ sl_bt_cbap_log_hexdump(&signed_device_oob_data[OOB_DATA_LEN],
+ OOB_SIGNATURE_LEN);
+ sl_bt_cbap_log_debug(APP_LOG_NL);
cbap_central_state = SL_BT_CBAP_CENTRAL_GET_PERIPHERAL_OOB;
sl_bt_cbap_central_on_event(cbap_central_state);
@@ -725,12 +725,12 @@ static void on_event_central(sl_bt_msg_t *evt)
sc = sl_bt_cbap_lib_process_remote_cert(remote_certificate_der,
remote_certificate_der_len);
if (sc == SL_STATUS_OK) {
- app_log_cbap_info("Remote certificate verified." APP_LOG_NL);
+ sl_bt_cbap_log_info("Remote certificate verified." APP_LOG_NL);
} else {
- app_log_cbap_info("Remote certificate verification failed. " \
- "Disconnecting." APP_LOG_NL);
- sc = sl_bt_connection_close(connection);
- app_assert_status(sc);
+ sl_bt_cbap_log_error("Remote certificate verification failed. " \
+ "Disconnecting." APP_LOG_NL);
+ sl_bt_on_cbap_error();
+ cbap_reset();
break;
}
}
@@ -757,31 +757,53 @@ static void on_event_central(sl_bt_msg_t *evt)
sl_bt_gatt_disable);
app_assert_status(sc);
- app_log_cbap_debug("Remote OOB data:" APP_LOG_NL);
- app_log_cbap_hexdump(&remote_random, sizeof(aes_key_128));
- app_log_cbap_debug(APP_LOG_NL);
- app_log_cbap_hexdump(&remote_confirm, sizeof(aes_key_128));
- app_log_cbap_debug(APP_LOG_NL);
- app_log_cbap_debug("Remote OOB signature:" APP_LOG_NL);
- app_log_cbap_hexdump(&remote_oob_signature, OOB_SIGNATURE_LEN);
- app_log_cbap_debug(APP_LOG_NL);
+ sl_bt_cbap_log_debug("Remote OOB data:" APP_LOG_NL);
+ sl_bt_cbap_log_hexdump(&remote_random, sizeof(aes_key_128));
+ sl_bt_cbap_log_debug(APP_LOG_NL);
+ sl_bt_cbap_log_hexdump(&remote_confirm, sizeof(aes_key_128));
+ sl_bt_cbap_log_debug(APP_LOG_NL);
+ sl_bt_cbap_log_debug("Remote OOB signature:" APP_LOG_NL);
+ sl_bt_cbap_log_hexdump(&remote_oob_signature, OOB_SIGNATURE_LEN);
+ sl_bt_cbap_log_debug(APP_LOG_NL);
sc = sl_bt_cbap_lib_verify_remote_oob_data(remote_random.data,
remote_confirm.data,
remote_oob_signature);
app_assert_status(sc);
- app_log_cbap_info("Remote OOB data verified." APP_LOG_NL);
+ sl_bt_cbap_log_info("Remote OOB data verified." APP_LOG_NL);
sc = sl_bt_sm_set_remote_oob(1, remote_random, remote_confirm);
app_assert_status(sc);
+ sc = sl_bt_cbap_destroy_key();
+ app_assert_status(sc);
}
break;
}
}
+/***************************************************************************//**
+ * Reset CBAP process states, flags and timers.
+ ******************************************************************************/
+static void cbap_reset(void)
+{
+ set_timeout(false); // Make sure timer is stopped
+ connection = SL_BT_INVALID_CONNECTION_HANDLE; // Clear connection handle
+ // Reset states
+ cbap_peripheral_state = (sl_bt_cbap_peripheral_state_t)0;
+ sl_bt_cbap_peripheral_on_event(cbap_peripheral_state);
+ cbap_central_state = (sl_bt_cbap_central_state_t)0;
+ sl_bt_cbap_central_on_event(cbap_central_state);
+ char_state = (characteristics_t)0;
+ // Reset flags
+ remote_cert_arrived = false;
+ device_cert_sent = false;
+ remote_certificate_der_len = 0;
+ dev_cert_sending_progression = 0;
+}
+
/*******************************************************************************
* Search for a Service UUID in scan report.
*
- * @param[in] scan_data Data received in evt_scanner_scan_report
+ * @param[in] scan_data Data received in scanner advertisement report event
* @param[in] scan_data_len Length of the scan data
* @param[in] uuid Service UUID to search for
* @param[in] uuid_len Service UUID length
@@ -853,11 +875,10 @@ static void state_timer_cb(sl_simple_timer_t *handle, void *data)
{
(void)handle;
(void)data;
- sl_status_t sc;
- app_log_cbap_info("Timeout error. Disconnecting." APP_LOG_NL);
- sc = sl_bt_connection_close(connection);
- app_assert_status(sc);
+ sl_bt_cbap_log_error("Timeout error. Disconnecting." APP_LOG_NL);
+ sl_bt_on_cbap_error();
+ cbap_reset();
}
// CBAP Peripheral event handler WEAK implementation.
@@ -871,3 +892,11 @@ SL_WEAK void sl_bt_cbap_central_on_event(sl_bt_cbap_central_state_t status)
{
(void)status;
}
+
+// Callback to handle CBAP process errors.
+SL_WEAK void sl_bt_on_cbap_error(void)
+{
+ sl_status_t sc;
+ sc = sl_bt_connection_close(connection);
+ app_assert_status(sc);
+}
diff --git a/app/bluetooth/common/cbap/sl_bt_cbap.h b/app/bluetooth/common/cbap/sl_bt_cbap.h
index 5cbcd54c15..024a27c1b5 100644
--- a/app/bluetooth/common/cbap/sl_bt_cbap.h
+++ b/app/bluetooth/common/cbap/sl_bt_cbap.h
@@ -71,7 +71,7 @@ void sl_bt_cbap_init(void);
* Start CBAP procedure.
* @param[in] cbap_role Device role. Should be either SL_BT_CBAP_ROLE_PERIPHERAL or
* SL_BT_CBAP_ROLE_CENTRAL.
- * @param[in] connection Connection handle.
+ * @param[in] connection Handle of the active connection.
*
* @param SL_STATUS_OK if successful otherwise error code.
*****************************************************************************/
@@ -98,10 +98,16 @@ void sl_bt_cbap_peripheral_on_event(sl_bt_cbap_peripheral_state_t status);
*****************************************************************************/
void sl_bt_cbap_central_on_event(sl_bt_cbap_central_state_t status);
+/**************************************************************************//**
+ * Callback to handle CBAP process errors.
+ * @note To be implemented in user code.
+ *****************************************************************************/
+void sl_bt_on_cbap_error(void);
+
/**************************************************************************//**
* Search for a the CBAP Service UUID in scan report.
*
- * @param[in] scan_data Data received in evt_scanner_scan_report
+ * @param[in] scan_data Data received in scanner advertisement report event
* @param[in] scan_data_len Length of the scan data
* @return true if the CBAP service is found
*****************************************************************************/
diff --git a/app/bluetooth/common/cbap_lib/lib/cbap_CM33_gcc.a b/app/bluetooth/common/cbap_lib/lib/cbap_CM33_gcc.a
index c06fad2775..38879a2fb0 100644
--- a/app/bluetooth/common/cbap_lib/lib/cbap_CM33_gcc.a
+++ b/app/bluetooth/common/cbap_lib/lib/cbap_CM33_gcc.a
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:6dc4caaa6de828d6a4340e8418254ed1bd01fd3b38f06df0e7e423a3284be7c5
-size 4780
+oid sha256:90f4f2f4bcd59f33b6e80ece80ba6966d51df97213d96667e20b6f0883d14519
+size 5318
diff --git a/app/bluetooth/common/cbap_lib/lib/cbap_CM33_iar.a b/app/bluetooth/common/cbap_lib/lib/cbap_CM33_iar.a
index 578e8976fa..da5f072582 100644
--- a/app/bluetooth/common/cbap_lib/lib/cbap_CM33_iar.a
+++ b/app/bluetooth/common/cbap_lib/lib/cbap_CM33_iar.a
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:2e6dbfff481a375584dbc800abc890f35235d1c624891558716aae95065be59d
-size 10088
+oid sha256:a44c17e6fda0c47b809a50b7bde40f1939faeae076f81e05cef85a133d72fbaa
+size 10508
diff --git a/app/bluetooth/common/cbap_lib/sl_bt_cbap_lib.h b/app/bluetooth/common/cbap_lib/sl_bt_cbap_lib.h
index 8ceb0fd0c7..1c4b69d7ab 100644
--- a/app/bluetooth/common/cbap_lib/sl_bt_cbap_lib.h
+++ b/app/bluetooth/common/cbap_lib/sl_bt_cbap_lib.h
@@ -86,4 +86,11 @@ sl_status_t sl_bt_cbap_lib_verify_remote_oob_data(uint8_t *remote_random,
uint8_t *remote_confirm,
uint8_t *remote_oob_signature);
+/***************************************************************************//**
+ * Destroys the keys which were used during the CBAP process.
+ *
+ * @return SL_STATUS_OK if OK, error code otherwise.
+ ******************************************************************************/
+sl_status_t sl_bt_cbap_destroy_key(void);
+
#endif // SL_BT_CBAP_LIB_H
diff --git a/app/bluetooth/common/gatt_service_cte_adv/sl_gatt_service_cte_connectionless.c b/app/bluetooth/common/gatt_service_cte_adv/sl_gatt_service_cte_connectionless.c
index 74b52b9661..8604e17044 100644
--- a/app/bluetooth/common/gatt_service_cte_adv/sl_gatt_service_cte_connectionless.c
+++ b/app/bluetooth/common/gatt_service_cte_adv/sl_gatt_service_cte_connectionless.c
@@ -101,7 +101,7 @@ sl_status_t adv_cte_start(void)
// Set PHY.
if (sc == SL_STATUS_OK) {
sc = sl_bt_extended_advertiser_set_phy(advertising_set_handle,
- sl_bt_gap_1m_phy,
+ sl_bt_gap_phy_1m,
ADV_CTE_PHY_CONVERT(adv_cte_phy));
}
diff --git a/app/bluetooth/common/gatt_service_cte_adv/sl_gatt_service_cte_silabs.c b/app/bluetooth/common/gatt_service_cte_adv/sl_gatt_service_cte_silabs.c
index cd3d5253cd..ebdcc42dd8 100644
--- a/app/bluetooth/common/gatt_service_cte_adv/sl_gatt_service_cte_silabs.c
+++ b/app/bluetooth/common/gatt_service_cte_adv/sl_gatt_service_cte_silabs.c
@@ -101,7 +101,7 @@ sl_status_t adv_cte_start(void)
// Set PHY.
if (sc == SL_STATUS_OK) {
sc = sl_bt_extended_advertiser_set_phy(advertising_set_handle,
- sl_bt_gap_1m_phy,
+ sl_bt_gap_phy_1m,
ADV_CTE_PHY_CONVERT(adv_cte_phy));
}
diff --git a/app/bluetooth/common/gatt_service_cte_adv/sli_gatt_service_cte_adv.h b/app/bluetooth/common/gatt_service_cte_adv/sli_gatt_service_cte_adv.h
index 58616183ba..ed058418f9 100644
--- a/app/bluetooth/common/gatt_service_cte_adv/sli_gatt_service_cte_adv.h
+++ b/app/bluetooth/common/gatt_service_cte_adv/sli_gatt_service_cte_adv.h
@@ -62,7 +62,7 @@ typedef uint8_t adv_cte_phy_t;
extern adv_cte_phy_t adv_cte_phy;
#define ADV_CTE_PHY_1M 0
#define ADV_CTE_PHY_2M 1
-#define ADV_CTE_PHY_CONVERT(p) (((p) == ADV_CTE_PHY_2M) ? sl_bt_gap_2m_phy : sl_bt_gap_1m_phy)
+#define ADV_CTE_PHY_CONVERT(p) (((p) == ADV_CTE_PHY_2M) ? sl_bt_gap_phy_2m : sl_bt_gap_phy_1m)
/**************************************************************************//**
* Initialize advertisement package according to CTE specifications.
diff --git a/app/bluetooth/common/l2cap_transfer/src/sl_bt_l2cap_transfer.c b/app/bluetooth/common/l2cap_transfer/src/sl_bt_l2cap_transfer.c
index 32aae3afdf..c48464a74d 100644
--- a/app/bluetooth/common/l2cap_transfer/src/sl_bt_l2cap_transfer.c
+++ b/app/bluetooth/common/l2cap_transfer/src/sl_bt_l2cap_transfer.c
@@ -449,11 +449,11 @@ static void register_open_response_from_server(sl_bt_evt_l2cap_le_channel_open_r
transfer = select_transfer_by_connection(response_event->connection,
request_pending_transfer_list);
- transfer->max_pdu = response_event->max_pdu;
- transfer->max_sdu = response_event->max_sdu;
- transfer->credit = response_event->credit;
-
if (transfer != NULL) {
+ transfer->max_pdu = response_event->max_pdu;
+ transfer->max_sdu = response_event->max_sdu;
+ transfer->credit = response_event->credit;
+
CORE_ENTER_CRITICAL();
sl_slist_remove(&request_pending_transfer_list, &transfer->node);
@@ -466,11 +466,11 @@ static void register_open_response_from_server(sl_bt_evt_l2cap_le_channel_open_r
}
CORE_EXIT_CRITICAL();
- }
- if (sl_bt_l2cap_connection_result_successful != error_code) {
- transfer->channel_error = error_code;
- close_transfer(transfer->connection, transfer->cid, error_code);
+ if (sl_bt_l2cap_connection_result_successful != error_code) {
+ transfer->channel_error = error_code;
+ close_transfer(transfer->connection, transfer->cid, error_code);
+ }
}
}
diff --git a/app/bluetooth/common/ots/inc/sl_bt_ots_client.h b/app/bluetooth/common/ots/inc/sl_bt_ots_client.h
index ff198f2805..c598f90239 100644
--- a/app/bluetooth/common/ots/inc/sl_bt_ots_client.h
+++ b/app/bluetooth/common/ots/inc/sl_bt_ots_client.h
@@ -641,6 +641,16 @@ sl_status_t sl_bt_ots_client_oacp_abort(sl_bt_ots_client_handle_t client);
sl_status_t sl_bt_ots_client_increase_credit(sl_bt_ots_client_handle_t client,
uint16_t credit);
+/***************************************************************************//**
+ * Abort current write or read operation. Close the L2CAP channel in case of
+ * Write operation is in progress or execute OACP Abort in case of Read
+ * operation is in progress.
+ *
+ * @param[in] client Client handle.
+ * @return Status code
+ ******************************************************************************/
+sl_status_t sl_bt_ots_client_abort(sl_bt_ots_client_handle_t client);
+
/***************************************************************************//**
* Internal Bluetooth event handler.
* @param[in] evt Bluetooth event.
diff --git a/app/bluetooth/common/ots/src/sl_bt_ots_client.c b/app/bluetooth/common/ots/src/sl_bt_ots_client.c
index 5459ec7422..a852b5e1b0 100644
--- a/app/bluetooth/common/ots/src/sl_bt_ots_client.c
+++ b/app/bluetooth/common/ots/src/sl_bt_ots_client.c
@@ -235,6 +235,14 @@ sl_status_t sl_bt_ots_client_init(sl_bt_ots_client_handle_t client,
client->status = CLIENT_STATUS_BEGIN;
+ // Active parameter clear
+ client->active_handle_index = SL_BT_OTS_CHARACTERISTIC_UUID_INDEX_INVALID;
+ client->active_opcode = 0;
+ client->active_transfer_size = 0;
+ client->active_transfer_offset = 0;
+ client->active_transfer_sdu = 0;
+ client->active_transfer_pdu = 0;
+
// Add client to the list
sl_slist_push_back(&client_list, &client->node);
@@ -783,8 +791,12 @@ sl_status_t sl_bt_ots_client_oacp_execute(sl_bt_ots_client_handle_t client,
return SL_STATUS_NULL_POINTER;
}
- uint8_t total_size = sizeof(sl_bt_ots_oacp_opcode_t) + optional_data_size;
- uint8_t content[total_size];
+ uint16_t total_size = sizeof(sl_bt_ots_oacp_opcode_t) + optional_data_size;
+ if (total_size > SL_BT_OTS_CLIENT_CONFIG_WRITE_REQUEST_DATA_SIZE) {
+ return SL_STATUS_INVALID_PARAMETER;
+ }
+
+ uint8_t content[SL_BT_OTS_CLIENT_CONFIG_WRITE_REQUEST_DATA_SIZE];
sl_bt_ots_oacp_message_t *message = (sl_bt_ots_oacp_message_t *)&content;
message->opcode = SL_BT_OTS_OACP_OPCODE_EXECUTE;
@@ -820,7 +832,7 @@ sl_status_t sl_bt_ots_client_oacp_read(sl_bt_ots_client_handle_t client,
}
uint8_t total_size = sizeof(sl_bt_ots_oacp_opcode_t) + sizeof(sl_bt_ots_oacp_read_parameters_t);
- uint8_t content[total_size];
+ uint8_t content[sizeof(sl_bt_ots_oacp_opcode_t) + sizeof(sl_bt_ots_oacp_read_parameters_t)];
sl_bt_ots_oacp_message_t *message = (sl_bt_ots_oacp_message_t *)&content;
sl_bt_ots_oacp_read_parameters_t *parameters
= (sl_bt_ots_oacp_read_parameters_t *)message->data;
@@ -862,7 +874,7 @@ sl_status_t sl_bt_ots_client_oacp_write(sl_bt_ots_client_handle_t client,
}
uint8_t total_size = sizeof(sl_bt_ots_oacp_opcode_t) + sizeof(sl_bt_ots_oacp_write_parameters_t);
- uint8_t content[total_size];
+ uint8_t content[sizeof(sl_bt_ots_oacp_opcode_t) + sizeof(sl_bt_ots_oacp_write_parameters_t)];
sl_bt_ots_oacp_message_t *message = (sl_bt_ots_oacp_message_t *)&content;
sl_bt_ots_oacp_write_parameters_t *parameters
= (sl_bt_ots_oacp_write_parameters_t *)message->data;
@@ -894,7 +906,7 @@ sl_status_t sl_bt_ots_client_oacp_abort(sl_bt_ots_client_handle_t client)
// Check status for read in progress
if ((client->status) != CLIENT_STATUS_WAIT_OACP_TRANSFER
- && client->active_opcode == SL_BT_OTS_OACP_OPCODE_READ) {
+ || client->active_opcode != SL_BT_OTS_OACP_OPCODE_READ) {
return SL_STATUS_INVALID_STATE;
}
@@ -926,6 +938,30 @@ sl_status_t sl_bt_ots_client_increase_credit(sl_bt_ots_client_handle_t client,
return sc;
}
+sl_status_t sl_bt_ots_client_abort(sl_bt_ots_client_handle_t client)
+{
+ sl_status_t sc = SL_STATUS_INVALID_STATE;
+
+ // Check arguments
+ CHECK_NULL(client);
+
+ // Check state
+ if (client->status == CLIENT_STATUS_WAIT_OACP_TRANSFER) {
+ if (client->active_opcode == SL_BT_OTS_OACP_OPCODE_READ) {
+ // Abort read in a gentle way.
+ sc = sl_bt_ots_client_oacp_abort(client);
+ } else if (client->active_opcode == SL_BT_OTS_OACP_OPCODE_WRITE) {
+ // Check progress of the operation
+ sc = sl_bt_l2cap_transfer_check_progress(&client->l2cap_transfer);
+ if (sc == SL_STATUS_IN_PROGRESS) {
+ // Abort the L2CAP transfer
+ sc = sl_bt_l2cap_transfer_abort_transfer(&client->l2cap_transfer);
+ }
+ }
+ }
+ return sc;
+}
+
void sli_bt_ots_client_init(void)
{
for (uint8_t connection_index = 0; connection_index < SL_BT_CONFIG_MAX_CONNECTIONS; connection_index++) {
@@ -1035,6 +1071,10 @@ void sli_bt_ots_client_on_bt_event(sl_bt_msg_t *evt)
}
// Set status
handle->status = CLIENT_STATUS_DISCONNECTED;
+
+ // Remove client from the list
+ sl_slist_remove(&client_list, &handle->node);
+
// Do callback
CALL_SAFE(handle, on_disconnect, handle);
}
@@ -1164,7 +1204,7 @@ void sli_bt_ots_client_on_bt_event(sl_bt_msg_t *evt)
memcpy(buffer->data, evt->data.evt_gatt_characteristic_value.value.data, buffer->len);
}
// Handle indication
- if (evt->data.evt_gatt_characteristic_value.att_opcode == gatt_handle_value_indication
+ if (evt->data.evt_gatt_characteristic_value.att_opcode == sl_bt_gatt_handle_value_indication
&& handle != NULL) {
uint8_t att_error = ATT_ERR_SUCCESS;
// OLCP indication
@@ -1270,9 +1310,10 @@ void sli_bt_ots_client_on_bt_event(sl_bt_msg_t *evt)
&& (response->opcode == SL_BT_OTS_OACP_OPCODE_READ
|| response->opcode == SL_BT_OTS_OACP_OPCODE_WRITE)) {
// Set transfer parameters
- handle->l2cap_transfer.callbacks = &l2cap_transfer_callbacks;
- handle->l2cap_transfer.connection = handle->connection;
+ handle->l2cap_transfer.callbacks = &l2cap_transfer_callbacks;
+ handle->l2cap_transfer.connection = handle->connection;
handle->l2cap_transfer.data_length = handle->active_transfer_size;
+ handle->l2cap_transfer.data_offset = handle->active_transfer_offset;
handle->l2cap_transfer.mode
= (response->opcode == SL_BT_OTS_OACP_OPCODE_WRITE) ? SL_BT_L2CAP_TRANSFER_MODE_TRANSMIT : SL_BT_L2CAP_TRANSFER_MODE_RECEIVE;
@@ -1457,6 +1498,12 @@ static void l2cap_transfer_transfer_finished(sl_bt_l2cap_transfer_transfer_handl
if (error_code != SL_STATUS_OK) {
result = SL_BT_OTS_TRANSFER_FINISHED_RESPONSE_CODE_CHANNEL_ERROR;
}
+ // Active transfer clear
+ handle->active_transfer_size = 0;
+ handle->active_transfer_offset = 0;
+ handle->active_transfer_sdu = 0;
+ handle->active_transfer_pdu = 0;
+
CALL_SAFE(handle,
on_data_transfer_finished,
handle,
@@ -1667,6 +1714,11 @@ static sl_bt_ots_client_status_t finish_init(sl_bt_ots_client_t *client,
// Clear active client for connection
active_client[HANDLE_TO_INDEX(client->connection)] = NULL;
+ if (client->status == CLIENT_STATUS_ERROR) {
+ // Remove client from the list
+ sl_slist_remove(&client_list, &client->node);
+ }
+
return client->status;
}
diff --git a/app/bluetooth/common/ots/src/sl_bt_ots_server.c b/app/bluetooth/common/ots/src/sl_bt_ots_server.c
index 1857aa75ce..eb769b1a4d 100644
--- a/app/bluetooth/common/ots/src/sl_bt_ots_server.c
+++ b/app/bluetooth/common/ots/src/sl_bt_ots_server.c
@@ -576,9 +576,9 @@ static void set_object_invalid(sl_bt_ots_object_id_t *object)
static sl_bt_ots_characteristic_uuid_index find_characteristic_index(uint16_t handle,
sl_bt_ots_server_t **server)
{
+ *server = NULL;
// Find handle on a server
if (INVALID_CHARACTERISTIC_HANDLE == handle) {
- server = NULL;
return SL_BT_OTS_CHARACTERISTIC_UUID_INDEX_INVALID;
}
// Find handle on a server
@@ -1818,14 +1818,15 @@ static void handle_gatt_write(sl_bt_evt_gatt_server_user_write_request_t *write_
{
sl_bt_ots_server_t *server = NULL;
sl_bt_ots_server_client_db_entry_t *client = NULL;
- sl_bt_ots_characteristic_uuid_index characteristic_index = SL_BT_OTS_CHARACTERISTIC_UUID_INDEX_INVALID;
+ sl_bt_ots_characteristic_uuid_index characteristic_index = SL_BT_OTS_CHARACTERISTIC_UUID_INDEX_INVALID;
uint8_t att_error = ATT_ERR_SUCCESS;
// Find characteristic handle
characteristic_index = find_characteristic_index(write_request->characteristic,
&server);
// Check server hand characteristic index
- if (server != NULL && characteristic_index != SL_BT_OTS_CHARACTERISTIC_UUID_INDEX_INVALID) {
+ if (server != NULL
+ && characteristic_index != SL_BT_OTS_CHARACTERISTIC_UUID_INDEX_INVALID) {
// Identify client
client = find_client(server, write_request->connection);
@@ -1908,15 +1909,16 @@ static void handle_gatt_write(sl_bt_evt_gatt_server_user_write_request_t *write_
static void handle_cccd(sl_bt_evt_gatt_server_characteristic_status_t *characteristic_status)
{
- sl_bt_ots_server_t *server;
+ sl_bt_ots_server_t *server = NULL;
if (sl_bt_gatt_server_client_config == characteristic_status->status_flags ) {
sl_bt_ots_characteristic_uuid_index characteristic_index
= find_characteristic_index(characteristic_status->characteristic,
&server);
bool value = (sl_bt_gatt_indication & characteristic_status->client_config_flags) > 0;
- if (server != NULL) {
- sl_bt_ots_server_client_db_entry_t * client = find_client(server,
- characteristic_status->connection);
+ if (server != NULL
+ && characteristic_index != SL_BT_OTS_CHARACTERISTIC_UUID_INDEX_INVALID) {
+ sl_bt_ots_server_client_db_entry_t *client = find_client(server,
+ characteristic_status->connection);
bool changed = false;
if (client != NULL) {
switch (characteristic_index) {
diff --git a/app/bluetooth/common/power_supply/sl_power_supply.c b/app/bluetooth/common/power_supply/sl_power_supply.c
index b850037893..7a3fde22c7 100644
--- a/app/bluetooth/common/power_supply/sl_power_supply.c
+++ b/app/bluetooth/common/power_supply/sl_power_supply.c
@@ -72,9 +72,9 @@ typedef struct {
// -----------------------------------------------------------------------------
// Private variables
-static float supply_voltage; ///< Supply voltage
-static float supply_ir; ///< Internal resistance of the supply
-static uint8_t supply_type; ///< Type of the connected supply
+static float supply_voltage = 0.0f; ///< Supply voltage
+static float supply_ir = 0.0f; ///< Internal resistance of the supply
+static uint8_t supply_type = SL_POWER_SUPPLY_TYPE_UNKNOWN; ///< Type of the connected supply
static batt_model_entry_t batt_model_cr2032[] =
{ { 3.0, 100 }, { 2.9, 80 }, { 2.8, 60 }, { 2.7, 40 }, { 2.6, 30 },
@@ -306,23 +306,27 @@ void sl_power_supply_probe(void)
"[E: %#04x] Si7021 sensor not available\n",
sc);
sc = sl_si70xx_init(rht_sensor, SI7021_ADDR);
- app_assert_status(sc);
-
- // Try to measure using 9.18 mA first.
- v = sl_power_supply_measure_voltage(16);
- r = measure_supply_ir(0x00);
- if ( r > 5.0 ) {
- type = SL_POWER_SUPPLY_TYPE_CR2032;
- } else if (r > 0.5) {
- type = SL_POWER_SUPPLY_TYPE_AAA;
+
+ if (sc == SL_STATUS_OK) {
+ // Try to measure using 9.18 mA first.
+ v = sl_power_supply_measure_voltage(16);
+ r = measure_supply_ir(0x00);
+ if ( r > 5.0 ) {
+ type = SL_POWER_SUPPLY_TYPE_CR2032;
+ } else if (r > 0.5) {
+ type = SL_POWER_SUPPLY_TYPE_AAA;
+ } else {
+ type = SL_POWER_SUPPLY_TYPE_USB;
+ }
+
+ // Store measurement results in global variables.
+ supply_voltage = v;
+ supply_ir = r;
+ supply_type = type;
} else {
- type = SL_POWER_SUPPLY_TYPE_USB;
+ app_log_warning("Si7021 sensor initialization failed. "
+ "Unable to detect power supply type." APP_LOG_NL);
}
-
- // Store measurement results in global variables.
- supply_voltage = v;
- supply_ir = r;
- supply_type = type;
}
/***************************************************************************//**
@@ -348,15 +352,7 @@ uint8_t sl_power_supply_get_type(void)
******************************************************************************/
bool sl_power_supply_is_low_power(void)
{
- bool lp;
-
- if ( (supply_type != SL_POWER_SUPPLY_TYPE_CR2032) && (supply_type != SL_POWER_SUPPLY_TYPE_UNKNOWN) ) {
- lp = false;
- } else {
- lp = true;
- }
-
- return lp;
+ return supply_type == SL_POWER_SUPPLY_TYPE_CR2032;
}
/***************************************************************************//**
diff --git a/app/bluetooth/common/simple_com/sl_simple_com_cpc.c b/app/bluetooth/common/simple_com/sl_simple_com_cpc.c
index 4b05b1cc39..edef30f51d 100644
--- a/app/bluetooth/common/simple_com/sl_simple_com_cpc.c
+++ b/app/bluetooth/common/simple_com/sl_simple_com_cpc.c
@@ -39,8 +39,15 @@ static uint8_t tx_buf[SL_SIMPLE_COM_TX_BUF_SIZE] = { 0 };
static sl_cpc_endpoint_handle_t endpoint_handle;
+// Write completed signal
+typedef struct {
+ uint8_t write_completed;
+ sl_status_t wr_comp_status;
+} sig_wr_comp;
+
// Signals to handle communication between callback functions
static uint8_t signal_write = 0;
+static sig_wr_comp signal_wr_comp = { 0 };
static uint8_t signal_read = 0;
static uint8_t signal_init = 1;
@@ -109,10 +116,20 @@ void sl_simple_com_step(void)
// Everything OK, send msg to upper layers
memcpy(rx_buf, rx_buf_p, len);
sl_simple_com_receive_cb(status, len, rx_buf);
+ sl_cpc_free_rx_buffer((void *) &rx_buf);
signal_read--;
memset(rx_buf, 0, sizeof(rx_buf));
}
}
+
+ if (signal_wr_comp.write_completed > 0) {
+ if (!signal_init) {
+ memset(tx_buf, 0, sizeof(tx_buf));
+ sl_simple_com_transmit_cb(signal_wr_comp.wr_comp_status);
+ signal_wr_comp.wr_comp_status = SL_STATUS_FAIL;
+ signal_wr_comp.write_completed--;
+ }
+ }
}
/**************************************************************************//**
@@ -189,6 +206,7 @@ void cpc_rx_cb(uint8_t endpoint_id, void *arg)
{
(void)endpoint_id;
(void)arg;
+
signal_read++;
}
@@ -204,8 +222,8 @@ void cpc_tx_cb(sl_cpc_user_endpoint_id_t endpoint_id,
(void)(buffer);
(void)(arg);
- if (!signal_init) {
- memset(tx_buf, 0, sizeof(tx_buf));
- sl_simple_com_transmit_cb(status);
- }
+ CORE_ATOMIC_SECTION(
+ signal_wr_comp.wr_comp_status = status;
+ signal_wr_comp.write_completed++;
+ )
}
diff --git a/app/bluetooth/common/throughput/throughput_types.h b/app/bluetooth/common/throughput/throughput_types.h
index 20d05ec651..814e2dda75 100644
--- a/app/bluetooth/common/throughput/throughput_types.h
+++ b/app/bluetooth/common/throughput/throughput_types.h
@@ -79,7 +79,7 @@ typedef uint16_t throughput_mtu_size_t;
/// Data size type
typedef uint16_t throughput_data_size_t;
/// PHY type
-typedef sl_bt_gap_phy_and_coding_type_t throughput_phy_t;
+typedef sl_bt_gap_phy_coding_t throughput_phy_t;
/// Notification/indication type
typedef sl_bt_gatt_client_config_flag_t throughput_notification_t;
/// Throughput type
diff --git a/app/bluetooth/common/throughput_central/config/throughput_central_config.h b/app/bluetooth/common/throughput_central/config/throughput_central_config.h
index d9710fb38e..6d349f11ea 100644
--- a/app/bluetooth/common/throughput_central/config/throughput_central_config.h
+++ b/app/bluetooth/common/throughput_central/config/throughput_central_config.h
@@ -37,18 +37,18 @@
#define THROUGHPUT_CENTRAL_MTU_SIZE 247
// Default PHY for scanning
-// 1M PHY
-// Coded PHY
-// Default: sl_bt_gap_1m_phy_uncoded
-#define THROUGHPUT_DEFAULT_SCAN_PHY sl_bt_gap_1m_phy_uncoded
+// 1M PHY
+// Coded PHY
+// Default: sl_bt_gap_phy_coding_1m_uncoded
+#define THROUGHPUT_DEFAULT_SCAN_PHY sl_bt_gap_phy_coding_1m_uncoded
// Default PHY
-// 1M PHY
-// 2M PHY
-// 125k Coded PHY (S=8)
-// 500k Coded PHY (S=2)
-// Default: sl_bt_gap_1m_phy_uncoded
-#define THROUGHPUT_DEFAULT_PHY sl_bt_gap_1m_phy_uncoded
+// 1M PHY
+// 2M PHY
+// 125k Coded PHY (S=8)
+// 500k Coded PHY (S=2)
+// Default: sl_bt_gap_phy_coding_1m_uncoded
+#define THROUGHPUT_DEFAULT_PHY sl_bt_gap_phy_coding_1m_uncoded
//
diff --git a/app/bluetooth/common/throughput_central/throughput_central.c b/app/bluetooth/common/throughput_central/throughput_central.c
index 112873cdb4..2cb40dd871 100644
--- a/app/bluetooth/common/throughput_central/throughput_central.c
+++ b/app/bluetooth/common/throughput_central/throughput_central.c
@@ -60,8 +60,6 @@
// Hardware clock ticks that equal one second
#define HW_TICKS_PER_SECOND 32768
-#define SCAN_PASSIVE 0
-#define TRANSMISSION_ON 1
#define TRANSMISSION_OFF 0
#define UUID_LEN 16
@@ -90,8 +88,8 @@ static throughput_count_t bytes_received = 0;
static throughput_count_t operation_count = 0;
/// Power control status
-static connection_power_reporting_mode_t power_control_enabled
- = connection_power_reporting_disable;
+static sl_bt_connection_power_reporting_mode_t power_control_enabled
+ = sl_bt_connection_power_reporting_disable;
/// Deep sleep enabled
static bool deep_sleep_enabled = THROUGHPUT_CENTRAL_SLEEP_ENABLE;
@@ -143,7 +141,11 @@ const uint8_t result_characteristic_uuid[] = { 0x1b, 0x29, 0xcc, 0xa6, 0x03, 0xb
0x0c, 0x40, 0x0f, 0xb0, 0x27, 0x22, 0xf3, 0xad };
// Function declarations
-static bool process_scan_response(sl_bt_evt_scanner_scan_report_t *response);
+static void handle_scan_event(bd_addr *address,
+ uint8_t address_type,
+ uint8_t * data,
+ uint16_t len);
+static bool process_scan_response(uint8_t *data, uint16_t data_len);
static void process_procedure_complete_event(sl_bt_msg_t *evt);
static void check_characteristic_uuid(sl_bt_msg_t *evt);
static void reset_variables(void);
@@ -186,45 +188,30 @@ void bt_on_event_central(sl_bt_msg_t *evt)
}
switch (SL_BT_MSG_ID(evt->header)) {
- case sl_bt_evt_scanner_scan_report_id:
- if ((central_state.discovery_state == THROUGHPUT_DISCOVERY_STATE_SCAN)
- & process_scan_response(&(evt->data.evt_scanner_scan_report))) {
- // Apply allowlist filtering
- if (false == throughput_central_allowlist_apply(evt->data.evt_scanner_scan_report.address.addr)) {
- break;
- }
-
- // Stop scanning
- sc = sl_bt_scanner_stop();
- app_assert_status(sc);
-
- // Open the connection
- central_state.discovery_state = THROUGHPUT_DISCOVERY_STATE_CONN;
- throughput_central_on_discovery_state_change(central_state.discovery_state);
-
- sc = sl_bt_connection_open(evt->data.evt_scanner_scan_report.address,
- evt->data.evt_scanner_scan_report.address_type,
- central_state.phy,
- &connection_handle);
-
- // Handle if the default PHY is not supported
- if (sc == SL_STATUS_INVALID_PARAMETER) {
- app_log_status_warning_f(sc, "Connection PHY is not supported and set to 1M PHY" APP_LOG_NEW_LINE);
-
- central_state.phy = sl_bt_gap_1m_phy_uncoded;
- sc = sl_bt_connection_open(evt->data.evt_scanner_scan_report.address,
- evt->data.evt_scanner_scan_report.address_type,
- central_state.phy,
- &connection_handle);
- }
- // Assertion to first or second attempt to connect
- app_assert_status(sc);
- } else {
- waiting_indication();
+ case sl_bt_evt_scanner_legacy_advertisement_report_id:
+ // If the device is connectable and scannable
+ if (evt->data.evt_scanner_legacy_advertisement_report.event_flags
+ & (SL_BT_SCANNER_EVENT_FLAG_CONNECTABLE | SL_BT_SCANNER_EVENT_FLAG_SCANNABLE)) {
+ handle_scan_event(&evt->data.evt_scanner_legacy_advertisement_report.address,
+ evt->data.evt_scanner_legacy_advertisement_report.address_type,
+ evt->data.evt_scanner_legacy_advertisement_report.data.data,
+ evt->data.evt_scanner_legacy_advertisement_report.data.len);
+ }
+ break;
+ case sl_bt_evt_scanner_extended_advertisement_report_id:
+ // If the device is connectable, scannable and the data is complete
+ if ((evt->data.evt_scanner_extended_advertisement_report.event_flags
+ & (SL_BT_SCANNER_EVENT_FLAG_CONNECTABLE | SL_BT_SCANNER_EVENT_FLAG_SCANNABLE))
+ && (evt->data.evt_scanner_extended_advertisement_report.data_completeness
+ == sl_bt_scanner_data_status_complete)) {
+ handle_scan_event(&evt->data.evt_scanner_extended_advertisement_report.address,
+ evt->data.evt_scanner_extended_advertisement_report.address_type,
+ evt->data.evt_scanner_extended_advertisement_report.data.data,
+ evt->data.evt_scanner_extended_advertisement_report.data.len);
}
break;
-
case sl_bt_evt_connection_opened_id:
+ connection_handle = evt->data.evt_connection_opened.connection;
// Set remote connection power reporting - needed for Power Control
sc = sl_bt_connection_set_remote_power_reporting(connection_handle,
power_control_enabled);
@@ -281,7 +268,7 @@ void bt_on_event_central(sl_bt_msg_t *evt)
finish_test = true;
}
} else if (evt->data.evt_gatt_characteristic_value.characteristic == result_handle) {
- if (evt->data.evt_gatt_characteristic_value.att_opcode == gatt_handle_value_indication) {
+ if (evt->data.evt_gatt_characteristic_value.att_opcode == sl_bt_gatt_handle_value_indication) {
sl_bt_gatt_send_characteristic_confirmation(evt->data.evt_gatt_characteristic_value.connection);
// Responder sends indication about result after each test. Data is uint8array LSB first.
memcpy(&results.throughput_peripheral_side, evt->data.evt_gatt_characteristic_value.value.data, 4);
@@ -294,7 +281,7 @@ void bt_on_event_central(sl_bt_msg_t *evt)
|| evt->data.evt_gatt_characteristic_value.characteristic == notifications_handle) {
// Send confirmation if needed
if (evt->data.evt_gatt_characteristic_value.characteristic == indications_handle) {
- if (evt->data.evt_gatt_characteristic_value.att_opcode == gatt_handle_value_indication) {
+ if (evt->data.evt_gatt_characteristic_value.att_opcode == sl_bt_gatt_handle_value_indication) {
sl_bt_gatt_send_characteristic_confirmation(evt->data.evt_gatt_characteristic_value.connection);
}
}
@@ -395,22 +382,67 @@ static void check_received_data(uint8_t * data, uint8_t len)
}
}
+static void handle_scan_event(bd_addr *address,
+ uint8_t address_type,
+ uint8_t * data,
+ uint16_t len)
+{
+ sl_status_t sc;
+
+ if ((central_state.discovery_state == THROUGHPUT_DISCOVERY_STATE_SCAN)
+ & process_scan_response(data, len)) {
+ // Apply allowlist filtering
+ if (false == throughput_central_allowlist_apply(address->addr)) {
+ return;
+ }
+
+ // Stop scanning
+ app_log_info("Scanning stop." APP_LOG_NL);
+ sc = sl_bt_scanner_stop();
+ app_assert_status(sc);
+
+ // Open the connection
+ central_state.discovery_state = THROUGHPUT_DISCOVERY_STATE_CONN;
+ throughput_central_on_discovery_state_change(central_state.discovery_state);
+
+ sc = sl_bt_connection_open(*address,
+ address_type,
+ central_state.phy,
+ &connection_handle);
+
+ // Handle if the default PHY is not supported
+ if (sc == SL_STATUS_INVALID_PARAMETER) {
+ app_log_status_warning_f(sc, "Connection PHY is not supported and set to 1M PHY" APP_LOG_NEW_LINE);
+
+ central_state.phy = sl_bt_gap_phy_coding_1m_uncoded;
+ sc = sl_bt_connection_open(*address,
+ address_type,
+ central_state.phy,
+ &connection_handle);
+ }
+ // Assertion to first or second attempt to connect
+ app_assert_status(sc);
+ } else {
+ waiting_indication();
+ }
+}
+
// Cycle through advertisement contents and look for matching device name.
-static bool process_scan_response(sl_bt_evt_scanner_scan_report_t *response)
+static bool process_scan_response(uint8_t *data, uint16_t data_len)
{
int i = 0;
bool device_name_match = false;
uint8_t advertisement_length;
uint8_t advertisement_type;
- while (i < (response->data.len - 1)) {
- advertisement_length = response->data.data[i];
- advertisement_type = response->data.data[i + 1];
+ while (i < (data_len - 1)) {
+ advertisement_length = data[i];
+ advertisement_type = data[i + 1];
/* Type 0x09 = Complete Local Name, 0x08 Shortened Name */
if (advertisement_type == 0x09) {
/* Check if device name is Throughput Tester */
- if (memcmp(response->data.data + i + 2, device_name, strlen(device_name)) == 0) {
+ if (memcmp(data + i + 2, device_name, strlen(device_name)) == 0) {
device_name_match = true;
break;
}
@@ -678,6 +710,7 @@ void throughput_central_scanning_stop(void)
{
sl_status_t sc;
if (central_state.discovery_state == THROUGHPUT_DISCOVERY_STATE_SCAN) {
+ app_log_info("Scanning stop." APP_LOG_NL);
sc = sl_bt_scanner_stop();
app_assert_status(sc);
central_state.discovery_state = THROUGHPUT_DISCOVERY_STATE_IDLE;
@@ -688,16 +721,10 @@ void throughput_central_scanning_stop(void)
// Apply phy for scanning
sl_status_t throughput_central_scanning_apply_phy(throughput_phy_t phy)
{
- sl_status_t sc;
-
throughput_central_scanning_stop();
- // Set passive scanning on selected PHY
- sc = sl_bt_scanner_set_mode(phy, SCAN_PASSIVE);
- if (sc == SL_STATUS_OK) {
- central_state.scan_phy = phy;
- }
+ central_state.scan_phy = phy;
throughput_central_scanning_start();
- return sc;
+ return SL_STATUS_OK;
}
// Start scanning
@@ -735,14 +762,6 @@ void throughput_central_scanning_start(void)
sc = sl_bt_gatt_server_set_max_mtu(central_state.mtu_size, &(central_state.mtu_size));
app_assert_status(sc);
- // Set passive scanning on selected PHY
- // Check if scanning phy is supported by setting mode
- sc = sl_bt_scanner_set_mode(central_state.scan_phy, SCAN_PASSIVE);
- if (sc != SL_STATUS_OK) {
- central_state.scan_phy = sl_bt_gap_1m_phy_uncoded;
- app_log_warning("Scanning PHY is not supported and set to 1M PHY" APP_LOG_NEW_LINE);
- }
-
// Set the default connection parameters for subsequent connections
sc = sl_bt_connection_set_default_parameters(central_state.connection_interval_min,
central_state.connection_interval_max,
@@ -753,7 +772,13 @@ void throughput_central_scanning_start(void)
app_assert_status(sc);
// Start scanning - looking for peripheral devices
- sc = sl_bt_scanner_start(central_state.scan_phy, scanner_discover_generic);
+ sc = sl_bt_scanner_start(central_state.scan_phy, sl_bt_scanner_discover_generic);
+ if (sc != SL_STATUS_OK) {
+ central_state.scan_phy = sl_bt_gap_phy_coding_1m_uncoded;
+ app_log_warning("Requested scanning PHY is not supported and set to 1M PHY" APP_LOG_NEW_LINE);
+ // Start scanning with the modified PHY
+ sc = sl_bt_scanner_start(central_state.scan_phy, sl_bt_scanner_discover_generic);
+ }
app_assert_status(sc);
}
@@ -992,7 +1017,7 @@ sl_status_t throughput_central_set_tx_power(throughput_tx_power_t tx_power,
sl_status_t res = SL_STATUS_OK;
if (enabled && central_state.state != THROUGHPUT_STATE_TEST) {
central_state.tx_power_requested = tx_power;
- power_control_enabled = (connection_power_reporting_mode_t)power_control;
+ power_control_enabled = (sl_bt_connection_power_reporting_mode_t)power_control;
deep_sleep_enabled = deep_sleep;
throughput_central_scanning_restart();
} else {
@@ -1102,8 +1127,8 @@ sl_status_t throughput_central_set_connection_phy(throughput_phy_t phy)
if (enabled
&& (central_state.state == THROUGHPUT_STATE_CONNECTED
|| central_state.state == THROUGHPUT_STATE_SUBSCRIBED) ) {
- if (phy == sl_bt_gap_coded_phy_500k) {
- accepted_phy = sl_bt_gap_coded_phy;
+ if (phy == sl_bt_gap_phy_coding_500k_coded) {
+ accepted_phy = sl_bt_gap_phy_coded;
}
res = sl_bt_connection_set_preferred_phy(connection_handle,
phy,
@@ -1125,41 +1150,41 @@ sl_status_t throughput_central_change_phy(void)
// If connected
current_phy = central_state.phy;
switch (current_phy) {
- case sl_bt_gap_1m_phy_uncoded:
- res = throughput_central_set_connection_phy(sl_bt_gap_2m_phy_uncoded);
+ case sl_bt_gap_phy_coding_1m_uncoded:
+ res = throughput_central_set_connection_phy(sl_bt_gap_phy_coding_2m_uncoded);
// if cannot switch to 2M, switch to 1M
if (res != SL_STATUS_OK) {
- res = throughput_central_set_connection_phy(sl_bt_gap_1m_phy_uncoded);
+ res = throughput_central_set_connection_phy(sl_bt_gap_phy_coding_1m_uncoded);
}
break;
- case sl_bt_gap_2m_phy_uncoded:
- res = throughput_central_set_connection_phy(sl_bt_gap_coded_phy_125k);
+ case sl_bt_gap_phy_coding_2m_uncoded:
+ res = throughput_central_set_connection_phy(sl_bt_gap_phy_coding_125k_coded);
// if cannot switch to coded, switch to 1M
if (res != SL_STATUS_OK) {
- res = throughput_central_set_connection_phy(sl_bt_gap_1m_phy_uncoded);
+ res = throughput_central_set_connection_phy(sl_bt_gap_phy_coding_1m_uncoded);
}
break;
- case sl_bt_gap_coded_phy_125k:
- res = throughput_central_set_connection_phy(sl_bt_gap_coded_phy_500k);
+ case sl_bt_gap_phy_coding_125k_coded:
+ res = throughput_central_set_connection_phy(sl_bt_gap_phy_coding_500k_coded);
// if cannot switch to coded, switch to 1M
if (res != SL_STATUS_OK) {
- res = throughput_central_set_connection_phy(sl_bt_gap_1m_phy_uncoded);
+ res = throughput_central_set_connection_phy(sl_bt_gap_phy_coding_1m_uncoded);
}
break;
- case sl_bt_gap_coded_phy_500k:
- res = throughput_central_set_connection_phy(sl_bt_gap_1m_phy_uncoded);
+ case sl_bt_gap_phy_coding_500k_coded:
+ res = throughput_central_set_connection_phy(sl_bt_gap_phy_coding_1m_uncoded);
break;
default:
- res = throughput_central_set_connection_phy(sl_bt_gap_1m_phy_uncoded);
+ res = throughput_central_set_connection_phy(sl_bt_gap_phy_coding_1m_uncoded);
break;
}
} else if (central_state.state == THROUGHPUT_STATE_DISCONNECTED) {
// if disconnected
current_phy = central_state.scan_phy;
- if (current_phy == sl_bt_gap_1m_phy_uncoded) {
- res = throughput_central_set_scan_phy(sl_bt_gap_coded_phy_125k);
+ if (current_phy == sl_bt_gap_phy_coding_1m_uncoded) {
+ res = throughput_central_set_scan_phy(sl_bt_gap_phy_coding_125k_coded);
} else {
- res = throughput_central_set_scan_phy(sl_bt_gap_1m_phy_uncoded);
+ res = throughput_central_set_scan_phy(sl_bt_gap_phy_coding_1m_uncoded);
}
}
}
@@ -1208,9 +1233,9 @@ void throughput_central_enable(void)
central_state.packet_lost = 0;
if (THROUGHPUT_CENTRAL_POWER_CONTROL_ENABLE) {
- power_control_enabled = connection_power_reporting_enable;
+ power_control_enabled = sl_bt_connection_power_reporting_enable;
} else {
- power_control_enabled = connection_power_reporting_disable;
+ power_control_enabled = sl_bt_connection_power_reporting_disable;
}
// if the power is greater than 10 dBm AFH must be used
afh_bit = (central_state.tx_power_requested > 10);
@@ -1263,13 +1288,6 @@ void throughput_central_enable(void)
throughput_ui_set_all(central_state);
#endif // SL_CATALOG_THROUGHPUT_UI_PRESENT
- // Check if scanning phy is supported by setting mode
- sc = sl_bt_scanner_set_mode(central_state.scan_phy, SCAN_PASSIVE);
- if (sc != SL_STATUS_OK) {
- central_state.scan_phy = sl_bt_gap_1m_phy_uncoded;
- app_log_warning("Default scanning PHY is not supported and set to 1M PHY" APP_LOG_NEW_LINE);
- }
-
// Start scanning
throughput_central_scanning_start();
@@ -1436,16 +1454,16 @@ SL_WEAK void throughput_central_on_phy_change(throughput_phy_t phy)
throughput_ui_update();
#else
switch (phy) {
- case sl_bt_gap_1m_phy_uncoded:
+ case sl_bt_gap_phy_coding_1m_uncoded:
app_log_info(THROUGHPUT_UI_PHY_1M_TEXT);
break;
- case sl_bt_gap_2m_phy_uncoded:
+ case sl_bt_gap_phy_coding_2m_uncoded:
app_log_info(THROUGHPUT_UI_PHY_2M_TEXT);
break;
- case sl_bt_gap_coded_phy_125k:
+ case sl_bt_gap_phy_coding_125k_coded:
app_log_info(THROUGHPUT_UI_PHY_CODED_125K_TEXT);
break;
- case sl_bt_gap_coded_phy_500k:
+ case sl_bt_gap_phy_coding_500k_coded:
app_log_info(THROUGHPUT_UI_PHY_CODED_500K_TEXT);
break;
default:
@@ -1846,22 +1864,11 @@ void cli_throughput_central_phy_scan_set(sl_cli_command_arg_t *arguments)
return;
}
uint8_t phy_scan;
- sl_status_t sc;
if (central_state.state != THROUGHPUT_STATE_TEST) {
phy_scan = sl_cli_get_argument_uint8(arguments, 0);
+ central_state.scan_phy = (throughput_phy_t)phy_scan;
throughput_central_scanning_restart();
-
- // Set passive scanning on selected PHY
- sc = sl_bt_scanner_set_mode(phy_scan, SCAN_PASSIVE);
- if (sc == SL_STATUS_OK) {
- central_state.scan_phy = (throughput_phy_t)phy_scan;
- }
-
- if (sc == SL_STATUS_OK) {
- CLI_RESPONSE(CLI_OK);
- } else {
- CLI_RESPONSE(CLI_ERROR);
- }
+ CLI_RESPONSE(CLI_OK);
} else {
CLI_RESPONSE(CLI_ERROR);
}
diff --git a/app/bluetooth/common/throughput_peripheral/throughput_peripheral.c b/app/bluetooth/common/throughput_peripheral/throughput_peripheral.c
index 3c5c77e644..cc0729dcd5 100644
--- a/app/bluetooth/common/throughput_peripheral/throughput_peripheral.c
+++ b/app/bluetooth/common/throughput_peripheral/throughput_peripheral.c
@@ -182,8 +182,8 @@ static bool notification_sent = false;
static bool indication_confirmed = false;
/// Power control status
-static connection_power_reporting_mode_t power_control_enabled
- = connection_power_reporting_disable;
+static sl_bt_connection_power_reporting_mode_t power_control_enabled
+ = sl_bt_connection_power_reporting_disable;
/// Requested notification data size
static uint8_t requested_notification_size =
@@ -314,7 +314,7 @@ static void throughput_peripheral_advertising_start(void)
app_assert_status(sc);
sc = sl_bt_legacy_advertiser_start(advertising_set_handle,
- advertiser_connectable_scannable);
+ sl_bt_advertiser_connectable_scannable);
app_assert_status(sc);
#ifdef SL_CATALOG_BLUETOOTH_FEATURE_EXTENDED_ADVERTISER_PRESENT
@@ -345,8 +345,8 @@ static void throughput_peripheral_advertising_start(void)
// Set PHY for extended advertiser
sc = sl_bt_extended_advertiser_set_phy(coded_advertising_set_handle,
- sl_bt_gap_coded_phy,
- sl_bt_gap_coded_phy);
+ sl_bt_gap_phy_coded,
+ sl_bt_gap_phy_coded);
app_assert( (sc == SL_STATUS_OK) || (sc == SL_STATUS_INVALID_PARAMETER),
"[E: 0x%04x] Failed to set CODED PHY for the advertistment\n",
@@ -354,7 +354,7 @@ static void throughput_peripheral_advertising_start(void)
if (sc == SL_STATUS_OK) {
sc = sl_bt_extended_advertiser_start(coded_advertising_set_handle,
- advertiser_connectable_non_scannable,
+ sl_bt_advertiser_connectable_non_scannable,
SL_BT_EXTENDED_ADVERTISER_INCLUDE_TX_POWER);
app_assert_status(sc);
}
@@ -829,7 +829,7 @@ void throughput_peripheral_enable(void)
peripheral_state.mode = THROUGHPUT_PERIPHERAL_MODE_DEFAULT;
peripheral_state.tx_power = THROUGHPUT_PERIPHERAL_TX_POWER;
peripheral_state.rssi = 0;
- peripheral_state.phy = sl_bt_gap_1m_phy_uncoded;
+ peripheral_state.phy = sl_bt_gap_phy_coding_1m_uncoded;
peripheral_state.interval = 0;
peripheral_state.pdu_size = 0;
peripheral_state.mtu_size = THROUGHPUT_PERIPHERAL_MTU_SIZE;
@@ -842,9 +842,9 @@ void throughput_peripheral_enable(void)
peripheral_state.packet_lost = 0;
if (THROUGHPUT_PERIPHERAL_TX_POWER_CONTROL_ENABLE) {
- power_control_enabled = connection_power_reporting_enable;
+ power_control_enabled = sl_bt_connection_power_reporting_enable;
} else {
- power_control_enabled = connection_power_reporting_disable;
+ power_control_enabled = sl_bt_connection_power_reporting_disable;
}
// Convert power to mdBm
@@ -1171,7 +1171,7 @@ void throughput_peripheral_on_bt_event(sl_bt_msg_t *evt)
// Handle received data
// Send confirmation if needed
if (evt->data.evt_gatt_characteristic_value.characteristic == indications_handle) {
- if (evt->data.evt_gatt_characteristic_value.att_opcode == gatt_handle_value_indication) {
+ if (evt->data.evt_gatt_characteristic_value.att_opcode == sl_bt_gatt_handle_value_indication) {
sl_bt_gatt_send_characteristic_confirmation(evt->data.evt_gatt_characteristic_value.connection);
}
}
@@ -1276,9 +1276,9 @@ sl_status_t throughput_peripheral_set_tx_power(throughput_tx_power_t tx_power,
deep_sleep_enabled = deep_sleep;
if (power_control) {
- power_control_enabled = connection_power_reporting_enable;
+ power_control_enabled = sl_bt_connection_power_reporting_enable;
} else {
- power_control_enabled = connection_power_reporting_disable;
+ power_control_enabled = sl_bt_connection_power_reporting_disable;
}
// Reconnect if required
diff --git a/app/bluetooth/common/throughput_ui/throughput_ui.c b/app/bluetooth/common/throughput_ui/throughput_ui.c
index 98df118400..2617a635d1 100644
--- a/app/bluetooth/common/throughput_ui/throughput_ui.c
+++ b/app/bluetooth/common/throughput_ui/throughput_ui.c
@@ -258,19 +258,19 @@ void throughput_ui_set_phy(throughput_phy_t phy)
{
clear_row(ROW_PHY);
switch (phy) {
- case sl_bt_gap_1m_phy_uncoded:
+ case sl_bt_gap_phy_coding_1m_uncoded:
write_row(THROUGHPUT_UI_PHY_1M_TEXT, ROW_PHY);
LOG(THROUGHPUT_UI_PHY_1M_TEXT);
break;
- case sl_bt_gap_2m_phy_uncoded:
+ case sl_bt_gap_phy_coding_2m_uncoded:
write_row(THROUGHPUT_UI_PHY_2M_TEXT, ROW_PHY);
LOG(THROUGHPUT_UI_PHY_2M_TEXT);
break;
- case sl_bt_gap_coded_phy_125k:
+ case sl_bt_gap_phy_coding_125k_coded:
write_row(THROUGHPUT_UI_PHY_CODED_125K_TEXT, ROW_PHY);
LOG(THROUGHPUT_UI_PHY_CODED_125K_TEXT);
break;
- case sl_bt_gap_coded_phy_500k:
+ case sl_bt_gap_phy_coding_500k_coded:
write_row(THROUGHPUT_UI_PHY_CODED_500K_TEXT, ROW_PHY);
LOG(THROUGHPUT_UI_PHY_CODED_500K_TEXT);
break;
diff --git a/app/bluetooth/common/throughput_ui/throughput_ui.h b/app/bluetooth/common/throughput_ui/throughput_ui.h
index 077ce55cff..249fba4137 100644
--- a/app/bluetooth/common/throughput_ui/throughput_ui.h
+++ b/app/bluetooth/common/throughput_ui/throughput_ui.h
@@ -120,9 +120,9 @@ void throughput_ui_set_data_size(throughput_data_size_t size);
* Sets the PHY on UI.
*
* @param[in] phy can be either of
- * - sl_bt_gap_1m_phy: 1M phy
- * - sl_bt_gap_2m_phy: 2M phy
- * - sl_bt_gap_coded_phy: Coded phy
+ * - sl_bt_gap_phy_coding_1m_uncoded: 1M phy
+ * - sl_bt_gap_phy_coding_2m_uncoded: 2M phy
+ * - sl_bt_gap_phy_coding_500k_coded: Coded phy
*****************************************************************************/
void throughput_ui_set_phy(throughput_phy_t phy);
diff --git a/app/bluetooth/common/throughput_ui/throughput_ui_log.c b/app/bluetooth/common/throughput_ui/throughput_ui_log.c
index 065f207744..6ec8abcaab 100644
--- a/app/bluetooth/common/throughput_ui/throughput_ui_log.c
+++ b/app/bluetooth/common/throughput_ui/throughput_ui_log.c
@@ -149,19 +149,19 @@ static void refresh_ui(uint8_t refresh_row)
break;
case ROW_PHY:
switch (ui_state.phy) {
- case sl_bt_gap_1m_phy_uncoded:
+ case sl_bt_gap_phy_coding_1m_uncoded:
UI_PRINTF(THROUGHPUT_UI_PHY_1M_TEXT);
UI_PRINTBOX(" ");
break;
- case sl_bt_gap_2m_phy_uncoded:
+ case sl_bt_gap_phy_coding_2m_uncoded:
UI_PRINTF(THROUGHPUT_UI_PHY_2M_TEXT);
UI_PRINTBOX(" ");
break;
- case sl_bt_gap_coded_phy_125k:
+ case sl_bt_gap_phy_coding_125k_coded:
UI_PRINTF(THROUGHPUT_UI_PHY_CODED_125K_TEXT);
UI_PRINTBOX(" ");
break;
- case sl_bt_gap_coded_phy_500k:
+ case sl_bt_gap_phy_coding_500k_coded:
UI_PRINTF(THROUGHPUT_UI_PHY_CODED_500K_TEXT);
UI_PRINTBOX(" ");
break;
diff --git a/app/bluetooth/common_host/aoa_cte/cte_conn.c b/app/bluetooth/common_host/aoa_cte/cte_conn.c
index 6200c60bb8..2729f4fe6c 100644
--- a/app/bluetooth/common_host/aoa_cte/cte_conn.c
+++ b/app/bluetooth/common_host/aoa_cte/cte_conn.c
@@ -69,19 +69,21 @@ sl_status_t cte_bt_on_event_conn(sl_bt_msg_t *evt)
// Do not call any stack command before receiving this boot event!
case sl_bt_evt_system_boot_id:
// Set passive scanning on 1M PHY
- sc = sl_bt_scanner_set_mode(sl_bt_gap_1m_phy, AOA_CTE_SCAN_MODE);
+ sc = sl_bt_scanner_set_mode(sl_bt_gap_phy_1m, AOA_CTE_SCAN_MODE);
if (SL_STATUS_OK != sc) {
break;
}
// Set scan interval and scan window
- sc = sl_bt_scanner_set_timing(sl_bt_gap_1m_phy, AOA_CTE_SCAN_INTERVAL, AOA_CTE_SCAN_WINDOW);
+ sc = sl_bt_scanner_set_timing(sl_bt_gap_phy_1m,
+ AOA_CTE_SCAN_INTERVAL,
+ AOA_CTE_SCAN_WINDOW);
if (SL_STATUS_OK != sc) {
break;
}
// Start scanning - looking for tags
- sc = sl_bt_scanner_start(sl_bt_gap_1m_phy, sl_bt_scanner_discover_generic);
+ sc = sl_bt_scanner_start(sl_bt_gap_phy_1m, sl_bt_scanner_discover_generic);
if (SL_STATUS_OK != sc) {
break;
}
@@ -131,7 +133,7 @@ sl_status_t cte_bt_on_event_conn(sl_bt_msg_t *evt)
uint8_t conn_handle;
sc = sl_bt_connection_open(evt->data.evt_scanner_scan_report.address,
evt->data.evt_scanner_scan_report.address_type,
- sl_bt_gap_1m_phy,
+ sl_bt_gap_phy_1m,
&conn_handle);
if (SL_STATUS_BT_CTRL_CONNECTION_LIMIT_EXCEEDED == sc) {
app_log_warning("SL_BT_CONFIG_MAX_CONNECTIONS reached, stop scanning." APP_LOG_NL);
@@ -252,7 +254,7 @@ sl_status_t cte_bt_on_event_conn(sl_bt_msg_t *evt)
}
// Restart the scanner to discover new tags.
- sc = sl_bt_scanner_start(sl_bt_gap_1m_phy, sl_bt_scanner_discover_generic);
+ sc = sl_bt_scanner_start(sl_bt_gap_phy_1m, sl_bt_scanner_discover_generic);
if (SL_STATUS_INVALID_STATE == sc) {
// Scanning is already running, continue execution.
sc = SL_STATUS_OK;
@@ -274,7 +276,7 @@ sl_status_t cte_bt_on_event_conn(sl_bt_msg_t *evt)
aoa_db_remove_tag((uint16_t)evt->data.evt_connection_closed.connection);
// Restart the scanner to discover new tags
- sc = sl_bt_scanner_start(sl_bt_gap_1m_phy, sl_bt_scanner_discover_generic);
+ sc = sl_bt_scanner_start(sl_bt_gap_phy_1m, sl_bt_scanner_discover_generic);
if (SL_STATUS_INVALID_STATE == sc) {
// Scanning is already running, continue execution.
diff --git a/app/bluetooth/common_host/aoa_cte/cte_conn_less.c b/app/bluetooth/common_host/aoa_cte/cte_conn_less.c
index 300577b0ab..53ba5847f5 100644
--- a/app/bluetooth/common_host/aoa_cte/cte_conn_less.c
+++ b/app/bluetooth/common_host/aoa_cte/cte_conn_less.c
@@ -55,19 +55,21 @@ sl_status_t cte_bt_on_event_conn_less(sl_bt_msg_t *evt)
// Do not call any stack command before receiving this boot event!
case sl_bt_evt_system_boot_id:
// Set passive scanning on 1M PHY
- sc = sl_bt_scanner_set_mode(sl_bt_gap_1m_phy, AOA_CTE_SCAN_MODE);
+ sc = sl_bt_scanner_set_mode(sl_bt_gap_phy_1m, AOA_CTE_SCAN_MODE);
if (SL_STATUS_OK != sc) {
break;
}
// Set scan interval and scan window
- sc = sl_bt_scanner_set_timing(sl_bt_gap_1m_phy, AOA_CTE_SCAN_INTERVAL, AOA_CTE_SCAN_WINDOW);
+ sc = sl_bt_scanner_set_timing(sl_bt_gap_phy_1m,
+ AOA_CTE_SCAN_INTERVAL,
+ AOA_CTE_SCAN_WINDOW);
if (SL_STATUS_OK != sc) {
break;
}
// Start scanning - looking for tags
- sc = sl_bt_scanner_start(sl_bt_gap_1m_phy, sl_bt_scanner_discover_generic);
+ sc = sl_bt_scanner_start(sl_bt_gap_phy_1m, sl_bt_scanner_discover_generic);
break;
// -------------------------------
@@ -151,7 +153,7 @@ sl_status_t cte_bt_on_event_conn_less(sl_bt_msg_t *evt)
aoa_db_remove_tag(evt->data.evt_cte_receiver_connectionless_iq_report.sync);
// Restart the scanner to discover new tags
- sc = sl_bt_scanner_start(sl_bt_gap_1m_phy, sl_bt_scanner_discover_generic);
+ sc = sl_bt_scanner_start(sl_bt_gap_phy_1m, sl_bt_scanner_discover_generic);
if (SL_STATUS_INVALID_STATE == sc) {
// Scanning is already running, continue execution.
diff --git a/app/bluetooth/common_host/aoa_cte/cte_silabs.c b/app/bluetooth/common_host/aoa_cte/cte_silabs.c
index 354f009e66..6e9b5968ea 100644
--- a/app/bluetooth/common_host/aoa_cte/cte_silabs.c
+++ b/app/bluetooth/common_host/aoa_cte/cte_silabs.c
@@ -65,19 +65,21 @@ sl_status_t cte_bt_on_event_silabs(sl_bt_msg_t *evt)
}
// Set passive scanning on 1M PHY
- sc = sl_bt_scanner_set_mode(sl_bt_gap_1m_phy, AOA_CTE_SCAN_MODE);
+ sc = sl_bt_scanner_set_mode(sl_bt_gap_phy_1m, AOA_CTE_SCAN_MODE);
if (SL_STATUS_OK != sc) {
break;
}
// Set scan interval and scan window
- sc = sl_bt_scanner_set_timing(sl_bt_gap_1m_phy, AOA_CTE_SCAN_INTERVAL, AOA_CTE_SCAN_WINDOW);
+ sc = sl_bt_scanner_set_timing(sl_bt_gap_phy_1m,
+ AOA_CTE_SCAN_INTERVAL,
+ AOA_CTE_SCAN_WINDOW);
if (SL_STATUS_OK != sc) {
break;
}
// Start scanning - looking for tags
- sc = sl_bt_scanner_start(sl_bt_gap_1m_phy, sl_bt_scanner_discover_generic);
+ sc = sl_bt_scanner_start(sl_bt_gap_phy_1m, sl_bt_scanner_discover_generic);
if (SL_STATUS_OK != sc) {
break;
}
diff --git a/app/bluetooth/common_host/aoa_loc/aoa_loc.c b/app/bluetooth/common_host/aoa_loc/aoa_loc.c
index e4605ea042..daf2cbc930 100644
--- a/app/bluetooth/common_host/aoa_loc/aoa_loc.c
+++ b/app/bluetooth/common_host/aoa_loc/aoa_loc.c
@@ -76,7 +76,6 @@ static sl_status_t aoa_loc_run_estimation(aoa_asset_tag_t *tag,
uint32_t angle_count,
aoa_angle_t *angle_list,
aoa_id_t *locator_list);
-static void aoa_loc_destroy_locators(void);
// -----------------------------------------------------------------------------
// Module variables
@@ -419,24 +418,22 @@ sl_status_t aoa_loc_calc_position(aoa_id_t tag_id,
}
/**************************************************************************//**
- * Destroy the module database
+ * Reinitialize the estimator.
*****************************************************************************/
-void aoa_loc_destroy(void)
+sl_status_t aoa_loc_reinit(void)
{
- aoa_loc_destroy_tags();
- aoa_loc_destroy_locators();
- sl_rtl_loc_deinit(&loc_libitem);
+ (void)aoa_loc_deinit();
+ return aoa_loc_init();
}
/**************************************************************************//**
- * Reinitialize the estimator.
+ * Deinitialize the estimator.
*****************************************************************************/
-sl_status_t aoa_loc_reinit(void)
+sl_status_t aoa_loc_deinit(void)
{
- sl_rtl_loc_deinit(&loc_libitem);
enum sl_rtl_error_code ec;
- ec = sl_rtl_loc_init(&loc_libitem);
+ ec = sl_rtl_loc_deinit(&loc_libitem);
CHECK_ERROR(ec);
return SL_STATUS_OK;
@@ -459,6 +456,22 @@ void aoa_loc_destroy_tags(void)
head_tag = NULL;
}
+/**************************************************************************//**
+ * Destroy the locator database
+ *****************************************************************************/
+void aoa_loc_destroy_locators(void)
+{
+ aoa_locator_node_t *current;
+ aoa_locator_node_t *next;
+
+ for (current = head_locator; current != NULL; current = next) {
+ next = current->next;
+ free(current);
+ }
+
+ head_locator = NULL;
+}
+
/**************************************************************************//**
* Position ready callback. Weak, implement it in the application.
*****************************************************************************/
@@ -692,19 +705,3 @@ static sl_status_t aoa_loc_run_estimation(aoa_asset_tag_t *tag,
return SL_STATUS_OK;
}
-
-/**************************************************************************//**
- * Destroy the locator database
- *****************************************************************************/
-static void aoa_loc_destroy_locators(void)
-{
- aoa_locator_node_t *current;
- aoa_locator_node_t *next;
-
- for (current = head_locator; current != NULL; current = next) {
- next = current->next;
- free(current);
- }
-
- head_locator = NULL;
-}
diff --git a/app/bluetooth/common_host/aoa_loc/aoa_loc.h b/app/bluetooth/common_host/aoa_loc/aoa_loc.h
index ca018a1f12..237c5a77cf 100644
--- a/app/bluetooth/common_host/aoa_loc/aoa_loc.h
+++ b/app/bluetooth/common_host/aoa_loc/aoa_loc.h
@@ -201,7 +201,7 @@ sl_status_t aoa_loc_get_tag_by_index(uint32_t index,
* @param[in] locator_list Locator list.
*
* @retval SL_STATUS_FAIL - Position calculation failed in the RTL lib.
- * @retval SL_STATUS_OK - Calculation was succesful.
+ * @retval SL_STATUS_OK - Calculation was successful.
*****************************************************************************/
sl_status_t aoa_loc_calc_position(aoa_id_t tag_id,
uint32_t angle_count,
@@ -209,9 +209,9 @@ sl_status_t aoa_loc_calc_position(aoa_id_t tag_id,
aoa_id_t *locator_list);
/**************************************************************************//**
- * Destroy the module database.
+ * Destroy the locator database.
*****************************************************************************/
-void aoa_loc_destroy(void);
+void aoa_loc_destroy_locators(void);
/**************************************************************************//**
* Destroy the tags database
@@ -230,11 +230,21 @@ sl_status_t aoa_loc_remove_locator(aoa_id_t locator_id);
/**************************************************************************//**
* Reinitialize the estimator.
*
+ * @deprecated Use the combination of aoa_loc_deinit and aoa_loc_init instead.
+ *
* @retval SL_STATUS_FAIL - Reinitialization failed.
- * @retval SL_STATUS_OK - Reinitialization was succesful.
+ * @retval SL_STATUS_OK - Reinitialization was successful.
*****************************************************************************/
sl_status_t aoa_loc_reinit(void);
+/**************************************************************************//**
+ * Deinitialize the estimator.
+ *
+ * @retval SL_STATUS_FAIL - Deinitialization failed.
+ * @retval SL_STATUS_OK - Deinitialization was successful.
+ *****************************************************************************/
+sl_status_t aoa_loc_deinit(void);
+
/**************************************************************************//**
* Position ready callback.
*
diff --git a/app/bluetooth/common_host/aoa_parse/aoa_parse.c b/app/bluetooth/common_host/aoa_parse/aoa_parse.c
index c8742848c3..2665efd2c5 100644
--- a/app/bluetooth/common_host/aoa_parse/aoa_parse.c
+++ b/app/bluetooth/common_host/aoa_parse/aoa_parse.c
@@ -121,7 +121,7 @@ sl_status_t aoa_parse_init(const char *config)
sl_status_t aoa_parse_check_config_exist(char *config_name,
aoa_id_t locator_id)
{
- cJSON *array;
+ cJSON *item;
cJSON *locator;
sl_status_t sc;
@@ -133,8 +133,8 @@ sl_status_t aoa_parse_check_config_exist(char *config_name,
}
// Try parse locator specific config
- array = cJSON_GetObjectItem(locator, config_name);
- if (NULL == array) {
+ item = cJSON_GetObjectItem(locator, config_name);
+ if (item == NULL) {
return SL_STATUS_NOT_FOUND;
}
@@ -354,6 +354,10 @@ sl_status_t aoa_parse_locator(aoa_id_t id,
// Increment locator index.
++locator_index;
+ // Reset array indices.
+ allowlist_index = 0;
+ azimuth_mask_index = 0;
+ elevation_mask_index = 0;
return SL_STATUS_OK;
}
@@ -595,6 +599,10 @@ static sl_status_t aoa_parse_find_locator_config(cJSON **locator,
cJSON *item;
uint32_t i = 0;
+ if (locator_id == NULL) {
+ return SL_STATUS_NULL_POINTER;
+ }
+
array = cJSON_GetObjectItem(root, "locators");
CHECK_TYPE(array, cJSON_Array);
//Check if array of locator configs present
diff --git a/app/bluetooth/common_host/aoa_util/aoa_topics.h b/app/bluetooth/common_host/aoa_util/aoa_topics.h
index e1be7c59e0..e13de786b0 100644
--- a/app/bluetooth/common_host/aoa_util/aoa_topics.h
+++ b/app/bluetooth/common_host/aoa_util/aoa_topics.h
@@ -40,5 +40,7 @@
#define AOA_TOPIC_CORRECTION_PRINT "silabs/aoa/correction/%s/%s"
#define AOA_TOPIC_CORRECTION_SCAN "silabs/aoa/correction/%64[^/]/%64[^/]"
#define AOA_TOPIC_CONFIG_PRINT "silabs/aoa/config/%s"
+#define AOA_TOPIC_CONFIG_SCAN "silabs/aoa/config/%64[^/]"
+#define AOA_TOPIC_CONFIG_BROADCAST "silabs/aoa/config"
#endif // AOA_TOPICS_H
diff --git a/app/bluetooth/common_host/cpc/cpc.c b/app/bluetooth/common_host/cpc/cpc.c
new file mode 100644
index 0000000000..f56a03728c
--- /dev/null
+++ b/app/bluetooth/common_host/cpc/cpc.c
@@ -0,0 +1,255 @@
+/***************************************************************************//**
+ * @file
+ * @brief CPC communication through UART on POSIX platform
+ *******************************************************************************
+ * # License
+ * Copyright 2022 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * SPDX-License-Identifier: Zlib
+ *
+ * The licensor of this software is Silicon Laboratories Inc.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ ******************************************************************************/
+
+#include "sl_cpc.h"
+#include "app_log.h"
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#define RETRY_COUNT 10
+#define CPC_RETRY_SLEEP_NS 100000000L
+#define CPC_RESET_SLEEP_NS 10000L
+#define CPC_TRANSMIT_WINDOW 1
+#define FROM_CPC_BUF_SIZE SL_CPC_READ_MINIMUM_SIZE
+
+// cpc related structures
+static cpc_handle_t lib_handle;
+static cpc_endpoint_t endpoint;
+
+// temporary rx buffer
+typedef struct {
+ int32_t len;
+ uint8_t buf[FROM_CPC_BUF_SIZE];
+} buf_t;
+
+static buf_t buf_rx = { 0 };
+
+static uint8_t handshake_msg[4] = { 0x20, 0x00, 0x01, 0x00 };
+
+// end the receiving loop if signal is received.
+static volatile bool run = true;
+// signal if the controller was reset
+static volatile bool has_reset = false;
+
+// two worker threads
+static pthread_t sv;
+
+// Static receive function
+static void *supervisor(void *ptr);
+
+// -----------------------------------------------------------------------------
+// Private Function Declaration
+
+static void reset_callback(void);
+
+// -----------------------------------------------------------------------------
+// Public Function Definitions
+
+int32_t cpc_open(void *handle, char *cpc_instance)
+{
+ int ret;
+ uint8_t retry = 0;
+
+ // Initialize CPC communication
+ do {
+ ret = cpc_init(&lib_handle, cpc_instance, false, reset_callback);
+ if (ret == 0) {
+ // speed up boot process if everything seems ok
+ break;
+ }
+ nanosleep((const struct timespec[]){{ 0, CPC_RETRY_SLEEP_NS } }, NULL);
+ retry++;
+ } while ((ret != 0) && (retry < RETRY_COUNT));
+
+ if (ret < 0) {
+ perror("cpc_init: ");
+ return ret;
+ }
+
+ // Start Bluetooth endpoint
+ ret = cpc_open_endpoint(lib_handle,
+ &endpoint,
+ SL_CPC_ENDPOINT_BLUETOOTH,
+ CPC_TRANSMIT_WINDOW);
+ if (ret < 0) {
+ perror("cpc_open_endpoint ");
+ return ret;
+ }
+
+ // Create supervisory thread
+ ret = pthread_create(&sv, NULL, supervisor, NULL);
+ if (ret) {
+ perror("Couldn't create thread ");
+ return ret;
+ }
+
+ handle = endpoint.ptr;
+
+ // Send handshake msg
+ (void)cpc_write_endpoint(endpoint, &handshake_msg[0], 4, 0);
+
+ // Discard response
+ (void)cpc_read_endpoint(endpoint, &buf_rx.buf, FROM_CPC_BUF_SIZE, 0);
+ buf_rx.len = 0;
+ memset(buf_rx.buf, 0, FROM_CPC_BUF_SIZE);
+
+ return ret;
+}
+
+int32_t cpc_tx(void *handle, uint32_t data_length, uint8_t *data)
+{
+ (void)handle;
+ ssize_t size = 0;
+
+ if (!has_reset) {
+ size = cpc_write_endpoint(endpoint, &data[0], data_length, 0);
+ } else {
+ // In case of reset we don't care if send was succesfull or not
+ size = data_length;
+ }
+
+ return (int32_t)size;
+}
+
+int32_t cpc_rx(void *handle, uint32_t data_length, uint8_t *data)
+{
+ (void)handle;
+
+ if (buf_rx.len > 0) {
+ memcpy(data, buf_rx.buf, buf_rx.len);
+ }
+
+ return buf_rx.len;
+}
+
+int32_t cpc_rx_peek(void *handle)
+{
+ (void)handle;
+
+ if (!has_reset) {
+ // Make read blocking - possible because threaded structure in host_comm
+ buf_rx.len = (int32_t)cpc_read_endpoint(endpoint, &buf_rx.buf,
+ FROM_CPC_BUF_SIZE, 0);
+ } else {
+ // If in reset, don't try to read
+ buf_rx.len = 0;
+ }
+ if (buf_rx.len < 0) {
+ buf_rx.len = 0;
+ }
+ return buf_rx.len;
+}
+
+int32_t cpc_close(void *handle)
+{
+ return cpc_close_endpoint(&endpoint);
+}
+
+// -----------------------------------------------------------------------------
+// Public Function Definitions
+
+/**************************************************************************//**
+ * Callback to register reset from other end.
+ *****************************************************************************/
+static void reset_callback(void)
+{
+ has_reset = true;
+}
+
+/**************************************************************************//**
+ * Reset CPC communication after other end restarted.
+ *****************************************************************************/
+int reset_cpc(void)
+{
+ int ret;
+ uint8_t retry = 0;
+
+ app_log_debug("RESET" APP_LOG_NL);
+
+ // Restart cpp communication
+ do {
+ ret = cpc_restart(&lib_handle);
+ if (ret == 0) {
+ // speed up boot process if everything seems ok
+ break;
+ }
+ nanosleep((const struct timespec[]){{ 0, CPC_RETRY_SLEEP_NS } }, NULL);
+ retry++;
+ } while ((ret != 0) && (retry < RETRY_COUNT));
+
+ if (ret < 0) {
+ perror("cpc restart ");
+ return ret;
+ }
+
+ // Open Bluetooth endpoint
+ ret = cpc_open_endpoint(lib_handle,
+ &endpoint,
+ SL_CPC_ENDPOINT_BLUETOOTH,
+ CPC_TRANSMIT_WINDOW);
+ if (ret < 0) {
+ perror(" open endpoint ");
+ return ret;
+ }
+
+ // Send handshake msg, but don't discard the answer, as upper layers need it.
+ cpc_write_endpoint(endpoint, &handshake_msg[0], 4, 0);
+ has_reset = false;
+ return ret;
+}
+
+/**************************************************************************//**
+ * Supervisor thread
+ *****************************************************************************/
+void *supervisor(void *ptr)
+{
+ // unused variable
+ (void)ptr;
+ int ret;
+
+ while (run) {
+ if (has_reset) {
+ ret = reset_cpc();
+ if (ret < 0) {
+ perror("reset ");
+ // better to die here than continue to work falsely
+ exit(EXIT_FAILURE);
+ }
+ }
+ nanosleep((const struct timespec[]){{ 0, CPC_RESET_SLEEP_NS } }, NULL);
+ }
+ return NULL;
+}
diff --git a/app/bluetooth/common_host/cpc/cpc.h b/app/bluetooth/common_host/cpc/cpc.h
new file mode 100644
index 0000000000..35b667e599
--- /dev/null
+++ b/app/bluetooth/common_host/cpc/cpc.h
@@ -0,0 +1,79 @@
+/***************************************************************************//**
+ * @file
+ * @brief CPC communication header file
+ *******************************************************************************
+ * # License
+ * Copyright 2022 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * SPDX-License-Identifier: Zlib
+ *
+ * The licensor of this software is Silicon Laboratories Inc.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ ******************************************************************************/
+
+#ifndef CPC_H
+#define CPC_H
+
+#include
+
+/**************************************************************************//**
+ * Open a CPC communication through CPCd.
+ * @param[out] handle eventually it's a socket handle
+ * @param[in] cpc_instance Instance name of CPCd
+ * @return 0 on success, -1 on failure.
+ *****************************************************************************/
+int32_t cpc_open(void *handle, char *cpc_instance);
+
+/**************************************************************************//**
+ * Send data to device through CPCd. The function will block until
+ * the desired amount has been written or an error occurs.
+ * @param[in] handle Socket handle
+ * @param[in] data_length The amount of bytes to write.
+ * @param[in] data Buffer used for storing the data.
+ * @return The amount of bytes written or -1 on failure.
+ *****************************************************************************/
+int32_t cpc_tx(void *handle, uint32_t data_length, uint8_t *data);
+
+/**************************************************************************//**
+ * Read data from device through CPCd. The function can be called only after
+ * cpc_rx_peak returned that there's data in the queue.
+ * @param[in] handle Socket handle
+ * @param[in] data_length The amount of bytes to read.
+ * @param[out] data Buffer used for storing the data.
+ * @return The amount of bytes read or -1 on failure.
+ *****************************************************************************/
+int32_t cpc_rx(void *handle, uint32_t data_length, uint8_t *data);
+
+/**************************************************************************//**
+ * Return the number of bytes in the input buffer. This call will block until
+ * there's data in the buffer.
+ * @param[in] handle Socket handle
+ * @return The number of bytes in the input buffer or -1 on failure.
+ *****************************************************************************/
+int32_t cpc_rx_peek(void *handle);
+
+/**************************************************************************//**
+ * Close the CPC connection.
+ * @param[in] handle Socket handle
+ * @return 0 on success, -1 on failure.
+ *****************************************************************************/
+int32_t cpc_close(void *handle);
+
+#endif // CPC_H
diff --git a/app/bluetooth/common_host/host_comm/host_comm.c b/app/bluetooth/common_host/host_comm/host_comm.c
index a3c5870a27..4460868712 100644
--- a/app/bluetooth/common_host/host_comm/host_comm.c
+++ b/app/bluetooth/common_host/host_comm/host_comm.c
@@ -43,6 +43,9 @@
#if defined(POSIX) && POSIX == 1
#include "named_socket.h"
+#if defined (CPC) && CPC == 1
+#include "cpc.h"
+#endif // defined (CPC) && CPC == 1
#else
#include
#endif // defined(POSIX) && POSIX == 1
@@ -52,9 +55,10 @@
#define DEFAULT_UART_BAUD_RATE 115200
#define DEFAULT_UART_FLOW_CONTROL 1
#define DEFAULT_UART_TIMEOUT 100
-#define DEFAUKT_TCP_ADDRESS ""
+#define DEFAULT_TCP_ADDRESS ""
#define DEFAULT_TCP_PORT "4901"
#define MAX_OPT_LEN 255
+#define DEFAULT_CPC_INST_NAME "cpcd_0"
#define IS_EMPTY_STRING(s) ((s)[0] == '\0')
#define HANDLE_VALUE_MIN 0
@@ -79,11 +83,19 @@ static uint32_t uart_baud_rate = DEFAULT_UART_BAUD_RATE;
static uint32_t uart_flow_control = DEFAULT_UART_FLOW_CONTROL;
// TCP/IP address.
-static char tcp_address[MAX_OPT_LEN] = DEFAUKT_TCP_ADDRESS;
+static char tcp_address[MAX_OPT_LEN] = DEFAULT_TCP_ADDRESS;
#if defined(POSIX) && POSIX == 1
// AF socket descriptor path
static char named_socket_target_address[MAX_OPT_LEN];
+#if defined (CPC) && CPC == 1
+// CPCd instance name.
+static char cpc_instance_name[MAX_OPT_LEN] = DEFAULT_CPC_INST_NAME;
+
+// CPC connection
+static bool cpc_conn = false;
+#endif // defined (CPC) && CPC == 1
+
#endif // defined(POSIX) && POSIX == 1
#if defined(POSIX) && POSIX == 1
@@ -145,6 +157,15 @@ sl_status_t host_comm_init(void)
app_log_critical("Connection to domain socket unsuccessful. Exiting.." APP_LOG_NL);
exit(EXIT_FAILURE);
}
+#if defined (CPC) && CPC == 1
+ } else if (cpc_conn) {
+ handle_ptr = &handle;
+ HOST_COMM_API_INITIALIZE_NONBLOCK(cpc_tx, cpc_rx, cpc_rx_peek);
+ if (cpc_open(handle_ptr, cpc_instance_name)) {
+ app_log_critical("Connection to CPCd unsuccessful. Exiting.." APP_LOG_NL);
+ exit(EXIT_FAILURE);
+ }
+#endif // defined (CPC) && CPC == 1
#endif // defined(POSIX) && POSIX == 1
} else {
app_log_error("Either UART serial port or TCP/IP address is mandatory."
@@ -190,6 +211,13 @@ sl_status_t host_comm_set_option(char option, char *value)
case 'n':
strncpy(named_socket_target_address, value, MAX_OPT_LEN);
break;
+#if defined (CPC) && CPC == 1
+ // CPC connection
+ case 'C':
+ strncpy(cpc_instance_name, value, MAX_OPT_LEN);
+ cpc_conn = true;
+ break;
+#endif // defined (CPC) && CPC == 1
#endif // defined(POSIX) && POSIX == 1
// Unknown option.
default:
diff --git a/app/bluetooth/common_host/host_comm/host_comm.h b/app/bluetooth/common_host/host_comm/host_comm.h
index 105d42aa7d..140a13ae81 100644
--- a/app/bluetooth/common_host/host_comm/host_comm.h
+++ b/app/bluetooth/common_host/host_comm/host_comm.h
@@ -33,6 +33,23 @@
#include "sl_status.h"
+// Macros used by CPC
+#if defined(POSIX) && POSIX == 1 && defined (CPC) && CPC == 1
+#define HOST_COMM_CPC_OPTSTRING "C:"
+
+// Usage info.
+#define HOST_COMM_CPC_USAGE " | -C "
+
+// Options info.
+#define HOST_COMM_CPC_OPTIONS \
+ " -C CPC connection\n" \
+ " Name of the CPCd instance to connect to.\n"
+#else // defined(POSIX) && POSIX == 1 && defined (CPC) && CPC == 1
+#define HOST_COMM_CPC_OPTSTRING
+#define HOST_COMM_CPC_USAGE
+#define HOST_COMM_CPC_OPTIONS
+#endif // defined(POSIX) && POSIX == 1 && defined (CPC) && CPC == 1
+
// Macros used by Named Socket
#if defined(POSIX) && POSIX == 1
#define CLIENT_PATH "client_unencrypted"
@@ -54,10 +71,10 @@
#endif // defined(POSIX) && POSIX == 1
// Optstring argument for getopt.
-#define HOST_COMM_OPTSTRING HOST_COMM_NS_OPTSTRING "t:u:b:f"
+#define HOST_COMM_OPTSTRING HOST_COMM_NS_OPTSTRING HOST_COMM_CPC_OPTSTRING "t:u:b:f"
// Usage info.
-#define HOST_COMM_USAGE "-t | -u " HOST_COMM_NS_USAGE " [-b ] [-f]"
+#define HOST_COMM_USAGE "-t | -u " HOST_COMM_NS_USAGE HOST_COMM_CPC_USAGE " [-b ] [-f]"
// Options info.
#define HOST_COMM_OPTIONS \
@@ -65,7 +82,7 @@
" TCP/IP address of the dev board.\n" \
" -u UART serial connection option.\n" \
" Serial port assigned to the dev board by the host system. (COM# on Windows, /dev/tty# on POSIX)\n" \
- HOST_COMM_NS_OPTIONS \
+ HOST_COMM_NS_OPTIONS HOST_COMM_CPC_OPTIONS \
" -b Baud rate of the serial connection.\n" \
" Baud rate, default: 115200\n" \
" -f Disable flow control (RTS/CTS), default: enabled\n" \
diff --git a/app/bluetooth/common_host/mqtt/mqtt.c b/app/bluetooth/common_host/mqtt/mqtt.c
index 6d3fa931e1..0eb1565a1f 100644
--- a/app/bluetooth/common_host/mqtt/mqtt.c
+++ b/app/bluetooth/common_host/mqtt/mqtt.c
@@ -45,7 +45,9 @@
#define QOS 1
#define KEEPALIVE_INTERVAL_SEC 30
#define LOOP_TIMEOUT_MS 1
-#define LOG_MASK MOSQ_LOG_NONE
+#ifndef MQTT_LOG_MASK
+#define MQTT_LOG_MASK MOSQ_LOG_NONE
+#endif
static void mqtt_on_connect(struct mosquitto *mosq, void *obj, int rc);
static void mqtt_on_disconnect(struct mosquitto *mosq, void *obj, int rc);
@@ -100,6 +102,9 @@ sl_status_t mqtt_init(mqtt_handle_t *handle)
} else {
handle->client = mosq;
}
+ if (sc == SL_STATUS_OK) {
+ app_log_info("MQTT init client: %s" APP_LOG_NL, handle->client_id);
+ }
return sc;
}
@@ -182,6 +187,9 @@ sl_status_t mqtt_subscribe(mqtt_handle_t *handle, const char *topic)
} else {
sc = SL_STATUS_NOT_INITIALIZED;
}
+ if (sc == SL_STATUS_OK) {
+ app_log_info("MQTT subscribe: %s" APP_LOG_NL, topic);
+ }
return sc;
}
@@ -199,7 +207,7 @@ sl_status_t mqtt_unsubscribe(mqtt_handle_t *handle, const char *topic)
rc = mosquitto_unsubscribe(handle->client, NULL, topic);
if ((rc != MOSQ_ERR_SUCCESS) && (rc != MOSQ_ERR_NO_CONN)) {
- app_log_info("MQTT unsubscribe attempt failed from topic '%s': '%s'\n",
+ app_log_info("MQTT unsubscribe attempt failed from topic '%s': '%s'" APP_LOG_NL,
topic,
mqtt_err2str(rc));
sc = SL_STATUS_FAIL;
@@ -208,12 +216,15 @@ sl_status_t mqtt_unsubscribe(mqtt_handle_t *handle, const char *topic)
// Remove topic from topic list.
sc = mqtt_remove_topic(handle, topic);
if (SL_STATUS_OK != sc) {
- app_log_info("MQTT failed to remove topic from topic list.\n");
+ app_log_info("MQTT failed to remove topic from topic list." APP_LOG_NL);
sc = SL_STATUS_FAIL;
}
} else {
sc = SL_STATUS_NOT_INITIALIZED;
}
+ if (sc == SL_STATUS_OK) {
+ app_log_info("MQTT unsubscribe: %s" APP_LOG_NL, topic);
+ }
return sc;
}
@@ -335,7 +346,7 @@ static void mqtt_on_message(struct mosquitto *mosq, void *obj, const struct mosq
static void mqtt_on_log(struct mosquitto *mosq, void *obj, int level, const char *str)
{
- if (level & LOG_MASK) {
+ if (level & MQTT_LOG_MASK) {
app_log("MQTT log (%d): %s" APP_LOG_NL, level, str);
}
}
diff --git a/app/bluetooth/component/bt_fp_ncp_default.slcc b/app/bluetooth/component/bt_fp_ncp_default.slcc
index f7b4b49c5a..7e2eaea62a 100644
--- a/app/bluetooth/component/bt_fp_ncp_default.slcc
+++ b/app/bluetooth/component/bt_fp_ncp_default.slcc
@@ -17,7 +17,8 @@ requires:
- name: bluetooth_feature_gatt
- name: bluetooth_feature_gatt_server
- name: bluetooth_feature_nvm
- - name: bluetooth_feature_scanner
+ - name: bluetooth_feature_legacy_scanner
+ - name: bluetooth_feature_extended_scanner
- name: bluetooth_feature_sm
- name: bluetooth_feature_sync
- name: bluetooth_feature_system
diff --git a/app/bluetooth/component/bt_fp_soc_client.slcc b/app/bluetooth/component/bt_fp_soc_client.slcc
index 0c660ac5bf..5095a82b44 100644
--- a/app/bluetooth/component/bt_fp_soc_client.slcc
+++ b/app/bluetooth/component/bt_fp_soc_client.slcc
@@ -11,7 +11,8 @@ requires:
- name: gatt_configuration
- name: bluetooth_feature_connection
- name: bluetooth_feature_gatt
- - name: bluetooth_feature_scanner
+ - name: bluetooth_feature_legacy_scanner
+ - name: bluetooth_feature_extended_scanner
- name: bluetooth_feature_sm
- name: bluetooth_feature_system
ui_hints:
diff --git a/app/bluetooth/component/bt_fp_soc_default.slcc b/app/bluetooth/component/bt_fp_soc_default.slcc
index 678ca759ec..7efa73e0b5 100644
--- a/app/bluetooth/component/bt_fp_soc_default.slcc
+++ b/app/bluetooth/component/bt_fp_soc_default.slcc
@@ -14,7 +14,8 @@ requires:
- name: bluetooth_feature_connection
- name: bluetooth_feature_gatt
- name: bluetooth_feature_gatt_server
- - name: bluetooth_feature_scanner
+ - name: bluetooth_feature_legacy_scanner
+ - name: bluetooth_feature_extended_scanner
- name: bluetooth_feature_sm
- name: bluetooth_feature_system
ui_hints:
diff --git a/app/bluetooth/component/throughput_central.slcc b/app/bluetooth/component/throughput_central.slcc
index cc3ee901b7..8772d6d081 100644
--- a/app/bluetooth/component/throughput_central.slcc
+++ b/app/bluetooth/component/throughput_central.slcc
@@ -27,10 +27,12 @@ requires:
- name: "app_log"
- name: "app_assert"
- name: "bluetooth_stack"
+ - name: "bluetooth_feature_system"
- name: "bluetooth_feature_afh"
- name: "bluetooth_feature_power_control"
- name: "bluetooth_feature_connection"
- - name: "bluetooth_feature_scanner"
+ - name: "bluetooth_feature_legacy_scanner"
+ - name: "bluetooth_feature_extended_scanner"
- name: "bluetooth_feature_gatt"
- name: "power_manager"
- name: "throughput"
diff --git a/app/bluetooth/component/throughput_peripheral.slcc b/app/bluetooth/component/throughput_peripheral.slcc
index a0458f51d7..f815dc17ce 100644
--- a/app/bluetooth/component/throughput_peripheral.slcc
+++ b/app/bluetooth/component/throughput_peripheral.slcc
@@ -26,6 +26,7 @@ requires:
- name: app_assert
- name: gatt_configuration
- name: bluetooth_stack
+ - name: bluetooth_feature_system
- name: bluetooth_feature_afh
- name: bluetooth_feature_power_control
- name: bluetooth_feature_connection
diff --git a/app/bluetooth/component_host/ncp_host_bt.mk b/app/bluetooth/component_host/ncp_host_bt.mk
index a1d199bdc2..2f8c2eae51 100644
--- a/app/bluetooth/component_host/ncp_host_bt.mk
+++ b/app/bluetooth/component_host/ncp_host_bt.mk
@@ -16,6 +16,21 @@ endif
SECURITY ?= $(SECURITY_DEFAULT)
+# CPC communication is disabled per default.
+# It can be enabled by assigning a non-zero value to the CPC variable
+# e.g. via command line like 'make CPC=1'.
+# Be aware that CPC can only be enabled on Linux OS
+
+ifneq (, $(filter $(MAKECMDGOALS), export))
+# Collect CPC resources when exporting.
+CPC_DEFAULT = 1
+else
+CPC_DEFAULT = 0
+endif
+
+CPC ?= $(CPC_DEFAULT)
+CPC_DIR ?=
+
override INCLUDEPATHS += \
$(SDK_DIR)/app/bluetooth/common_host/app_sleep \
$(SDK_DIR)/app/bluetooth/common_host/host_comm \
@@ -68,6 +83,33 @@ ifneq ($(SECURITY), 0)
endif
endif
+# CPC related settings
+ifneq ($(CPC), 0)
+ ifeq (, $(filter $(MAKECMDGOALS), export))
+ ifeq ($(OS), win)
+ $(error CPC is not supported on Windows OS!)
+ endif
+ ifeq ($(UNAME), darwin)
+ $(error CPC is not supported on MacOS!)
+ endif
+ ifeq ($(CPC_DIR), )
+ $(error Please set CPC library dir: CPC_DIR! e.g. /home/user/cpc)
+ endif
+ endif
+ override INCLUDEPATHS += $(SDK_DIR)/app/bluetooth/common_host/cpc
+ # CPCd is outside of GSDK. Therefore, add it directly as a compiler flag
+ # instead of adding it to INCLUDEPATHS.
+ override CFLAGS += -I"$(CPC_DIR)/daemon/lib"
+
+ override C_SRC += $(SDK_DIR)/app/bluetooth/common_host/cpc/cpc.c
+
+ LIBS += $(CPC_DIR)/daemon/build/libcpc.so
+
+ override CFLAGS += -DCPC
+
+ override LDFLAGS += -lpthread -lutil
+endif
+
ifeq ($(OS), win)
# Ws2_32: WinSock library
override LDFLAGS += -lWs2_32
diff --git a/app/bluetooth/documentation/btmesh-release-highlights.txt b/app/bluetooth/documentation/btmesh-release-highlights.txt
index 8195179f7d..014621f1dd 100644
--- a/app/bluetooth/documentation/btmesh-release-highlights.txt
+++ b/app/bluetooth/documentation/btmesh-release-highlights.txt
@@ -1,5 +1,2 @@
-Bluetooth Mesh SDK 3.0.0.0
-- Reduced project flash consumption by optimizing Mesh stack code size
-- Support added for xGM240P PCB Modules and BG22/BGM220 Explorer Kits
-- Support added for GCC version 10.3-2021.10 and IAR version 9.20.4
-
+Bluetooth Mesh SDK 3.0.1.0
+- Targeted quality improvements and bug fixes
\ No newline at end of file
diff --git a/app/bluetooth/documentation/example/btmesh_ncp_empty/readme.md b/app/bluetooth/documentation/example/btmesh_ncp_empty/readme.md
index 5e0f2b5f8e..ddfc6a7ed7 100644
--- a/app/bluetooth/documentation/example/btmesh_ncp_empty/readme.md
+++ b/app/bluetooth/documentation/example/btmesh_ncp_empty/readme.md
@@ -40,7 +40,7 @@ NCP Commander can be used to control the target and test NCP firmware without de
![step 3](readme_img6.png)
-5. Once you have factory-reset the node, you can initialize the stack as a node by calling the initializing routine `sl_btmesh_node_init()`. In the API help menu, select the corresponding routine, copy it in the command field and send it. You can now see the device scanning. If you want to prevent the device scanning (as the display may be flooded with the scan response messages), you can also call `sl_bt_user_manage_event_filter(00 A0 00 05 01)` to block all the Bluetooth LE scan reports. This can be called even before the node initialization.
+5. Once you have factory-reset the node, you can initialize the stack as a node by calling the initializing routine `sl_btmesh_node_init()`. In the API help menu, select the corresponding routine, copy it in the command field and send it. You can now see the device scanning. If you want to prevent the device scanning (as the display may be flooded with the scan response messages), you can also call `sl_bt_user_manage_event_filter(00 A0 00 05 00)`, `sl_bt_user_manage_event_filter(00 A0 00 05 01)` and `sl_bt_user_manage_event_filter(00 A0 00 05 02)` to block all the Bluetooth LE scan reports. This can be called even before the node initialization.
![step 3](readme_img7.png)
diff --git a/app/bluetooth/documentation/example/ncp/readme.md b/app/bluetooth/documentation/example/ncp/readme.md
index 01444d87aa..97614bd48d 100644
--- a/app/bluetooth/documentation/example/ncp/readme.md
+++ b/app/bluetooth/documentation/example/ncp/readme.md
@@ -4,6 +4,8 @@ This is a Network Co-Processor (NCP) target application. It runs the Bluetooth
This example does not have a GATT database, but makes it possible to build one from the application using Dynamic GATT API. Use this example together with NCP host example applications.
+> Note: this example expects a specific Gecko Bootloader to be present on your device. For details see the Troubleshooting section.
+
## Getting Started
To get started with Silicon Labs Bluetooth software and Simplicity Studio, see [QSG169: Bluetooth SDK v3.x Quick Start Guide](https://www.silabs.com/documents/public/quick-start-guides/qsg169-bluetooth-sdk-v3x-quick-start-guide.pdf).
@@ -45,23 +47,41 @@ This example project does not have a GATT database. It only contains the Generic
## Troubleshooting
-Note that Software Example-based projects do not include a bootloader. However, they are configured to expect a bootloader to be present on the device. To get your application to work, either
-- flash a bootloader to the device or
-- uninstall the **Bootloader Application Interface** software component.
+### Bootloader Issues
+
+Note that Example Projects do not include a bootloader. However, Bluetooth-based Example Projects expect a bootloader to be present on the device in order to support device firmware upgrade (DFU). To get your application to work, you should either
+- flash the proper bootloader or
+- remove the DFU functionality from the project.
+
+**If you do not wish to add a bootloader**, then remove the DFU functionality by uninstalling the *Bootloader Application Interface* software component -- and all of its dependants. This will automatically put your application code to the start address of the flash, which means that a bootloader is no longer needed, but also that you will not be able to upgrade your firmware.
+
+**If you want to add a bootloader**, then either
+- Create a bootloader project, build it and flash it to your device. Note that different projects expect different bootloaders:
+ - for NCP and RCP projects create a *BGAPI UART DFU* type bootloader
+ - for SoC projects on Series 1 devices create a *Bluetooth in-place OTA DFU* type bootloader or any *Internal Storage* type bootloader
+ - for SoC projects on Series 2 devices create a *Bluetooth Apploader OTA DFU* type bootloader
+
+- or run a precompiled Demo on your device from the Launcher view before flashing your application. Precompiled demos flash both bootloader and application images to the device. Flashing your own application image after the demo will overwrite the demo application but leave the bootloader in place.
+ - For NCP and RCP projects, flash the *Bluetooth - NCP* demo.
+ - For SoC projects, flash the *Bluetooth - SoC Thermometer* demo.
-To flash a bootloader, either create a bootloader project or run a precompiled **Demo** on your device from the Launcher view. Precompiled demos flash both bootloader and application images to the device. Then flash your own application image to overwrite the demo application but leave the bootloader in place.
+**Important Notes:**
+- when you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
-- To flash an OTA DFU-capable bootloader to the device, flash the **Bluetooth - SoC Thermometer** demo.
-- To flash a UART DFU-capable bootloader to the device, flash the **Bluetooth - NCP** demo.
-- For other bootloader types, create your own bootloader project and flash it to the device before flashing your application.
-- When you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
- On Series 1 devices (EFR32xG1x), both first stage and second stage bootloaders have to be flashed. This can be done at once by flashing the *-combined.s37* file found in the bootloader project after building the project.
-- For more information, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
-Before programming the radio board mounted on the mainboard, make sure the power supply switch the AEM position (right side) as shown below.
+- On Series 2 devices SoC example projects require a *Bluetooth Apploader OTA DFU* type bootloader by default. This bootloader needs a lot of flash space and does not fit into the regular bootloader area, hence the application start address must be shifted. This shift is automatically done by the *Apploader Support for Applications* software component, which is installed by default. If you want to use any other bootloader type, you should remove this software component in order to shift the application start address back to the end of the regular bootloader area. Note, that in this case you cannot do OTA DFU with Apploader, but you can still implement application-level OTA DFU by installing the *Application OTA DFU* software component instead of *In-place OTA DFU*.
+
+For more information on bootloaders, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
+
+
+### Programming the Radio Board
+
+Before programming the radio board mounted on the mainboard, make sure the power supply switch is in the AEM position (right side) as shown below.
![Radio board power supply switch](readme_img0.png)
+
## Resources
[Bluetooth Documentation](https://docs.silabs.com/bluetooth/latest/)
diff --git a/app/bluetooth/documentation/example/ncp_aoa_locator/readme.md b/app/bluetooth/documentation/example/ncp_aoa_locator/readme.md
index f69e6bbff4..1c07c67661 100644
--- a/app/bluetooth/documentation/example/ncp_aoa_locator/readme.md
+++ b/app/bluetooth/documentation/example/ncp_aoa_locator/readme.md
@@ -4,6 +4,8 @@ This is an NCP (Network Co-Processor) target example to be used together with th
Use this example together with **SoC - AoA Asset Tag**, which can transmit CTE signals.
+> Note: this example expects a specific Gecko Bootloader to be present on your device. For details see the Troubleshooting section.
+
## Getting Started
To get started with Silicon Labs Bluetooth software and Simplicity Studio, see [QSG169: Bluetooth SDK v3.x Quick-Start Guide](https://www.silabs.com/documents/public/quick-start-guides/qsg169-bluetooth-sdk-v3x-quick-start-guide.pdf).
@@ -46,23 +48,42 @@ After programming your antenna array board with the **NCP - AoA Locator** target
Note that, when using **NCP - AoA Locator**, you may need to change the mainboard flow control settings. Follow the instructions of [AN1296: Application Development with Silicon Labs’ RTL Library](https://www.silabs.com/documents/public/application-notes/an1296-application-development-with-rtl-library.pdf).
-Note that Software Example-based projects do not include a bootloader. However, they are configured to expect a bootloader to be present on the device. To get your application to work, either
-- flash a bootloader to the device or
-- uninstall the **Bootloader Application Interface** software component.
+### Bootloader Issues
+
+Note that Example Projects do not include a bootloader. However, Bluetooth-based Example Projects expect a bootloader to be present on the device in order to support device firmware upgrade (DFU). To get your application to work, you should either
+- flash the proper bootloader or
+- remove the DFU functionality from the project.
+
+**If you do not wish to add a bootloader**, then remove the DFU functionality by uninstalling the *Bootloader Application Interface* software component -- and all of its dependants. This will automatically put your application code to the start address of the flash, which means that a bootloader is no longer needed, but also that you will not be able to upgrade your firmware.
-To flash a bootloader, either create a bootloader project or run a precompiled **Demo** on your device from the Launcher view. Precompiled demos flash both bootloader and application images to the device. Then flash your own application image to overwrite the demo application but leave the bootloader in place.
+**If you want to add a bootloader**, then either
+- Create a bootloader project, build it and flash it to your device. Note that different projects expect different bootloaders:
+ - for NCP and RCP projects create a *BGAPI UART DFU* type bootloader
+ - for SoC projects on Series 1 devices create a *Bluetooth in-place OTA DFU* type bootloader or any *Internal Storage* type bootloader
+ - for SoC projects on Series 2 devices create a *Bluetooth Apploader OTA DFU* type bootloader
+
+- or run a precompiled Demo on your device from the Launcher view before flashing your application. Precompiled demos flash both bootloader and application images to the device. Flashing your own application image after the demo will overwrite the demo application but leave the bootloader in place.
+ - For NCP and RCP projects, flash the *Bluetooth - NCP* demo.
+ - For SoC projects, flash the *Bluetooth - SoC Thermometer* demo.
+
+**Important Notes:**
+- when you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
-- To flash an OTA DFU-capable bootloader to the device, flash the **Bluetooth - SoC Thermometer** demo.
-- To flash a UART DFU-capable bootloader to the device, flash the **Bluetooth - NCP** demo.
-- For other bootloader types, create your own bootloader project and flash it to the device before flashing your application.
-- When you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
- On Series 1 devices (EFR32xG1x), both first stage and second stage bootloaders have to be flashed. This can be done at once by flashing the *-combined.s37* file found in the bootloader project after building the project.
-- For more information, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
-Before programming the radio board mounted on the mainboard, make sure the power supply switch the AEM position (right side), as shown below.
+- On Series 2 devices SoC example projects require a *Bluetooth Apploader OTA DFU* type bootloader by default. This bootloader needs a lot of flash space and does not fit into the regular bootloader area, hence the application start address must be shifted. This shift is automatically done by the *Apploader Support for Applications* software component, which is installed by default. If you want to use any other bootloader type, you should remove this software component in order to shift the application start address back to the end of the regular bootloader area. Note, that in this case you cannot do OTA DFU with Apploader, but you can still implement application-level OTA DFU by installing the *Application OTA DFU* software component instead of *In-place OTA DFU*.
+
+For more information on bootloaders, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
+
+
+### Programming the Radio Board
+
+Before programming the radio board mounted on the mainboard, make sure the power supply switch is in the AEM position (right side) as shown below.
![Radio board power supply switch](readme_img0.png)
+
+
## Resources
[Bluetooth Documentation](https://docs.silabs.com/bluetooth/latest/)
diff --git a/app/bluetooth/documentation/example/ncp_host/readme.md b/app/bluetooth/documentation/example/ncp_host/readme.md
index c1d18a88e3..2566543095 100644
--- a/app/bluetooth/documentation/example/ncp_host/readme.md
+++ b/app/bluetooth/documentation/example/ncp_host/readme.md
@@ -4,6 +4,8 @@ This is a reference implementation of an NCP (Network Co-Processor) host, which
This example uses the Dynamic GATT feature, and it must be used together with the **Bluetooth - NCP** target app.
+> Note: this example expects a specific Gecko Bootloader to be present on your device. For details see the Troubleshooting section.
+
## Getting Started
To get started with Silicon Labs Bluetooth software and Simplicity Studio, see [QSG169: Bluetooth SDK v3.x Quick-Start Guide](https://www.silabs.com/documents/public/quick-start-guides/qsg169-bluetooth-sdk-v3x-quick-start-guide.pdf).
@@ -70,20 +72,40 @@ See the Bluetooth API reference manual section "GATT Database" for more details.
## Troubleshooting
-Note that Software Example-based projects do not include a bootloader. However, they are configured to expect a bootloader to be present on the device.
+### Bootloader Issues
+
+Note that Example Projects do not include a bootloader. However, Bluetooth-based Example Projects expect a bootloader to be present on the device in order to support device firmware upgrade (DFU). To get your application to work, you should either
+- flash the proper bootloader or
+- remove the DFU functionality from the project.
+
+**If you do not wish to add a bootloader**, then remove the DFU functionality by uninstalling the *Bootloader Application Interface* software component -- and all of its dependants. This will automatically put your application code to the start address of the flash, which means that a bootloader is no longer needed, but also that you will not be able to upgrade your firmware.
+
+**If you want to add a bootloader**, then either
+- Create a bootloader project, build it and flash it to your device. Note that different projects expect different bootloaders:
+ - for NCP and RCP projects create a *BGAPI UART DFU* type bootloader
+ - for SoC projects on Series 1 devices create a *Bluetooth in-place OTA DFU* type bootloader or any *Internal Storage* type bootloader
+ - for SoC projects on Series 2 devices create a *Bluetooth Apploader OTA DFU* type bootloader
+
+- or run a precompiled Demo on your device from the Launcher view before flashing your application. Precompiled demos flash both bootloader and application images to the device. Flashing your own application image after the demo will overwrite the demo application but leave the bootloader in place.
+ - For NCP and RCP projects, flash the *Bluetooth - NCP* demo.
+ - For SoC projects, flash the *Bluetooth - SoC Thermometer* demo.
-To flash a bootloader, either create a bootloader project or run a precompiled **Demo** on your device from the Launcher view. Precompiled demos flash both bootloader and application images to the device. Then flash your own application image to overwrite the demo application but leave the bootloader in place.
+**Important Notes:**
+- when you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
-- To flash an OTA DFU-capable bootloader to the device, flash the **Bluetooth - SoC Thermometer** demo.
-- To flash a UART DFU-capable bootloader to the device, flash the **Bluetooth - NCP** demo.
-- For other bootloader types, create your own bootloader project and flash it to the device before flashing your application.
-- When you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
- On Series 1 devices (EFR32xG1x), both first stage and second stage bootloaders have to be flashed. This can be done at once by flashing the *-combined.s37* file found in the bootloader project after building the project.
-- For more information, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
-Before programming the radio board mounted on the mainboard, make sure the power supply switch of the NCP host is in the AEM position (right side) as shown below, while the power supply switch of the NCP target board is in the BAT position.
+- On Series 2 devices SoC example projects require a *Bluetooth Apploader OTA DFU* type bootloader by default. This bootloader needs a lot of flash space and does not fit into the regular bootloader area, hence the application start address must be shifted. This shift is automatically done by the *Apploader Support for Applications* software component, which is installed by default. If you want to use any other bootloader type, you should remove this software component in order to shift the application start address back to the end of the regular bootloader area. Note, that in this case you cannot do OTA DFU with Apploader, but you can still implement application-level OTA DFU by installing the *Application OTA DFU* software component instead of *In-place OTA DFU*.
+
+For more information on bootloaders, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
+
+
+### Programming the Radio Board
+
+Before programming the radio board mounted on the mainboard, make sure the power supply switch is in the AEM position (right side) as shown below.
+
+![Radio board power supply switch](readme_img0.png)
-![Radio Board Power Supply Switch](readme_img0.png)
## Resources
diff --git a/app/bluetooth/documentation/example/rcp/readme.md b/app/bluetooth/documentation/example/rcp/readme.md
index 8885e0c372..c509839cca 100644
--- a/app/bluetooth/documentation/example/rcp/readme.md
+++ b/app/bluetooth/documentation/example/rcp/readme.md
@@ -2,6 +2,8 @@
The RCP (Radio Co-Processor)) example application runs the Bluetooth Controller (radio + Link Layer) and implements the controller part of the HCI, as defined in the *Bluetooth Core Specification, Vol 4: Host Controller Interface*. The HCI is a standardized way for Bluetooth host and controller to communicate with each other. Because the interface is standard, the host and controller can be from different vendors. Currently, Silicon Labs Bluetooth Controller supports UART (Universal Asynchronous Receiver-Transmitter) as the HCI transport layer.
+> Note: this example expects a specific Gecko Bootloader to be present on your device. For details see the Troubleshooting section.
+
## Getting Started
To get started with Silicon Labs Bluetooth and Simplicity Studio, see [QSG169: Bluetooth SDK v3.x Quick Start Guide](https://www.silabs.com/documents/public/quick-start-guides/qsg169-bluetooth-sdk-v3x-quick-start-guide.pdf).
@@ -51,23 +53,41 @@ Now, it can be controlled with any tool that uses HCI commands, e.g., *bluetooth
## Troubleshooting
-Note that Software Example-based projects do not include a bootloader. However, they are configured to expect a bootloader to be present on the device. To get your application to work, either
-- flash a bootloader to the device or
-- uninstall the **Bootloader Application Interface** software component.
+### Bootloader Issues
+
+Note that Example Projects do not include a bootloader. However, Bluetooth-based Example Projects expect a bootloader to be present on the device in order to support device firmware upgrade (DFU). To get your application to work, you should either
+- flash the proper bootloader or
+- remove the DFU functionality from the project.
+
+**If you do not wish to add a bootloader**, then remove the DFU functionality by uninstalling the *Bootloader Application Interface* software component -- and all of its dependants. This will automatically put your application code to the start address of the flash, which means that a bootloader is no longer needed, but also that you will not be able to upgrade your firmware.
+
+**If you want to add a bootloader**, then either
+- Create a bootloader project, build it and flash it to your device. Note that different projects expect different bootloaders:
+ - for NCP and RCP projects create a *BGAPI UART DFU* type bootloader
+ - for SoC projects on Series 1 devices create a *Bluetooth in-place OTA DFU* type bootloader or any *Internal Storage* type bootloader
+ - for SoC projects on Series 2 devices create a *Bluetooth Apploader OTA DFU* type bootloader
+
+- or run a precompiled Demo on your device from the Launcher view before flashing your application. Precompiled demos flash both bootloader and application images to the device. Flashing your own application image after the demo will overwrite the demo application but leave the bootloader in place.
+ - For NCP and RCP projects, flash the *Bluetooth - NCP* demo.
+ - For SoC projects, flash the *Bluetooth - SoC Thermometer* demo.
-To flash a bootloader, either create a bootloader project or run a precompiled **Demo** on your device from the Launcher view. Precompiled demos flash both bootloader and application images to the device. Then flash your own application image to overwrite the demo application but leave the bootloader in place.
+**Important Notes:**
+- when you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
-- To flash an OTA DFU-capable bootloader to the device, flash the **Bluetooth - SoC Thermometer** demo.
-- To flash a UART DFU-capable bootloader to the device, flash the **Bluetooth - NCP** demo.
-- For other bootloader types, create your own bootloader project and flash it to the device before flashing your application.
-- When you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
- On Series 1 devices (EFR32xG1x), both first stage and second stage bootloaders have to be flashed. This can be done at once by flashing the *-combined.s37* file found in the bootloader project after building the project.
-- For more information, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
-Before programming the radio board mounted on the mainboard, make sure the power supply switch the AEM position (right side) as shown below.
+- On Series 2 devices SoC example projects require a *Bluetooth Apploader OTA DFU* type bootloader by default. This bootloader needs a lot of flash space and does not fit into the regular bootloader area, hence the application start address must be shifted. This shift is automatically done by the *Apploader Support for Applications* software component, which is installed by default. If you want to use any other bootloader type, you should remove this software component in order to shift the application start address back to the end of the regular bootloader area. Note, that in this case you cannot do OTA DFU with Apploader, but you can still implement application-level OTA DFU by installing the *Application OTA DFU* software component instead of *In-place OTA DFU*.
+
+For more information on bootloaders, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
+
+
+### Programming the Radio Board
+
+Before programming the radio board mounted on the mainboard, make sure the power supply switch is in the AEM position (right side) as shown below.
![Radio board power supply switch](readme_img0.png)
+
## Resources
[Bluetooth Documentation](https://docs.silabs.com/bluetooth/latest/)
diff --git a/app/bluetooth/documentation/example/rcp_cpc/readme.md b/app/bluetooth/documentation/example/rcp_cpc/readme.md
index 8be6d43270..38a5d28322 100644
--- a/app/bluetooth/documentation/example/rcp_cpc/readme.md
+++ b/app/bluetooth/documentation/example/rcp_cpc/readme.md
@@ -2,6 +2,8 @@
The RCP (Radio Co-Processor) example application runs the Bluetooth Controller (radio + Link Layer) and implements the controller part of the HCI, as defined in the *Bluetooth Core Specification, Vol 4: Host Controller Interface*. The HCI is a standardized way for Bluetooth host and controller to communicate with each other. Because the interface is standard, the host and controller can be from different vendors. Currently, Silicon Labs Bluetooth Controller supports UART (Universal Asynchronous Receiver-Transmitter) as the HCI transport layer. In this project Silicon Labs’ proprietary CPC (Co-Processor Communication) protocol is used as the transport protocol over UART.
+> Note: this example expects a specific Gecko Bootloader to be present on your device. For details see the Troubleshooting section.
+
## Getting Started
To get started with Silicon Labs Bluetooth and Simplicity Studio, see [QSG169: Bluetooth SDK v3.x Quick Start Guide](https://www.silabs.com/documents/public/quick-start-guides/qsg169-bluetooth-sdk-v3x-quick-start-guide.pdf).
@@ -36,20 +38,37 @@ For more information on CPC, refer to [AN1351: Using the Co-Processor Communicat
## Troubleshooting
-Note that Software Example-based projects do not include a bootloader. However, they are configured to expect a bootloader to be present on the device. To get your application to work, either
-- flash a bootloader to the device or
-- uninstall the **Bootloader Application Interface** software component.
+### Bootloader Issues
+
+Note that Example Projects do not include a bootloader. However, Bluetooth-based Example Projects expect a bootloader to be present on the device in order to support device firmware upgrade (DFU). To get your application to work, you should either
+- flash the proper bootloader or
+- remove the DFU functionality from the project.
+
+**If you do not wish to add a bootloader**, then remove the DFU functionality by uninstalling the *Bootloader Application Interface* software component -- and all of its dependants. This will automatically put your application code to the start address of the flash, which means that a bootloader is no longer needed, but also that you will not be able to upgrade your firmware.
+
+**If you want to add a bootloader**, then either
+- Create a bootloader project, build it and flash it to your device. Note that different projects expect different bootloaders:
+ - for NCP and RCP projects create a *BGAPI UART DFU* type bootloader
+ - for SoC projects on Series 1 devices create a *Bluetooth in-place OTA DFU* type bootloader or any *Internal Storage* type bootloader
+ - for SoC projects on Series 2 devices create a *Bluetooth Apploader OTA DFU* type bootloader
+
+- or run a precompiled Demo on your device from the Launcher view before flashing your application. Precompiled demos flash both bootloader and application images to the device. Flashing your own application image after the demo will overwrite the demo application but leave the bootloader in place.
+ - For NCP and RCP projects, flash the *Bluetooth - NCP* demo.
+ - For SoC projects, flash the *Bluetooth - SoC Thermometer* demo.
-To flash a bootloader, either create a bootloader project or run a precompiled **Demo** on your device from the Launcher view. Precompiled demos flash both bootloader and application images to the device. Then flash your own application image to overwrite the demo application but leave the bootloader in place.
+**Important Notes:**
+- when you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
-- To flash an OTA DFU-capable bootloader to the device, flash the **Bluetooth - SoC Thermometer** demo.
-- To flash a UART DFU-capable bootloader to the device, flash the **Bluetooth - NCP** demo.
-- For other bootloader types, create your own bootloader project and flash it to the device before flashing your application.
-- When you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
- On Series 1 devices (EFR32xG1x), both first stage and second stage bootloaders have to be flashed. This can be done at once by flashing the *-combined.s37* file found in the bootloader project after building the project.
-- For more information, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
-Before programming the radio board mounted on the mainboard, make sure the power supply switch the AEM position (right side) as shown below.
+- On Series 2 devices SoC example projects require a *Bluetooth Apploader OTA DFU* type bootloader by default. This bootloader needs a lot of flash space and does not fit into the regular bootloader area, hence the application start address must be shifted. This shift is automatically done by the *Apploader Support for Applications* software component, which is installed by default. If you want to use any other bootloader type, you should remove this software component in order to shift the application start address back to the end of the regular bootloader area. Note, that in this case you cannot do OTA DFU with Apploader, but you can still implement application-level OTA DFU by installing the *Application OTA DFU* software component instead of *In-place OTA DFU*.
+
+For more information on bootloaders, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
+
+
+### Programming the Radio Board
+
+Before programming the radio board mounted on the mainboard, make sure the power supply switch is in the AEM position (right side) as shown below.
![Radio board power supply switch](readme_img0.png)
diff --git a/app/bluetooth/documentation/example/soc_aoa_asset_tag/readme.md b/app/bluetooth/documentation/example/soc_aoa_asset_tag/readme.md
index c8ae449f47..0140bfe8c4 100644
--- a/app/bluetooth/documentation/example/soc_aoa_asset_tag/readme.md
+++ b/app/bluetooth/documentation/example/soc_aoa_asset_tag/readme.md
@@ -2,6 +2,8 @@
This example application demonstrates a CTE (Constant Tone Extension) transmitter that can be used as an asset tag in a direction finding setup estimating Angle of Arrival (AoA). Test this example with **NCP - AoA Locator**, which (when used together with the **aoa_locator host** applications) can estimate the direction of the asset tag.
+> Note: this example expects a specific Gecko Bootloader to be present on your device. For details see the Troubleshooting section.
+
## Getting Started
To learn the basics of Bluetooth direction finding technology , see [UG103.18: Bluetooth Direction Finding Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-18-bluetooth-direction-finding-fundamentals.pdf).
@@ -41,23 +43,41 @@ AoA Asset Tag can be tested together with an AoA Locator. After programming the
## Troubleshooting
-Note that Software Example-based projects do not include a bootloader. However, they are configured to expect a bootloader to be present on the device. To get your application to work, either
-- flash a bootloader to the device or
-- uninstall the **OTA DFU** and **Bootloader Application Interface** software components.
+### Bootloader Issues
+
+Note that Example Projects do not include a bootloader. However, Bluetooth-based Example Projects expect a bootloader to be present on the device in order to support device firmware upgrade (DFU). To get your application to work, you should either
+- flash the proper bootloader or
+- remove the DFU functionality from the project.
+
+**If you do not wish to add a bootloader**, then remove the DFU functionality by uninstalling the *Bootloader Application Interface* software component -- and all of its dependants. This will automatically put your application code to the start address of the flash, which means that a bootloader is no longer needed, but also that you will not be able to upgrade your firmware.
+
+**If you want to add a bootloader**, then either
+- Create a bootloader project, build it and flash it to your device. Note that different projects expect different bootloaders:
+ - for NCP and RCP projects create a *BGAPI UART DFU* type bootloader
+ - for SoC projects on Series 1 devices create a *Bluetooth in-place OTA DFU* type bootloader or any *Internal Storage* type bootloader
+ - for SoC projects on Series 2 devices create a *Bluetooth Apploader OTA DFU* type bootloader
+
+- or run a precompiled Demo on your device from the Launcher view before flashing your application. Precompiled demos flash both bootloader and application images to the device. Flashing your own application image after the demo will overwrite the demo application but leave the bootloader in place.
+ - For NCP and RCP projects, flash the *Bluetooth - NCP* demo.
+ - For SoC projects, flash the *Bluetooth - SoC Thermometer* demo.
-To flash a bootloader, either create a bootloader project or run a precompiled **Demo** on your device from the Launcher view. Precompiled demos flash both bootloader and application images to the device. Then flash your own application image to overwrite the demo application but leave the bootloader in place.
+**Important Notes:**
+- when you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
-- To flash an OTA DFU-capable bootloader to the device, flash the **Bluetooth - SoC Thermometer** demo.
-- To flash a UART DFU-capable bootloader to the device, flash the **Bluetooth - NCP** demo.
-- For other bootloader types, create your own bootloader project and flash it to the device before flashing your application.
-- When you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
- On Series 1 devices (EFR32xG1x), both first stage and second stage bootloaders have to be flashed. This can be done at once by flashing the *-combined.s37* file found in the bootloader project after building the project.
-- For more information, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
-Before programming the radio board mounted on the mainboard, make sure the power supply switch the AEM position (right side) as shown below.
+- On Series 2 devices SoC example projects require a *Bluetooth Apploader OTA DFU* type bootloader by default. This bootloader needs a lot of flash space and does not fit into the regular bootloader area, hence the application start address must be shifted. This shift is automatically done by the *Apploader Support for Applications* software component, which is installed by default. If you want to use any other bootloader type, you should remove this software component in order to shift the application start address back to the end of the regular bootloader area. Note, that in this case you cannot do OTA DFU with Apploader, but you can still implement application-level OTA DFU by installing the *Application OTA DFU* software component instead of *In-place OTA DFU*.
+
+For more information on bootloaders, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
+
+
+### Programming the Radio Board
+
+Before programming the radio board mounted on the mainboard, make sure the power supply switch is in the AEM position (right side) as shown below.
![Radio board power supply switch](readme_img0.png)
+
## Resources
[Bluetooth Documentation](https://docs.silabs.com/bluetooth/latest/)
diff --git a/app/bluetooth/documentation/example/soc_app_ota_dfu/readme.md b/app/bluetooth/documentation/example/soc_app_ota_dfu/readme.md
index e698a57687..8e41ba0972 100644
--- a/app/bluetooth/documentation/example/soc_app_ota_dfu/readme.md
+++ b/app/bluetooth/documentation/example/soc_app_ota_dfu/readme.md
@@ -2,6 +2,7 @@
This example project demonstrates the Application Over-the-Air Device Firmware Upgrade (OTA DFU) service, which unlocks firmware update during application runtime without resetting the device into 'OTA DFU mode' and without installing any application loader utility to the device. The downloaded firmware is stored in dedicated flash storage (slot 0). Once the download has finished, the bootloader is configured to update the firmware on the device. During the reboot session the new firmware is copied to the application space in the flash and the new application is loaded.
+ > Note: this example expects a specific Gecko Bootloader to be present on your device. For details see the Troubleshooting section.
## Getting Started
@@ -66,20 +67,37 @@ This is a minimal example with the application OTA service that allows it to do
## Troubleshooting
-Note that __NO__ Bootloader is included in any Software Example projects, but they are configured to expect a bootloader to be present on the device. To get your application to work, you should either
-- flash a bootloader to the device or
-- uninstall the **OTA DFU** and **Bootloader Application Interface** software components.
+### Bootloader Issues
-To flash a bootloader, you should either create a bootloader project or run a precompiled **Demo** on your device from the Launcher view. Precompiled Demos flash both bootloader and application images to your device.
+Note that Example Projects do not include a bootloader. However, Bluetooth-based Example Projects expect a bootloader to be present on the device in order to support device firmware upgrade (DFU). To get your application to work, you should either
+- flash the proper bootloader or
+- remove the DFU functionality from the project.
-- To flash an OTA DFU-capable bootloader to your device, *SoC-Thermometer* demo can be flashed before your application to load the bootloader.
-- To flash a UART DFU-capable bootloader to your device, *NCP* demo can be flashed before your application to load the bootloader.
-- For your custom application, create your own bootloader project and flash it to your device before flashing your application.
-- When you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
-- On Series 1 devices (EFR32xG1x), both first stage and second stage bootloaders have to be flashed. This can be done in one step by flashing the **-combined.s37** file found in your bootloader project after building the project.
-- For more information, see *[UG103: Bootloading fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf)*, *[UG266: Silicon Labs Gecko Bootloader User's Guide](https://www.silabs.com/documents/public/user-guides/ug266-gecko-bootloader-user-guide.pdf)* and *[UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://www.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf)*.
+**If you do not wish to add a bootloader**, then remove the DFU functionality by uninstalling the *Bootloader Application Interface* software component -- and all of its dependants. This will automatically put your application code to the start address of the flash, which means that a bootloader is no longer needed, but also that you will not be able to upgrade your firmware.
-Before programming the radio board mounted on the mainboard, make sure the power supply switch is in the AEM position (right side), as shown below.
+**If you want to add a bootloader**, then either
+- Create a bootloader project, build it and flash it to your device. Note that different projects expect different bootloaders:
+ - for NCP and RCP projects create a *BGAPI UART DFU* type bootloader
+ - for SoC projects on Series 1 devices create a *Bluetooth in-place OTA DFU* type bootloader or any *Internal Storage* type bootloader
+ - for SoC projects on Series 2 devices create a *Bluetooth Apploader OTA DFU* type bootloader
+
+- or run a precompiled Demo on your device from the Launcher view before flashing your application. Precompiled demos flash both bootloader and application images to the device. Flashing your own application image after the demo will overwrite the demo application but leave the bootloader in place.
+ - For NCP and RCP projects, flash the *Bluetooth - NCP* demo.
+ - For SoC projects, flash the *Bluetooth - SoC Thermometer* demo.
+
+**Important Notes:**
+- when you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
+
+- On Series 1 devices (EFR32xG1x), both first stage and second stage bootloaders have to be flashed. This can be done at once by flashing the *-combined.s37* file found in the bootloader project after building the project.
+
+- On Series 2 devices SoC example projects require a *Bluetooth Apploader OTA DFU* type bootloader by default. This bootloader needs a lot of flash space and does not fit into the regular bootloader area, hence the application start address must be shifted. This shift is automatically done by the *Apploader Support for Applications* software component, which is installed by default. If you want to use any other bootloader type, you should remove this software component in order to shift the application start address back to the end of the regular bootloader area. Note, that in this case you cannot do OTA DFU with Apploader, but you can still implement application-level OTA DFU by installing the *Application OTA DFU* software component instead of *In-place OTA DFU*.
+
+For more information on bootloaders, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
+
+
+### Programming the Radio Board
+
+Before programming the radio board mounted on the mainboard, make sure the power supply switch is in the AEM position (right side) as shown below.
![Radio board power supply switch](readme_img0.png)
diff --git a/app/bluetooth/documentation/example/soc_blinky/readme.md b/app/bluetooth/documentation/example/soc_blinky/readme.md
index 2c8322cbc9..ed22768224 100644
--- a/app/bluetooth/documentation/example/soc_blinky/readme.md
+++ b/app/bluetooth/documentation/example/soc_blinky/readme.md
@@ -2,6 +2,8 @@
This example application is the "Hello World" of Bluetooth Low Energy (BLE). It allows a BLE central device to control the LED on the mainboard and receive button press notifications.
+> Note: this example expects a specific Gecko Bootloader to be present on your device. For details see the Troubleshooting section.
+
## Getting started
To get started with Silicon Labs Bluetooth and Simplicity Studio, see [QSG169: Bluetooth SDK v3.x Quick Start Guide](https://www.silabs.com/documents/public/quick-start-guides/qsg169-bluetooth-sdk-v3x-quick-start-guide.pdf).
@@ -24,23 +26,42 @@ The animation below showcases the demo running on a BGM220 Explorer Kit (BGM220-
## Troubleshooting
-Note that Software Example-based projects do not include a bootloader. However, they are configured to expect a bootloader to be present on the device. To get your application to work, either
-- flash a bootloader to the device or
-- uninstall the **OTA DFU** and **Bootloader Application Interface** software components.
+### Bootloader Issues
+
+Note that Example Projects do not include a bootloader. However, Bluetooth-based Example Projects expect a bootloader to be present on the device in order to support device firmware upgrade (DFU). To get your application to work, you should either
+- flash the proper bootloader or
+- remove the DFU functionality from the project.
+
+**If you do not wish to add a bootloader**, then remove the DFU functionality by uninstalling the *Bootloader Application Interface* software component -- and all of its dependants. This will automatically put your application code to the start address of the flash, which means that a bootloader is no longer needed, but also that you will not be able to upgrade your firmware.
-To flash a bootloader, either create a bootloader project or run a precompiled **Demo** on your device from the Launcher view. Precompiled demos flash both bootloader and application images to the device. Then flash your own application image to overwrite the demo application but leave the bootloader in place.
+**If you want to add a bootloader**, then either
+- Create a bootloader project, build it and flash it to your device. Note that different projects expect different bootloaders:
+ - for NCP and RCP projects create a *BGAPI UART DFU* type bootloader
+ - for SoC projects on Series 1 devices create a *Bluetooth in-place OTA DFU* type bootloader or any *Internal Storage* type bootloader
+ - for SoC projects on Series 2 devices create a *Bluetooth Apploader OTA DFU* type bootloader
+
+- or run a precompiled Demo on your device from the Launcher view before flashing your application. Precompiled demos flash both bootloader and application images to the device. Flashing your own application image after the demo will overwrite the demo application but leave the bootloader in place.
+ - For NCP and RCP projects, flash the *Bluetooth - NCP* demo.
+ - For SoC projects, flash the *Bluetooth - SoC Thermometer* demo.
+
+**Important Notes:**
+- when you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
-- To flash an OTA DFU-capable bootloader to the device, flash the **Bluetooth - SoC Thermometer** demo.
-- To flash a UART DFU-capable bootloader to the device, flash the **Bluetooth - NCP** demo.
-- For other bootloader types, create your own bootloader project and flash it to the device before flashing your application.
-- When you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
- On Series 1 devices (EFR32xG1x), both first stage and second stage bootloaders have to be flashed. This can be done at once by flashing the *-combined.s37* file found in the bootloader project after building the project.
-- For more information, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
-Before programming the radio board mounted on the mainboard, make sure the power supply switch the AEM position (right side) as shown below.
+- On Series 2 devices SoC example projects require a *Bluetooth Apploader OTA DFU* type bootloader by default. This bootloader needs a lot of flash space and does not fit into the regular bootloader area, hence the application start address must be shifted. This shift is automatically done by the *Apploader Support for Applications* software component, which is installed by default. If you want to use any other bootloader type, you should remove this software component in order to shift the application start address back to the end of the regular bootloader area. Note, that in this case you cannot do OTA DFU with Apploader, but you can still implement application-level OTA DFU by installing the *Application OTA DFU* software component instead of *In-place OTA DFU*.
+
+For more information on bootloaders, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
+
+
+### Programming the Radio Board
+
+Before programming the radio board mounted on the mainboard, make sure the power supply switch is in the AEM position (right side) as shown below.
![Radio board power supply switch](readme_img0.png)
+
+
## Resources
[Bluetooth Documentation](https://docs.silabs.com/bluetooth/latest/)
diff --git a/app/bluetooth/documentation/example/soc_cbap/readme.md b/app/bluetooth/documentation/example/soc_cbap/readme.md
index 4575f04a6e..01ecd7abe1 100644
--- a/app/bluetooth/documentation/example/soc_cbap/readme.md
+++ b/app/bluetooth/documentation/example/soc_cbap/readme.md
@@ -2,6 +2,8 @@
This example application demonstrates how to create secure connections with trusted devices, where the trust between the devices is based on device certificates instead of some classical authentication method like numeric comparison or passkey entry. This method ensures authenticated connections without any user interaction. A signed device certificate must be present on the devices.
+> Note: this example expects a specific Gecko Bootloader to be present on your device. For details see the Troubleshooting section.
+
## Getting started
To get started with Silicon Labs Bluetooth and Simplicity Studio, see [QSG169: Bluetooth® Quick-Start Guide for SDK v3.x and Higher](https://www.silabs.com/documents/public/quick-start-guides/qsg169-bluetooth-sdk-v3x-quick-start-guide.pdf).
@@ -38,23 +40,41 @@ To test the example:
## Troubleshooting
-Note that Software Example-based projects do not include a bootloader. However, they are configured to expect a bootloader to be present on the device. To get your application to work, either
-- flash a bootloader to the device or
-- uninstall the **OTA DFU** and **Bootloader Application Interface** software components.
+### Bootloader Issues
+
+Note that Example Projects do not include a bootloader. However, Bluetooth-based Example Projects expect a bootloader to be present on the device in order to support device firmware upgrade (DFU). To get your application to work, you should either
+- flash the proper bootloader or
+- remove the DFU functionality from the project.
+
+**If you do not wish to add a bootloader**, then remove the DFU functionality by uninstalling the *Bootloader Application Interface* software component -- and all of its dependants. This will automatically put your application code to the start address of the flash, which means that a bootloader is no longer needed, but also that you will not be able to upgrade your firmware.
+
+**If you want to add a bootloader**, then either
+- Create a bootloader project, build it and flash it to your device. Note that different projects expect different bootloaders:
+ - for NCP and RCP projects create a *BGAPI UART DFU* type bootloader
+ - for SoC projects on Series 1 devices create a *Bluetooth in-place OTA DFU* type bootloader or any *Internal Storage* type bootloader
+ - for SoC projects on Series 2 devices create a *Bluetooth Apploader OTA DFU* type bootloader
+
+- or run a precompiled Demo on your device from the Launcher view before flashing your application. Precompiled demos flash both bootloader and application images to the device. Flashing your own application image after the demo will overwrite the demo application but leave the bootloader in place.
+ - For NCP and RCP projects, flash the *Bluetooth - NCP* demo.
+ - For SoC projects, flash the *Bluetooth - SoC Thermometer* demo.
-To flash a bootloader, either create a bootloader project or run a precompiled **Demo** on your device from the Launcher view. Precompiled demos flash both bootloader and application images to the device. Then flash your own application image to overwrite the demo application but leave the bootloader in place.
+**Important Notes:**
+- when you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
-- To flash an OTA DFU-capable bootloader to the device, flash the **Bluetooth - SoC Thermometer** demo.
-- To flash a UART DFU-capable bootloader to the device, flash the **Bluetooth - NCP** demo.
-- For other bootloader types, create your own bootloader project and flash it to the device before flashing your application.
-- When you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
- On Series 1 devices (EFR32xG1x), both first stage and second stage bootloaders have to be flashed. This can be done at once by flashing the *-combined.s37* file found in the bootloader project after building the project.
-- For more information, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
+
+- On Series 2 devices SoC example projects require a *Bluetooth Apploader OTA DFU* type bootloader by default. This bootloader needs a lot of flash space and does not fit into the regular bootloader area, hence the application start address must be shifted. This shift is automatically done by the *Apploader Support for Applications* software component, which is installed by default. If you want to use any other bootloader type, you should remove this software component in order to shift the application start address back to the end of the regular bootloader area. Note, that in this case you cannot do OTA DFU with Apploader, but you can still implement application-level OTA DFU by installing the *Application OTA DFU* software component instead of *In-place OTA DFU*.
+
+For more information on bootloaders, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
+
+
+### Programming the Radio Board
Before programming the radio board mounted on the mainboard, make sure the power supply switch is in the AEM position (right side) as shown below.
![Radio board power supply switch](readme_img0.png)
+
## Resources
[Bluetooth Documentation](https://docs.silabs.com/bluetooth/latest/)
diff --git a/app/bluetooth/documentation/example/soc_dtm/readme.md b/app/bluetooth/documentation/example/soc_dtm/readme.md
index e311975419..1fd6b51629 100644
--- a/app/bluetooth/documentation/example/soc_dtm/readme.md
+++ b/app/bluetooth/documentation/example/soc_dtm/readme.md
@@ -2,6 +2,8 @@
This example application provides the Direct Test Mode (DTM) through a 2-wire UART interface for the RF PHY testing of a Bluetooth Low Energy device.
+> Note: this example expects a specific Gecko Bootloader to be present on your device. For details see the Troubleshooting section.
+
## Direct Test Mode (DTM) Overview
DTM is typically used with a separate Bluetooth Tester device.
@@ -46,23 +48,41 @@ Detailed specifications are in the Bluetooth Specifications.
## Troubleshooting
-Note that Software Example-based projects do not include a bootloader. However, they are configured to expect a bootloader to be present on the device. To get your application to work, either
-- flash a bootloader to the device or
-- uninstall the **OTA DFU** and **Bootloader Application Interface** software components.
+### Bootloader Issues
+
+Note that Example Projects do not include a bootloader. However, Bluetooth-based Example Projects expect a bootloader to be present on the device in order to support device firmware upgrade (DFU). To get your application to work, you should either
+- flash the proper bootloader or
+- remove the DFU functionality from the project.
+
+**If you do not wish to add a bootloader**, then remove the DFU functionality by uninstalling the *Bootloader Application Interface* software component -- and all of its dependants. This will automatically put your application code to the start address of the flash, which means that a bootloader is no longer needed, but also that you will not be able to upgrade your firmware.
+
+**If you want to add a bootloader**, then either
+- Create a bootloader project, build it and flash it to your device. Note that different projects expect different bootloaders:
+ - for NCP and RCP projects create a *BGAPI UART DFU* type bootloader
+ - for SoC projects on Series 1 devices create a *Bluetooth in-place OTA DFU* type bootloader or any *Internal Storage* type bootloader
+ - for SoC projects on Series 2 devices create a *Bluetooth Apploader OTA DFU* type bootloader
+
+- or run a precompiled Demo on your device from the Launcher view before flashing your application. Precompiled demos flash both bootloader and application images to the device. Flashing your own application image after the demo will overwrite the demo application but leave the bootloader in place.
+ - For NCP and RCP projects, flash the *Bluetooth - NCP* demo.
+ - For SoC projects, flash the *Bluetooth - SoC Thermometer* demo.
-To flash a bootloader, either create a bootloader project or run a precompiled **Demo** on your device from the Launcher view. Precompiled demos flash both bootloader and application images to the device. Then flash your own application image to overwrite the demo application but leave the bootloader in place.
+**Important Notes:**
+- when you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
-- To flash an OTA DFU-capable bootloader to the device, flash the **Bluetooth - SoC Thermometer** demo.
-- To flash a UART DFU-capable bootloader to the device, flash the **Bluetooth - NCP** demo.
-- For other bootloader types, create your own bootloader project and flash it to the device before flashing your application.
-- When you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
- On Series 1 devices (EFR32xG1x), both first stage and second stage bootloaders have to be flashed. This can be done at once by flashing the *-combined.s37* file found in the bootloader project after building the project.
-- For more information, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
-Before programming the radio board mounted on the mainboard, make sure the power supply switch the AEM position (right side) as shown below.
+- On Series 2 devices SoC example projects require a *Bluetooth Apploader OTA DFU* type bootloader by default. This bootloader needs a lot of flash space and does not fit into the regular bootloader area, hence the application start address must be shifted. This shift is automatically done by the *Apploader Support for Applications* software component, which is installed by default. If you want to use any other bootloader type, you should remove this software component in order to shift the application start address back to the end of the regular bootloader area. Note, that in this case you cannot do OTA DFU with Apploader, but you can still implement application-level OTA DFU by installing the *Application OTA DFU* software component instead of *In-place OTA DFU*.
+
+For more information on bootloaders, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
+
+
+### Programming the Radio Board
+
+Before programming the radio board mounted on the mainboard, make sure the power supply switch is in the AEM position (right side) as shown below.
![Radio board power supply switch](readme_img0.png)
+
**Note!** With the mainboard and the Radio Board, the DTM example uses EXP-header UART pins by default and not the USB UART as most of the other examples. Also, the default is no flow control.
diff --git a/app/bluetooth/documentation/example/soc_empty/readme.md b/app/bluetooth/documentation/example/soc_empty/readme.md
index d5e09bdd31..f32a03ba2a 100644
--- a/app/bluetooth/documentation/example/soc_empty/readme.md
+++ b/app/bluetooth/documentation/example/soc_empty/readme.md
@@ -2,6 +2,8 @@
The Bluetooth SoC-Empty example is a project that you can use as a template for any standalone Bluetooth application.
+> Note: this example expects a specific Gecko Bootloader to be present on your device. For details see the Troubleshooting section.
+
## Getting Started
To learn the Bluetooth technology basics, see [UG103.14: Bluetooth LE Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-14-fundamentals-ble.pdf).
@@ -60,23 +62,41 @@ As described above, an empty example does nothing except advertising and letting
## Troubleshooting
-Note that Software Example-based projects do not include a bootloader. However, they are configured to expect a bootloader to be present on the device. To get your application to work, either
-- flash a bootloader to the device or
-- uninstall the **OTA DFU** and **Bootloader Application Interface** software components.
+### Bootloader Issues
+
+Note that Example Projects do not include a bootloader. However, Bluetooth-based Example Projects expect a bootloader to be present on the device in order to support device firmware upgrade (DFU). To get your application to work, you should either
+- flash the proper bootloader or
+- remove the DFU functionality from the project.
+
+**If you do not wish to add a bootloader**, then remove the DFU functionality by uninstalling the *Bootloader Application Interface* software component -- and all of its dependants. This will automatically put your application code to the start address of the flash, which means that a bootloader is no longer needed, but also that you will not be able to upgrade your firmware.
+
+**If you want to add a bootloader**, then either
+- Create a bootloader project, build it and flash it to your device. Note that different projects expect different bootloaders:
+ - for NCP and RCP projects create a *BGAPI UART DFU* type bootloader
+ - for SoC projects on Series 1 devices create a *Bluetooth in-place OTA DFU* type bootloader or any *Internal Storage* type bootloader
+ - for SoC projects on Series 2 devices create a *Bluetooth Apploader OTA DFU* type bootloader
+
+- or run a precompiled Demo on your device from the Launcher view before flashing your application. Precompiled demos flash both bootloader and application images to the device. Flashing your own application image after the demo will overwrite the demo application but leave the bootloader in place.
+ - For NCP and RCP projects, flash the *Bluetooth - NCP* demo.
+ - For SoC projects, flash the *Bluetooth - SoC Thermometer* demo.
-To flash a bootloader, either create a bootloader project or run a precompiled **Demo** on your device from the Launcher view. Precompiled demos flash both bootloader and application images to the device. Then flash your own application image to overwrite the demo application but leave the bootloader in place.
+**Important Notes:**
+- when you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
-- To flash an OTA DFU-capable bootloader to the device, flash the **Bluetooth - SoC Thermometer** demo.
-- To flash a UART DFU-capable bootloader to the device, flash the **Bluetooth - NCP** demo.
-- For other bootloader types, create your own bootloader project and flash it to the device before flashing your application.
-- When you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
- On Series 1 devices (EFR32xG1x), both first stage and second stage bootloaders have to be flashed. This can be done at once by flashing the *-combined.s37* file found in the bootloader project after building the project.
-- For more information, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
-Before programming the radio board mounted on the mainboard, make sure the power supply switch the AEM position (right side) as shown below.
+- On Series 2 devices SoC example projects require a *Bluetooth Apploader OTA DFU* type bootloader by default. This bootloader needs a lot of flash space and does not fit into the regular bootloader area, hence the application start address must be shifted. This shift is automatically done by the *Apploader Support for Applications* software component, which is installed by default. If you want to use any other bootloader type, you should remove this software component in order to shift the application start address back to the end of the regular bootloader area. Note, that in this case you cannot do OTA DFU with Apploader, but you can still implement application-level OTA DFU by installing the *Application OTA DFU* software component instead of *In-place OTA DFU*.
+
+For more information on bootloaders, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
+
+
+### Programming the Radio Board
+
+Before programming the radio board mounted on the mainboard, make sure the power supply switch is in the AEM position (right side) as shown below.
![Radio board power supply switch](readme_img0.png)
+
## Resources
[Bluetooth Documentation](https://docs.silabs.com/bluetooth/latest/)
diff --git a/app/bluetooth/documentation/example/soc_empty_rail_dmp/readme.md b/app/bluetooth/documentation/example/soc_empty_rail_dmp/readme.md
index cf0161a742..b7003bda2a 100644
--- a/app/bluetooth/documentation/example/soc_empty_rail_dmp/readme.md
+++ b/app/bluetooth/documentation/example/soc_empty_rail_dmp/readme.md
@@ -2,6 +2,8 @@
This is a basic implementation of a Bluetooth and proprietary dynamic multiprotocol (DMP) application. It serves as a starting point for any DMP application development.
+> Note: this example expects a specific Gecko Bootloader to be present on your device. For details see the Troubleshooting section.
+
## Getting Started
To get started with Silicon Labs Bluetooth and Simplicity Studio, see [QSG169: Bluetooth SDK v3.x Quick Start Guide](https://www.silabs.com/documents/public/quick-start-guides/qsg169-bluetooth-sdk-v3x-quick-start-guide.pdf).
@@ -58,23 +60,41 @@ You can implement additional application-specific tasks in *app.c*. You can crea
## Troubleshooting
-Note that Software Example-based projects do not include a bootloader. However, they are configured to expect a bootloader to be present on the device. To get your application to work, either
-- flash a bootloader to the device or
-- uninstall the **OTA DFU** and **Bootloader Application Interface** software components.
+### Bootloader Issues
+
+Note that Example Projects do not include a bootloader. However, Bluetooth-based Example Projects expect a bootloader to be present on the device in order to support device firmware upgrade (DFU). To get your application to work, you should either
+- flash the proper bootloader or
+- remove the DFU functionality from the project.
+
+**If you do not wish to add a bootloader**, then remove the DFU functionality by uninstalling the *Bootloader Application Interface* software component -- and all of its dependants. This will automatically put your application code to the start address of the flash, which means that a bootloader is no longer needed, but also that you will not be able to upgrade your firmware.
+
+**If you want to add a bootloader**, then either
+- Create a bootloader project, build it and flash it to your device. Note that different projects expect different bootloaders:
+ - for NCP and RCP projects create a *BGAPI UART DFU* type bootloader
+ - for SoC projects on Series 1 devices create a *Bluetooth in-place OTA DFU* type bootloader or any *Internal Storage* type bootloader
+ - for SoC projects on Series 2 devices create a *Bluetooth Apploader OTA DFU* type bootloader
+
+- or run a precompiled Demo on your device from the Launcher view before flashing your application. Precompiled demos flash both bootloader and application images to the device. Flashing your own application image after the demo will overwrite the demo application but leave the bootloader in place.
+ - For NCP and RCP projects, flash the *Bluetooth - NCP* demo.
+ - For SoC projects, flash the *Bluetooth - SoC Thermometer* demo.
-To flash a bootloader, either create a bootloader project or run a precompiled **Demo** on your device from the Launcher view. Precompiled demos flash both bootloader and application images to the device. Then flash your own application image to overwrite the demo application but leave the bootloader in place.
+**Important Notes:**
+- when you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
-- To flash an OTA DFU-capable bootloader to the device, flash the **Bluetooth - SoC Thermometer** demo.
-- To flash a UART DFU-capable bootloader to the device, flash the **Bluetooth - NCP** demo.
-- For other bootloader types, create your own bootloader project and flash it to the device before flashing your application.
-- When you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
- On Series 1 devices (EFR32xG1x), both first stage and second stage bootloaders have to be flashed. This can be done at once by flashing the *-combined.s37* file found in the bootloader project after building the project.
-- For more information, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
-Before programming the radio board mounted on the mainboard, make sure the power supply switch the AEM position (right side) as shown below.
+- On Series 2 devices SoC example projects require a *Bluetooth Apploader OTA DFU* type bootloader by default. This bootloader needs a lot of flash space and does not fit into the regular bootloader area, hence the application start address must be shifted. This shift is automatically done by the *Apploader Support for Applications* software component, which is installed by default. If you want to use any other bootloader type, you should remove this software component in order to shift the application start address back to the end of the regular bootloader area. Note, that in this case you cannot do OTA DFU with Apploader, but you can still implement application-level OTA DFU by installing the *Application OTA DFU* software component instead of *In-place OTA DFU*.
+
+For more information on bootloaders, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
+
+
+### Programming the Radio Board
+
+Before programming the radio board mounted on the mainboard, make sure the power supply switch is in the AEM position (right side) as shown below.
![Radio board power supply switch](readme_img0.png)
+
## Resources
[Bluetooth Documentation](https://docs.silabs.com/bluetooth/latest/)
diff --git a/app/bluetooth/documentation/example/soc_empty_std_dmp/readme.md b/app/bluetooth/documentation/example/soc_empty_std_dmp/readme.md
index 500302b4e4..eb31c2c9ae 100644
--- a/app/bluetooth/documentation/example/soc_empty_std_dmp/readme.md
+++ b/app/bluetooth/documentation/example/soc_empty_std_dmp/readme.md
@@ -4,6 +4,8 @@ This example application contains a basic implementation of a Bluetooth and prop
Note: This DMP application uses a standard physical layer for the proprietary protocol, defined by the IEEE 802.15.4 standard, which cannot be changed.
+> Note: this example expects a specific Gecko Bootloader to be present on your device. For details see the Troubleshooting section.
+
## Getting Started
To get started with Silicon Labs Bluetooth and Simplicity Studio, see [QSG169: Bluetooth SDK v3.x Quick Start Guide](https://www.silabs.com/documents/public/quick-start-guides/qsg169-bluetooth-sdk-v3x-quick-start-guide.pdf).
@@ -56,23 +58,41 @@ You can implement additional application-specific tasks in *app.c*. You can crea
## Troubleshooting
-Note that Software Example-based projects do not include a bootloader. However, they are configured to expect a bootloader to be present on the device. To get your application to work, either
-- flash a bootloader to the device or
-- uninstall the **OTA DFU** and **Bootloader Application Interface** software components.
+### Bootloader Issues
+
+Note that Example Projects do not include a bootloader. However, Bluetooth-based Example Projects expect a bootloader to be present on the device in order to support device firmware upgrade (DFU). To get your application to work, you should either
+- flash the proper bootloader or
+- remove the DFU functionality from the project.
+
+**If you do not wish to add a bootloader**, then remove the DFU functionality by uninstalling the *Bootloader Application Interface* software component -- and all of its dependants. This will automatically put your application code to the start address of the flash, which means that a bootloader is no longer needed, but also that you will not be able to upgrade your firmware.
+
+**If you want to add a bootloader**, then either
+- Create a bootloader project, build it and flash it to your device. Note that different projects expect different bootloaders:
+ - for NCP and RCP projects create a *BGAPI UART DFU* type bootloader
+ - for SoC projects on Series 1 devices create a *Bluetooth in-place OTA DFU* type bootloader or any *Internal Storage* type bootloader
+ - for SoC projects on Series 2 devices create a *Bluetooth Apploader OTA DFU* type bootloader
+
+- or run a precompiled Demo on your device from the Launcher view before flashing your application. Precompiled demos flash both bootloader and application images to the device. Flashing your own application image after the demo will overwrite the demo application but leave the bootloader in place.
+ - For NCP and RCP projects, flash the *Bluetooth - NCP* demo.
+ - For SoC projects, flash the *Bluetooth - SoC Thermometer* demo.
-To flash a bootloader, either create a bootloader project or run a precompiled **Demo** on your device from the Launcher view. Precompiled demos flash both bootloader and application images to the device. Then flash your own application image to overwrite the demo application but leave the bootloader in place.
+**Important Notes:**
+- when you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
-- To flash an OTA DFU-capable bootloader to the device, flash the **Bluetooth - SoC Thermometer** demo.
-- To flash a UART DFU-capable bootloader to the device, flash the **Bluetooth - NCP** demo.
-- For other bootloader types, create your own bootloader project and flash it to the device before flashing your application.
-- When you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
- On Series 1 devices (EFR32xG1x), both first stage and second stage bootloaders have to be flashed. This can be done at once by flashing the *-combined.s37* file found in the bootloader project after building the project.
-- For more information, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
-Before programming the radio board mounted on the mainboard, make sure the power supply switch the AEM position (right side) as shown below.
+- On Series 2 devices SoC example projects require a *Bluetooth Apploader OTA DFU* type bootloader by default. This bootloader needs a lot of flash space and does not fit into the regular bootloader area, hence the application start address must be shifted. This shift is automatically done by the *Apploader Support for Applications* software component, which is installed by default. If you want to use any other bootloader type, you should remove this software component in order to shift the application start address back to the end of the regular bootloader area. Note, that in this case you cannot do OTA DFU with Apploader, but you can still implement application-level OTA DFU by installing the *Application OTA DFU* software component instead of *In-place OTA DFU*.
+
+For more information on bootloaders, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
+
+
+### Programming the Radio Board
+
+Before programming the radio board mounted on the mainboard, make sure the power supply switch is in the AEM position (right side) as shown below.
![Radio board power supply switch](readme_img0.png)
+
## Resources
[Bluetooth Documentation](https://docs.silabs.com/bluetooth/latest/)
diff --git a/app/bluetooth/documentation/example/soc_ibeacon/readme.md b/app/bluetooth/documentation/example/soc_ibeacon/readme.md
index e69b33a7b7..fe1e7c6387 100644
--- a/app/bluetooth/documentation/example/soc_ibeacon/readme.md
+++ b/app/bluetooth/documentation/example/soc_ibeacon/readme.md
@@ -2,6 +2,8 @@
An iBeacon device is an implementation that sends non-connectable advertisements in iBeacon format. The iBeacon Service gives Bluetooth accessories a simple and convenient way to send iBeacon to smartphones. This example can be tested together with the EFR Connect mobile app.
+> Note: this example expects a specific Gecko Bootloader to be present on your device. For details see the Troubleshooting section.
+
## Getting Started
Introduced in iOS 7, iBeacon enables new location awareness possibilities for apps. Leveraging Bluetooth Low Energy (BLE), a device with iBeacon technology can be used to establish a region around an object. This allows an iOS device to determine when it has entered or left the region, along with an estimation of proximity to a beacon.
@@ -35,23 +37,41 @@ Follow these steps to set up the project:
## Troubleshooting
-Note that Software Example-based projects do not include a bootloader. However, they are configured to expect a bootloader to be present on the device. To get your application to work, either
-- flash a bootloader to the device or
-- uninstall the **OTA DFU** and **Bootloader Application Interface** software components.
+### Bootloader Issues
+
+Note that Example Projects do not include a bootloader. However, Bluetooth-based Example Projects expect a bootloader to be present on the device in order to support device firmware upgrade (DFU). To get your application to work, you should either
+- flash the proper bootloader or
+- remove the DFU functionality from the project.
+
+**If you do not wish to add a bootloader**, then remove the DFU functionality by uninstalling the *Bootloader Application Interface* software component -- and all of its dependants. This will automatically put your application code to the start address of the flash, which means that a bootloader is no longer needed, but also that you will not be able to upgrade your firmware.
+
+**If you want to add a bootloader**, then either
+- Create a bootloader project, build it and flash it to your device. Note that different projects expect different bootloaders:
+ - for NCP and RCP projects create a *BGAPI UART DFU* type bootloader
+ - for SoC projects on Series 1 devices create a *Bluetooth in-place OTA DFU* type bootloader or any *Internal Storage* type bootloader
+ - for SoC projects on Series 2 devices create a *Bluetooth Apploader OTA DFU* type bootloader
+
+- or run a precompiled Demo on your device from the Launcher view before flashing your application. Precompiled demos flash both bootloader and application images to the device. Flashing your own application image after the demo will overwrite the demo application but leave the bootloader in place.
+ - For NCP and RCP projects, flash the *Bluetooth - NCP* demo.
+ - For SoC projects, flash the *Bluetooth - SoC Thermometer* demo.
-To flash a bootloader, either create a bootloader project or run a precompiled **Demo** on your device from the Launcher view. Precompiled demos flash both bootloader and application images to the device. Then flash your own application image to overwrite the demo application but leave the bootloader in place.
+**Important Notes:**
+- when you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
-- To flash an OTA DFU-capable bootloader to the device, flash the **Bluetooth - SoC Thermometer** demo.
-- To flash a UART DFU-capable bootloader to the device, flash the **Bluetooth - NCP** demo.
-- For other bootloader types, create your own bootloader project and flash it to the device before flashing your application.
-- When you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
- On Series 1 devices (EFR32xG1x), both first stage and second stage bootloaders have to be flashed. This can be done at once by flashing the *-combined.s37* file found in the bootloader project after building the project.
-- For more information, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
-Before programming the radio board mounted on the mainboard, make sure the power supply switch the AEM position (right side) as shown below.
+- On Series 2 devices SoC example projects require a *Bluetooth Apploader OTA DFU* type bootloader by default. This bootloader needs a lot of flash space and does not fit into the regular bootloader area, hence the application start address must be shifted. This shift is automatically done by the *Apploader Support for Applications* software component, which is installed by default. If you want to use any other bootloader type, you should remove this software component in order to shift the application start address back to the end of the regular bootloader area. Note, that in this case you cannot do OTA DFU with Apploader, but you can still implement application-level OTA DFU by installing the *Application OTA DFU* software component instead of *In-place OTA DFU*.
+
+For more information on bootloaders, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
+
+
+### Programming the Radio Board
+
+Before programming the radio board mounted on the mainboard, make sure the power supply switch is in the AEM position (right side) as shown below.
![Radio board power supply switch](readme_img0.png)
+
## Resources
[Bluetooth Documentation](https://docs.silabs.com/bluetooth/latest/)
diff --git a/app/bluetooth/documentation/example/soc_iop_test/readme.md b/app/bluetooth/documentation/example/soc_iop_test/readme.md
index 657c989725..4742eb1ba1 100644
--- a/app/bluetooth/documentation/example/soc_iop_test/readme.md
+++ b/app/bluetooth/documentation/example/soc_iop_test/readme.md
@@ -4,6 +4,8 @@ Interoperability (IOP) is one of the key value propositions of Bluetooth Low Ene
This readme describes the Silicon Labs IOP test framework, composed of hardware kits, embedded software, and a mobile app. It also explains the requirements for building the IOP test setup, running the test, and collecting data for further analysis.
+> Note: this example expects a specific Gecko Bootloader to be present on your device. For details see the Troubleshooting section.
+
**Because some optional steps need to be taken before the IOP test starts, read this document before running the IOP test.**
## Introduction
@@ -113,23 +115,41 @@ While UART logs have multiple COMPort emulators such as tera term, you can also
## Troubleshooting
-Note that Software Example-based projects do not include a bootloader. However, they are configured to expect a bootloader to be present on the device. To get your application to work, either
-- flash a bootloader to the device or
-- uninstall the **OTA DFU** and **Bootloader Application Interface** software components.
+### Bootloader Issues
+
+Note that Example Projects do not include a bootloader. However, Bluetooth-based Example Projects expect a bootloader to be present on the device in order to support device firmware upgrade (DFU). To get your application to work, you should either
+- flash the proper bootloader or
+- remove the DFU functionality from the project.
+
+**If you do not wish to add a bootloader**, then remove the DFU functionality by uninstalling the *Bootloader Application Interface* software component -- and all of its dependants. This will automatically put your application code to the start address of the flash, which means that a bootloader is no longer needed, but also that you will not be able to upgrade your firmware.
+
+**If you want to add a bootloader**, then either
+- Create a bootloader project, build it and flash it to your device. Note that different projects expect different bootloaders:
+ - for NCP and RCP projects create a *BGAPI UART DFU* type bootloader
+ - for SoC projects on Series 1 devices create a *Bluetooth in-place OTA DFU* type bootloader or any *Internal Storage* type bootloader
+ - for SoC projects on Series 2 devices create a *Bluetooth Apploader OTA DFU* type bootloader
+
+- or run a precompiled Demo on your device from the Launcher view before flashing your application. Precompiled demos flash both bootloader and application images to the device. Flashing your own application image after the demo will overwrite the demo application but leave the bootloader in place.
+ - For NCP and RCP projects, flash the *Bluetooth - NCP* demo.
+ - For SoC projects, flash the *Bluetooth - SoC Thermometer* demo.
-To flash a bootloader, either create a bootloader project or run a precompiled **Demo** on your device from the Launcher view. Precompiled demos flash both bootloader and application images to the device. Then flash your own application image to overwrite the demo application but leave the bootloader in place.
+**Important Notes:**
+- when you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
-- To flash an OTA DFU-capable bootloader to the device, flash the **Bluetooth - SoC Thermometer** demo.
-- To flash a UART DFU-capable bootloader to the device, flash the **Bluetooth - NCP** demo.
-- For other bootloader types, create your own bootloader project and flash it to the device before flashing your application.
-- When you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
- On Series 1 devices (EFR32xG1x), both first stage and second stage bootloaders have to be flashed. This can be done at once by flashing the *-combined.s37* file found in the bootloader project after building the project.
-- For more information, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
-Before programming the radio board mounted on the mainboard, make sure the power supply switch the AEM position (right side) as shown below.
+- On Series 2 devices SoC example projects require a *Bluetooth Apploader OTA DFU* type bootloader by default. This bootloader needs a lot of flash space and does not fit into the regular bootloader area, hence the application start address must be shifted. This shift is automatically done by the *Apploader Support for Applications* software component, which is installed by default. If you want to use any other bootloader type, you should remove this software component in order to shift the application start address back to the end of the regular bootloader area. Note, that in this case you cannot do OTA DFU with Apploader, but you can still implement application-level OTA DFU by installing the *Application OTA DFU* software component instead of *In-place OTA DFU*.
+
+For more information on bootloaders, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
+
+
+### Programming the Radio Board
+
+Before programming the radio board mounted on the mainboard, make sure the power supply switch is in the AEM position (right side) as shown below.
![Radio board power supply switch](readme_img0.png)
+
## Resources
[Bluetooth Documentation](https://docs.silabs.com/bluetooth/latest/)
diff --git a/app/bluetooth/documentation/example/soc_light_rail_dmp/readme.md b/app/bluetooth/documentation/example/soc_light_rail_dmp/readme.md
index 611966d0f2..b8d047e5e7 100644
--- a/app/bluetooth/documentation/example/soc_light_rail_dmp/readme.md
+++ b/app/bluetooth/documentation/example/soc_light_rail_dmp/readme.md
@@ -2,6 +2,8 @@
This is a Dynamic Multiprotocol reference application demonstrating a light bulb that can be switched both via Bluetooth and via a Proprietary protocol. To switch it via Bluetooth, use the EFR Connect smartphone app. To switch it via a Proprietary protocol, use the **Flex (RAIL) - Switch** example.
+> Note: this example expects a specific Gecko Bootloader to be present on your device. For details see the Troubleshooting section.
+
## Getting Started
To get started with Silicon Labs Bluetooth and Simplicity Studio, see [QSG169: Bluetooth SDK v3.x Quick Start Guide](https://www.silabs.com/documents/public/quick-start-guides/qsg169-bluetooth-sdk-v3x-quick-start-guide.pdf).
@@ -99,23 +101,41 @@ The main logic of the demo application is implemented in `demo_app_task()` that
## Troubleshooting
-Note that Software Example-based projects do not include a bootloader. However, they are configured to expect a bootloader to be present on the device. To get your application to work, either
-- flash a bootloader to the device or
-- uninstall the **OTA DFU** and **Bootloader Application Interface** software components.
+### Bootloader Issues
+
+Note that Example Projects do not include a bootloader. However, Bluetooth-based Example Projects expect a bootloader to be present on the device in order to support device firmware upgrade (DFU). To get your application to work, you should either
+- flash the proper bootloader or
+- remove the DFU functionality from the project.
+
+**If you do not wish to add a bootloader**, then remove the DFU functionality by uninstalling the *Bootloader Application Interface* software component -- and all of its dependants. This will automatically put your application code to the start address of the flash, which means that a bootloader is no longer needed, but also that you will not be able to upgrade your firmware.
+
+**If you want to add a bootloader**, then either
+- Create a bootloader project, build it and flash it to your device. Note that different projects expect different bootloaders:
+ - for NCP and RCP projects create a *BGAPI UART DFU* type bootloader
+ - for SoC projects on Series 1 devices create a *Bluetooth in-place OTA DFU* type bootloader or any *Internal Storage* type bootloader
+ - for SoC projects on Series 2 devices create a *Bluetooth Apploader OTA DFU* type bootloader
+
+- or run a precompiled Demo on your device from the Launcher view before flashing your application. Precompiled demos flash both bootloader and application images to the device. Flashing your own application image after the demo will overwrite the demo application but leave the bootloader in place.
+ - For NCP and RCP projects, flash the *Bluetooth - NCP* demo.
+ - For SoC projects, flash the *Bluetooth - SoC Thermometer* demo.
-To flash a bootloader, either create a bootloader project or run a precompiled **Demo** on your device from the Launcher view. Precompiled demos flash both bootloader and application images to the device. Then flash your own application image to overwrite the demo application but leave the bootloader in place.
+**Important Notes:**
+- when you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
-- To flash an OTA DFU-capable bootloader to the device, flash the **Bluetooth - SoC Thermometer** demo.
-- To flash a UART DFU-capable bootloader to the device, flash the **Bluetooth - NCP** demo.
-- For other bootloader types, create your own bootloader project and flash it to the device before flashing your application.
-- When you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
- On Series 1 devices (EFR32xG1x), both first stage and second stage bootloaders have to be flashed. This can be done at once by flashing the *-combined.s37* file found in the bootloader project after building the project.
-- For more information, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
-Before programming the radio board mounted on the mainboard, make sure the power supply switch the AEM position (right side) as shown below.
+- On Series 2 devices SoC example projects require a *Bluetooth Apploader OTA DFU* type bootloader by default. This bootloader needs a lot of flash space and does not fit into the regular bootloader area, hence the application start address must be shifted. This shift is automatically done by the *Apploader Support for Applications* software component, which is installed by default. If you want to use any other bootloader type, you should remove this software component in order to shift the application start address back to the end of the regular bootloader area. Note, that in this case you cannot do OTA DFU with Apploader, but you can still implement application-level OTA DFU by installing the *Application OTA DFU* software component instead of *In-place OTA DFU*.
+
+For more information on bootloaders, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
+
+
+### Programming the Radio Board
+
+Before programming the radio board mounted on the mainboard, make sure the power supply switch is in the AEM position (right side) as shown below.
![Radio board power supply switch](readme_img0.png)
+
## Resources
[Bluetooth Documentation](https://docs.silabs.com/bluetooth/latest/)
diff --git a/app/bluetooth/documentation/example/soc_light_std_dmp/readme.md b/app/bluetooth/documentation/example/soc_light_std_dmp/readme.md
index a83a5be44c..439f8d305f 100644
--- a/app/bluetooth/documentation/example/soc_light_std_dmp/readme.md
+++ b/app/bluetooth/documentation/example/soc_light_std_dmp/readme.md
@@ -4,6 +4,8 @@ This is a Dynamic Multiprotocol reference application demonstrating a light bulb
Note: This DMP application uses a standard physical layer for the proprietary protocol, defined by the IEEE 802.15.4 standard, which cannot be changed.
+> Note: this example expects a specific Gecko Bootloader to be present on your device. For details see the Troubleshooting section.
+
## Getting Started
To get started with Silicon Labs Bluetooth and Simplicity Studio, see [QSG169: Bluetooth SDK v3.x Quick Start Guide](https://www.silabs.com/documents/public/quick-start-guides/qsg169-bluetooth-sdk-v3x-quick-start-guide.pdf).
@@ -97,23 +99,41 @@ The main logic of the demo application is implemented in `demo_app_task()` that
## Troubleshooting
-Note that Software Example-based projects do not include a bootloader. However, they are configured to expect a bootloader to be present on the device. To get your application to work, either
-- flash a bootloader to the device or
-- uninstall the **OTA DFU** and **Bootloader Application Interface** software components.
+### Bootloader Issues
+
+Note that Example Projects do not include a bootloader. However, Bluetooth-based Example Projects expect a bootloader to be present on the device in order to support device firmware upgrade (DFU). To get your application to work, you should either
+- flash the proper bootloader or
+- remove the DFU functionality from the project.
+
+**If you do not wish to add a bootloader**, then remove the DFU functionality by uninstalling the *Bootloader Application Interface* software component -- and all of its dependants. This will automatically put your application code to the start address of the flash, which means that a bootloader is no longer needed, but also that you will not be able to upgrade your firmware.
+
+**If you want to add a bootloader**, then either
+- Create a bootloader project, build it and flash it to your device. Note that different projects expect different bootloaders:
+ - for NCP and RCP projects create a *BGAPI UART DFU* type bootloader
+ - for SoC projects on Series 1 devices create a *Bluetooth in-place OTA DFU* type bootloader or any *Internal Storage* type bootloader
+ - for SoC projects on Series 2 devices create a *Bluetooth Apploader OTA DFU* type bootloader
+
+- or run a precompiled Demo on your device from the Launcher view before flashing your application. Precompiled demos flash both bootloader and application images to the device. Flashing your own application image after the demo will overwrite the demo application but leave the bootloader in place.
+ - For NCP and RCP projects, flash the *Bluetooth - NCP* demo.
+ - For SoC projects, flash the *Bluetooth - SoC Thermometer* demo.
-To flash a bootloader, either create a bootloader project or run a precompiled **Demo** on your device from the Launcher view. Precompiled demos flash both bootloader and application images to the device. Then flash your own application image to overwrite the demo application but leave the bootloader in place.
+**Important Notes:**
+- when you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
-- To flash an OTA DFU-capable bootloader to the device, flash the **Bluetooth - SoC Thermometer** demo.
-- To flash a UART DFU-capable bootloader to the device, flash the **Bluetooth - NCP** demo.
-- For other bootloader types, create your own bootloader project and flash it to the device before flashing your application.
-- When you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
- On Series 1 devices (EFR32xG1x), both first stage and second stage bootloaders have to be flashed. This can be done at once by flashing the *-combined.s37* file found in the bootloader project after building the project.
-- For more information, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
-Before programming the radio board mounted on the mainboard, make sure the power supply switch the AEM position (right side) as shown below.
+- On Series 2 devices SoC example projects require a *Bluetooth Apploader OTA DFU* type bootloader by default. This bootloader needs a lot of flash space and does not fit into the regular bootloader area, hence the application start address must be shifted. This shift is automatically done by the *Apploader Support for Applications* software component, which is installed by default. If you want to use any other bootloader type, you should remove this software component in order to shift the application start address back to the end of the regular bootloader area. Note, that in this case you cannot do OTA DFU with Apploader, but you can still implement application-level OTA DFU by installing the *Application OTA DFU* software component instead of *In-place OTA DFU*.
+
+For more information on bootloaders, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
+
+
+### Programming the Radio Board
+
+Before programming the radio board mounted on the mainboard, make sure the power supply switch is in the AEM position (right side) as shown below.
![Radio board power supply switch](readme_img0.png)
+
## Resources
[Bluetooth Documentation](https://docs.silabs.com/bluetooth/latest/)
diff --git a/app/bluetooth/documentation/example/soc_thermometer/readme.md b/app/bluetooth/documentation/example/soc_thermometer/readme.md
index 3d8bb61718..df4bcaccdf 100644
--- a/app/bluetooth/documentation/example/soc_thermometer/readme.md
+++ b/app/bluetooth/documentation/example/soc_thermometer/readme.md
@@ -2,6 +2,8 @@
This example implements the Health Thermometer service. It enables a peer device to connect and receive temperature values via Bluetooth. The reported values are measured by a temperature sensor located on the mainboard.
+> Note: this example expects a specific Gecko Bootloader to be present on your device. For details see the Troubleshooting section.
+
## Getting Started
To get started with Silicon Labs Bluetooth and Simplicity Studio, see [QSG169: Bluetooth SDK v3.x Quick Start Guide](https://www.silabs.com/documents/public/quick-start-guides/qsg169-bluetooth-sdk-v3x-quick-start-guide.pdf).
@@ -43,23 +45,41 @@ Alternatively, you can follow the steps below instead of steps 3-5 to use the He
## Troubleshooting
-Note that Software Example-based projects do not include a bootloader. However, they are configured to expect a bootloader to be present on the device. To get your application to work, either
-- flash a bootloader to the device or
-- uninstall the **OTA DFU** and **Bootloader Application Interface** software components.
+### Bootloader Issues
+
+Note that Example Projects do not include a bootloader. However, Bluetooth-based Example Projects expect a bootloader to be present on the device in order to support device firmware upgrade (DFU). To get your application to work, you should either
+- flash the proper bootloader or
+- remove the DFU functionality from the project.
+
+**If you do not wish to add a bootloader**, then remove the DFU functionality by uninstalling the *Bootloader Application Interface* software component -- and all of its dependants. This will automatically put your application code to the start address of the flash, which means that a bootloader is no longer needed, but also that you will not be able to upgrade your firmware.
+
+**If you want to add a bootloader**, then either
+- Create a bootloader project, build it and flash it to your device. Note that different projects expect different bootloaders:
+ - for NCP and RCP projects create a *BGAPI UART DFU* type bootloader
+ - for SoC projects on Series 1 devices create a *Bluetooth in-place OTA DFU* type bootloader or any *Internal Storage* type bootloader
+ - for SoC projects on Series 2 devices create a *Bluetooth Apploader OTA DFU* type bootloader
+
+- or run a precompiled Demo on your device from the Launcher view before flashing your application. Precompiled demos flash both bootloader and application images to the device. Flashing your own application image after the demo will overwrite the demo application but leave the bootloader in place.
+ - For NCP and RCP projects, flash the *Bluetooth - NCP* demo.
+ - For SoC projects, flash the *Bluetooth - SoC Thermometer* demo.
-To flash a bootloader, either create a bootloader project or run a precompiled **Demo** on your device from the Launcher view. Precompiled demos flash both bootloader and application images to the device. Then flash your own application image to overwrite the demo application but leave the bootloader in place.
+**Important Notes:**
+- when you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
-- To flash an OTA DFU-capable bootloader to the device, flash the **Bluetooth - SoC Thermometer** demo.
-- To flash a UART DFU-capable bootloader to the device, flash the **Bluetooth - NCP** demo.
-- For other bootloader types, create your own bootloader project and flash it to the device before flashing your application.
-- When you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
- On Series 1 devices (EFR32xG1x), both first stage and second stage bootloaders have to be flashed. This can be done at once by flashing the *-combined.s37* file found in the bootloader project after building the project.
-- For more information, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
-Before programming the radio board mounted on the mainboard, make sure the power supply switch the AEM position (right side) as shown below.
+- On Series 2 devices SoC example projects require a *Bluetooth Apploader OTA DFU* type bootloader by default. This bootloader needs a lot of flash space and does not fit into the regular bootloader area, hence the application start address must be shifted. This shift is automatically done by the *Apploader Support for Applications* software component, which is installed by default. If you want to use any other bootloader type, you should remove this software component in order to shift the application start address back to the end of the regular bootloader area. Note, that in this case you cannot do OTA DFU with Apploader, but you can still implement application-level OTA DFU by installing the *Application OTA DFU* software component instead of *In-place OTA DFU*.
+
+For more information on bootloaders, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
+
+
+### Programming the Radio Board
+
+Before programming the radio board mounted on the mainboard, make sure the power supply switch is in the AEM position (right side) as shown below.
![Radio board power supply switch](readme_img0.png)
+
## Resources
[Bluetooth Documentation](https://docs.silabs.com/bluetooth/latest/)
diff --git a/app/bluetooth/documentation/example/soc_thermometer_client/readme.md b/app/bluetooth/documentation/example/soc_thermometer_client/readme.md
index e2a10f35c5..ce1bdd9c82 100644
--- a/app/bluetooth/documentation/example/soc_thermometer_client/readme.md
+++ b/app/bluetooth/documentation/example/soc_thermometer_client/readme.md
@@ -2,6 +2,8 @@
This example demonstrates the operation of a client device in a multi-peripheral Bluetooth LE (BLE) topology. The Silicon Labs Bluetooth stack supports simultaneous connections for up to eight peripheral devices at one time. This example application illustrates how to handle simultaneous connection to four thermometer peripheral devices.
+> Note: this example expects a specific Gecko Bootloader to be present on your device. For details see the Troubleshooting section.
+
## Getting Started
To get started with Silicon Labs Bluetooth and Simplicity Studio, see [QSG169: Bluetooth SDK v3.x Quick Start Guide](https://www.silabs.com/documents/public/quick-start-guides/qsg169-bluetooth-sdk-v3x-quick-start-guide.pdf).
@@ -32,23 +34,41 @@ After programming the devices, open your terminal emulator and connect to your c
## Troubleshooting
-Note that Software Example-based projects do not include a bootloader. However, they are configured to expect a bootloader to be present on the device. To get your application to work, either
-- flash a bootloader to the device or
-- uninstall the **OTA DFU** and **Bootloader Application Interface** software components.
+### Bootloader Issues
+
+Note that Example Projects do not include a bootloader. However, Bluetooth-based Example Projects expect a bootloader to be present on the device in order to support device firmware upgrade (DFU). To get your application to work, you should either
+- flash the proper bootloader or
+- remove the DFU functionality from the project.
+
+**If you do not wish to add a bootloader**, then remove the DFU functionality by uninstalling the *Bootloader Application Interface* software component -- and all of its dependants. This will automatically put your application code to the start address of the flash, which means that a bootloader is no longer needed, but also that you will not be able to upgrade your firmware.
+
+**If you want to add a bootloader**, then either
+- Create a bootloader project, build it and flash it to your device. Note that different projects expect different bootloaders:
+ - for NCP and RCP projects create a *BGAPI UART DFU* type bootloader
+ - for SoC projects on Series 1 devices create a *Bluetooth in-place OTA DFU* type bootloader or any *Internal Storage* type bootloader
+ - for SoC projects on Series 2 devices create a *Bluetooth Apploader OTA DFU* type bootloader
+
+- or run a precompiled Demo on your device from the Launcher view before flashing your application. Precompiled demos flash both bootloader and application images to the device. Flashing your own application image after the demo will overwrite the demo application but leave the bootloader in place.
+ - For NCP and RCP projects, flash the *Bluetooth - NCP* demo.
+ - For SoC projects, flash the *Bluetooth - SoC Thermometer* demo.
-To flash a bootloader, either create a bootloader project or run a precompiled **Demo** on your device from the Launcher view. Precompiled demos flash both bootloader and application images to the device. Then flash your own application image to overwrite the demo application but leave the bootloader in place.
+**Important Notes:**
+- when you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
-- To flash an OTA DFU-capable bootloader to the device, flash the **Bluetooth - SoC Thermometer** demo.
-- To flash a UART DFU-capable bootloader to the device, flash the **Bluetooth - NCP** demo.
-- For other bootloader types, create your own bootloader project and flash it to the device before flashing your application.
-- When you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
- On Series 1 devices (EFR32xG1x), both first stage and second stage bootloaders have to be flashed. This can be done at once by flashing the *-combined.s37* file found in the bootloader project after building the project.
-- For more information, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
-Before programming the radio board mounted on the mainboard, make sure the power supply switch the AEM position (right side) as shown below.
+- On Series 2 devices SoC example projects require a *Bluetooth Apploader OTA DFU* type bootloader by default. This bootloader needs a lot of flash space and does not fit into the regular bootloader area, hence the application start address must be shifted. This shift is automatically done by the *Apploader Support for Applications* software component, which is installed by default. If you want to use any other bootloader type, you should remove this software component in order to shift the application start address back to the end of the regular bootloader area. Note, that in this case you cannot do OTA DFU with Apploader, but you can still implement application-level OTA DFU by installing the *Application OTA DFU* software component instead of *In-place OTA DFU*.
+
+For more information on bootloaders, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
+
+
+### Programming the Radio Board
+
+Before programming the radio board mounted on the mainboard, make sure the power supply switch is in the AEM position (right side) as shown below.
![Radio board power supply switch](readme_img0.png)
+
## Resources
[Bluetooth Documentation](https://docs.silabs.com/bluetooth/latest/)
diff --git a/app/bluetooth/documentation/example/soc_thermometer_rtos/readme.md b/app/bluetooth/documentation/example/soc_thermometer_rtos/readme.md
index 5c995b7992..a7af1f33aa 100644
--- a/app/bluetooth/documentation/example/soc_thermometer_rtos/readme.md
+++ b/app/bluetooth/documentation/example/soc_thermometer_rtos/readme.md
@@ -2,6 +2,8 @@
This example application demonstrates the integration of a Real Time Operating System (RTOS) into Bluetooth applications. RTOS is added to the **Bluetooth - SoC Thermometer** example.
+> Note: this example expects a specific Gecko Bootloader to be present on your device. For details see the Troubleshooting section.
+
## Getting Started
To get started with Silicon Labs Bluetooth and Simplicity Studio, see [QSG169: Bluetooth SDK v3.x Quick Start Guide](https://www.silabs.com/documents/public/quick-start-guides/qsg169-bluetooth-sdk-v3x-quick-start-guide.pdf).
@@ -20,23 +22,41 @@ To learn more about RTOS integration into Bluetooth projects, see [AN1260: Integ
## Troubleshooting
-Note that Software Example-based projects do not include a bootloader. However, they are configured to expect a bootloader to be present on the device. To get your application to work, either
-- flash a bootloader to the device or
-- uninstall the **OTA DFU** and **Bootloader Application Interface** software components.
+### Bootloader Issues
+
+Note that Example Projects do not include a bootloader. However, Bluetooth-based Example Projects expect a bootloader to be present on the device in order to support device firmware upgrade (DFU). To get your application to work, you should either
+- flash the proper bootloader or
+- remove the DFU functionality from the project.
+
+**If you do not wish to add a bootloader**, then remove the DFU functionality by uninstalling the *Bootloader Application Interface* software component -- and all of its dependants. This will automatically put your application code to the start address of the flash, which means that a bootloader is no longer needed, but also that you will not be able to upgrade your firmware.
+
+**If you want to add a bootloader**, then either
+- Create a bootloader project, build it and flash it to your device. Note that different projects expect different bootloaders:
+ - for NCP and RCP projects create a *BGAPI UART DFU* type bootloader
+ - for SoC projects on Series 1 devices create a *Bluetooth in-place OTA DFU* type bootloader or any *Internal Storage* type bootloader
+ - for SoC projects on Series 2 devices create a *Bluetooth Apploader OTA DFU* type bootloader
+
+- or run a precompiled Demo on your device from the Launcher view before flashing your application. Precompiled demos flash both bootloader and application images to the device. Flashing your own application image after the demo will overwrite the demo application but leave the bootloader in place.
+ - For NCP and RCP projects, flash the *Bluetooth - NCP* demo.
+ - For SoC projects, flash the *Bluetooth - SoC Thermometer* demo.
-To flash a bootloader, either create a bootloader project or run a precompiled **Demo** on your device from the Launcher view. Precompiled demos flash both bootloader and application images to the device. Then flash your own application image to overwrite the demo application but leave the bootloader in place.
+**Important Notes:**
+- when you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
-- To flash an OTA DFU-capable bootloader to the device, flash the **Bluetooth - SoC Thermometer** demo.
-- To flash a UART DFU-capable bootloader to the device, flash the **Bluetooth - NCP** demo.
-- For other bootloader types, create your own bootloader project and flash it to the device before flashing your application.
-- When you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
- On Series 1 devices (EFR32xG1x), both first stage and second stage bootloaders have to be flashed. This can be done at once by flashing the *-combined.s37* file found in the bootloader project after building the project.
-- For more information, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
-Before programming the radio board mounted on the mainboard, make sure the power supply switch the AEM position (right side) as shown below.
+- On Series 2 devices SoC example projects require a *Bluetooth Apploader OTA DFU* type bootloader by default. This bootloader needs a lot of flash space and does not fit into the regular bootloader area, hence the application start address must be shifted. This shift is automatically done by the *Apploader Support for Applications* software component, which is installed by default. If you want to use any other bootloader type, you should remove this software component in order to shift the application start address back to the end of the regular bootloader area. Note, that in this case you cannot do OTA DFU with Apploader, but you can still implement application-level OTA DFU by installing the *Application OTA DFU* software component instead of *In-place OTA DFU*.
+
+For more information on bootloaders, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
+
+
+### Programming the Radio Board
+
+Before programming the radio board mounted on the mainboard, make sure the power supply switch is in the AEM position (right side) as shown below.
![Radio board power supply switch](readme_img0.png)
+
## Resources
[Bluetooth Documentation](https://docs.silabs.com/bluetooth/latest/)
diff --git a/app/bluetooth/documentation/example/soc_throughput/readme.md b/app/bluetooth/documentation/example/soc_throughput/readme.md
index 96fb0ac4fc..b9d0066e6e 100644
--- a/app/bluetooth/documentation/example/soc_throughput/readme.md
+++ b/app/bluetooth/documentation/example/soc_throughput/readme.md
@@ -2,6 +2,8 @@
This example allows measuring data throughput between EFR32 devices as well as between an EFR32 and a smartphone running the EFR Connect mobile app.
+> Note: this example expects a specific Gecko Bootloader to be present on your device. For details see the Troubleshooting section.
+
## Getting started
To get started with Silicon Labs Bluetooth and Simplicity Studio, see [QSG169: Bluetooth SDK v3.x Quick Start Guide](https://www.silabs.com/documents/public/quick-start-guides/qsg169-bluetooth-sdk-v3x-quick-start-guide.pdf).
@@ -86,23 +88,41 @@ On devices without display, the CLI is used for printing a virtual display which
## Troubleshooting
-Note that Software Example-based projects do not include a bootloader. However, they are configured to expect a bootloader to be present on the device. To get your application to work, either
-- flash a bootloader to the device or
-- uninstall the **OTA DFU** and **Bootloader Application Interface** software components.
+### Bootloader Issues
+
+Note that Example Projects do not include a bootloader. However, Bluetooth-based Example Projects expect a bootloader to be present on the device in order to support device firmware upgrade (DFU). To get your application to work, you should either
+- flash the proper bootloader or
+- remove the DFU functionality from the project.
+
+**If you do not wish to add a bootloader**, then remove the DFU functionality by uninstalling the *Bootloader Application Interface* software component -- and all of its dependants. This will automatically put your application code to the start address of the flash, which means that a bootloader is no longer needed, but also that you will not be able to upgrade your firmware.
+
+**If you want to add a bootloader**, then either
+- Create a bootloader project, build it and flash it to your device. Note that different projects expect different bootloaders:
+ - for NCP and RCP projects create a *BGAPI UART DFU* type bootloader
+ - for SoC projects on Series 1 devices create a *Bluetooth in-place OTA DFU* type bootloader or any *Internal Storage* type bootloader
+ - for SoC projects on Series 2 devices create a *Bluetooth Apploader OTA DFU* type bootloader
+
+- or run a precompiled Demo on your device from the Launcher view before flashing your application. Precompiled demos flash both bootloader and application images to the device. Flashing your own application image after the demo will overwrite the demo application but leave the bootloader in place.
+ - For NCP and RCP projects, flash the *Bluetooth - NCP* demo.
+ - For SoC projects, flash the *Bluetooth - SoC Thermometer* demo.
-To flash a bootloader, either create a bootloader project or run a precompiled **Demo** on your device from the Launcher view. Precompiled demos flash both bootloader and application images to the device. Then flash your own application image to overwrite the demo application but leave the bootloader in place.
+**Important Notes:**
+- when you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
-- To flash an OTA DFU-capable bootloader to the device, flash the **Bluetooth - SoC Thermometer** demo.
-- To flash a UART DFU-capable bootloader to the device, flash the **Bluetooth - NCP** demo.
-- For other bootloader types, create your own bootloader project and flash it to the device before flashing your application.
-- When you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
- On Series 1 devices (EFR32xG1x), both first stage and second stage bootloaders have to be flashed. This can be done at once by flashing the *-combined.s37* file found in the bootloader project after building the project.
-- For more information, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
-Before programming the radio board mounted on the mainboard, make sure the power supply switch the AEM position (right side) as shown below.
+- On Series 2 devices SoC example projects require a *Bluetooth Apploader OTA DFU* type bootloader by default. This bootloader needs a lot of flash space and does not fit into the regular bootloader area, hence the application start address must be shifted. This shift is automatically done by the *Apploader Support for Applications* software component, which is installed by default. If you want to use any other bootloader type, you should remove this software component in order to shift the application start address back to the end of the regular bootloader area. Note, that in this case you cannot do OTA DFU with Apploader, but you can still implement application-level OTA DFU by installing the *Application OTA DFU* software component instead of *In-place OTA DFU*.
+
+For more information on bootloaders, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
+
+
+### Programming the Radio Board
+
+Before programming the radio board mounted on the mainboard, make sure the power supply switch is in the AEM position (right side) as shown below.
![Radio board power supply switch](readme_img0.png)
+
## Resources
[Bluetooth Documentation](https://docs.silabs.com/bluetooth/latest/)
diff --git a/app/bluetooth/documentation/example/soc_thunderboard/readme.md b/app/bluetooth/documentation/example/soc_thunderboard/readme.md
index 9c8da4106e..169bd87866 100644
--- a/app/bluetooth/documentation/example/soc_thunderboard/readme.md
+++ b/app/bluetooth/documentation/example/soc_thunderboard/readme.md
@@ -2,6 +2,8 @@
This example collects and processes sensor data from the Thunderboard Sense 2 or the Thunderboard EFR32BG22 board, and gives immediate graphical feedback through the Thunderboard iOS/Android application.
+> Note: this example expects a specific Gecko Bootloader to be present on your device. For details see the Troubleshooting section.
+
## Getting Started
To get started with Silicon Labs Bluetooth and Simplicity Studio, see [QSG169: Bluetooth SDK v3.x Quick Start Guide](https://www.silabs.com/documents/public/quick-start-guides/qsg169-bluetooth-sdk-v3x-quick-start-guide.pdf).
@@ -49,23 +51,41 @@ Additional functionality can be added to the empty app_process_action function.
## Troubleshooting
-Note that Software Example-based projects do not include a bootloader. However, they are configured to expect a bootloader to be present on the device. To get your application to work, either
-- flash a bootloader to the device or
-- uninstall the **OTA DFU** and **Bootloader Application Interface** software components.
+### Bootloader Issues
+
+Note that Example Projects do not include a bootloader. However, Bluetooth-based Example Projects expect a bootloader to be present on the device in order to support device firmware upgrade (DFU). To get your application to work, you should either
+- flash the proper bootloader or
+- remove the DFU functionality from the project.
+
+**If you do not wish to add a bootloader**, then remove the DFU functionality by uninstalling the *Bootloader Application Interface* software component -- and all of its dependants. This will automatically put your application code to the start address of the flash, which means that a bootloader is no longer needed, but also that you will not be able to upgrade your firmware.
+
+**If you want to add a bootloader**, then either
+- Create a bootloader project, build it and flash it to your device. Note that different projects expect different bootloaders:
+ - for NCP and RCP projects create a *BGAPI UART DFU* type bootloader
+ - for SoC projects on Series 1 devices create a *Bluetooth in-place OTA DFU* type bootloader or any *Internal Storage* type bootloader
+ - for SoC projects on Series 2 devices create a *Bluetooth Apploader OTA DFU* type bootloader
+
+- or run a precompiled Demo on your device from the Launcher view before flashing your application. Precompiled demos flash both bootloader and application images to the device. Flashing your own application image after the demo will overwrite the demo application but leave the bootloader in place.
+ - For NCP and RCP projects, flash the *Bluetooth - NCP* demo.
+ - For SoC projects, flash the *Bluetooth - SoC Thermometer* demo.
-To flash a bootloader, either create a bootloader project or run a precompiled **Demo** on your device from the Launcher view. Precompiled demos flash both bootloader and application images to the device. Then flash your own application image to overwrite the demo application but leave the bootloader in place.
+**Important Notes:**
+- when you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
-- To flash an OTA DFU-capable bootloader to the device, flash the **Bluetooth - SoC Thermometer** demo.
-- To flash a UART DFU-capable bootloader to the device, flash the **Bluetooth - NCP** demo.
-- For other bootloader types, create your own bootloader project and flash it to the device before flashing your application.
-- When you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
- On Series 1 devices (EFR32xG1x), both first stage and second stage bootloaders have to be flashed. This can be done at once by flashing the *-combined.s37* file found in the bootloader project after building the project.
-- For more information, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
-Before programming the radio board mounted on the mainboard, make sure the power supply switch the AEM position (right side) as shown below.
+- On Series 2 devices SoC example projects require a *Bluetooth Apploader OTA DFU* type bootloader by default. This bootloader needs a lot of flash space and does not fit into the regular bootloader area, hence the application start address must be shifted. This shift is automatically done by the *Apploader Support for Applications* software component, which is installed by default. If you want to use any other bootloader type, you should remove this software component in order to shift the application start address back to the end of the regular bootloader area. Note, that in this case you cannot do OTA DFU with Apploader, but you can still implement application-level OTA DFU by installing the *Application OTA DFU* software component instead of *In-place OTA DFU*.
+
+For more information on bootloaders, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
+
+
+### Programming the Radio Board
+
+Before programming the radio board mounted on the mainboard, make sure the power supply switch is in the AEM position (right side) as shown below.
![Radio board power supply switch](readme_img0.png)
+
## Resources
[Bluetooth Documentation](https://docs.silabs.com/bluetooth/latest/)
diff --git a/app/bluetooth/documentation/example/soc_voice/readme.md b/app/bluetooth/documentation/example/soc_voice/readme.md
index 3f96e6d99c..a51c17eab5 100644
--- a/app/bluetooth/documentation/example/soc_voice/readme.md
+++ b/app/bluetooth/documentation/example/soc_voice/readme.md
@@ -2,6 +2,8 @@
This is a Voice over Bluetooth Low Energy example. It is supported by a Thunderboard Sense 2 board and demonstrates how to send voice data over GATT, which is acquired from the on-board microphone.
+> Note: this example expects a specific Gecko Bootloader to be present on your device. For details see the Troubleshooting section.
+
## Getting started
To get started with Silicon Labs Bluetooth and Simplicity Studio, see [QSG169: Bluetooth SDK v3.x Quick Start Guide](https://www.silabs.com/documents/public/quick-start-guides/qsg169-bluetooth-sdk-v3x-quick-start-guide.pdf).
@@ -81,23 +83,41 @@ The handling of the microphone, the encoding, buffering and filtering can be fou
## Troubleshooting
-Note that Software Example-based projects do not include a bootloader. However, they are configured to expect a bootloader to be present on the device. To get your application to work, either
-- flash a bootloader to the device or
-- uninstall the **OTA DFU** and **Bootloader Application Interface** software components.
+### Bootloader Issues
+
+Note that Example Projects do not include a bootloader. However, Bluetooth-based Example Projects expect a bootloader to be present on the device in order to support device firmware upgrade (DFU). To get your application to work, you should either
+- flash the proper bootloader or
+- remove the DFU functionality from the project.
+
+**If you do not wish to add a bootloader**, then remove the DFU functionality by uninstalling the *Bootloader Application Interface* software component -- and all of its dependants. This will automatically put your application code to the start address of the flash, which means that a bootloader is no longer needed, but also that you will not be able to upgrade your firmware.
+
+**If you want to add a bootloader**, then either
+- Create a bootloader project, build it and flash it to your device. Note that different projects expect different bootloaders:
+ - for NCP and RCP projects create a *BGAPI UART DFU* type bootloader
+ - for SoC projects on Series 1 devices create a *Bluetooth in-place OTA DFU* type bootloader or any *Internal Storage* type bootloader
+ - for SoC projects on Series 2 devices create a *Bluetooth Apploader OTA DFU* type bootloader
+
+- or run a precompiled Demo on your device from the Launcher view before flashing your application. Precompiled demos flash both bootloader and application images to the device. Flashing your own application image after the demo will overwrite the demo application but leave the bootloader in place.
+ - For NCP and RCP projects, flash the *Bluetooth - NCP* demo.
+ - For SoC projects, flash the *Bluetooth - SoC Thermometer* demo.
-To flash a bootloader, either create a bootloader project or run a precompiled **Demo** on your device from the Launcher view. Precompiled demos flash both bootloader and application images to the device. Then flash your own application image to overwrite the demo application but leave the bootloader in place.
+**Important Notes:**
+- when you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
-- To flash an OTA DFU-capable bootloader to the device, flash the **Bluetooth - SoC Thermometer** demo.
-- To flash a UART DFU-capable bootloader to the device, flash the **Bluetooth - NCP** demo.
-- For other bootloader types, create your own bootloader project and flash it to the device before flashing your application.
-- When you flash your application image to the device, use the *.hex* or *.s37* output file. Flashing *.bin* files may overwrite (erase) the bootloader.
- On Series 1 devices (EFR32xG1x), both first stage and second stage bootloaders have to be flashed. This can be done at once by flashing the *-combined.s37* file found in the bootloader project after building the project.
-- For more information, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
-Before programming the radio board mounted on the mainboard, make sure the power supply switch the AEM position (right side) as shown below.
+- On Series 2 devices SoC example projects require a *Bluetooth Apploader OTA DFU* type bootloader by default. This bootloader needs a lot of flash space and does not fit into the regular bootloader area, hence the application start address must be shifted. This shift is automatically done by the *Apploader Support for Applications* software component, which is installed by default. If you want to use any other bootloader type, you should remove this software component in order to shift the application start address back to the end of the regular bootloader area. Note, that in this case you cannot do OTA DFU with Apploader, but you can still implement application-level OTA DFU by installing the *Application OTA DFU* software component instead of *In-place OTA DFU*.
+
+For more information on bootloaders, see [UG103.6: Bootloader Fundamentals](https://www.silabs.com/documents/public/user-guides/ug103-06-fundamentals-bootloading.pdf) and [UG489: Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://cn.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf).
+
+
+### Programming the Radio Board
+
+Before programming the radio board mounted on the mainboard, make sure the power supply switch is in the AEM position (right side) as shown below.
![Radio board power supply switch](readme_img0.png)
+
## Resources
[Bluetooth Documentation](https://docs.silabs.com/bluetooth/latest/)
diff --git a/app/bluetooth/documentation/slBluetooth_docContent.xml b/app/bluetooth/documentation/slBluetooth_docContent.xml
index 442a330286..41dcc3aba6 100644
--- a/app/bluetooth/documentation/slBluetooth_docContent.xml
+++ b/app/bluetooth/documentation/slBluetooth_docContent.xml
@@ -1,373 +1,373 @@
-
-
+
+
+ Includes detailed information on using the Gecko Bootloader with Silicon Labs Bluetooth applications. It supplements the general Gecko Bootloader implementation information provided in UG489: Silicon Labs Gecko Bootloader User's Guide.
- Includes detailed information on using the Gecko Bootloader with Silicon Labs Bluetooth applications. It supplements the general Gecko Bootloader implementation information provided in UG489: Silicon Labs Gecko Bootloader User's Guide.
-
+
+ Describes the Wi-Fi impact on Bluetooth and methods to improve Bluetooth coexistence with Wi-Fi. Explains design considerations to improve coexistence without direct interaction between Bluetooth and Wi-Fi radios. These techniques are applicable to the EFR32MGx and EFR32BGx series. Discusses the Silicon Labs Packet Traffic Arbitration (PTA) support to coordinate 2.4GHz RF traffic for co-located Bluetooth and Wi-Fi radios.
- Describes the Wi-Fi impact on Bluetooth and methods to improve Bluetooth coexistence with Wi-Fi. Explains design considerations to improve coexistence without direct interaction between Bluetooth and Wi-Fi radios. These techniques are applicable to the EFR32MGx and EFR32BGx series. Discusses the Silicon Labs Packet Traffic Arbitration (PTA) support to coordinate 2.4GHz RF traffic for co-located Bluetooth and Wi-Fi radios.
-
+
+ Explains how NVM3 can be used as non-volatile data storage in various protocol implementations.
- Explains how NVM3 can be used as non-volatile data storage in various protocol implementations.
-
+
+ Describes how to lock and unlock the debug access of EFR32 Gecko Series 2 devices. Many aspects of the debug access, including the secure debug unlock are described. The Debug Challenge Interface (DCI) and Secure Engine (SE) Mailbox Interface for locking and unlocking debug access are also included.
- Describes how to lock and unlock the debug access of EFR32 Gecko Series 2 devices. Many aspects of the debug access, including the secure debug unlock are described. The Debug Challenge Interface (DCI) and Secure Engine (SE) Mailbox Interface for locking and unlocking debug access are also included.
-
+
+ Contains detailed information on configuring and using the Secure Boot with hardware Root of Trust and Secure Loader on Series 2 devices, including how to provision the signing key. This is a companion document to UG489: Silicon Labs Gecko Bootloader User's Guide.
- Contains detailed information on configuring and using the Secure Boot with hardware Root of Trust and Secure Loader on Series 2 devices, including how to provision the signing key. This is a companion document to UG489: Silicon Labs Gecko Bootloader User's Guide.
-
+
+ Details on programming, provisioning, and configuring Series 2 devices in production environments. Covers Secure Engine Subsystem of Series 2 devices, which runs easily upgradeable Secure Engine (SE) or Virtual Secure Engine (VSE) firmware.
- Details on programming, provisioning, and configuring Series 2 devices in production environments. Covers Secure Engine Subsystem of Series 2 devices, which runs easily upgradeable Secure Engine (SE) or Virtual Secure Engine (VSE) firmware.
-
+
+ Describes how to measure the power consumption of EFR32BG devices running the Bluetooth i-Beacon example. For general instructions, see AN969: Measuring Power Consumption in Wireless Gecko Devices, available on silabs.com.
- Describes how to measure the power consumption of EFR32BG devices running the Bluetooth i-Beacon example. For general instructions, see AN969: Measuring Power Consumption in Wireless Gecko Devices, available on silabs.com.
-
+
+ How to program, provision, and configure the anti-tamper module on EFR32 Series 2 devices with Secure Vault.
- How to program, provision, and configure the anti-tamper module on EFR32 Series 2 devices with Secure Vault.
-
+
+ Describes how to configure the NCP target and how to program the NCP host when using the Bluetooth Stack in Network Co-Processor mode
- Describes how to configure the NCP target and how to program the NCP host when using the Bluetooth Stack in Network Co-Processor mode
-
+
+ Describes how to integrate a v3.x Silicon Labs Bluetooth application with an RTOS, and demonstrate how a time- and event-driven application can be run in parallel with the Bluetooth stack.
- Describes how to integrate a v3.x Silicon Labs Bluetooth application with an RTOS, and demonstrate how a time- and event-driven application can be run in parallel with the Bluetooth stack.
-
+
+ Reviews performing radio frequency physical layer evaluation with EFR32BG SoCs and BGM modules using the Direct Test Mode protocol in Bluetooth SDK v3.x.
- Reviews performing radio frequency physical layer evaluation with EFR32BG SoCs and BGM modules using the Direct Test Mode protocol in Bluetooth SDK v3.x.
-
+
+ How to authenticate an EFR32 Series 2 device with Secure Vault, using secure device certificates and signatures.
- How to authenticate an EFR32 Series 2 device with Secure Vault, using secure device certificates and signatures.
-
+
+ Provides details on how to develop a dynamic multiprotocol application running Bluetooth and a proprietary protocol on RAIL in GSDK v3.x.
- Provides details on how to develop a dynamic multiprotocol application running Bluetooth and a proprietary protocol on RAIL in GSDK v3.x.
-
+
+ How to securely "wrap" keys in EFR32 Series 2 devices with Secure Vault, so they can be stored in non-volatile storage.
- How to securely "wrap" keys in EFR32 Series 2 devices with Secure Vault, so they can be stored in non-volatile storage.
-
+
+ Describes the sample applications provided to demonstrate the directing finding capabilities of Bluetooth 5.1. Angle of Arrival (AoA) estimation is demonstrated with the use of Silicon Labs' Real Time Locating (RTL) library. These techniques are applicable to the EFR32MGx and EFR32BGx series.
- Describes the sample applications provided to demonstrate the directing finding capabilities of Bluetooth 5.1. Angle of Arrival (AoA) estimation is demonstrated with the use of Silicon Labs' Real Time Locating (RTL) library. These techniques are applicable to the EFR32MGx and EFR32BGx series.
-
+
+ Bluetooth 5.1 makes it possible to send Constant Tone Extensions (CTEs) in Bluetooth packets on which phase measurements can be done. This guide is for those implementing custom applications that take advantage of phase measurement and antenna switching capabilites.
- Bluetooth 5.1 makes it possible to send Constant Tone Extensions (CTEs) in Bluetooth packets on which phase measurements can be done. This guide is for those implementing custom applications that take advantage of phase measurement and antenna switching capabilites.
-
+
+ Provides details on designing Bluetooth Low Energy applications with security and privacy in mind.
- Provides details on designing Bluetooth Low Energy applications with security and privacy in mind.
-
+
+ Describes how to provision and configure Series 2 devices through the DCI and SWD.
- Describes how to provision and configure Series 2 devices through the DCI and SWD.
-
+
+ Includes the results of the interoperability testing of Silicon Labs' ICs and Bluetooth Low Energy stack with Android and iOS smart phones.
- Includes the results of the interoperability testing of Silicon Labs' ICs and Bluetooth Low Energy stack with Android and iOS smart phones.
-
+
+ Describes how to integrate crypto functionality into applications using PSA Crypto compared to Mbed TLS.
- Describes how to integrate crypto functionality into applications using PSA Crypto compared to Mbed TLS.
-
+
+ Describes using Simplicity Studio 5's Network Analyzer to debug Bluetooth Mesh and Low Energy applications. It can be read jointly with AN958: Debugging and Programming Interfaces for Customer Designs for more information on using Packet Trace Interface with custom hardware.
- Describes using Simplicity Studio 5's Network Analyzer to debug Bluetooth Mesh and Low Energy applications. It can be read jointly with AN958: Debugging and Programming Interfaces for Customer Designs for more information on using Packet Trace Interface with custom hardware.
-
+
+ Gecko Bootloader v2.x, introduced in GSDK 4.0, contains a number of changes compared to Gecko Bootloader v1.x. This document describes the differences between the versions, including how to configure the new Gecko Bootloader in Simplicity Studio 5.
- Gecko Bootloader v2.x, introduced in GSDK 4.0, contains a number of changes compared to Gecko Bootloader v1.x. This document describes the differences between the versions, including how to configure the new Gecko Bootloader in Simplicity Studio 5.
-
+
+ Gives a short overview of the standard Host Controller Interface (HCI) and how to use it with a Silicon Labs Bluetooth LE controller.
- Gives a short overview of the standard Host Controller Interface (HCI) and how to use it with a Silicon Labs Bluetooth LE controller.
-
+
+ Describes how to run any combination of Zigbee EmberZNet, OpenThread, and Bluetooth networking stacks on a Linux host processor, interfacing with a single EFR32 Radio Co-processor (RCP) with multiprotocol and multi-PAN support, as well as how to run the Zigbee stack on the EFR32 as a network co-processor (NCP) alongside the OpenThread RCP.
- Describes how to run any combination of Zigbee EmberZNet, OpenThread, and Bluetooth networking stacks on a Linux host processor, interfacing with a single EFR32 Radio Co-processor (RCP) with multiprotocol and multi-PAN support.
-
+
+ Summarizes Amazon FreeRTOS components and sample applications, and explains how to use the examples to communicate with the Amazon Web Services (AWS) cloud with a smart phone app.
- Summarizes Amazon FreeRTOS components and sample applications, and explains how to use the examples to communicate with the Amazon Web Services (AWS) cloud with a smart phone app.
-
+
+ Describes how to exploit the different features of Bluetooth technology to achieve the minimum possible energy consumption for a given use case.
- Describes how to exploit the different features of Bluetooth technology to achieve the minimum possible energy consumption for a given use case.
-
+
+ Provides an overview and hyperlinks to all packaged documentation.
- Provides an overview and hyperlinks to all packaged documentation.
-
+
+ Describes the differences between using Bluetooth SDK v2.x in Simplicity Studio 4 and using Bluetooth SDK v3.x in Simplicity Studio 5. Outlines the steps needed to migrate a v2.x project to v3.x.
- Describes the differences between using Bluetooth SDK v2.x in Simplicity Studio 4 and using Bluetooth SDK v3.x in Simplicity Studio 5. Outlines the steps needed to migrate a v2.x project to v3.x.
-
+
+ Describes using the Simplicity Studio 5 IDE and tools for application development with Bluetooth SDK v3.x.
- Describes using the Simplicity Studio 5 IDE and tools for application development with Bluetooth SDK v3.x.
-
+
+ Describes the software components provided by Silicon Labs to support Direction Finding (DF) and provides instructions on how to start developing your own application.
- Describes the software components provided by Silicon Labs to support Direction Finding (DF) and provides instructions on how to start developing your own application.
-
+
+ Contains a comprehensive list of APIs used to interface to the Silicon Labs Bluetooth Real-Time Locating Library.
- Contains a comprehensive list of APIs used to interface to the Silicon Labs Bluetooth Real-Time Locating Library.
-
+
+ Contains a comprehensive list of APIs used to interface to the Silicon Labs Bluetooth stack.
- Contains a comprehensive list of APIs used to interface to the Silicon Labs Bluetooth stack.
-
+
+ Lists compatibility requirements and sources for all software components in the development environment. Discusses the latest changes to the Silicon Labs Bluetooth SDK and associated utilities, including added/deleted/deprecated features/API, and lists fixed and known issues.
- Lists compatibility requirements and sources for all software components in the development environment. Discusses the latest changes to the Silicon Labs Bluetooth SDK and associated utilities, including added/deleted/deprecated features/API, and lists fixed and known issues.
-
+
+ Discusses the latest changes to the The Real-Time Locating (RTL) library, including added/deleted/deprecated APIs, and lists fixed and known issues.
- Discusses the latest changes to the The Real-Time Locating (RTL) library, including added/deleted/deprecated APIs, and lists fixed and known issues.
-
+
+ A detailed overview of the changes, additions, and fixes in the Gecko Platform components. The Gecko Platform includes EMLIB, EMDRV, RAIL Library, NVM3, and the component-based infrastructure.
- A detailed overview of the changes, additions, and fixes in the Gecko Platform components. The Gecko Platform includes EMLIB, EMDRV, RAIL Library, NVM3, and the component-based infrastructure.
-
+
+ Introduces the security concepts that must be considered when implementing an Internet of Things (IoT) system. Using the ioXt Alliance's eight security principles as a structure, it clearly delineates the solutions Silicon Labs provides to support endpoint security and what you must do outside of the Silicon Labs framework.
- Introduces the security concepts that must be considered when implementing an Internet of Things (IoT) system. Using the ioXt Alliance's eight security principles as a structure, it clearly delineates the solutions Silicon Labs provides to support endpoint security and what you must do outside of the Silicon Labs framework.
-
+
+ Introduces bootloading for Silicon Labs networking devices. Discusses the Gecko Bootloader as well as legacy Ember and Bluetooth bootloaders, and describes the file formats used by each.
- Introduces bootloading for Silicon Labs networking devices. Discusses the Gecko Bootloader as well as legacy Ember and Bluetooth bootloaders, and describes the file formats used by each.
-
+
+ Introduces non-volatile data storage using flash and the three different storage implementations offered for Silicon Labs microcontrollers and SoCs: Simulated EEPROM, PS Store, and NVM3.
- Introduces non-volatile data storage using flash and the three different storage implementations offered for Silicon Labs microcontrollers and SoCs: Simulated EEPROM, PS Store, and NVM3.
-
+
+ Offers an overview for those new to the Bluetooth low energy technology.
- Offers an overview for those new to the Bluetooth low energy technology.
-
+
+ Describes the four multiprotocol modes, discusses considerations when selecting protocols for multiprotocol implementations, and reviews the Radio Scheduler, a required component of a dynamic multiprotocol solution.
- Describes the four multiprotocol modes, discusses considerations when selecting protocols for multiprotocol implementations, and reviews the Radio Scheduler, a required component of a dynamic multiprotocol solution.
-
+
+ Describes methods to improve the coexistence of 2.4 GHz IEEE 802.11b/g/n Wi-Fi and other 2.4 GHz radios such as Bluetooth, Bluetooth Mesh, Bluetooth Low Energy, and IEEE 802.15.4-based radios such as Zigbee and OpenThread.
- Describes methods to improve the coexistence of 2.4 GHz IEEE 802.11b/g/n Wi-Fi and other 2.4 GHz radios such as Bluetooth, Bluetooth Mesh, Bluetooth Low Energy, and IEEE 802.15.4-based radios such as Zigbee and OpenThread.
-
+
+ Explains the basics of Bluetooth Angle of Arrival (AoA) and Angle of Departure (AoD) direction finding technologies and provides the theory behind estimating angle of arrival.
- Explains the basics of Bluetooth Angle of Arrival (AoA) and Angle of Departure (AoD) direction finding technologies and provides the theory behind estimating angle of arrival.
-
+
+ Reviews using this XML-based mark-up language to describe the Bluetooth GATT database, configure access and security properties, and include the GATT database as part of the firmware.
- Reviews using this XML-based mark-up language to describe the Bluetooth GATT database, configure access and security properties, and include the GATT database as part of the firmware.
-
+
+ Describes how and when to use Simplicity Commander's Command-Line Interface.
- Describes how and when to use Simplicity Commander's Command-Line Interface.
-
+
+ Describes how to implement a dynamic multiprotocol solution.
- Describes how to implement a dynamic multiprotocol solution.
-
+
+ Covers the Bluetooth stack v3.x architecture, application development flow, using the MCU core and peripherals, stack configuration options, and stack resource usage.
- Covers the Bluetooth stack v3.x architecture, application development flow, using the MCU core and peripherals, stack configuration options, and stack resource usage.
-
+
+ Describes how to use the Simplicity Studio 5 GATT Configurator, an intuitive interface providing access to all the Profiles, Services, Characteristics, and Descriptors as defined in the Bluetooth specification.
- Describes how to use the Simplicity Studio 5 GATT Configurator, an intuitive interface providing access to all the Profiles, Services, Characteristics, and Descriptors as defined in the Bluetooth specification.
-
+
+ Describes the high-level implementation of the Silicon Labs Gecko Bootloader for EFR32 SoCs and NCPs, and provides information on how to get started using the Gecko Bootloader with Silicon Labs wireless protocol stacks in GSDK 4.0 and higher.
- Describes the high-level implementation of the Silicon Labs Gecko Bootloader for EFR32 SoCs and NCPs, and provides information on how to get started using the Gecko Bootloader with Silicon Labs wireless protocol stacks in GSDK 4.0 and higher.
-
+
+ The Bluetooth Direction Finding Tool Suite is meant to ease development with the Silicon Labs' RTL library. It provides multiple tools to configure the system, and also helps the development with analyzer tools that calculate many output parameters from the observed IQ samples.
- The Bluetooth Direction Finding Tool Suite is meant to ease development with the Silicon Labs' RTL library. It provides multiple tools to configure the system, and also helps the development with analyzer tools that calculate many output parameters from the observed IQ samples.
diff --git a/app/bluetooth/documentation/slBtMesh_docContent.xml b/app/bluetooth/documentation/slBtMesh_docContent.xml
index 50031c172c..e45753be64 100644
--- a/app/bluetooth/documentation/slBtMesh_docContent.xml
+++ b/app/bluetooth/documentation/slBtMesh_docContent.xml
@@ -1,308 +1,308 @@
-
-
+
+
+ Includes detailed information on using the Gecko Bootloader with Silicon Labs Bluetooth applications. It supplements the general Gecko Bootloader implementation information provided in UG489: Silicon Labs Gecko Bootloader User's Guide.
- Includes detailed information on using the Gecko Bootloader with Silicon Labs Bluetooth applications. It supplements the general Gecko Bootloader implementation information provided in UG489: Silicon Labs Gecko Bootloader User's Guide.
-
+
+ Describes the Wi-Fi impact on Bluetooth and methods to improve Bluetooth coexistence with Wi-Fi. Explains design considerations to improve coexistence without direct interaction between Bluetooth and Wi-Fi radios. These techniques are applicable to the EFR32MGx and EFR32BGx series. Discusses the Silicon Labs Packet Traffic Arbitration (PTA) support to coordinate 2.4GHz RF traffic for co-located Bluetooth and Wi-Fi radios.
- Describes the Wi-Fi impact on Bluetooth and methods to improve Bluetooth coexistence with Wi-Fi. Explains design considerations to improve coexistence without direct interaction between Bluetooth and Wi-Fi radios. These techniques are applicable to the EFR32MGx and EFR32BGx series. Discusses the Silicon Labs Packet Traffic Arbitration (PTA) support to coordinate 2.4GHz RF traffic for co-located Bluetooth and Wi-Fi radios.
-
+
+ Explains how NVM3 can be used as non-volatile data storage in various protocol implementations.
- Explains how NVM3 can be used as non-volatile data storage in various protocol implementations.
-
+
+ Details methods for testing Bluetooth mesh network performance; results are intended to provide guidance on design practices and principles as well as expected field performance results.
- Details methods for testing Bluetooth mesh network performance; results are intended to provide guidance on design practices and principles as well as expected field performance results.
-
+
+ Reviews the Zigbee, Thread, and Bluetooth mesh networks to evaluate their differences in performance and behavior.
- Reviews the Zigbee, Thread, and Bluetooth mesh networks to evaluate their differences in performance and behavior.
-
+
+ Describes how to lock and unlock the debug access of EFR32 Gecko Series 2 devices. Many aspects of the debug access, including the secure debug unlock are described. The Debug Challenge Interface (DCI) and Secure Engine (SE) Mailbox Interface for locking and unlocking debug access are also included.
- Describes how to lock and unlock the debug access of EFR32 Gecko Series 2 devices. Many aspects of the debug access, including the secure debug unlock are described. The Debug Challenge Interface (DCI) and Secure Engine (SE) Mailbox Interface for locking and unlocking debug access are also included.
-
+
+ Contains detailed information on configuring and using the Secure Boot with hardware Root of Trust and Secure Loader on Series 2 devices, including how to provision the signing key. This is a companion document to UG489: Silicon Labs Gecko Bootloader User's Guide.
- Contains detailed information on configuring and using the Secure Boot with hardware Root of Trust and Secure Loader on Series 2 devices, including how to provision the signing key. This is a companion document to UG489: Silicon Labs Gecko Bootloader User's Guide.
-
+
+ Details on programming, provisioning, and configuring Series 2 devices in production environments. Covers Secure Engine Subsystem of Series 2 devices, which runs easily upgradeable Secure Engine (SE) or Virtual Secure Engine (VSE) firmware.
- Details on programming, provisioning, and configuring Series 2 devices in production environments. Covers Secure Engine Subsystem of Series 2 devices, which runs easily upgradeable Secure Engine (SE) or Virtual Secure Engine (VSE) firmware.
-
+
+ How to program, provision, and configure the anti-tamper module on EFR32 Series 2 devices with Secure Vault.
- How to program, provision, and configure the anti-tamper module on EFR32 Series 2 devices with Secure Vault.
-
+
+ Describes how to configure the NCP target and how to program the NCP host when using the Bluetooth Stack in Network Co-Processor mode
- Describes how to configure the NCP target and how to program the NCP host when using the Bluetooth Stack in Network Co-Processor mode
-
+
+ Reviews performing radio frequency physical layer evaluation with EFR32BG SoCs and BGM modules using the Direct Test Mode protocol in Bluetooth SDK v3.x.
- Reviews performing radio frequency physical layer evaluation with EFR32BG SoCs and BGM modules using the Direct Test Mode protocol in Bluetooth SDK v3.x.
-
+
+ How to authenticate an EFR32 Series 2 device with Secure Vault, using secure device certificates and signatures.
- How to authenticate an EFR32 Series 2 device with Secure Vault, using secure device certificates and signatures.
-
+
+ How to securely "wrap" keys in EFR32 Series 2 devices with Secure Vault, so they can be stored in non-volatile storage.
- How to securely "wrap" keys in EFR32 Series 2 devices with Secure Vault, so they can be stored in non-volatile storage.
-
+
+ Describes the differences between using Bluetooth mesh SDK v1.x in Simplicity Studio 4 and using Bluetooth mesh SDK v2.x in Simplicity Studio 5. Outlines the steps needed to migrate a v1.x project to v2.x.
- Describes the differences between using Bluetooth mesh SDK v1.x in Simplicity Studio 4 and using Bluetooth mesh SDK v2.x in Simplicity Studio 5. Outlines the steps needed to migrate a v1.x project to v2.x.
-
+
+ Discusses the basics of Bluetooth mesh required to understand the Bluetooth mesh lighting example, and walks through key aspects of the application source code.
- Discusses the basics of Bluetooth mesh required to understand the Bluetooth mesh lighting example, and walks through key aspects of the application source code.
-
+
+ Discusses the basics of sensor models and describe the related sample applications in the SDK that create a wireless network of sensors and sensor clients using Bluetooth mesh technology.
- Discusses the basics of sensor models and describe the related sample applications in the SDK that create a wireless network of sensors and sensor clients using Bluetooth mesh technology.
-
+
+ Describes how to provision and configure Series 2 devices through the DCI and SWD.
- Describes how to provision and configure Series 2 devices through the DCI and SWD.
-
+
+ Includes the results of the interoperability testing of Silicon Labs' ICs and Bluetooth Mesh stack with Android and iOS smart phones.
- Includes the results of the interoperability testing of Silicon Labs' ICs and Bluetooth Mesh stack with Android and iOS smart phones.
-
+
+ Describes how to integrate crypto functionality into applications using PSA Crypto compared to Mbed TLS.
- Describes how to integrate crypto functionality into applications using PSA Crypto compared to Mbed TLS.
-
+
+ Describes Low Power Node (LPN) and Friend operation and the parameters related to power consumption. It also describes how to measure the power consumption of EFR32BG devices acting as Bluetooth mesh LPNs using the setup and procedures recommended in AN969: Measuring Power Consumption in Wireless Gecko Devices.
- Describes Low Power Node (LPN) and Friend operation and the parameters related to power consumption. It also describes how to measure the power consumption of EFR32BG devices acting as Bluetooth mesh LPNs using the setup and procedures recommended in AN969: Measuring Power Consumption in Wireless Gecko Devices.
-
+
+ Describes in detail how the Bluetooth mesh toplogy can influence network operation. Provides tips on how to tune your network and its nodes to achieve best performance.
- Describes in detail how the Bluetooth mesh toplogy can influence network operation. Provides tips on how to tune your network and its nodes to achieve best performance.
-
+
+ Describes using Simplicity Studio 5's Network Analyzer to debug Bluetooth Mesh and Low Energy applications. It can be read jointly with AN958: Debugging and Programming Interfaces for Customer Designs for more information on using Packet Trace Interface with custom hardware.
- Describes using Simplicity Studio 5's Network Analyzer to debug Bluetooth Mesh and Low Energy applications. It can be read jointly with AN958: Debugging and Programming Interfaces for Customer Designs for more information on using Packet Trace Interface with custom hardware.
-
+
+ Provides background information on the sequence number and IV index in a Bluetooth mesh network and the IV Update and IV Index Recovery procedures. It also discusses how to implement IV Update functionality in a Bluetooth mesh application.
- Provides background information on the sequence number and IV index in a Bluetooth mesh network and the IV Update and IV Index Recovery procedures. It also discusses how to implement IV Update functionality in a Bluetooth mesh application.
-
+
+ Gecko Bootloader v2.x, introduced in GSDK 4.0, contains a number of changes compared to Gecko Bootloader v1.x. This document describes the differences between the versions, including how to configure the new Gecko Bootloader in Simplicity Studio 5.
- Gecko Bootloader v2.x, introduced in GSDK 4.0, contains a number of changes compared to Gecko Bootloader v1.x. This document describes the differences between the versions, including how to configure the new Gecko Bootloader in Simplicity Studio 5.
-
+
+ The NCP Host Provisioner example demonstrates how to run a provisioner on a computer with a NCP node connected. The user can provision, configure, and reset other nodes through the NCP node.
- The NCP Host Provisioner example demonstrates how to run a provisioner on a computer with a NCP node connected. The user can provision, configure, and reset other nodes through the NCP node.
-
+
+ Provides an overview and hyperlinks to all packaged documentation.
- Provides an overview and hyperlinks to all packaged documentation.
-
+
+ Describes using the Simplicity Studio 5 IDE and tools for application development with Bluetooth Mesh SDK v2.x.
- Describes using the Simplicity Studio 5 IDE and tools for application development with Bluetooth Mesh SDK v2.x.
-
+
+ Contains a comprehensive list of APIs used to interface to the Silicon Labs Bluetooth Mesh stack.
- Contains a comprehensive list of APIs used to interface to the Silicon Labs Bluetooth Mesh stack.
-
+
+ A reference for those developing C-based applications for the Silicon Labs EFR32 products using the Silicon Labs Bluetooth mesh stack. A companion to UG434: Silicon Labs Bluetooth C Application Developers Guide for SDK v3.x containing content specific to Bluetooth mesh application development. Covers Bluetooth mesh stack architecture, application development flow, use and limitations of the MCU core and peripherals, stack configuration options, and stack resource usage.
- A reference for those developing C-based applications for the Silicon Labs EFR32 products using the Silicon Labs Bluetooth mesh stack. A companion to UG434: Silicon Labs Bluetooth C Application Developers Guide for SDK v3.x containing content specific to Bluetooth mesh application development. Covers Bluetooth mesh stack architecture, application development flow, use and limitations of the MCU core and peripherals, stack configuration options, and stack resource usage.
-
+
+ Lists compatibility requirements and sources for all software components in the development environment. Discusses the latest changes to the Silicon Labs Bluetooth mesh SDK and associated utilities, including added/deleted/deprecated features/API, and lists fixed and known issues.
- Lists compatibility requirements and sources for all software components in the development environment. Discusses the latest changes to the Silicon Labs Bluetooth mesh SDK and associated utilities, including added/deleted/deprecated features/API, and lists fixed and known issues.
-
+
+ A detailed overview of the changes, additions, and fixes in the Gecko Platform components. The Gecko Platform includes EMLIB, EMDRV, RAIL Library, NVM3, and the component-based infrastructure.
- A detailed overview of the changes, additions, and fixes in the Gecko Platform components. The Gecko Platform includes EMLIB, EMDRV, RAIL Library, NVM3, and the component-based infrastructure.
-
+
+ Introduces the security concepts that must be considered when implementing an Internet of Things (IoT) system. Using the ioXt Alliance's eight security principles as a structure, it clearly delineates the solutions Silicon Labs provides to support endpoint security and what you must do outside of the Silicon Labs framework.
- Introduces the security concepts that must be considered when implementing an Internet of Things (IoT) system. Using the ioXt Alliance's eight security principles as a structure, it clearly delineates the solutions Silicon Labs provides to support endpoint security and what you must do outside of the Silicon Labs framework.
-
+
+ Introduces bootloading for Silicon Labs networking devices. Discusses the Gecko Bootloader as well as legacy Ember and Bluetooth bootloaders, and describes the file formats used by each.
- Introduces bootloading for Silicon Labs networking devices. Discusses the Gecko Bootloader as well as legacy Ember and Bluetooth bootloaders, and describes the file formats used by each.
-
+
+ Introduces non-volatile data storage using flash and the three different storage implementations offered for Silicon Labs microcontrollers and SoCs: Simulated EEPROM, PS Store, and NVM3.
- Introduces non-volatile data storage using flash and the three different storage implementations offered for Silicon Labs microcontrollers and SoCs: Simulated EEPROM, PS Store, and NVM3.
-
+
+ Describes methods to improve the coexistence of 2.4 GHz IEEE 802.11b/g/n Wi-Fi and other 2.4 GHz radios such as Bluetooth, Bluetooth Mesh, Bluetooth Low Energy, and IEEE 802.15.4-based radios such as Zigbee and OpenThread.
- Describes methods to improve the coexistence of 2.4 GHz IEEE 802.11b/g/n Wi-Fi and other 2.4 GHz radios such as Bluetooth, Bluetooth Mesh, Bluetooth Low Energy, and IEEE 802.15.4-based radios such as Zigbee and OpenThread.
-
+
+ Reviews using this XML-based mark-up language to describe the Bluetooth GATT database, configure access and security properties, and include the GATT database as part of the firmware.
- Reviews using this XML-based mark-up language to describe the Bluetooth GATT database, configure access and security properties, and include the GATT database as part of the firmware.
-
+
+ Describes how and when to use Simplicity Commander's Command-Line Interface.
- Describes how and when to use Simplicity Commander's Command-Line Interface.
-
+
+ Describes how to use the Simplicity Studio 5 GATT Configurator, an intuitive interface providing access to all the Profiles, Services, Characteristics, and Descriptors as defined in the Bluetooth specification.
- Describes how to use the Simplicity Studio 5 GATT Configurator, an intuitive interface providing access to all the Profiles, Services, Characteristics, and Descriptors as defined in the Bluetooth specification.
-
+
+ Describes the components, stack, and DCD (Device Composition Data) configuration options for the Bluetooth Mesh v2.x SDK.
- Describes the components, stack, and DCD (Device Composition Data) configuration options for the Bluetooth Mesh v2.x SDK.
-
+
+ Describes the high-level implementation of the Silicon Labs Gecko Bootloader for EFR32 SoCs and NCPs, and provides information on how to get started using the Gecko Bootloader with Silicon Labs wireless protocol stacks in GSDK 4.0 and higher.
- Describes the high-level implementation of the Silicon Labs Gecko Bootloader for EFR32 SoCs and NCPs, and provides information on how to get started using the Gecko Bootloader with Silicon Labs wireless protocol stacks in GSDK 4.0 and higher.
diff --git a/app/bluetooth/esf.properties b/app/bluetooth/esf.properties
index 6e064ecf2c..0e26dddfd6 100644
--- a/app/bluetooth/esf.properties
+++ b/app/bluetooth/esf.properties
@@ -3,8 +3,8 @@ id=com.silabs.stack.ble
label=Bluetooth SDK
description=Bluetooth Software Development Kit
-version=4.0.0.0
-prop.subLabel=Bluetooth\\ 4.0.0
+version=4.1.0.0
+prop.subLabel=Bluetooth\\ 4.1.0
# Default compatibility of the BLE SDK
prop.boardCompatibility=.*
diff --git a/app/bluetooth/example/bt_aoa_soc_asset_tag/app.c b/app/bluetooth/example/bt_aoa_soc_asset_tag/app.c
index c18c8f5dd6..0cc34b3086 100644
--- a/app/bluetooth/example/bt_aoa_soc_asset_tag/app.c
+++ b/app/bluetooth/example/bt_aoa_soc_asset_tag/app.c
@@ -3,7 +3,7 @@
* @brief Core application logic.
*******************************************************************************
* # License
- * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
+ * Copyright 2022 Silicon Laboratories Inc. www.silabs.com
*******************************************************************************
*
* SPDX-License-Identifier: Zlib
@@ -28,7 +28,6 @@
*
******************************************************************************/
#include "em_common.h"
-#include "app_log.h"
#include "app_assert.h"
#include "sl_bluetooth.h"
#include "gatt_db.h"
@@ -81,13 +80,6 @@ void sl_bt_on_event(sl_bt_msg_t *evt)
// This event indicates the device has started and the radio is ready.
// Do not call any stack command before receiving this boot event!
case sl_bt_evt_system_boot_id:
- // Print boot message.
- app_log_info("Bluetooth stack booted: v%d.%d.%d-b%d\n",
- evt->data.evt_system_boot.major,
- evt->data.evt_system_boot.minor,
- evt->data.evt_system_boot.patch,
- evt->data.evt_system_boot.build);
-
// Extract unique ID from BT Address.
sc = sl_bt_system_get_identity_address(&address, &address_type);
app_assert_status(sc);
@@ -108,20 +100,11 @@ void sl_bt_on_event(sl_bt_msg_t *evt)
system_id);
app_assert_status(sc);
- app_log_info("Bluetooth %s address: %02X:%02X:%02X:%02X:%02X:%02X\n",
- address_type ? "static random" : "public device",
- address.addr[5],
- address.addr[4],
- address.addr[3],
- address.addr[2],
- address.addr[1],
- address.addr[0]);
-
// Create an advertising set.
sc = sl_bt_advertiser_create_set(&advertising_set_handle);
app_assert_status(sc);
- // Generate data for advertising
+ // Generate data for advertising.
sc = sl_bt_legacy_advertiser_generate_data(advertising_set_handle,
sl_bt_advertiser_general_discoverable);
app_assert_status(sc);
@@ -134,56 +117,33 @@ void sl_bt_on_event(sl_bt_msg_t *evt)
0, // adv. duration
0); // max. num. adv. events
app_assert_status(sc);
- // Start general advertising and enable connections.
+
+ // Enable connections.
sc = sl_bt_legacy_advertiser_start(advertising_set_handle,
sl_bt_advertiser_connectable_scannable);
app_assert_status(sc);
- app_log_info("Started advertising\n");
break;
// -------------------------------
// This event indicates that a new connection was opened.
case sl_bt_evt_connection_opened_id:
- app_log_info("Connection opened: %d\n", evt->data.evt_connection_opened.connection);
- app_log_info("Client address: %02X:%02X:%02X:%02X:%02X:%02X\n",
- evt->data.evt_connection_opened.address.addr[5],
- evt->data.evt_connection_opened.address.addr[4],
- evt->data.evt_connection_opened.address.addr[3],
- evt->data.evt_connection_opened.address.addr[2],
- evt->data.evt_connection_opened.address.addr[1],
- evt->data.evt_connection_opened.address.addr[0]);
connection_count++;
// Continue advertising if the stack allows further connections.
if (connection_count < SL_BT_CONFIG_MAX_CONNECTIONS) {
- // Generate data for advertising
- sc = sl_bt_legacy_advertiser_generate_data(advertising_set_handle,
- sl_bt_advertiser_general_discoverable);
- app_assert_status(sc);
-
sc = sl_bt_legacy_advertiser_start(advertising_set_handle,
sl_bt_advertiser_connectable_scannable);
app_assert_status(sc);
- app_log_info("Continue advertising\n");
}
break;
// -------------------------------
// This event indicates that a connection was closed.
case sl_bt_evt_connection_closed_id:
- app_log_info("Connection closed: %d\n",
- evt->data.evt_connection_closed.connection);
-
- // Generate data for advertising
- sc = sl_bt_legacy_advertiser_generate_data(advertising_set_handle,
- sl_bt_advertiser_general_discoverable);
- app_assert_status(sc);
-
if (connection_count >= SL_BT_CONFIG_MAX_CONNECTIONS) {
// Restart advertising after client has disconnected.
sc = sl_bt_legacy_advertiser_start(advertising_set_handle,
sl_bt_advertiser_connectable_scannable);
app_assert_status(sc);
- app_log_info("Restart advertising\n");
}
connection_count--;
break;
diff --git a/app/bluetooth/example/bt_aoa_soc_asset_tag/bt_aoa_soc_asset_tag.slcp b/app/bluetooth/example/bt_aoa_soc_asset_tag/bt_aoa_soc_asset_tag.slcp
index 2ed78bcca9..0aae81fed9 100644
--- a/app/bluetooth/example/bt_aoa_soc_asset_tag/bt_aoa_soc_asset_tag.slcp
+++ b/app/bluetooth/example/bt_aoa_soc_asset_tag/bt_aoa_soc_asset_tag.slcp
@@ -23,7 +23,6 @@ component:
- id: bluetooth_feature_connection
- id: bluetooth_feature_gatt
- id: bluetooth_feature_gatt_server
- - id: bluetooth_feature_scanner
- id: bluetooth_feature_sm
- id: bluetooth_feature_system
- id: in_place_ota_dfu
@@ -34,11 +33,6 @@ component:
- id: mpu
- id: gatt_service_cte
- id: gatt_service_cte_silabs
- - id: app_log
- - id: iostream_usart
- instance:
- - vcom
- - id: iostream_retarget_stdio
source:
- path: main.c
@@ -74,10 +68,6 @@ configuration:
value: "2752"
- name: SL_HEAP_SIZE
value: "9200"
- - name: SL_BOARD_ENABLE_VCOM
- value: "1"
- condition:
- - iostream_usart
- name: SL_PSA_KEY_USER_SLOT_COUNT
value: "0"
condition:
diff --git a/app/bluetooth/example/bt_ncp/bt_ncp.slcp b/app/bluetooth/example/bt_ncp/bt_ncp.slcp
index a560bf2841..821690820f 100644
--- a/app/bluetooth/example/bt_ncp/bt_ncp.slcp
+++ b/app/bluetooth/example/bt_ncp/bt_ncp.slcp
@@ -28,7 +28,8 @@ component:
- id: bluetooth_feature_gatt
- id: bluetooth_feature_gatt_server
- id: bluetooth_feature_nvm
- - id: bluetooth_feature_scanner
+ - id: bluetooth_feature_legacy_scanner
+ - id: bluetooth_feature_extended_scanner
- id: bluetooth_feature_sm
- id: bluetooth_feature_sync
- id: bluetooth_feature_system
diff --git a/app/bluetooth/example/bt_ncp/bt_ncp_xg1.slcp b/app/bluetooth/example/bt_ncp/bt_ncp_xg1.slcp
index d443d05ff0..135f0e7bd3 100644
--- a/app/bluetooth/example/bt_ncp/bt_ncp_xg1.slcp
+++ b/app/bluetooth/example/bt_ncp/bt_ncp_xg1.slcp
@@ -26,7 +26,7 @@ component:
- id: bluetooth_feature_gatt
- id: bluetooth_feature_gatt_server
- id: bluetooth_feature_nvm
- - id: bluetooth_feature_scanner
+ - id: bluetooth_feature_legacy_scanner
- id: bluetooth_feature_sm
- id: bluetooth_feature_sync
- id: bluetooth_feature_system
diff --git a/app/bluetooth/example/bt_rail_dmp_soc_empty/bt_rail_dmp_soc_empty_freertos.slcp b/app/bluetooth/example/bt_rail_dmp_soc_empty/bt_rail_dmp_soc_empty_freertos.slcp
index cfd368ce42..047a567061 100644
--- a/app/bluetooth/example/bt_rail_dmp_soc_empty/bt_rail_dmp_soc_empty_freertos.slcp
+++ b/app/bluetooth/example/bt_rail_dmp_soc_empty/bt_rail_dmp_soc_empty_freertos.slcp
@@ -24,9 +24,7 @@ component:
- id: gatt_configuration
- id: bluetooth_feature_legacy_advertiser
- id: bluetooth_feature_connection
- - id: bluetooth_feature_gatt
- id: bluetooth_feature_gatt_server
- - id: bluetooth_feature_scanner
- id: bluetooth_feature_sm
- id: bluetooth_feature_system
- id: bootloader_interface
diff --git a/app/bluetooth/example/bt_rail_dmp_soc_empty/bt_rail_dmp_soc_empty_micriumos.slcp b/app/bluetooth/example/bt_rail_dmp_soc_empty/bt_rail_dmp_soc_empty_micriumos.slcp
index c9159e35b3..6aaeebbb6c 100644
--- a/app/bluetooth/example/bt_rail_dmp_soc_empty/bt_rail_dmp_soc_empty_micriumos.slcp
+++ b/app/bluetooth/example/bt_rail_dmp_soc_empty/bt_rail_dmp_soc_empty_micriumos.slcp
@@ -24,9 +24,7 @@ component:
- id: gatt_configuration
- id: bluetooth_feature_legacy_advertiser
- id: bluetooth_feature_connection
- - id: bluetooth_feature_gatt
- id: bluetooth_feature_gatt_server
- - id: bluetooth_feature_scanner
- id: bluetooth_feature_sm
- id: bluetooth_feature_system
- id: bootloader_interface
diff --git a/app/bluetooth/example/bt_rail_dmp_soc_empty_std/bt_rail_dmp_soc_empty_std_freertos.slcp b/app/bluetooth/example/bt_rail_dmp_soc_empty_std/bt_rail_dmp_soc_empty_std_freertos.slcp
index f12ca4a3e3..1e152f1520 100644
--- a/app/bluetooth/example/bt_rail_dmp_soc_empty_std/bt_rail_dmp_soc_empty_std_freertos.slcp
+++ b/app/bluetooth/example/bt_rail_dmp_soc_empty_std/bt_rail_dmp_soc_empty_std_freertos.slcp
@@ -24,9 +24,7 @@ component:
- id: gatt_configuration
- id: bluetooth_feature_legacy_advertiser
- id: bluetooth_feature_connection
- - id: bluetooth_feature_gatt
- id: bluetooth_feature_gatt_server
- - id: bluetooth_feature_scanner
- id: bluetooth_feature_sm
- id: bluetooth_feature_system
- id: bootloader_interface
diff --git a/app/bluetooth/example/bt_rail_dmp_soc_empty_std/bt_rail_dmp_soc_empty_std_micriumos.slcp b/app/bluetooth/example/bt_rail_dmp_soc_empty_std/bt_rail_dmp_soc_empty_std_micriumos.slcp
index a57a1b98ec..027f6231b6 100644
--- a/app/bluetooth/example/bt_rail_dmp_soc_empty_std/bt_rail_dmp_soc_empty_std_micriumos.slcp
+++ b/app/bluetooth/example/bt_rail_dmp_soc_empty_std/bt_rail_dmp_soc_empty_std_micriumos.slcp
@@ -24,11 +24,9 @@ component:
- id: gatt_configuration
- id: bluetooth_feature_legacy_advertiser
- id: bluetooth_feature_connection
- - id: bluetooth_feature_gatt
- id: bluetooth_feature_gatt_server
- - id: bluetooth_feature_scanner
- - id: bluetooth_feature_sm
- id: bluetooth_feature_system
+ - id: bluetooth_feature_sm
- id: bootloader_interface
- id: mpu
- id: in_place_ota_dfu
diff --git a/app/bluetooth/example/bt_rail_dmp_soc_light/bt_rail_dmp_soc_light_freertos.slcp b/app/bluetooth/example/bt_rail_dmp_soc_light/bt_rail_dmp_soc_light_freertos.slcp
index 456d1928c2..cdde7f28d0 100644
--- a/app/bluetooth/example/bt_rail_dmp_soc_light/bt_rail_dmp_soc_light_freertos.slcp
+++ b/app/bluetooth/example/bt_rail_dmp_soc_light/bt_rail_dmp_soc_light_freertos.slcp
@@ -25,9 +25,7 @@ component:
- id: gatt_configuration
- id: bluetooth_feature_legacy_advertiser
- id: bluetooth_feature_connection
- - id: bluetooth_feature_gatt
- id: bluetooth_feature_gatt_server
- - id: bluetooth_feature_scanner
- id: bluetooth_feature_sm
- id: bluetooth_feature_system
- id: in_place_ota_dfu
diff --git a/app/bluetooth/example/bt_rail_dmp_soc_light/bt_rail_dmp_soc_light_micriumos.slcp b/app/bluetooth/example/bt_rail_dmp_soc_light/bt_rail_dmp_soc_light_micriumos.slcp
index 54f8181a58..8e430ad695 100644
--- a/app/bluetooth/example/bt_rail_dmp_soc_light/bt_rail_dmp_soc_light_micriumos.slcp
+++ b/app/bluetooth/example/bt_rail_dmp_soc_light/bt_rail_dmp_soc_light_micriumos.slcp
@@ -25,9 +25,7 @@ component:
- id: gatt_configuration
- id: bluetooth_feature_legacy_advertiser
- id: bluetooth_feature_connection
- - id: bluetooth_feature_gatt
- id: bluetooth_feature_gatt_server
- - id: bluetooth_feature_scanner
- id: bluetooth_feature_sm
- id: bluetooth_feature_system
- id: in_place_ota_dfu
diff --git a/app/bluetooth/example/bt_rail_dmp_soc_light_std/bt_rail_dmp_soc_light_std_freertos.slcp b/app/bluetooth/example/bt_rail_dmp_soc_light_std/bt_rail_dmp_soc_light_std_freertos.slcp
index ebfb183de1..e21b126380 100644
--- a/app/bluetooth/example/bt_rail_dmp_soc_light_std/bt_rail_dmp_soc_light_std_freertos.slcp
+++ b/app/bluetooth/example/bt_rail_dmp_soc_light_std/bt_rail_dmp_soc_light_std_freertos.slcp
@@ -25,9 +25,7 @@ component:
- id: gatt_configuration
- id: bluetooth_feature_legacy_advertiser
- id: bluetooth_feature_connection
- - id: bluetooth_feature_gatt
- id: bluetooth_feature_gatt_server
- - id: bluetooth_feature_scanner
- id: bluetooth_feature_sm
- id: bluetooth_feature_system
- id: in_place_ota_dfu
diff --git a/app/bluetooth/example/bt_rail_dmp_soc_light_std/bt_rail_dmp_soc_light_std_micriumos.slcp b/app/bluetooth/example/bt_rail_dmp_soc_light_std/bt_rail_dmp_soc_light_std_micriumos.slcp
index e9029311f5..8229a7ec94 100644
--- a/app/bluetooth/example/bt_rail_dmp_soc_light_std/bt_rail_dmp_soc_light_std_micriumos.slcp
+++ b/app/bluetooth/example/bt_rail_dmp_soc_light_std/bt_rail_dmp_soc_light_std_micriumos.slcp
@@ -25,9 +25,7 @@ component:
- id: gatt_configuration
- id: bluetooth_feature_legacy_advertiser
- id: bluetooth_feature_connection
- - id: bluetooth_feature_gatt
- id: bluetooth_feature_gatt_server
- - id: bluetooth_feature_scanner
- id: bluetooth_feature_sm
- id: bluetooth_feature_system
- id: in_place_ota_dfu
diff --git a/app/bluetooth/example/bt_rcp/bt_rcp.slcp b/app/bluetooth/example/bt_rcp/bt_rcp.slcp
index b731d573bf..3350aa7095 100644
--- a/app/bluetooth/example/bt_rcp/bt_rcp.slcp
+++ b/app/bluetooth/example/bt_rcp/bt_rcp.slcp
@@ -29,7 +29,8 @@ component:
- id: bluetooth_feature_extended_advertiser
- id: bluetooth_feature_periodic_advertiser
- id: bluetooth_feature_connection_phy_update
- - id: bluetooth_feature_scanner
+ - id: bluetooth_feature_legacy_scanner
+ - id: bluetooth_feature_extended_scanner
- id: device_init
- id: bootloader_interface
diff --git a/app/bluetooth/example/bt_rcp/bt_rcp_cpc.slcp b/app/bluetooth/example/bt_rcp/bt_rcp_cpc.slcp
index d83a96c369..e10e7519fa 100644
--- a/app/bluetooth/example/bt_rcp/bt_rcp_cpc.slcp
+++ b/app/bluetooth/example/bt_rcp/bt_rcp_cpc.slcp
@@ -32,7 +32,8 @@ component:
- id: bluetooth_feature_extended_advertiser
- id: bluetooth_feature_periodic_advertiser
- id: bluetooth_feature_connection_phy_update
- - id: bluetooth_feature_scanner
+ - id: bluetooth_feature_legacy_scanner
+ - id: bluetooth_feature_extended_scanner
- id: device_init
- id: bootloader_interface
diff --git a/app/bluetooth/example/bt_soc_app_ota_dfu/bt_soc_app_ota_dfu.slcp b/app/bluetooth/example/bt_soc_app_ota_dfu/bt_soc_app_ota_dfu.slcp
index 7bfa8c9238..0b3715b9bd 100644
--- a/app/bluetooth/example/bt_soc_app_ota_dfu/bt_soc_app_ota_dfu.slcp
+++ b/app/bluetooth/example/bt_soc_app_ota_dfu/bt_soc_app_ota_dfu.slcp
@@ -21,11 +21,9 @@ component:
- id: gatt_configuration
- id: bluetooth_feature_legacy_advertiser
- id: bluetooth_feature_connection
- - id: bluetooth_feature_gatt
- id: bluetooth_feature_gatt_server
- - id: bluetooth_feature_scanner
- id: bluetooth_feature_sm
- - id: bluetooth_feature_system
+ - id: bluetooth_feature_system
- id: bootloader_interface
- id: rail_util_pti
- id: simple_button
diff --git a/app/bluetooth/example/bt_soc_app_ota_dfu/bt_soc_app_ota_dfu_freertos.slcp b/app/bluetooth/example/bt_soc_app_ota_dfu/bt_soc_app_ota_dfu_freertos.slcp
index fbaf9723a7..024ce68439 100644
--- a/app/bluetooth/example/bt_soc_app_ota_dfu/bt_soc_app_ota_dfu_freertos.slcp
+++ b/app/bluetooth/example/bt_soc_app_ota_dfu/bt_soc_app_ota_dfu_freertos.slcp
@@ -23,9 +23,7 @@ component:
- id: gatt_configuration
- id: bluetooth_feature_legacy_advertiser
- id: bluetooth_feature_connection
- - id: bluetooth_feature_gatt
- id: bluetooth_feature_gatt_server
- - id: bluetooth_feature_scanner
- id: bluetooth_feature_sm
- id: bluetooth_feature_system
- id: bootloader_interface
diff --git a/app/bluetooth/example/bt_soc_app_ota_dfu/bt_soc_app_ota_dfu_micriumos.slcp b/app/bluetooth/example/bt_soc_app_ota_dfu/bt_soc_app_ota_dfu_micriumos.slcp
index cfbca920f7..020f4b12ba 100644
--- a/app/bluetooth/example/bt_soc_app_ota_dfu/bt_soc_app_ota_dfu_micriumos.slcp
+++ b/app/bluetooth/example/bt_soc_app_ota_dfu/bt_soc_app_ota_dfu_micriumos.slcp
@@ -23,9 +23,7 @@ component:
- id: gatt_configuration
- id: bluetooth_feature_legacy_advertiser
- id: bluetooth_feature_connection
- - id: bluetooth_feature_gatt
- id: bluetooth_feature_gatt_server
- - id: bluetooth_feature_scanner
- id: bluetooth_feature_sm
- id: bluetooth_feature_system
- id: bootloader_interface
diff --git a/app/bluetooth/example/bt_soc_cbap/app.c b/app/bluetooth/example/bt_soc_cbap/app.c
index 16c0dab1a6..62d0c93a5d 100644
--- a/app/bluetooth/example/bt_soc_cbap/app.c
+++ b/app/bluetooth/example/bt_soc_cbap/app.c
@@ -28,44 +28,84 @@
*
******************************************************************************/
#include
+#include
#include "em_common.h"
#include "sl_bluetooth.h"
#include "gatt_db.h"
#include "app_assert.h"
#include "app_log.h"
#include "sl_simple_led_instances.h"
+#include "sl_simple_timer.h"
#include "sl_bt_cbap.h"
#include "cbap_config.h"
#include "app.h"
-#define SCAN_INTERVAL 16 // 10ms
-#define SCAN_WINDOW 16 // 10ms
+#define LED_TIMEOUT 500 // ms
+#define NO_CALLBACK_DATA (void *)NULL // Callback has no parameters
-#define BT_ADDR_LEN 6 // Bluetooth address length
+#if SL_BT_CONFIG_MAX_CONNECTIONS < 1
+ #error At least 1 connection has to be enabled!
+#endif
+
+// Connection properties
+typedef struct {
+ uint8_t connection_handle;
+ bd_addr address;
+} conn_properties_t;
// The advertising set handle allocated from Bluetooth stack.
-static uint8_t advertising_set_handle = 0xff;
-// Connection handle
-static uint8_t connection = 0xff;
+static uint8_t advertising_set_handle = SL_BT_INVALID_ADVERTISING_SET_HANDLE;
+
+// The connectiopn handle and the Bluetooth address of the remote device we
+// have CBAP in progress with
+static conn_properties_t candidate_device;
+
+// Array for holding properties of the trusted connections
+static conn_properties_t trusted_devices[SL_BT_CONFIG_MAX_CONNECTIONS];
// Device role
static sl_bt_cbap_role_t role = ROLE;
// Should we search for a specified peripheral device or not
static bool peripheral_target_defined = ADDR_ENABLE;
// Target device Bluetooth address
-static uint8_t peripheral_target_addr[BT_ADDR_LEN];
+static bd_addr peripheral_target_addr;
+
+// Timer handle
+static sl_simple_timer_t led_timer;
+
+// Clears candidate device.
+static void clear_connection_info(void);
+// Adds the candidate device to the trusted devices array.
+static void save_connection_info(void);
+// Logs the connection handle and the Bluetooth address of the trusted devices.
+static void print_trusted_devices(void);
// Convert address string to address data bytes.
-static bool decode_address(char *addess_str, uint8_t *address);
+static bool decode_address(char *addess_str, bd_addr *address);
// Examine a scan report and decide if a connection should be established.
-bool check_scan_report(sl_bt_evt_scanner_scan_report_t *scan_report);
+bool check_scan_report(sl_bt_evt_scanner_legacy_advertisement_report_t *scan_report);
+
+// Timer Callback.
+static void led_timer_cb(sl_simple_timer_t *handle, void *data);
/**************************************************************************//**
* Application Init.
*****************************************************************************/
SL_WEAK void app_init(void)
{
+ // Initialize candidate device data
+ clear_connection_info();
+
+ // Initialize connection array
+ uint8_t i, j;
+ for (i = 0; i < SL_BT_CONFIG_MAX_CONNECTIONS; i++) {
+ trusted_devices[i].connection_handle = SL_BT_INVALID_CONNECTION_HANDLE;
+ for (j = 0; j < sizeof(bd_addr); j++) {
+ trusted_devices[i].address.addr[j] = 0xff;
+ }
+ }
+
/////////////////////////////////////////////////////////////////////////////
// Put your additional application init code here! //
// This is called once during start-up. //
@@ -156,14 +196,14 @@ void sl_bt_on_event(sl_bt_msg_t *evt)
// If defined, get target address
if (peripheral_target_defined) {
- if (decode_address(ADDR, peripheral_target_addr)) {
- app_log_info("Searching for %02X:%02X:%02X:%02X:%02X:%02X. ",
- peripheral_target_addr[5],
- peripheral_target_addr[4],
- peripheral_target_addr[3],
- peripheral_target_addr[2],
- peripheral_target_addr[1],
- peripheral_target_addr[0]);
+ if (decode_address(ADDR, &peripheral_target_addr)) {
+ app_log_info("Searching for %02X:%02X:%02X:%02X:%02X:%02X. " APP_LOG_NL,
+ peripheral_target_addr.addr[5],
+ peripheral_target_addr.addr[4],
+ peripheral_target_addr.addr[3],
+ peripheral_target_addr.addr[2],
+ peripheral_target_addr.addr[1],
+ peripheral_target_addr.addr[0]);
} else {
peripheral_target_defined = false;
app_log_error("Reading target address failed. Searching for any " \
@@ -174,12 +214,6 @@ void sl_bt_on_event(sl_bt_msg_t *evt)
"Service." APP_LOG_NL);
}
- // Set default scanning parameters.
- sc = sl_bt_scanner_set_parameters(sl_bt_scanner_scan_mode_passive,
- SCAN_INTERVAL,
- SCAN_WINDOW);
- app_assert_status(sc);
-
// Start scanning
sc = sl_bt_scanner_start(sl_bt_scanner_scan_phy_1m,
sl_bt_scanner_discover_generic);
@@ -196,19 +230,20 @@ void sl_bt_on_event(sl_bt_msg_t *evt)
// -------------------------------
// This event is generated when an advertisement packet or a scan response
// is received from a responder
- case sl_bt_evt_scanner_scan_report_id:
+ case sl_bt_evt_scanner_legacy_advertisement_report_id:
if (role == SL_BT_CBAP_ROLE_CENTRAL) {
// Filter for connectable scannable undirected advertisements
- if (evt->data.evt_scanner_scan_report.packet_type == 0
- && check_scan_report(&evt->data.evt_scanner_scan_report)) {
+ if ((evt->data.evt_scanner_legacy_advertisement_report.event_flags
+ == (SL_BT_SCANNER_EVENT_FLAG_CONNECTABLE | SL_BT_SCANNER_EVENT_FLAG_SCANNABLE))
+ && check_scan_report(&evt->data.evt_scanner_legacy_advertisement_report)) {
// Target device found. Stop scanning.
sc = sl_bt_scanner_stop();
app_assert_status(sc);
// Connect to device
- sc = sl_bt_connection_open(evt->data.evt_scanner_scan_report.address,
- evt->data.evt_scanner_scan_report.address_type,
- sl_bt_gap_1m_phy,
+ sc = sl_bt_connection_open(evt->data.evt_scanner_legacy_advertisement_report.address,
+ evt->data.evt_scanner_legacy_advertisement_report.address_type,
+ sl_bt_gap_phy_1m,
NULL);
app_assert_status(sc);
}
@@ -219,47 +254,35 @@ void sl_bt_on_event(sl_bt_msg_t *evt)
// This event indicates that a new connection was opened.
case sl_bt_evt_connection_opened_id:
app_log_info("Connection opened." APP_LOG_NL);
- connection = evt->data.evt_connection_opened.connection;
+ // Store data of the candidate device
+ candidate_device.connection_handle = evt->data.evt_connection_opened.connection;
+ candidate_device.address = evt->data.evt_connection_opened.address;
if (evt->data.evt_connection_opened.bonding
!= SL_BT_INVALID_BONDING_HANDLE) {
app_log_warning("Devices are already bonded." APP_LOG_NL);
}
- sl_bt_cbap_start(role, connection);
+ sc = sl_bt_cbap_start(role, candidate_device.connection_handle);
+ app_log_status_error(sc);
+ if (sc == SL_STATUS_OK) {
+ app_log_info("CBAP procedure start." APP_LOG_NL);
+ }
break;
// -------------------------------
// This event indicates that a connection was closed.
case sl_bt_evt_connection_closed_id:
- switch (role) {
- case SL_BT_CBAP_ROLE_PERIPHERAL:
- // Turn off LED
- sl_led_turn_off(SL_SIMPLE_LED_INSTANCE(0));
- app_log_info("LED off." APP_LOG_NL);
-
- // Generate data for advertising
- sc = sl_bt_legacy_advertiser_generate_data(advertising_set_handle,
- sl_bt_advertiser_general_discoverable);
- app_assert_status(sc);
-
- // Restart advertising after client has disconnected
- sc = sl_bt_legacy_advertiser_start(advertising_set_handle,
- sl_bt_advertiser_connectable_scannable);
- app_assert_status(sc);
- app_log_info("Connection closed. Advertising started." APP_LOG_NL);
- break;
-
- case SL_BT_CBAP_ROLE_CENTRAL:
- // Start scanning
- sc = sl_bt_scanner_start(sl_bt_scanner_scan_phy_1m,
- sl_bt_scanner_discover_generic);
- app_log_info("Connection closed. Scanning started." APP_LOG_NL);
- break;
-
- default:
- app_assert_status_f(SL_STATUS_INVALID_STATE, "Invalid role!");
- break;
+ // Remove connection from the connection array if present
+ for (int i = 0; i < SL_BT_CONFIG_MAX_CONNECTIONS; i++) {
+ if (trusted_devices[i].connection_handle == evt->data.evt_connection_closed.connection) {
+ trusted_devices[i].connection_handle = SL_BT_INVALID_CONNECTION_HANDLE;
+ for (uint8_t j = 0; j < sizeof(bd_addr); j++) {
+ trusted_devices[i].address.addr[j] = 0xff;
+ }
+ app_log_info("Trusted device [%d] removed." APP_LOG_NL,
+ evt->data.evt_connection_closed.connection);
+ }
}
break;
@@ -286,13 +309,20 @@ void sl_bt_on_event(sl_bt_msg_t *evt)
break;
}
- // Set LED state.
if (data_recv == 0x00) {
+ // Turn off LED.
sl_led_turn_off(SL_SIMPLE_LED_INSTANCE(0));
app_log_info("LED off." APP_LOG_NL);
} else {
+ // Blink LED.
sl_led_turn_on(SL_SIMPLE_LED_INSTANCE(0));
app_log_info("LED on." APP_LOG_NL);
+ sc = sl_simple_timer_start(&led_timer,
+ LED_TIMEOUT,
+ led_timer_cb,
+ NO_CALLBACK_DATA,
+ false);
+ app_assert_status(sc);
}
}
break;
@@ -311,6 +341,8 @@ void sl_bt_on_event(sl_bt_msg_t *evt)
// CBAP Peripheral event handler.
void sl_bt_cbap_peripheral_on_event(sl_bt_cbap_peripheral_state_t status)
{
+ sl_status_t sc;
+
switch (status) {
case SL_BT_CBAP_PERIPHERAL_IDLE:
break;
@@ -325,6 +357,15 @@ void sl_bt_cbap_peripheral_on_event(sl_bt_cbap_peripheral_state_t status)
case SL_BT_CBAP_PERIPHERAL_DONE:
app_log_info("CBAP procedure complete." APP_LOG_NL);
+ save_connection_info();
+ clear_connection_info();
+ print_trusted_devices();
+
+ // Restart advertising and enable connections
+ sc = sl_bt_legacy_advertiser_start(advertising_set_handle,
+ sl_bt_advertiser_connectable_scannable);
+ app_assert_status(sc);
+ app_log_info("Advertising started." APP_LOG_NL);
break;
default:
@@ -372,13 +413,22 @@ void sl_bt_cbap_central_on_event(sl_bt_cbap_central_state_t status)
case SL_BT_CBAP_CENTRAL_DONE: {
app_log_info("CBAP procedure complete." APP_LOG_NL);
- // Turn on LED on peripheral
- uint8_t led_on = 0x01;
- sc = sl_bt_gatt_write_characteristic_value(connection,
+ // Blink LED on peripheral
+ uint8_t led = 0x01;
+ sc = sl_bt_gatt_write_characteristic_value(candidate_device.connection_handle,
gattdb_aio_digital_out,
- sizeof(led_on),
- &led_on);
+ sizeof(led),
+ &led);
app_assert_status(sc);
+
+ save_connection_info();
+ clear_connection_info();
+ print_trusted_devices();
+
+ // Start scanning
+ sc = sl_bt_scanner_start(sl_bt_scanner_scan_phy_1m,
+ sl_bt_scanner_discover_generic);
+ app_log_info("Scanning started." APP_LOG_NL);
break;
}
@@ -387,16 +437,114 @@ void sl_bt_cbap_central_on_event(sl_bt_cbap_central_state_t status)
}
}
+// Callback to handle CBAP process errors.
+void sl_bt_on_cbap_error(void)
+{
+ sl_status_t sc;
+ app_log_info("CBAP procedure was aborted for connection %d." APP_LOG_NL,
+ candidate_device.connection_handle);
+
+ sc = sl_bt_connection_close(candidate_device.connection_handle);
+ app_log_status_error(sc);
+ clear_connection_info();
+
+ switch (role) {
+ case SL_BT_CBAP_ROLE_PERIPHERAL:
+ // Restart advertising and enable connections
+ sc = sl_bt_legacy_advertiser_start(advertising_set_handle,
+ sl_bt_advertiser_connectable_scannable);
+ app_assert_status(sc);
+ app_log_info("Advertising started." APP_LOG_NL);
+ break;
+
+ case SL_BT_CBAP_ROLE_CENTRAL:
+ // Start scanning
+ sc = sl_bt_scanner_start(sl_bt_scanner_scan_phy_1m,
+ sl_bt_scanner_discover_generic);
+ app_assert_status(sc);
+ app_log_info("Scanning started." APP_LOG_NL);
+ break;
+
+ default:
+ app_assert_status_f(SL_STATUS_INVALID_STATE, "Invalid role!");
+ break;
+ }
+}
+
+/**************************************************************************//**
+ * Clears candidate device.
+ *****************************************************************************/
+static void clear_connection_info(void)
+{
+ candidate_device.connection_handle = SL_BT_INVALID_CONNECTION_HANDLE;
+ for (uint8_t i = 0; i < sizeof(bd_addr); i++) {
+ candidate_device.address.addr[i] = 0xff;
+ }
+}
+
+/**************************************************************************//**
+ * Adds the candidate device to the trusted devices array.
+ *****************************************************************************/
+static void save_connection_info(void)
+{
+ // Find next available slot
+ int index = -1;
+ for (int i = 0; i < SL_BT_CONFIG_MAX_CONNECTIONS; i++) {
+ if (trusted_devices[i].connection_handle == SL_BT_INVALID_CONNECTION_HANDLE) {
+ index = i;
+ break;
+ }
+ }
+ if (index == -1) {
+ app_log_error("Connection array is full." APP_LOG_NL);
+ return;
+ }
+
+ // Save connection parameters
+ trusted_devices[index].connection_handle = candidate_device.connection_handle;
+ trusted_devices[index].address = candidate_device.address;
+
+ app_log_info("Trusted device [%d] added." APP_LOG_NL,
+ trusted_devices[index].connection_handle);
+}
+
+/**************************************************************************//**
+ * Logs the connection handle and the Bluetooth address of the trusted devices.
+ *****************************************************************************/
+static void print_trusted_devices(void)
+{
+ bool found = false;
+ app_log_info("List of trusted connections:" APP_LOG_NL);
+
+ for (int i = 0; i < SL_BT_CONFIG_MAX_CONNECTIONS; i++) {
+ if (trusted_devices[i].connection_handle != SL_BT_INVALID_CONNECTION_HANDLE) {
+ found = true;
+ app_log_info(" Connection handle: %d Address: %02X:%02X:%02X:%02X:%02X:%02X" APP_LOG_NL,
+ trusted_devices[i].connection_handle,
+ trusted_devices[i].address.addr[5],
+ trusted_devices[i].address.addr[4],
+ trusted_devices[i].address.addr[3],
+ trusted_devices[i].address.addr[2],
+ trusted_devices[i].address.addr[1],
+ trusted_devices[i].address.addr[0]);
+ }
+ }
+
+ if (!found) {
+ app_log_info(" None." APP_LOG_NL);
+ }
+}
+
/**************************************************************************//**
* Convert address string to address data bytes.
* @param[in] addess_str Address string
- * @param[out] address address byte array
+ * @param[out] address Bluetooth address byte array
* @return true if operation was successful
*****************************************************************************/
-static bool decode_address(char *addess_str, uint8_t *address)
+static bool decode_address(char *addess_str, bd_addr *address)
{
uint8_t retval;
- unsigned int address_cache[BT_ADDR_LEN];
+ unsigned int address_cache[sizeof(bd_addr)];
retval = sscanf(addess_str, "%02X:%02X:%02X:%02X:%02X:%02X",
&address_cache[5],
@@ -406,13 +554,13 @@ static bool decode_address(char *addess_str, uint8_t *address)
&address_cache[1],
&address_cache[0]);
- if (retval != BT_ADDR_LEN) {
+ if (retval != sizeof(bd_addr)) {
app_log_error("Invalid Bluetooth address." APP_LOG_NL);
return false;
}
- for (int i = 0; i < BT_ADDR_LEN; i++) {
- address[i] = (uint8_t)(address_cache[i]);
+ for (uint8_t i = 0; i < sizeof(bd_addr); i++) {
+ address->addr[i] = (uint8_t)(address_cache[i]);
}
return true;
}
@@ -422,11 +570,18 @@ static bool decode_address(char *addess_str, uint8_t *address)
* @param[in] scan_report Scan report coming from the Bluetooth stack event.
* return true if a connection should be established with the device.
*****************************************************************************/
-bool check_scan_report(sl_bt_evt_scanner_scan_report_t *scan_report)
+bool check_scan_report(sl_bt_evt_scanner_legacy_advertisement_report_t *scan_report)
{
+ // Check if there is a connection with this device already
+ for (int i = 0; i < SL_BT_CONFIG_MAX_CONNECTIONS; i++) {
+ if (memcmp(scan_report->address.addr, trusted_devices[i].address.addr, sizeof(bd_addr)) == 0) {
+ return false;
+ }
+ }
+
// If target defined, check the address
if (peripheral_target_defined
- && memcmp(scan_report->address.addr, peripheral_target_addr, BT_ADDR_LEN) != 0) {
+ && memcmp(scan_report->address.addr, peripheral_target_addr.addr, sizeof(bd_addr)) != 0) {
return false; // Target device is defined but with different address.
}
@@ -434,3 +589,17 @@ bool check_scan_report(sl_bt_evt_scanner_scan_report_t *scan_report)
return sl_bt_cbap_find_service_in_advertisement(scan_report->data.data,
scan_report->data.len);
}
+
+/***************************************************************************//**
+ * Timer Callback.
+ * @param[in] handle pointer to handle instance
+ * @param[in] data pointer to input data
+ ******************************************************************************/
+static void led_timer_cb(sl_simple_timer_t *handle, void *data)
+{
+ (void)handle;
+ (void)data;
+
+ sl_led_turn_off(SL_SIMPLE_LED_INSTANCE(0));
+ app_log_info("LED off." APP_LOG_NL);
+}
diff --git a/app/bluetooth/example/bt_soc_cbap/bt_soc_cbap.slcp b/app/bluetooth/example/bt_soc_cbap/bt_soc_cbap.slcp
index fb40e7b842..1c3bd11c9d 100644
--- a/app/bluetooth/example/bt_soc_cbap/bt_soc_cbap.slcp
+++ b/app/bluetooth/example/bt_soc_cbap/bt_soc_cbap.slcp
@@ -21,7 +21,7 @@ component:
- id: bluetooth_feature_connection
- id: bluetooth_feature_gatt
- id: bluetooth_feature_gatt_server
- - id: bluetooth_feature_scanner
+ - id: bluetooth_feature_legacy_scanner
- id: bluetooth_feature_sm
- id: bluetooth_feature_system
- id: in_place_ota_dfu
@@ -34,6 +34,7 @@ component:
- id: simple_led
instance:
- led0
+ - id: simple_timer
- id: cbap
source:
@@ -72,7 +73,7 @@ configuration:
- name: SL_HEAP_SIZE
value: "15000"
- name: SL_PSA_KEY_USER_SLOT_COUNT
- value: "0"
+ value: "1"
condition:
- psa_crypto
- name: SL_BOARD_ENABLE_VCOM
@@ -82,6 +83,9 @@ configuration:
- name: APP_LOG_LEVEL_FILTER_THRESHOLD
value: APP_LOG_LEVEL_INFO
+requires:
+ - name: device_security_vault
+
tag:
- hardware:rf:band:2400
- hardware:device:flash:512
diff --git a/app/bluetooth/example/bt_soc_csr_generator/bt_soc_csr_generator.slcp b/app/bluetooth/example/bt_soc_csr_generator/bt_soc_csr_generator.slcp
index e53e864821..aae22294c1 100644
--- a/app/bluetooth/example/bt_soc_csr_generator/bt_soc_csr_generator.slcp
+++ b/app/bluetooth/example/bt_soc_csr_generator/bt_soc_csr_generator.slcp
@@ -102,6 +102,10 @@ configuration:
condition:
- psa_crypto
+requires:
+ - name: device_supports_bluetooth
+ - name: device_security_vault
+
tag:
- hardware:device:flash:512
- hardware:device:ram:32
diff --git a/app/bluetooth/example/bt_soc_dtm/bt_soc_dtm.slcp b/app/bluetooth/example/bt_soc_dtm/bt_soc_dtm.slcp
index 81be841852..a00e4d700e 100644
--- a/app/bluetooth/example/bt_soc_dtm/bt_soc_dtm.slcp
+++ b/app/bluetooth/example/bt_soc_dtm/bt_soc_dtm.slcp
@@ -22,7 +22,6 @@ component:
- id: bluetooth_feature_connection
- id: bluetooth_feature_gatt
- id: bluetooth_feature_gatt_server
- - id: bluetooth_feature_scanner
- id: bluetooth_feature_sm
- id: bluetooth_feature_system
- id: bluetooth_feature_test
diff --git a/app/bluetooth/example/bt_soc_empty/bt_soc_empty.slcp b/app/bluetooth/example/bt_soc_empty/bt_soc_empty.slcp
index a169e957b5..8a927165ef 100644
--- a/app/bluetooth/example/bt_soc_empty/bt_soc_empty.slcp
+++ b/app/bluetooth/example/bt_soc_empty/bt_soc_empty.slcp
@@ -23,7 +23,7 @@ component:
- id: bluetooth_feature_connection
- id: bluetooth_feature_gatt
- id: bluetooth_feature_gatt_server
- - id: bluetooth_feature_scanner
+ - id: bluetooth_feature_legacy_scanner
- id: bluetooth_feature_sm
- id: bluetooth_feature_system
- id: in_place_ota_dfu
diff --git a/app/bluetooth/example/bt_soc_ibeacon/bt_soc_ibeacon.slcp b/app/bluetooth/example/bt_soc_ibeacon/bt_soc_ibeacon.slcp
index 84663aa669..de24f06ce7 100644
--- a/app/bluetooth/example/bt_soc_ibeacon/bt_soc_ibeacon.slcp
+++ b/app/bluetooth/example/bt_soc_ibeacon/bt_soc_ibeacon.slcp
@@ -22,9 +22,7 @@ component:
- id: gatt_configuration
- id: bluetooth_feature_legacy_advertiser
- id: bluetooth_feature_connection
- - id: bluetooth_feature_gatt
- id: bluetooth_feature_gatt_server
- - id: bluetooth_feature_scanner
- id: bluetooth_feature_sm
- id: bluetooth_feature_system
- id: app_assert
diff --git a/app/bluetooth/example/bt_soc_iop_test/app.c b/app/bluetooth/example/bt_soc_iop_test/app.c
index 06ea2c1c42..ecfa5ba4a3 100644
--- a/app/bluetooth/example/bt_soc_iop_test/app.c
+++ b/app/bluetooth/example/bt_soc_iop_test/app.c
@@ -135,7 +135,7 @@ void sl_bt_on_event(sl_bt_msg_t* evt)
// Generate data for advertising
sc = sl_bt_legacy_advertiser_generate_data(advertising_set_handle,
- advertiser_general_discoverable);
+ sl_bt_advertiser_general_discoverable);
app_log_status_error(sc);
// Default advertisement parameters: 32 (20 ms) interval. Other optional
@@ -149,7 +149,7 @@ void sl_bt_on_event(sl_bt_msg_t* evt)
// Start advertising and enable connections.
sc = sl_bt_legacy_advertiser_start(advertising_set_handle,
- advertiser_connectable_scannable);
+ sl_bt_advertiser_connectable_scannable);
app_assert_status(sc);
if (sc == SL_STATUS_OK) {
@@ -251,22 +251,22 @@ void sl_bt_on_event(sl_bt_msg_t* evt)
(int)supv_timeout);
switch (evt->data.evt_connection_parameters.security_mode) {
- case connection_mode1_level1: {
+ case sl_bt_connection_mode1_level1: {
app_log_info("Connection security: No Security." APP_LOG_NL);
break;
}
- case connection_mode1_level2: {
+ case sl_bt_connection_mode1_level2: {
app_log_info("Connection security: Unauthenticated pairing." APP_LOG_NL);
break;
}
- case connection_mode1_level3: {
+ case sl_bt_connection_mode1_level3: {
app_log_info("Connection security: Authenticated pairing." APP_LOG_NL);
break;
}
- case connection_mode1_level4: {
+ case sl_bt_connection_mode1_level4: {
app_log_info("Connection security: Bonded." APP_LOG_NL);
break;
}
@@ -372,12 +372,12 @@ void sl_bt_on_event(sl_bt_msg_t* evt)
// Generate data for advertising
sc = sl_bt_legacy_advertiser_generate_data(advertising_set_handle,
- advertiser_general_discoverable);
+ sl_bt_advertiser_general_discoverable);
app_log_status_error(sc);
// Restart advertising.
sc = sl_bt_legacy_advertiser_start(advertising_set_handle,
- advertiser_connectable_scannable);
+ sl_bt_advertiser_connectable_scannable);
app_log_status_error(sc);
if (sc == SL_STATUS_OK) {
diff --git a/app/bluetooth/example/bt_soc_thermometer_client/app.c b/app/bluetooth/example/bt_soc_thermometer_client/app.c
index 15516e0702..882bb54c5f 100644
--- a/app/bluetooth/example/bt_soc_thermometer_client/app.c
+++ b/app/bluetooth/example/bt_soc_thermometer_client/app.c
@@ -50,10 +50,6 @@
#define CONN_MIN_CE_LENGTH 0
#define CONN_MAX_CE_LENGTH 0xffff
-#define SCAN_INTERVAL 16 //10ms
-#define SCAN_WINDOW 16 //10ms
-#define SCAN_PASSIVE 0
-
#define TEMP_INVALID NAN
#define UNIT_INVALID ('?')
#define UNIT_CELSIUS ('C')
@@ -183,12 +179,7 @@ void sl_bt_on_event(sl_bt_msg_t* evt)
evt->data.evt_system_boot.build);
// Print bluetooth address.
print_bluetooth_address();
- // Set passive scanning on 1Mb PHY
- sc = sl_bt_scanner_set_mode(sl_bt_gap_1m_phy, SCAN_PASSIVE);
- app_assert_status(sc);
- // Set scan interval and scan window
- sc = sl_bt_scanner_set_timing(sl_bt_gap_1m_phy, SCAN_INTERVAL, SCAN_WINDOW);
- app_assert_status(sc);
+
// Set the default connection parameters for subsequent connections
sc = sl_bt_connection_set_default_parameters(CONN_INTERVAL_MIN,
CONN_INTERVAL_MAX,
@@ -198,7 +189,7 @@ void sl_bt_on_event(sl_bt_msg_t* evt)
CONN_MAX_CE_LENGTH);
app_assert_status(sc);
// Start scanning - looking for thermometer devices
- sc = sl_bt_scanner_start(sl_bt_gap_1m_phy, sl_bt_scanner_discover_generic);
+ sc = sl_bt_scanner_start(sl_bt_gap_phy_1m, sl_bt_scanner_discover_generic);
app_assert_status_f(sc,
"Failed to start discovery #1\n");
conn_state = scanning;
@@ -207,20 +198,21 @@ void sl_bt_on_event(sl_bt_msg_t* evt)
// -------------------------------
// This event is generated when an advertisement packet or a scan response
// is received from a responder
- case sl_bt_evt_scanner_scan_report_id:
+ case sl_bt_evt_scanner_legacy_advertisement_report_id:
// Parse advertisement packets
- if (evt->data.evt_scanner_scan_report.packet_type == 0) {
+ if (evt->data.evt_scanner_legacy_advertisement_report.event_flags
+ == (SL_BT_SCANNER_EVENT_FLAG_CONNECTABLE | SL_BT_SCANNER_EVENT_FLAG_SCANNABLE)) {
// If a thermometer advertisement is found...
- if (find_service_in_advertisement(&(evt->data.evt_scanner_scan_report.data.data[0]),
- evt->data.evt_scanner_scan_report.data.len) != 0) {
+ if (find_service_in_advertisement(&(evt->data.evt_scanner_legacy_advertisement_report.data.data[0]),
+ evt->data.evt_scanner_legacy_advertisement_report.data.len) != 0) {
// then stop scanning for a while
sc = sl_bt_scanner_stop();
app_assert_status(sc);
// and connect to that device
if (active_connections_num < SL_BT_CONFIG_MAX_CONNECTIONS) {
- sc = sl_bt_connection_open(evt->data.evt_scanner_scan_report.address,
- evt->data.evt_scanner_scan_report.address_type,
- sl_bt_gap_1m_phy,
+ sc = sl_bt_connection_open(evt->data.evt_scanner_legacy_advertisement_report.address,
+ evt->data.evt_scanner_legacy_advertisement_report.address_type,
+ sl_bt_gap_phy_1m,
NULL);
app_assert_status(sc);
conn_state = opening;
@@ -307,7 +299,7 @@ void sl_bt_on_event(sl_bt_msg_t* evt)
// and we can connect to more devices
if (active_connections_num < SL_BT_CONFIG_MAX_CONNECTIONS) {
// start scanning again to find new devices
- sc = sl_bt_scanner_start(sl_bt_gap_1m_phy, sl_bt_scanner_discover_generic);
+ sc = sl_bt_scanner_start(sl_bt_gap_phy_1m, sl_bt_scanner_discover_generic);
app_assert_status_f(sc,
"Failed to start discovery #2\n");
conn_state = scanning;
@@ -325,7 +317,7 @@ void sl_bt_on_event(sl_bt_msg_t* evt)
remove_connection(evt->data.evt_connection_closed.connection);
if (conn_state != scanning) {
// start scanning again to find new devices
- sc = sl_bt_scanner_start(sl_bt_gap_1m_phy, sl_bt_scanner_discover_generic);
+ sc = sl_bt_scanner_start(sl_bt_gap_phy_1m, sl_bt_scanner_discover_generic);
app_assert_status_f(sc,
"Failed to start discovery #3\n");
conn_state = scanning;
diff --git a/app/bluetooth/example/bt_soc_thermometer_client/bt_soc_thermometer_client.slcp b/app/bluetooth/example/bt_soc_thermometer_client/bt_soc_thermometer_client.slcp
index da579acf0f..f9ff781dcb 100644
--- a/app/bluetooth/example/bt_soc_thermometer_client/bt_soc_thermometer_client.slcp
+++ b/app/bluetooth/example/bt_soc_thermometer_client/bt_soc_thermometer_client.slcp
@@ -22,7 +22,7 @@ component:
- id: bluetooth_feature_connection
- id: bluetooth_feature_gatt
- id: bluetooth_feature_gatt_server
- - id: bluetooth_feature_scanner
+ - id: bluetooth_feature_legacy_scanner
- id: bluetooth_feature_system
- id: bluetooth_feature_power_control
- id: in_place_ota_dfu
diff --git a/app/bluetooth/example/bt_soc_thunderboard/app.c b/app/bluetooth/example/bt_soc_thunderboard/app.c
index aba300a8ee..c549876624 100644
--- a/app/bluetooth/example/bt_soc_thunderboard/app.c
+++ b/app/bluetooth/example/bt_soc_thunderboard/app.c
@@ -130,8 +130,7 @@ static void sensor_deinit(void);
void app_init(void)
{
- app_log_info("Thuderboard demo initialised");
- app_log_nl();
+ app_log_info("Thuderboard demo initialised" APP_LOG_NL);
sl_power_supply_probe();
shutdown_start_timer();
#if defined(BOARD_RGBLED_COUNT) && (BOARD_RGBLED_COUNT > 0)
@@ -176,23 +175,21 @@ void sl_bt_on_event(sl_bt_msg_t *evt)
(uint8_t *)fw_rev);
app_log_status_error(sc);
// Print boot message.
- app_log_info("Bluetooth stack booted: v%d.%d.%d-b%d",
+ app_log_info("Bluetooth stack booted: v%d.%d.%d-b%d" APP_LOG_NL,
evt->data.evt_system_boot.major,
evt->data.evt_system_boot.minor,
evt->data.evt_system_boot.patch,
evt->data.evt_system_boot.build);
- app_log_nl();
sc = sl_bt_system_get_identity_address(&address, &address_type);
app_assert_status(sc);
app_log_info("Bluetooth %s address: %02X:%02X:%02X:%02X:%02X:%02X",
- address_type ? "static random" : "public device",
+ address_type ? "static random" : "public device" APP_LOG_NL,
address.addr[5],
address.addr[4],
address.addr[3],
address.addr[2],
address.addr[1],
address.addr[0]);
- app_log_nl();
unique_id = 0xFFFFFF & *((uint32_t*) address.addr);
// Pad and reverse unique ID to get System ID
@@ -216,8 +213,7 @@ void sl_bt_on_event(sl_bt_msg_t *evt)
// -------------------------------
case sl_bt_evt_connection_opened_id:
- app_log_info("Connection opened");
- app_log_nl();
+ app_log_info("Connection opened" APP_LOG_NL);
advertise_stop();
shutdown_stop_timer();
sensor_init();
@@ -225,8 +221,7 @@ void sl_bt_on_event(sl_bt_msg_t *evt)
// -------------------------------
case sl_bt_evt_connection_closed_id:
- app_log_info("Connection closed");
- app_log_nl();
+ app_log_info("Connection closed" APP_LOG_NL);
shutdown_start_timer();
sensor_deinit();
advertise_start();
@@ -295,29 +290,25 @@ static void sensor_init(void)
#ifdef SL_CATALOG_SENSOR_HALL_PRESENT
sc = sl_sensor_hall_init();
if (sc != SL_STATUS_OK) {
- app_log_warning("Hall sensor initialization failed.");
- app_log_nl();
+ app_log_warning("Hall sensor initialization failed." APP_LOG_NL);
}
#endif // SL_CATALOG_SENSOR_HALL_PRESENT
#ifdef SL_CATALOG_SENSOR_LIGHT_PRESENT
sc = sl_sensor_light_init();
if (sc != SL_STATUS_OK) {
- app_log_warning("Ambient light and UV index sensor initialization failed.");
- app_log_nl();
+ app_log_warning("Ambient light and UV index sensor initialization failed." APP_LOG_NL);
}
#endif // SL_CATALOG_SENSOR_LIGHT_PRESENT
#ifdef SL_CATALOG_SENSOR_LUX_PRESENT
sc = sl_sensor_lux_init();
if (sc != SL_STATUS_OK) {
- app_log_warning("Ambient light sensor initialization failed.");
- app_log_nl();
+ app_log_warning("Ambient light sensor initialization failed." APP_LOG_NL);
}
#endif // SL_CATALOG_SENSOR_LUX_PRESENT
#ifdef SL_CATALOG_SENSOR_RHT_PRESENT
sc = sl_sensor_rht_init();
if (sc != SL_STATUS_OK) {
- app_log_warning("Relative Humidity and Temperature sensor initialization failed.");
- app_log_nl();
+ app_log_warning("Relative Humidity and Temperature sensor initialization failed." APP_LOG_NL);
}
#endif // SL_CATALOG_SENSOR_RHT_PRESENT
#ifdef SL_CATALOG_SENSOR_IMU_PRESENT
@@ -326,24 +317,21 @@ static void sensor_init(void)
#ifdef SL_CATALOG_SENSOR_PRESSURE_PRESENT
sc = sl_sensor_pressure_init();
if (sc != SL_STATUS_OK) {
- app_log_warning("Air Pressure sensor initialization failed.");
- app_log_nl();
+ app_log_warning("Air Pressure sensor initialization failed." APP_LOG_NL);
}
#endif // SL_CATALOG_SENSOR_PRESSURE_PRESENT
#ifdef SL_CATALOG_SENSOR_GAS_PRESENT
if (!sl_power_supply_is_low_power()) {
sc = sl_sensor_gas_init();
if (sc != SL_STATUS_OK) {
- app_log_warning("Air quality sensor initialization failed.");
- app_log_nl();
+ app_log_warning("Air quality sensor initialization failed." APP_LOG_NL);
}
}
#endif // SL_CATALOG_SENSOR_GAS_PRESENT
#ifdef SL_CATALOG_SENSOR_SOUND_PRESENT
sc = sl_sensor_sound_init();
if (sc != SL_STATUS_OK) {
- app_log_warning("Sound level sensor initialization failed.");
- app_log_nl();
+ app_log_warning("Sound level sensor initialization failed." APP_LOG_NL);
}
#endif // SL_CATALOG_SENSOR_SOUND_PRESENT
}
@@ -389,8 +377,7 @@ uint8_t sl_gatt_service_battery_get_level(void)
{
uint8_t bat_level;
bat_level = sl_power_supply_get_battery_level();
- app_log_info("Battery level = %d %%", bat_level);
- app_log_nl();
+ app_log_info("Battery level = %d %%" APP_LOG_NL, bat_level);
return bat_level;
}
@@ -406,14 +393,11 @@ sl_status_t sl_gatt_service_hall_get(float *field_strength, bool *alert, bool *t
sl_status_t sc;
sc = sl_sensor_hall_get(field_strength, alert, tamper);
if (SL_STATUS_OK == sc) {
- app_log_info("Magnetic Flux = %4.3f mT", *field_strength);
- app_log_nl();
+ app_log_info("Magnetic Flux = %4.3f mT" APP_LOG_NL, *field_strength);
} else if (SL_STATUS_NOT_INITIALIZED == sc) {
- app_log_info("Hall sensor is not initialized.");
- app_log_nl();
+ app_log_info("Hall sensor is not initialized." APP_LOG_NL);
} else {
- app_log_status_error_f(sc, "Hall sensor measurement failed");
- app_log_nl();
+ app_log_status_error_f(sc, "Hall sensor measurement failed" APP_LOG_NL);
}
return sc;
}
@@ -425,16 +409,12 @@ sl_status_t sl_gatt_service_light_get(float *lux, float *uvi)
sl_status_t sc;
sc = sl_sensor_light_get(lux, uvi);
if (SL_STATUS_OK == sc) {
- app_log_info("Amb light = %f Lux", *lux);
- app_log_nl();
- app_log_info("UV Index = %d", *uvi);
- app_log_nl();
+ app_log_info("Amb light = %f Lux" APP_LOG_NL, *lux);
+ app_log_info("UV Index = %d" APP_LOG_NL, *uvi);
} else if (SL_STATUS_NOT_INITIALIZED == sc) {
- app_log_info("Ambient light and UV index sensor is not initialized.");
- app_log_nl();
+ app_log_info("Ambient light and UV index sensor is not initialized." APP_LOG_NL);
} else {
- app_log_status_error_f(sc, "Light sensor measurement failed");
- app_log_nl();
+ app_log_status_error_f(sc, "Light sensor measurement failed" APP_LOG_NL);
}
return sc;
}
@@ -448,8 +428,7 @@ sl_status_t sl_gatt_service_lux_get(float *lux)
if (SL_STATUS_OK == sc) {
app_log_info("Amb light = %f Lux\r\n", *lux);
} else if (SL_STATUS_NOT_INITIALIZED == sc) {
- app_log_info("Ambient light sensor is not initialized.");
- app_log_nl();
+ app_log_info("Ambient light sensor is not initialized." APP_LOG_NL);
} else {
app_log_status_error_f(sc, "Light sensor measurement failed\n");
}
@@ -463,16 +442,12 @@ sl_status_t sl_gatt_service_rht_get(uint32_t *rh, int32_t *t)
sl_status_t sc;
sc = sl_sensor_rht_get(rh, t);
if (SL_STATUS_OK == sc) {
- app_log_info("Humidity = %3.2f %%RH", (float)*rh / 1000.0f);
- app_log_nl();
- app_log_info("Temp = %3.2f C", (float)*t / 1000.0f);
- app_log_nl();
+ app_log_info("Humidity = %3.2f %%RH" APP_LOG_NL, (float)*rh / 1000.0f);
+ app_log_info("Temp = %3.2f C" APP_LOG_NL, (float)*t / 1000.0f);
} else if (SL_STATUS_NOT_INITIALIZED == sc) {
- app_log_info("Relative Humidity and Temperature sensor is not initialized.");
- app_log_nl();
+ app_log_info("Relative Humidity and Temperature sensor is not initialized." APP_LOG_NL);
} else {
- app_log_status_error_f(sc, "RHT sensor measurement failed");
- app_log_nl();
+ app_log_status_error_f(sc, "RHT sensor measurement failed" APP_LOG_NL);
}
return sc;
}
@@ -484,13 +459,10 @@ sl_status_t sl_gatt_service_imu_get(int16_t ovec[3], int16_t avec[3])
sl_status_t sc;
sc = sl_sensor_imu_get(ovec, avec);
if (SL_STATUS_OK == sc) {
- app_log_info("IMU: ORI : %04d,%04d,%04d", ovec[0], ovec[1], ovec[2]);
- app_log_nl();
- app_log_info("IMU: ACC : %04d,%04d,%04d", avec[0], avec[1], avec[2]);
- app_log_nl();
+ app_log_info("IMU: ORI : %04d,%04d,%04d" APP_LOG_NL, ovec[0], ovec[1], ovec[2]);
+ app_log_info("IMU: ACC : %04d,%04d,%04d" APP_LOG_NL, avec[0], avec[1], avec[2]);
} else if (SL_STATUS_NOT_INITIALIZED == sc) {
- app_log_info("Inertial Measurement Unit sensor is not initialized.");
- app_log_nl();
+ app_log_info("Inertial Measurement Unit sensor is not initialized." APP_LOG_NL);
}
return sc;
}
@@ -500,11 +472,9 @@ sl_status_t sl_gatt_service_imu_calibrate(void)
sl_status_t sc;
sc = sl_sensor_imu_calibrate();
if (SL_STATUS_NOT_INITIALIZED == sc) {
- app_log_info("Inertial Measurement Unit sensor is not initialized.");
- app_log_nl();
+ app_log_info("Inertial Measurement Unit sensor is not initialized." APP_LOG_NL);
} else {
- app_log_info("IMU calibration status: %d", sc);
- app_log_nl();
+ app_log_info("IMU calibration status: %d" APP_LOG_NL, sc);
}
return sc;
}
@@ -512,12 +482,10 @@ sl_status_t sl_gatt_service_imu_calibrate(void)
void sl_gatt_service_imu_enable(bool enable)
{
sl_status_t sc;
- app_log_info("IMU %sable", enable ? "en" : "dis");
- app_log_nl();
+ app_log_info("IMU %sable" APP_LOG_NL, enable ? "en" : "dis");
sc = sl_sensor_imu_enable(enable);
if (enable && SL_STATUS_OK != sc) {
- app_log_warning("Inertial Measurement Unit sensor sensor initialization failed.");
- app_log_nl();
+ app_log_warning("Inertial Measurement Unit sensor sensor initialization failed." APP_LOG_NL);
}
}
#endif
@@ -527,8 +495,7 @@ void sl_gatt_service_rgb_set_led(uint8_t m, uint8_t r, uint8_t g, uint8_t b)
{
if (!sl_power_supply_is_low_power()) {
rgb_led_set(m, r, g, b);
- app_log_info("RGBLED write: m:%02x r:%02x g:%02x b:%02x", m, r, g, b);
- app_log_nl();
+ app_log_info("RGBLED write: m:%02x r:%02x g:%02x b:%02x" APP_LOG_NL, m, r, g, b);
}
}
@@ -544,14 +511,11 @@ sl_status_t sl_gatt_service_pressure_get(float *pressure)
sl_status_t sc;
sc = sl_sensor_pressure_get(pressure);
if (SL_STATUS_OK == sc) {
- app_log_info("Pressure = %0.3f mbar", *pressure);
- app_log_nl();
+ app_log_info("Pressure = %0.3f mbar" APP_LOG_NL, *pressure);
} else if (SL_STATUS_NOT_INITIALIZED == sc) {
- app_log_info("Air Pressure sensor is not initialized.");
- app_log_nl();
+ app_log_info("Air Pressure sensor is not initialized." APP_LOG_NL);
} else {
- app_log_status_error_f(sc, "Pressure sensor measurement failed");
- app_log_nl();
+ app_log_status_error_f(sc, "Pressure sensor measurement failed" APP_LOG_NL);
}
return sc;
}
@@ -564,16 +528,12 @@ sl_status_t sl_gatt_service_gas_get(uint16_t *eco2, uint16_t *tvoc)
if (!sl_power_supply_is_low_power()) {
sc = sl_sensor_gas_get(eco2, tvoc);
if (SL_STATUS_OK == sc) {
- app_log_info("eCO2 = %u ppm", (uint16_t)*eco2);
- app_log_nl();
- app_log_info("TVOC = %u ppd", (uint16_t)*tvoc);
- app_log_nl();
+ app_log_info("eCO2 = %u ppm" APP_LOG_NL, (uint16_t)*eco2);
+ app_log_info("TVOC = %u ppd" APP_LOG_NL, (uint16_t)*tvoc);
} else if (SL_STATUS_NOT_INITIALIZED == sc) {
- app_log_info("Air quality sensor is not initialized.");
- app_log_nl();
+ app_log_info("Air quality sensor is not initialized." APP_LOG_NL);
} else if (SL_STATUS_NOT_READY != sc) {
- app_log_status_error_f(sc, "Air quality sensor measurement failed");
- app_log_nl();
+ app_log_status_error_f(sc, "Air quality sensor measurement failed" APP_LOG_NL);
}
}
return sc;
@@ -586,14 +546,11 @@ sl_status_t sl_gatt_service_sound_get(float *sound_level)
sl_status_t sc;
sc = sl_sensor_sound_get(sound_level);
if (SL_STATUS_OK == sc) {
- app_log_info("Sound Level = %3.2f dBA", *sound_level);
- app_log_nl();
+ app_log_info("Sound Level = %3.2f dBA" APP_LOG_NL, *sound_level);
} else if (SL_STATUS_NOT_INITIALIZED == sc) {
- app_log_info("Sound level sensor is not initialized.");
- app_log_nl();
+ app_log_info("Sound level sensor is not initialized." APP_LOG_NL);
} else {
- app_log_status_error_f(sc, "Sound level measurement failed");
- app_log_nl();
+ app_log_status_error_f(sc, "Sound level measurement failed" APP_LOG_NL);
}
return sc;
}
diff --git a/app/bluetooth/example/bt_soc_thunderboard/brd2601b/rgbled.c b/app/bluetooth/example/bt_soc_thunderboard/brd2601b/rgbled.c
index dcb52b9ed6..4da6c81d44 100644
--- a/app/bluetooth/example/bt_soc_thunderboard/brd2601b/rgbled.c
+++ b/app/bluetooth/example/bt_soc_thunderboard/brd2601b/rgbled.c
@@ -70,7 +70,7 @@ void rgb_led_init(void)
void rgb_led_deinit(void)
{
- sl_simple_rgb_pwm_led_turn_off(sl_led_rgb.led_common.context);
+ sl_simple_rgb_pwm_led_turn_off(sl_simple_rgb_pwm_led_rgb_led0.led_common.context);
}
void rgb_led_set(uint8_t m, uint8_t r, uint8_t g, uint8_t b)
@@ -82,18 +82,18 @@ void rgb_led_set(uint8_t m, uint8_t r, uint8_t g, uint8_t b)
}
if (m != 0) {
- sl_simple_rgb_pwm_led_set_color(sl_led_rgb.led_common.context,
+ sl_simple_rgb_pwm_led_set_color(sl_simple_rgb_pwm_led_rgb_led0.led_common.context,
light_levels[r],
light_levels[g],
light_levels[b]);
} else {
- sl_simple_rgb_pwm_led_turn_off(sl_led_rgb.led_common.context);
+ sl_simple_rgb_pwm_led_turn_off(sl_simple_rgb_pwm_led_rgb_led0.led_common.context);
}
}
void adv_led_turn_on(void)
{
- sl_simple_rgb_pwm_led_set_color(sl_led_rgb.led_common.context,
+ sl_simple_rgb_pwm_led_set_color(sl_simple_rgb_pwm_led_rgb_led0.led_common.context,
light_levels[ADV_LED_RED_INTENSITY],
light_levels[ADV_LED_GREEN_INTENSITY],
light_levels[ADV_LED_BLUE_INTENSITY]);
@@ -101,10 +101,10 @@ void adv_led_turn_on(void)
void adv_led_turn_off(void)
{
- sl_simple_rgb_pwm_led_turn_off(sl_led_rgb.led_common.context);
+ sl_simple_rgb_pwm_led_turn_off(sl_simple_rgb_pwm_led_rgb_led0.led_common.context);
}
void adv_led_toggle(void)
{
- sl_simple_rgb_pwm_led_toggle(sl_led_rgb.led_common.context);
+ sl_simple_rgb_pwm_led_toggle(sl_simple_rgb_pwm_led_rgb_led0.led_common.context);
}
diff --git a/app/bluetooth/example/bt_soc_thunderboard/brd2601b/sl_simple_rgb_pwm_led_led_rgb_config.h b/app/bluetooth/example/bt_soc_thunderboard/brd2601b/sl_simple_rgb_pwm_led_led_rgb_config.h
deleted file mode 100644
index 47ac21f73c..0000000000
--- a/app/bluetooth/example/bt_soc_thunderboard/brd2601b/sl_simple_rgb_pwm_led_led_rgb_config.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************//**
- * @file
- * @brief Simple RGB PWM Led Driver Configuration
- *******************************************************************************
- * # License
- * Copyright 2022 Silicon Laboratories Inc. www.silabs.com
- *******************************************************************************
- *
- * SPDX-License-Identifier: Zlib
- *
- * The licensor of this software is Silicon Laboratories Inc.
- *
- * This software is provided 'as-is', without any express or implied
- * warranty. In no event will the authors be held liable for any damages
- * arising from the use of this software.
- *
- * Permission is granted to anyone to use this software for any purpose,
- * including commercial applications, and to alter it and redistribute it
- * freely, subject to the following restrictions:
- *
- * 1. The origin of this software must not be misrepresented; you must not
- * claim that you wrote the original software. If you use this software
- * in a product, an acknowledgment in the product documentation would be
- * appreciated but is not required.
- * 2. Altered source versions must be plainly marked as such, and must not be
- * misrepresented as being the original software.
- * 3. This notice may not be removed or altered from any source distribution.
- *
- ******************************************************************************/
-
-#ifndef SL_SIMPLE_RGB_PWM_LED_LED_RGB_CONFIG_H
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_CONFIG_H
-
-// <<< Use Configuration Wizard in Context Menu >>>
-
-// Simple RGB PWM LED Configuration
-// PWM frequency [Hz]
-// Sets the frequency of the PWM signal
-// 0 = Don't care
-// Default: 10000
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_FREQUENCY 10000
-
-// PWM resolution <2-65536>
-// Specifies the PWM (dimming) resolution. I.e. if you want a
-// dimming resolution that takes the input values from 0 to 99,
-// set this value to 100
-// Default: 256
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_RESOLUTION 256
-
-// Red LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_RED_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-// Green LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_GREEN_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-
-// Blue LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_BLUE_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-// end led configuration
-
-// <<< end of configuration section >>>
-
-// <<< sl:start pin_tool >>>
-
-// SL_SIMPLE_RGB_PWM_LED_LED_RGB
-// $[TIMER_SL_SIMPLE_RGB_PWM_LED_LED_RGB]
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_PERIPHERAL TIMER1
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_PERIPHERAL_NO 1
-
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_RED_CHANNEL 0
-// TIMER1 CC0 on PD02
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_RED_PORT gpioPortD
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_RED_PIN 2
-
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_GREEN_CHANNEL 1
-// TIMER1 CC1 on PA04
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_GREEN_PORT gpioPortA
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_GREEN_PIN 4
-
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_BLUE_CHANNEL 2
-// TIMER1 CC2 on PB00
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_BLUE_PORT gpioPortB
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_BLUE_PIN 0
-// [TIMER_SL_SIMPLE_RGB_PWM_LED_LED_RGB]$
-
-// <<< sl:end pin_tool >>>
-
-#endif // SL_SIMPLE_RGB_PWM_LED_LED_RGB_CONFIG_H
diff --git a/app/bluetooth/example/bt_soc_thunderboard/brd4166a/rgbled.c b/app/bluetooth/example/bt_soc_thunderboard/brd4166a/rgbled.c
index f15961def3..7c0e790f9b 100644
--- a/app/bluetooth/example/bt_soc_thunderboard/brd4166a/rgbled.c
+++ b/app/bluetooth/example/bt_soc_thunderboard/brd4166a/rgbled.c
@@ -130,7 +130,7 @@ void rgb_led_set(uint8_t m, uint8_t r, uint8_t g, uint8_t b)
{
rgb_led_enable(false, (~m & BOARD_RGBLED_MASK));
rgb_led_enable(true, m);
- sl_led_set_rgb_color(&sl_led_rgb,
+ sl_led_set_rgb_color(&sl_simple_rgb_pwm_led_rgb_led0,
light_levels[r],
light_levels[g],
light_levels[b]);
diff --git a/app/bluetooth/example/bt_soc_thunderboard/brd4166a/sl_simple_rgb_pwm_led_led_rgb_config.h b/app/bluetooth/example/bt_soc_thunderboard/brd4166a/sl_simple_rgb_pwm_led_led_rgb_config.h
deleted file mode 100644
index ef7bc74060..0000000000
--- a/app/bluetooth/example/bt_soc_thunderboard/brd4166a/sl_simple_rgb_pwm_led_led_rgb_config.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/***************************************************************************//**
- * @file
- * @brief Simple RGB PWM Led Driver Configuration
- *******************************************************************************
- * # License
- * Copyright 2022 Silicon Laboratories Inc. www.silabs.com
- *******************************************************************************
- *
- * SPDX-License-Identifier: Zlib
- *
- * The licensor of this software is Silicon Laboratories Inc.
- *
- * This software is provided 'as-is', without any express or implied
- * warranty. In no event will the authors be held liable for any damages
- * arising from the use of this software.
- *
- * Permission is granted to anyone to use this software for any purpose,
- * including commercial applications, and to alter it and redistribute it
- * freely, subject to the following restrictions:
- *
- * 1. The origin of this software must not be misrepresented; you must not
- * claim that you wrote the original software. If you use this software
- * in a product, an acknowledgment in the product documentation would be
- * appreciated but is not required.
- * 2. Altered source versions must be plainly marked as such, and must not be
- * misrepresented as being the original software.
- * 3. This notice may not be removed or altered from any source distribution.
- *
- ******************************************************************************/
-
-#ifndef SL_SIMPLE_RGB_PWM_LED_LED_RGB_CONFIG_H
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_CONFIG_H
-
-// <<< Use Configuration Wizard in Context Menu >>>
-
-// Simple RGB PWM LED Configuration
-// PWM frequency [Hz]
-// Sets the frequency of the PWM signal
-// 0 = Don't care
-// Default: 10000
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_FREQUENCY 10000
-
-// PWM resolution <2-65536>
-// Specifies the PWM (dimming) resolution. I.e. if you want a
-// dimming resolution that takes the input values from 0 to 99,
-// set this value to 100
-// Default: 256
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_RESOLUTION 256
-
-// Red LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_HIGH
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_RED_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_HIGH
-
-// Green LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_HIGH
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_GREEN_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_HIGH
-
-// Blue LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_HIGH
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_BLUE_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_HIGH
-// end led configuration
-
-// <<< end of configuration section >>>
-
-// <<< sl:start pin_tool >>>
-
-// SL_SIMPLE_RGB_PWM_LED_LED_RGB
-// $[TIMER_SL_SIMPLE_RGB_PWM_LED_LED_RGB]
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_PERIPHERAL TIMER1
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_PERIPHERAL_NO 1
-
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_RED_CHANNEL 0
-// TIMER0 CC0 on PD11
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_RED_PORT gpioPortD
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_RED_PIN 11
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_RED_LOC 19
-
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_GREEN_CHANNEL 1
-// TIMER0 CC1 on PD12
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_GREEN_PORT gpioPortD
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_GREEN_PIN 12
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_GREEN_LOC 19
-
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_BLUE_CHANNEL 2
-// TIMER0 CC2 on PD13
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_BLUE_PORT gpioPortD
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_BLUE_PIN 13
-#define SL_SIMPLE_RGB_PWM_LED_LED_RGB_BLUE_LOC 19
-// [TIMER_SL_SIMPLE_RGB_PWM_LED_LED_RGB]$
-
-// <<< sl:end pin_tool >>>
-
-#endif // SL_SIMPLE_RGB_PWM_LED_LED_RGB_CONFIG_H
diff --git a/app/bluetooth/example/bt_soc_thunderboard/bt_soc_thunderboard_brd4166a.slcp b/app/bluetooth/example/bt_soc_thunderboard/bt_soc_thunderboard_brd4166a.slcp
index 248731dec7..7cfb9491e0 100644
--- a/app/bluetooth/example/bt_soc_thunderboard/bt_soc_thunderboard_brd4166a.slcp
+++ b/app/bluetooth/example/bt_soc_thunderboard/bt_soc_thunderboard_brd4166a.slcp
@@ -21,9 +21,7 @@ component:
- id: gatt_configuration
- id: bluetooth_feature_legacy_advertiser
- id: bluetooth_feature_connection
- - id: bluetooth_feature_gatt
- id: bluetooth_feature_gatt_server
- - id: bluetooth_feature_scanner
- id: bluetooth_feature_sm
- id: bluetooth_feature_system
- id: in_place_ota_dfu
@@ -72,7 +70,7 @@ component:
- btn1
- id: simple_rgb_pwm_led
instance:
- - led_rgb
+ - rgb_led0
source:
- path: advertise.c
@@ -98,11 +96,6 @@ config_file:
file_id: gatt_configuration_file_id
path: gatt_configuration_brd4166a.btconf
directory: btconf
- - override:
- component: simple_rgb_pwm_led
- file_id: simple_rgb_pwm_led_config
- instance: led_rgb
- path: brd4166a/sl_simple_rgb_pwm_led_led_rgb_config.h
other_file:
- path: ../../script/create_bl_files.bat
diff --git a/app/bluetooth/example/bt_soc_thunderboard/bt_soc_thunderboard_brd4184a.slcp b/app/bluetooth/example/bt_soc_thunderboard/bt_soc_thunderboard_brd4184a.slcp
index f68e6a0ddb..af1ba830aa 100644
--- a/app/bluetooth/example/bt_soc_thunderboard/bt_soc_thunderboard_brd4184a.slcp
+++ b/app/bluetooth/example/bt_soc_thunderboard/bt_soc_thunderboard_brd4184a.slcp
@@ -21,9 +21,7 @@ component:
- id: gatt_configuration
- id: bluetooth_feature_legacy_advertiser
- id: bluetooth_feature_connection
- - id: bluetooth_feature_gatt
- id: bluetooth_feature_gatt_server
- - id: bluetooth_feature_scanner
- id: bluetooth_feature_sm
- id: bluetooth_feature_system
- id: in_place_ota_dfu
diff --git a/app/bluetooth/example/bt_soc_thunderboard/bt_soc_thunderboard_brd4184b.slcp b/app/bluetooth/example/bt_soc_thunderboard/bt_soc_thunderboard_brd4184b.slcp
index d6ee2f7bc7..a8d6ddd929 100644
--- a/app/bluetooth/example/bt_soc_thunderboard/bt_soc_thunderboard_brd4184b.slcp
+++ b/app/bluetooth/example/bt_soc_thunderboard/bt_soc_thunderboard_brd4184b.slcp
@@ -21,9 +21,7 @@ component:
- id: gatt_configuration
- id: bluetooth_feature_legacy_advertiser
- id: bluetooth_feature_connection
- - id: bluetooth_feature_gatt
- id: bluetooth_feature_gatt_server
- - id: bluetooth_feature_scanner
- id: bluetooth_feature_sm
- id: bluetooth_feature_system
- id: in_place_ota_dfu
diff --git a/app/bluetooth/example/bt_soc_thunderboard/bt_soc_xg24_dev_kit_brd2601b.slcp b/app/bluetooth/example/bt_soc_thunderboard/bt_soc_xg24_dev_kit_brd2601b.slcp
index d2614ac3cc..f35be7183b 100644
--- a/app/bluetooth/example/bt_soc_thunderboard/bt_soc_xg24_dev_kit_brd2601b.slcp
+++ b/app/bluetooth/example/bt_soc_thunderboard/bt_soc_xg24_dev_kit_brd2601b.slcp
@@ -21,9 +21,7 @@ component:
- id: gatt_configuration
- id: bluetooth_feature_legacy_advertiser
- id: bluetooth_feature_connection
- - id: bluetooth_feature_gatt
- id: bluetooth_feature_gatt_server
- - id: bluetooth_feature_scanner
- id: bluetooth_feature_sm
- id: bluetooth_feature_system
- id: in_place_ota_dfu
@@ -64,7 +62,7 @@ component:
- btn1
- id: simple_rgb_pwm_led
instance:
- - led_rgb
+ - rgb_led0
source:
- path: advertise.c
@@ -90,11 +88,6 @@ config_file:
file_id: gatt_configuration_file_id
path: gatt_configuration_brd2601b.btconf
directory: btconf
- - override:
- component: simple_rgb_pwm_led
- file_id: simple_rgb_pwm_led_config
- instance: led_rgb
- path: brd2601b/sl_simple_rgb_pwm_led_led_rgb_config.h
other_file:
- path: ../../script/create_bl_files.bat
diff --git a/app/bluetooth/example/bt_soc_voice/app.c b/app/bluetooth/example/bt_soc_voice/app.c
index 848a552786..cdc98927a2 100644
--- a/app/bluetooth/example/bt_soc_voice/app.c
+++ b/app/bluetooth/example/bt_soc_voice/app.c
@@ -126,8 +126,8 @@ void sl_bt_on_event(sl_bt_msg_t *evt)
evt->data.evt_system_boot.patch,
evt->data.evt_system_boot.build);
- // Set maximal MTU.
- sc = sl_bt_gatt_set_max_mtu(250, &max_mtu_out);
+ // Set maximal MTU for GATT Server.
+ sc = sl_bt_gatt_server_set_max_mtu(250, &max_mtu_out);
app_assert_status(sc);
// Extract unique ID from BT Address.
diff --git a/app/bluetooth/example/bt_soc_voice/bt_soc_voice.slcp b/app/bluetooth/example/bt_soc_voice/bt_soc_voice.slcp
index cbb5dffd73..853644f247 100644
--- a/app/bluetooth/example/bt_soc_voice/bt_soc_voice.slcp
+++ b/app/bluetooth/example/bt_soc_voice/bt_soc_voice.slcp
@@ -21,9 +21,7 @@ component:
- id: gatt_configuration
- id: bluetooth_feature_legacy_advertiser
- id: bluetooth_feature_connection
- - id: bluetooth_feature_gatt
- id: bluetooth_feature_gatt_server
- - id: bluetooth_feature_scanner
- id: bluetooth_feature_sm
- id: bluetooth_feature_system
- id: in_place_ota_dfu
diff --git a/app/bluetooth/example/btmesh_ncp_empty/btmesh_ncp_empty.slcp b/app/bluetooth/example/btmesh_ncp_empty/btmesh_ncp_empty.slcp
index 5df2e0e384..d50e36cb50 100644
--- a/app/bluetooth/example/btmesh_ncp_empty/btmesh_ncp_empty.slcp
+++ b/app/bluetooth/example/btmesh_ncp_empty/btmesh_ncp_empty.slcp
@@ -129,7 +129,7 @@ configuration:
condition:
- psa_crypto
- name: SL_STACK_SIZE
- value: "0x1200"
+ value: "0x1400"
- name: SL_UARTDRV_USART_VCOM_FLOW_CONTROL_TYPE
value: uartdrvFlowControlNone
condition:
diff --git a/app/bluetooth/example/btmesh_ncp_empty/btmesh_ncp_empty_xg22.slcp b/app/bluetooth/example/btmesh_ncp_empty/btmesh_ncp_empty_xg22.slcp
index cd23e8b7a6..bed249fa9e 100644
--- a/app/bluetooth/example/btmesh_ncp_empty/btmesh_ncp_empty_xg22.slcp
+++ b/app/bluetooth/example/btmesh_ncp_empty/btmesh_ncp_empty_xg22.slcp
@@ -134,7 +134,7 @@ configuration:
- name: SL_SIMPLE_COM_TX_BUF_SIZE
value: "768"
- name: SL_STACK_SIZE
- value: "0xD00"
+ value: "0xE00"
- name: SL_UARTDRV_USART_VCOM_FLOW_CONTROL_TYPE
value: uartdrvFlowControlNone
condition:
diff --git a/app/bluetooth/example/btmesh_ncp_empty/dcd_config.btmeshconf b/app/bluetooth/example/btmesh_ncp_empty/dcd_config.btmeshconf
index 69b4f33f23..3021489714 100644
--- a/app/bluetooth/example/btmesh_ncp_empty/dcd_config.btmeshconf
+++ b/app/bluetooth/example/btmesh_ncp_empty/dcd_config.btmeshconf
@@ -2,7 +2,7 @@
"composition_data": {
"cid": "0x02ff",
"pid": "0x0000",
- "vid": "0x0300",
+ "vid": "0x0301",
"elements": [
{
"name": "Primary Element",
diff --git a/app/bluetooth/example/btmesh_ncp_empty/dcd_config_xg22.btmeshconf b/app/bluetooth/example/btmesh_ncp_empty/dcd_config_xg22.btmeshconf
index ba5a194090..2d6ff4f487 100644
--- a/app/bluetooth/example/btmesh_ncp_empty/dcd_config_xg22.btmeshconf
+++ b/app/bluetooth/example/btmesh_ncp_empty/dcd_config_xg22.btmeshconf
@@ -2,7 +2,7 @@
"composition_data": {
"cid": "0x02ff",
"pid": "0x0000",
- "vid": "0x0300",
+ "vid": "0x0301",
"elements": [
{
"name": "Main",
diff --git a/app/bluetooth/example/btmesh_soc_empty/btmesh_soc_empty.slcp b/app/bluetooth/example/btmesh_soc_empty/btmesh_soc_empty.slcp
index c67d8eb596..837ba76887 100644
--- a/app/bluetooth/example/btmesh_soc_empty/btmesh_soc_empty.slcp
+++ b/app/bluetooth/example/btmesh_soc_empty/btmesh_soc_empty.slcp
@@ -72,7 +72,7 @@ configuration:
condition:
- psa_crypto
- name: SL_STACK_SIZE
- value: "0x1000"
+ value: "0x1200"
tag:
- hardware:device:flash:512
diff --git a/app/bluetooth/example/btmesh_soc_empty/dcd_config.btmeshconf b/app/bluetooth/example/btmesh_soc_empty/dcd_config.btmeshconf
index 08f7e16039..8c41a98e6f 100644
--- a/app/bluetooth/example/btmesh_soc_empty/dcd_config.btmeshconf
+++ b/app/bluetooth/example/btmesh_soc_empty/dcd_config.btmeshconf
@@ -2,7 +2,7 @@
"composition_data": {
"cid": "0x02ff",
"pid": "0x0001",
- "vid": "0x0300",
+ "vid": "0x0301",
"elements": [
{
"name": "Main",
diff --git a/app/bluetooth/example/btmesh_soc_hsl/btmesh_soc_hsl_brd2601b.slcp b/app/bluetooth/example/btmesh_soc_hsl/btmesh_soc_hsl_brd2601b.slcp
index 7d4933d7b0..5de29abefe 100644
--- a/app/bluetooth/example/btmesh_soc_hsl/btmesh_soc_hsl_brd2601b.slcp
+++ b/app/bluetooth/example/btmesh_soc_hsl/btmesh_soc_hsl_brd2601b.slcp
@@ -53,7 +53,7 @@ component:
- btn1
- id: simple_rgb_pwm_led
instance:
- - led_rgb
+ - rgb_led0
- id: simple_timer
source:
@@ -77,11 +77,6 @@ config_file:
file_id: gatt_configuration_file_id
path: gatt_configuration.btconf
directory: btconf
- - override:
- component: simple_rgb_pwm_led
- file_id: simple_rgb_pwm_led_config
- instance: led_rgb
- path: sl_simple_rgb_pwm_led_led_rgb_brd2601_config.h
- override:
component: btmesh_dcd_configuration
file_id: dcd_configuration_file_id
@@ -147,7 +142,7 @@ configuration:
condition:
- psa_crypto
- name: SL_STACK_SIZE
- value: "0x1300"
+ value: "0x1500"
define:
- name: SL_BTMESH_HSL_RGB_BRD2601
diff --git a/app/bluetooth/example/btmesh_soc_hsl/btmesh_soc_hsl_brd4166a.slcp b/app/bluetooth/example/btmesh_soc_hsl/btmesh_soc_hsl_brd4166a.slcp
index f68010bf0b..062a624778 100644
--- a/app/bluetooth/example/btmesh_soc_hsl/btmesh_soc_hsl_brd4166a.slcp
+++ b/app/bluetooth/example/btmesh_soc_hsl/btmesh_soc_hsl_brd4166a.slcp
@@ -53,7 +53,7 @@ component:
- btn1
- id: simple_rgb_pwm_led
instance:
- - led_rgb
+ - rgb_led0
- id: simple_timer
source:
@@ -77,11 +77,6 @@ config_file:
file_id: gatt_configuration_file_id
path: gatt_configuration.btconf
directory: btconf
- - override:
- component: simple_rgb_pwm_led
- file_id: simple_rgb_pwm_led_config
- instance: led_rgb
- path: sl_simple_rgb_pwm_led_led_rgb_brd4166_config.h
- override:
component: btmesh_dcd_configuration
file_id: dcd_configuration_file_id
@@ -147,7 +142,7 @@ configuration:
condition:
- psa_crypto
- name: SL_STACK_SIZE
- value: "0x1300"
+ value: "0x1500"
define:
- name: SL_BTMESH_HSL_RGB_BRD4166
diff --git a/app/bluetooth/example/btmesh_soc_hsl/btmesh_soc_hsl_display.slcp b/app/bluetooth/example/btmesh_soc_hsl/btmesh_soc_hsl_display.slcp
index c8ae259499..ea837452b7 100644
--- a/app/bluetooth/example/btmesh_soc_hsl/btmesh_soc_hsl_display.slcp
+++ b/app/bluetooth/example/btmesh_soc_hsl/btmesh_soc_hsl_display.slcp
@@ -141,7 +141,7 @@ configuration:
condition:
- psa_crypto
- name: SL_STACK_SIZE
- value: "0x1300"
+ value: "0x1500"
template_contribution:
- name: cli_command
diff --git a/app/bluetooth/example/btmesh_soc_hsl/btmesh_soc_hsl_log.slcp b/app/bluetooth/example/btmesh_soc_hsl/btmesh_soc_hsl_log.slcp
index e9b26dff1b..3caceebebe 100644
--- a/app/bluetooth/example/btmesh_soc_hsl/btmesh_soc_hsl_log.slcp
+++ b/app/bluetooth/example/btmesh_soc_hsl/btmesh_soc_hsl_log.slcp
@@ -140,7 +140,7 @@ configuration:
condition:
- psa_crypto
- name: SL_STACK_SIZE
- value: "0x1300"
+ value: "0x1500"
template_contribution:
- name: cli_command
diff --git a/app/bluetooth/example/btmesh_soc_hsl/dcd_config.btmeshconf b/app/bluetooth/example/btmesh_soc_hsl/dcd_config.btmeshconf
index 20aba3b3f4..d987799001 100644
--- a/app/bluetooth/example/btmesh_soc_hsl/dcd_config.btmeshconf
+++ b/app/bluetooth/example/btmesh_soc_hsl/dcd_config.btmeshconf
@@ -2,7 +2,7 @@
"composition_data": {
"cid": "0x02ff",
"pid": "0x0002",
- "vid": "0x0300",
+ "vid": "0x0301",
"elements": [
{
"name": "Main",
diff --git a/app/bluetooth/example/btmesh_soc_hsl/rgbled_brd2601.c b/app/bluetooth/example/btmesh_soc_hsl/rgbled_brd2601.c
index 650db1101e..5eb78e3e26 100644
--- a/app/bluetooth/example/btmesh_soc_hsl/rgbled_brd2601.c
+++ b/app/bluetooth/example/btmesh_soc_hsl/rgbled_brd2601.c
@@ -60,7 +60,7 @@ void rgb_led_deinit(void)
void rgb_led_set_rgb(uint8_t m, uint8_t r, uint8_t g, uint8_t b)
{
(void) m;
- sl_led_set_rgb_color(&sl_led_rgb,
+ sl_led_set_rgb_color(&sl_simple_rgb_pwm_led_rgb_led0,
(uint16_t)r,
(uint16_t)g,
(uint16_t)b);
diff --git a/app/bluetooth/example/btmesh_soc_hsl/rgbled_brd4166.c b/app/bluetooth/example/btmesh_soc_hsl/rgbled_brd4166.c
index 3d23d3ad2f..966e192142 100644
--- a/app/bluetooth/example/btmesh_soc_hsl/rgbled_brd4166.c
+++ b/app/bluetooth/example/btmesh_soc_hsl/rgbled_brd4166.c
@@ -124,7 +124,7 @@ void rgb_led_set_rgb(uint8_t m, uint8_t r, uint8_t g, uint8_t b)
{
rgb_led_enable(false, ~m);
rgb_led_enable(true, m);
- sl_led_set_rgb_color(&sl_led_rgb,
+ sl_led_set_rgb_color(&sl_simple_rgb_pwm_led_rgb_led0,
(uint16_t)r,
(uint16_t)g,
(uint16_t)b);
diff --git a/app/bluetooth/example/btmesh_soc_hsl/sl_simple_rgb_pwm_led_led_rgb_brd2601_config.h b/app/bluetooth/example/btmesh_soc_hsl/sl_simple_rgb_pwm_led_led_rgb_brd2601_config.h
deleted file mode 100644
index f9e4730922..0000000000
--- a/app/bluetooth/example/btmesh_soc_hsl/sl_simple_rgb_pwm_led_led_rgb_brd2601_config.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/***************************************************************************//**
- * @file
- * @brief Simple RGB PWM Led Driver Configuration
- *******************************************************************************
- * # License
- * Copyright 2022 Silicon Laboratories Inc. www.silabs.com
- *******************************************************************************
- *
- * SPDX-License-Identifier: Zlib
- *
- * The licensor of this software is Silicon Laboratories Inc.
- *
- * This software is provided 'as-is', without any express or implied
- * warranty. In no event will the authors be held liable for any damages
- * arising from the use of this software.
- *
- * Permission is granted to anyone to use this software for any purpose,
- * including commercial applications, and to alter it and redistribute it
- * freely, subject to the following restrictions:
- *
- * 1. The origin of this software must not be misrepresented; you must not
- * claim that you wrote the original software. If you use this software
- * in a product, an acknowledgment in the product documentation would be
- * appreciated but is not required.
- * 2. Altered source versions must be plainly marked as such, and must not be
- * misrepresented as being the original software.
- * 3. This notice may not be removed or altered from any source distribution.
- *
- ******************************************************************************/
-
-#ifndef SL_SIMPLE_RGB_PWM_LED_INSTANCE_CONFIG_H
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_CONFIG_H
-
-// <<< Use Configuration Wizard in Context Menu >>>
-
-// Simple RGB PWM LED Configuration
-// PWM frequency [Hz]
-// Sets the frequency of the PWM signal
-// 0 = Don't care
-// Default: 10000
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_FREQUENCY 10000
-
-// PWM resolution <2-65536>
-// Specifies the PWM (dimming) resolution. I.e. if you want a
-// dimming resolution that takes the input values from 0 to 99,
-// set this value to 100
-// Default: 256
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_RESOLUTION 256
-
-// Red LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_RED_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-
-// Green LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_GREEN_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-
-// Blue LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_BLUE_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-// end led configuration
-
-// <<< end of configuration section >>>
-
-// <<< sl:start pin_tool >>>
-
-// SL_SIMPLE_RGB_PWM_LED_INSTANCE
-// $[TIMER_SL_SIMPLE_RGB_PWM_LED_INSTANCE]
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_PERIPHERAL TIMER1
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_PERIPHERAL_NO 1
-
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_RED_CHANNEL 0
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_RED_PORT gpioPortD
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_RED_PIN 2
-
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_GREEN_CHANNEL 1
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_GREEN_PORT gpioPortA
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_GREEN_PIN 4
-
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_BLUE_CHANNEL 2
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_BLUE_PORT gpioPortB
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_BLUE_PIN 0
-// [TIMER_SL_SIMPLE_RGB_PWM_LED_INSTANCE]$
-
-// <<< sl:end pin_tool >>>
-
-#endif // SL_SIMPLE_RGB_PWM_LED_INSTANCE_CONFIG_H
diff --git a/app/bluetooth/example/btmesh_soc_hsl/sl_simple_rgb_pwm_led_led_rgb_brd4166_config.h b/app/bluetooth/example/btmesh_soc_hsl/sl_simple_rgb_pwm_led_led_rgb_brd4166_config.h
deleted file mode 100644
index dccf063aba..0000000000
--- a/app/bluetooth/example/btmesh_soc_hsl/sl_simple_rgb_pwm_led_led_rgb_brd4166_config.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/***************************************************************************//**
- * @file
- * @brief Simple RGB PWM Led Driver Configuration
- *******************************************************************************
- * # License
- * Copyright 2022 Silicon Laboratories Inc. www.silabs.com
- *******************************************************************************
- *
- * SPDX-License-Identifier: Zlib
- *
- * The licensor of this software is Silicon Laboratories Inc.
- *
- * This software is provided 'as-is', without any express or implied
- * warranty. In no event will the authors be held liable for any damages
- * arising from the use of this software.
- *
- * Permission is granted to anyone to use this software for any purpose,
- * including commercial applications, and to alter it and redistribute it
- * freely, subject to the following restrictions:
- *
- * 1. The origin of this software must not be misrepresented; you must not
- * claim that you wrote the original software. If you use this software
- * in a product, an acknowledgment in the product documentation would be
- * appreciated but is not required.
- * 2. Altered source versions must be plainly marked as such, and must not be
- * misrepresented as being the original software.
- * 3. This notice may not be removed or altered from any source distribution.
- *
- ******************************************************************************/
-
-#ifndef SL_SIMPLE_RGB_PWM_LED_INSTANCE_CONFIG_H
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_CONFIG_H
-
-// <<< Use Configuration Wizard in Context Menu >>>
-
-// Simple RGB PWM LED Configuration
-// PWM frequency [Hz]
-// Sets the frequency of the PWM signal
-// 0 = Don't care
-// Default: 10000
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_FREQUENCY 10000
-
-// PWM resolution <2-65536>
-// Specifies the PWM (dimming) resolution. I.e. if you want a
-// dimming resolution that takes the input values from 0 to 99,
-// set this value to 100
-// Default: 256
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_RESOLUTION 256
-
-// Red LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_RED_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_HIGH
-
-// Green LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_GREEN_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_HIGH
-
-// Blue LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_BLUE_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_HIGH
-// end led configuration
-
-// <<< end of configuration section >>>
-
-// <<< sl:start pin_tool >>>
-
-// SL_SIMPLE_RGB_PWM_LED_INSTANCE
-// $[TIMER_SL_SIMPLE_RGB_PWM_LED_INSTANCE]
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_PERIPHERAL TIMER1
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_PERIPHERAL_NO 1
-
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_RED_CHANNEL 0
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_RED_PORT gpioPortD
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_RED_PIN 11
- #define SL_SIMPLE_RGB_PWM_LED_INSTANCE_RED_LOC 19
-
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_GREEN_CHANNEL 1
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_GREEN_PORT gpioPortD
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_GREEN_PIN 12
- #define SL_SIMPLE_RGB_PWM_LED_INSTANCE_GREEN_LOC 19
-
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_BLUE_CHANNEL 2
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_BLUE_PORT gpioPortD
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_BLUE_PIN 13
- #define SL_SIMPLE_RGB_PWM_LED_INSTANCE_BLUE_LOC 19
-// [TIMER_SL_SIMPLE_RGB_PWM_LED_INSTANCE]$
-
-// <<< sl:end pin_tool >>>
-
-#endif // SL_SIMPLE_RGB_PWM_LED_INSTANCE_CONFIG_H
diff --git a/app/bluetooth/example/btmesh_soc_light/btmesh_soc_light_brd2601b.slcp b/app/bluetooth/example/btmesh_soc_light/btmesh_soc_light_brd2601b.slcp
index 2b415497b1..bd325548bf 100644
--- a/app/bluetooth/example/btmesh_soc_light/btmesh_soc_light_brd2601b.slcp
+++ b/app/bluetooth/example/btmesh_soc_light/btmesh_soc_light_brd2601b.slcp
@@ -53,7 +53,7 @@ component:
- btn1
- id: simple_rgb_pwm_led
instance:
- - led_rgb
+ - rgb_led0
- id: simple_timer
source:
@@ -77,11 +77,6 @@ config_file:
file_id: gatt_configuration_file_id
path: gatt_configuration.btconf
directory: btconf
- - override:
- component: simple_rgb_pwm_led
- file_id: simple_rgb_pwm_led_config
- instance: led_rgb
- path: sl_simple_rgb_pwm_led_led_rgb_brd2601_config.h
- override:
component: btmesh_dcd_configuration
file_id: dcd_configuration_file_id
@@ -147,7 +142,7 @@ configuration:
condition:
- psa_crypto
- name: SL_STACK_SIZE
- value: "0x1300"
+ value: "0x1500"
define:
- name: SL_BTMESH_LIGHT_RGB_BRD2601
diff --git a/app/bluetooth/example/btmesh_soc_light/btmesh_soc_light_brd4166a.slcp b/app/bluetooth/example/btmesh_soc_light/btmesh_soc_light_brd4166a.slcp
index 1835fd39e9..b873c186f0 100644
--- a/app/bluetooth/example/btmesh_soc_light/btmesh_soc_light_brd4166a.slcp
+++ b/app/bluetooth/example/btmesh_soc_light/btmesh_soc_light_brd4166a.slcp
@@ -53,7 +53,7 @@ component:
- btn1
- id: simple_rgb_pwm_led
instance:
- - led_rgb
+ - rgb_led0
- id: simple_timer
source:
@@ -77,11 +77,6 @@ config_file:
file_id: gatt_configuration_file_id
path: gatt_configuration.btconf
directory: btconf
- - override:
- component: simple_rgb_pwm_led
- file_id: simple_rgb_pwm_led_config
- instance: led_rgb
- path: sl_simple_rgb_pwm_led_led_rgb_brd4166_config.h
- override:
component: btmesh_dcd_configuration
file_id: dcd_configuration_file_id
@@ -147,7 +142,7 @@ configuration:
condition:
- psa_crypto
- name: SL_STACK_SIZE
- value: "0x1300"
+ value: "0x1500"
define:
- name: SL_BTMESH_LIGHT_RGB_BRD4166
diff --git a/app/bluetooth/example/btmesh_soc_light/btmesh_soc_light_display.slcp b/app/bluetooth/example/btmesh_soc_light/btmesh_soc_light_display.slcp
index 514e97f322..9c5ee77cc1 100644
--- a/app/bluetooth/example/btmesh_soc_light/btmesh_soc_light_display.slcp
+++ b/app/bluetooth/example/btmesh_soc_light/btmesh_soc_light_display.slcp
@@ -141,7 +141,7 @@ configuration:
condition:
- psa_crypto
- name: SL_STACK_SIZE
- value: "0x1300"
+ value: "0x1500"
template_contribution:
- name: cli_command
diff --git a/app/bluetooth/example/btmesh_soc_light/btmesh_soc_light_log.slcp b/app/bluetooth/example/btmesh_soc_light/btmesh_soc_light_log.slcp
index dedf38353c..4b3dee7beb 100644
--- a/app/bluetooth/example/btmesh_soc_light/btmesh_soc_light_log.slcp
+++ b/app/bluetooth/example/btmesh_soc_light/btmesh_soc_light_log.slcp
@@ -140,7 +140,7 @@ configuration:
condition:
- psa_crypto
- name: SL_STACK_SIZE
- value: "0x1300"
+ value: "0x1500"
template_contribution:
- name: cli_command
diff --git a/app/bluetooth/example/btmesh_soc_light/dcd_config.btmeshconf b/app/bluetooth/example/btmesh_soc_light/dcd_config.btmeshconf
index 491c563e72..35d55e388b 100644
--- a/app/bluetooth/example/btmesh_soc_light/dcd_config.btmeshconf
+++ b/app/bluetooth/example/btmesh_soc_light/dcd_config.btmeshconf
@@ -2,7 +2,7 @@
"composition_data": {
"cid": "0x02ff",
"pid": "0x0003",
- "vid": "0x0300",
+ "vid": "0x0301",
"elements": [
{
"name": "Main",
diff --git a/app/bluetooth/example/btmesh_soc_light/rgbled_brd2601.c b/app/bluetooth/example/btmesh_soc_light/rgbled_brd2601.c
index c23da4353a..792287a4b0 100644
--- a/app/bluetooth/example/btmesh_soc_light/rgbled_brd2601.c
+++ b/app/bluetooth/example/btmesh_soc_light/rgbled_brd2601.c
@@ -60,7 +60,7 @@ void rgb_led_deinit(void)
void rgb_led_set_rgb(uint8_t m, uint8_t r, uint8_t g, uint8_t b)
{
(void) m;
- sl_led_set_rgb_color(&sl_led_rgb,
+ sl_led_set_rgb_color(&sl_simple_rgb_pwm_led_rgb_led0,
(uint16_t)r,
(uint16_t)g,
(uint16_t)b);
diff --git a/app/bluetooth/example/btmesh_soc_light/rgbled_brd4166.c b/app/bluetooth/example/btmesh_soc_light/rgbled_brd4166.c
index ced58c810e..3ac2688ec6 100644
--- a/app/bluetooth/example/btmesh_soc_light/rgbled_brd4166.c
+++ b/app/bluetooth/example/btmesh_soc_light/rgbled_brd4166.c
@@ -124,7 +124,7 @@ void rgb_led_set_rgb(uint8_t m, uint8_t r, uint8_t g, uint8_t b)
{
rgb_led_enable(false, ~m);
rgb_led_enable(true, m);
- sl_led_set_rgb_color(&sl_led_rgb,
+ sl_led_set_rgb_color(&sl_simple_rgb_pwm_led_rgb_led0,
(uint16_t)r,
(uint16_t)g,
(uint16_t)b);
diff --git a/app/bluetooth/example/btmesh_soc_light/sl_simple_rgb_pwm_led_led_rgb_brd2601_config.h b/app/bluetooth/example/btmesh_soc_light/sl_simple_rgb_pwm_led_led_rgb_brd2601_config.h
deleted file mode 100644
index f9e4730922..0000000000
--- a/app/bluetooth/example/btmesh_soc_light/sl_simple_rgb_pwm_led_led_rgb_brd2601_config.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/***************************************************************************//**
- * @file
- * @brief Simple RGB PWM Led Driver Configuration
- *******************************************************************************
- * # License
- * Copyright 2022 Silicon Laboratories Inc. www.silabs.com
- *******************************************************************************
- *
- * SPDX-License-Identifier: Zlib
- *
- * The licensor of this software is Silicon Laboratories Inc.
- *
- * This software is provided 'as-is', without any express or implied
- * warranty. In no event will the authors be held liable for any damages
- * arising from the use of this software.
- *
- * Permission is granted to anyone to use this software for any purpose,
- * including commercial applications, and to alter it and redistribute it
- * freely, subject to the following restrictions:
- *
- * 1. The origin of this software must not be misrepresented; you must not
- * claim that you wrote the original software. If you use this software
- * in a product, an acknowledgment in the product documentation would be
- * appreciated but is not required.
- * 2. Altered source versions must be plainly marked as such, and must not be
- * misrepresented as being the original software.
- * 3. This notice may not be removed or altered from any source distribution.
- *
- ******************************************************************************/
-
-#ifndef SL_SIMPLE_RGB_PWM_LED_INSTANCE_CONFIG_H
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_CONFIG_H
-
-// <<< Use Configuration Wizard in Context Menu >>>
-
-// Simple RGB PWM LED Configuration
-// PWM frequency [Hz]
-// Sets the frequency of the PWM signal
-// 0 = Don't care
-// Default: 10000
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_FREQUENCY 10000
-
-// PWM resolution <2-65536>
-// Specifies the PWM (dimming) resolution. I.e. if you want a
-// dimming resolution that takes the input values from 0 to 99,
-// set this value to 100
-// Default: 256
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_RESOLUTION 256
-
-// Red LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_RED_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-
-// Green LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_GREEN_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-
-// Blue LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_BLUE_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-// end led configuration
-
-// <<< end of configuration section >>>
-
-// <<< sl:start pin_tool >>>
-
-// SL_SIMPLE_RGB_PWM_LED_INSTANCE
-// $[TIMER_SL_SIMPLE_RGB_PWM_LED_INSTANCE]
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_PERIPHERAL TIMER1
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_PERIPHERAL_NO 1
-
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_RED_CHANNEL 0
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_RED_PORT gpioPortD
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_RED_PIN 2
-
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_GREEN_CHANNEL 1
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_GREEN_PORT gpioPortA
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_GREEN_PIN 4
-
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_BLUE_CHANNEL 2
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_BLUE_PORT gpioPortB
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_BLUE_PIN 0
-// [TIMER_SL_SIMPLE_RGB_PWM_LED_INSTANCE]$
-
-// <<< sl:end pin_tool >>>
-
-#endif // SL_SIMPLE_RGB_PWM_LED_INSTANCE_CONFIG_H
diff --git a/app/bluetooth/example/btmesh_soc_light/sl_simple_rgb_pwm_led_led_rgb_brd4166_config.h b/app/bluetooth/example/btmesh_soc_light/sl_simple_rgb_pwm_led_led_rgb_brd4166_config.h
deleted file mode 100644
index dccf063aba..0000000000
--- a/app/bluetooth/example/btmesh_soc_light/sl_simple_rgb_pwm_led_led_rgb_brd4166_config.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/***************************************************************************//**
- * @file
- * @brief Simple RGB PWM Led Driver Configuration
- *******************************************************************************
- * # License
- * Copyright 2022 Silicon Laboratories Inc. www.silabs.com
- *******************************************************************************
- *
- * SPDX-License-Identifier: Zlib
- *
- * The licensor of this software is Silicon Laboratories Inc.
- *
- * This software is provided 'as-is', without any express or implied
- * warranty. In no event will the authors be held liable for any damages
- * arising from the use of this software.
- *
- * Permission is granted to anyone to use this software for any purpose,
- * including commercial applications, and to alter it and redistribute it
- * freely, subject to the following restrictions:
- *
- * 1. The origin of this software must not be misrepresented; you must not
- * claim that you wrote the original software. If you use this software
- * in a product, an acknowledgment in the product documentation would be
- * appreciated but is not required.
- * 2. Altered source versions must be plainly marked as such, and must not be
- * misrepresented as being the original software.
- * 3. This notice may not be removed or altered from any source distribution.
- *
- ******************************************************************************/
-
-#ifndef SL_SIMPLE_RGB_PWM_LED_INSTANCE_CONFIG_H
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_CONFIG_H
-
-// <<< Use Configuration Wizard in Context Menu >>>
-
-// Simple RGB PWM LED Configuration
-// PWM frequency [Hz]
-// Sets the frequency of the PWM signal
-// 0 = Don't care
-// Default: 10000
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_FREQUENCY 10000
-
-// PWM resolution <2-65536>
-// Specifies the PWM (dimming) resolution. I.e. if you want a
-// dimming resolution that takes the input values from 0 to 99,
-// set this value to 100
-// Default: 256
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_RESOLUTION 256
-
-// Red LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_RED_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_HIGH
-
-// Green LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_GREEN_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_HIGH
-
-// Blue LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_BLUE_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_HIGH
-// end led configuration
-
-// <<< end of configuration section >>>
-
-// <<< sl:start pin_tool >>>
-
-// SL_SIMPLE_RGB_PWM_LED_INSTANCE
-// $[TIMER_SL_SIMPLE_RGB_PWM_LED_INSTANCE]
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_PERIPHERAL TIMER1
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_PERIPHERAL_NO 1
-
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_RED_CHANNEL 0
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_RED_PORT gpioPortD
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_RED_PIN 11
- #define SL_SIMPLE_RGB_PWM_LED_INSTANCE_RED_LOC 19
-
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_GREEN_CHANNEL 1
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_GREEN_PORT gpioPortD
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_GREEN_PIN 12
- #define SL_SIMPLE_RGB_PWM_LED_INSTANCE_GREEN_LOC 19
-
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_BLUE_CHANNEL 2
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_BLUE_PORT gpioPortD
-#define SL_SIMPLE_RGB_PWM_LED_INSTANCE_BLUE_PIN 13
- #define SL_SIMPLE_RGB_PWM_LED_INSTANCE_BLUE_LOC 19
-// [TIMER_SL_SIMPLE_RGB_PWM_LED_INSTANCE]$
-
-// <<< sl:end pin_tool >>>
-
-#endif // SL_SIMPLE_RGB_PWM_LED_INSTANCE_CONFIG_H
diff --git a/app/bluetooth/example/btmesh_soc_sensor_client/btmesh_soc_sensor_client_display.slcp b/app/bluetooth/example/btmesh_soc_sensor_client/btmesh_soc_sensor_client_display.slcp
index afa46c5397..e7a1f99cd6 100644
--- a/app/bluetooth/example/btmesh_soc_sensor_client/btmesh_soc_sensor_client_display.slcp
+++ b/app/bluetooth/example/btmesh_soc_sensor_client/btmesh_soc_sensor_client_display.slcp
@@ -129,13 +129,7 @@ configuration:
- name: SL_SIMPLE_BUTTON_ALLOW_LED_CONFLICT
value: "1"
- name: SL_STACK_SIZE
- value: "0x1000"
- unless:
- - "device_sdid_205"
- - name: SL_STACK_SIZE
- value: "0xF00"
- condition:
- - "device_sdid_205"
+ value: "0x1300"
template_contribution:
- name: cli_command
diff --git a/app/bluetooth/example/btmesh_soc_sensor_client/btmesh_soc_sensor_client_log.slcp b/app/bluetooth/example/btmesh_soc_sensor_client/btmesh_soc_sensor_client_log.slcp
index 25853d7088..b999a7f96a 100644
--- a/app/bluetooth/example/btmesh_soc_sensor_client/btmesh_soc_sensor_client_log.slcp
+++ b/app/bluetooth/example/btmesh_soc_sensor_client/btmesh_soc_sensor_client_log.slcp
@@ -120,7 +120,7 @@ configuration:
- name: SL_SIMPLE_BUTTON_ALLOW_LED_CONFLICT
value: "1"
- name: SL_STACK_SIZE
- value: "0x1000"
+ value: "0x1200"
template_contribution:
- name: cli_command
diff --git a/app/bluetooth/example/btmesh_soc_sensor_client/btmesh_soc_sensor_client_log_single.slcp b/app/bluetooth/example/btmesh_soc_sensor_client/btmesh_soc_sensor_client_log_single.slcp
index fbd3030c42..e339de33fa 100644
--- a/app/bluetooth/example/btmesh_soc_sensor_client/btmesh_soc_sensor_client_log_single.slcp
+++ b/app/bluetooth/example/btmesh_soc_sensor_client/btmesh_soc_sensor_client_log_single.slcp
@@ -116,7 +116,7 @@ configuration:
condition:
- psa_crypto
- name: SL_STACK_SIZE
- value: "0x1000"
+ value: "0x1200"
define:
- name: "SINGLE_BUTTON"
diff --git a/app/bluetooth/example/btmesh_soc_sensor_client/dcd_config.btmeshconf b/app/bluetooth/example/btmesh_soc_sensor_client/dcd_config.btmeshconf
index 295722c69e..1651efe558 100644
--- a/app/bluetooth/example/btmesh_soc_sensor_client/dcd_config.btmeshconf
+++ b/app/bluetooth/example/btmesh_soc_sensor_client/dcd_config.btmeshconf
@@ -2,7 +2,7 @@
"composition_data": {
"cid": "0x02ff",
"pid": "0x0004",
- "vid": "0x0300",
+ "vid": "0x0301",
"elements": [
{
"name": "Main",
diff --git a/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_brd2601b.slcp b/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_brd2601b.slcp
index 5e3459d9b2..d85c9bf7ea 100644
--- a/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_brd2601b.slcp
+++ b/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_brd2601b.slcp
@@ -130,7 +130,7 @@ configuration:
condition:
- psa_crypto
- name: SL_STACK_SIZE
- value: "0x1000"
+ value: "0x1200"
template_contribution:
- name: cli_command
diff --git a/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_display.slcp b/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_display.slcp
index 4c0edebb95..9ed0966e80 100644
--- a/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_display.slcp
+++ b/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_display.slcp
@@ -139,13 +139,7 @@ configuration:
- name: SL_SIMPLE_BUTTON_ALLOW_LED_CONFLICT
value: "1"
- name: SL_STACK_SIZE
- value: "0x1000"
- unless:
- - "device_sdid_205"
- - name: SL_STACK_SIZE
- value: "0xF00"
- condition:
- - "device_sdid_205"
+ value: "0x1300"
template_contribution:
- name: cli_command
diff --git a/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_mock_display.slcp b/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_mock_display.slcp
index 1f828d9fc2..30d11296e5 100644
--- a/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_mock_display.slcp
+++ b/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_mock_display.slcp
@@ -125,7 +125,7 @@ configuration:
- name: SL_SIMPLE_BUTTON_ALLOW_LED_CONFLICT
value: "1"
- name: SL_STACK_SIZE
- value: "0x1000"
+ value: "0x1400"
template_contribution:
- name: cli_command
diff --git a/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_mock_log.slcp b/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_mock_log.slcp
index fe2cc4647b..07bbeeca50 100644
--- a/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_mock_log.slcp
+++ b/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_mock_log.slcp
@@ -122,7 +122,7 @@ configuration:
- name: SL_SIMPLE_BUTTON_ALLOW_LED_CONFLICT
value: "1"
- name: SL_STACK_SIZE
- value: "0x1000"
+ value: "0x1200"
template_contribution:
- name: cli_command
diff --git a/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_mock_log_single.slcp b/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_mock_log_single.slcp
index 8a60535f1c..10f229bd1d 100644
--- a/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_mock_log_single.slcp
+++ b/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_mock_log_single.slcp
@@ -118,7 +118,7 @@ configuration:
condition:
- psa_crypto
- name: SL_STACK_SIZE
- value: "0x1000"
+ value: "0x1200"
define:
- name: "SINGLE_BUTTON"
diff --git a/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_tbbg22a.slcp b/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_tbbg22a.slcp
index 1313207a9b..d872ff2315 100644
--- a/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_tbbg22a.slcp
+++ b/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_tbbg22a.slcp
@@ -130,7 +130,7 @@ configuration:
condition:
- psa_crypto
- name: SL_STACK_SIZE
- value: "0x1000"
+ value: "0x1200"
define:
- name: "SINGLE_LED"
diff --git a/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_tbbg22b.slcp b/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_tbbg22b.slcp
index 2050ebdacd..062b39a2ae 100644
--- a/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_tbbg22b.slcp
+++ b/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_tbbg22b.slcp
@@ -128,7 +128,7 @@ configuration:
condition:
- psa_crypto
- name: SL_STACK_SIZE
- value: "0x1000"
+ value: "0x1200"
define:
- name: "SINGLE_LED"
diff --git a/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_tbsense.slcp b/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_tbsense.slcp
index 6d256e726f..ce74b7e98f 100644
--- a/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_tbsense.slcp
+++ b/app/bluetooth/example/btmesh_soc_sensor_server/btmesh_soc_sensor_server_tbsense.slcp
@@ -130,7 +130,7 @@ configuration:
condition:
- psa_crypto
- name: SL_STACK_SIZE
- value: "0x1000"
+ value: "0x1200"
template_contribution:
- name: cli_command
diff --git a/app/bluetooth/example/btmesh_soc_sensor_server/dcd_config.btmeshconf b/app/bluetooth/example/btmesh_soc_sensor_server/dcd_config.btmeshconf
index cf048c7992..cdfff067bd 100644
--- a/app/bluetooth/example/btmesh_soc_sensor_server/dcd_config.btmeshconf
+++ b/app/bluetooth/example/btmesh_soc_sensor_server/dcd_config.btmeshconf
@@ -2,7 +2,7 @@
"composition_data": {
"cid": "0x02ff",
"pid": "0x0005",
- "vid": "0x0300",
+ "vid": "0x0301",
"elements": [
{
"name": "Main",
diff --git a/app/bluetooth/example/btmesh_soc_switch/btmesh_soc_switch_display.slcp b/app/bluetooth/example/btmesh_soc_switch/btmesh_soc_switch_display.slcp
index 116bfb1b98..21d411c8ae 100644
--- a/app/bluetooth/example/btmesh_soc_switch/btmesh_soc_switch_display.slcp
+++ b/app/bluetooth/example/btmesh_soc_switch/btmesh_soc_switch_display.slcp
@@ -122,7 +122,7 @@ configuration:
condition:
- "device_sdid_205"
- name: SL_HEAP_SIZE
- value: "0x4000"
+ value: "0x4100"
unless:
- "device_sdid_205"
- name: SL_PSA_KEY_USER_SLOT_COUNT
@@ -132,13 +132,7 @@ configuration:
- name: SL_SIMPLE_BUTTON_ALLOW_LED_CONFLICT
value: "1"
- name: SL_STACK_SIZE
- value: "0xE00"
- condition:
- - "device_sdid_205"
- - name: SL_STACK_SIZE
- value: "0x1000"
- unless:
- - "device_sdid_205"
+ value: "0x1300"
template_contribution:
- name: cli_command
diff --git a/app/bluetooth/example/btmesh_soc_switch/btmesh_soc_switch_log.slcp b/app/bluetooth/example/btmesh_soc_switch/btmesh_soc_switch_log.slcp
index f1bc393022..5a9f8f9998 100644
--- a/app/bluetooth/example/btmesh_soc_switch/btmesh_soc_switch_log.slcp
+++ b/app/bluetooth/example/btmesh_soc_switch/btmesh_soc_switch_log.slcp
@@ -115,7 +115,7 @@ configuration:
condition:
- "device_sdid_205"
- name: SL_HEAP_SIZE
- value: "0x4000"
+ value: "0x4100"
- name: SL_PSA_KEY_USER_SLOT_COUNT
value: "0"
condition:
@@ -123,7 +123,7 @@ configuration:
- name: SL_SIMPLE_BUTTON_ALLOW_LED_CONFLICT
value: "1"
- name: SL_STACK_SIZE
- value: "0x1000"
+ value: "0x1200"
template_contribution:
- name: cli_command
diff --git a/app/bluetooth/example/btmesh_soc_switch/btmesh_soc_switch_log_single.slcp b/app/bluetooth/example/btmesh_soc_switch/btmesh_soc_switch_log_single.slcp
index c827412112..8d25821031 100644
--- a/app/bluetooth/example/btmesh_soc_switch/btmesh_soc_switch_log_single.slcp
+++ b/app/bluetooth/example/btmesh_soc_switch/btmesh_soc_switch_log_single.slcp
@@ -123,7 +123,7 @@ configuration:
condition:
- psa_crypto
- name: SL_STACK_SIZE
- value: "0x1000"
+ value: "0x1200"
define:
- name: "SINGLE_BUTTON"
diff --git a/app/bluetooth/example/btmesh_soc_switch/btmesh_soc_switch_low_power.slcp b/app/bluetooth/example/btmesh_soc_switch/btmesh_soc_switch_low_power.slcp
index 8257a85b24..1d4f05f451 100644
--- a/app/bluetooth/example/btmesh_soc_switch/btmesh_soc_switch_low_power.slcp
+++ b/app/bluetooth/example/btmesh_soc_switch/btmesh_soc_switch_low_power.slcp
@@ -96,7 +96,7 @@ configuration:
- name: NVM3_DEFAULT_CACHE_SIZE
value: 100
- name: SL_HEAP_SIZE
- value: "0x4000"
+ value: "0x4100"
- name: SL_PSA_KEY_USER_SLOT_COUNT
value: "0"
condition:
@@ -104,7 +104,7 @@ configuration:
- name: SL_SIMPLE_BUTTON_ALLOW_LED_CONFLICT
value: "1"
- name: SL_STACK_SIZE
- value: "0x1000"
+ value: "0x1200"
tag:
- hardware:board_only
diff --git a/app/bluetooth/example/btmesh_soc_switch/btmesh_soc_switch_low_power_single.slcp b/app/bluetooth/example/btmesh_soc_switch/btmesh_soc_switch_low_power_single.slcp
index 380e33d8fc..019ccbe599 100644
--- a/app/bluetooth/example/btmesh_soc_switch/btmesh_soc_switch_low_power_single.slcp
+++ b/app/bluetooth/example/btmesh_soc_switch/btmesh_soc_switch_low_power_single.slcp
@@ -104,7 +104,7 @@ configuration:
condition:
- psa_crypto
- name: SL_STACK_SIZE
- value: "0x1000"
+ value: "0x1200"
define:
- name: "SINGLE_BUTTON"
diff --git a/app/bluetooth/example/btmesh_soc_switch/dcd_config.btmeshconf b/app/bluetooth/example/btmesh_soc_switch/dcd_config.btmeshconf
index 78def78d10..c50d998a9d 100644
--- a/app/bluetooth/example/btmesh_soc_switch/dcd_config.btmeshconf
+++ b/app/bluetooth/example/btmesh_soc_switch/dcd_config.btmeshconf
@@ -2,7 +2,7 @@
"composition_data": {
"cid": "0x02ff",
"pid": "0x0006",
- "vid": "0x0300",
+ "vid": "0x0301",
"elements": [
{
"name": "Main",
diff --git a/app/bluetooth/example/btmesh_soc_switch/dcd_config_low_power.btmeshconf b/app/bluetooth/example/btmesh_soc_switch/dcd_config_low_power.btmeshconf
index fc858d5d06..db43106c87 100644
--- a/app/bluetooth/example/btmesh_soc_switch/dcd_config_low_power.btmeshconf
+++ b/app/bluetooth/example/btmesh_soc_switch/dcd_config_low_power.btmeshconf
@@ -2,7 +2,7 @@
"composition_data": {
"cid": "0x02ff",
"pid": "0x0007",
- "vid": "0x0300",
+ "vid": "0x0301",
"elements": [
{
"name": "Main",
diff --git a/app/bluetooth/example_host/bt_aoa_host_locator/app.c b/app/bluetooth/example_host/bt_aoa_host_locator/app.c
index 880c0540cc..c23a70f84d 100644
--- a/app/bluetooth/example_host/bt_aoa_host_locator/app.c
+++ b/app/bluetooth/example_host/bt_aoa_host_locator/app.c
@@ -81,13 +81,14 @@ static void parse_config(const char *config);
static void on_message(mqtt_handle_t *handle,
const char *topic,
const char *payload);
+static void on_correction(aoa_id_t loc_id,
+ aoa_id_t tag_id,
+ char *correction);
static void subscribe_correction(void);
static void subscribe_config(void);
-static sl_status_t check_config_topic(const char* topic_literal,
- const char* topic,
- size_t topic_size);
+static sl_status_t check_config_topic(const char* topic);
// report mode config
static aoa_report_mode_t report_mode;
@@ -102,13 +103,6 @@ static char *mqtt_host = NULL;
// Config file path
static char *config_file = NULL;
-// CTE Mode strings
-static const char *cte_mode_string[] = {
- "Silabs",
- "connection",
- "connectionless"
-};
-
/**************************************************************************//**
* Application Init.
*****************************************************************************/
@@ -117,6 +111,7 @@ void app_init(int argc, char *argv[])
sl_status_t sc;
int opt;
char *port_str;
+ char *cte_mode_string;
report_mode = DEFAULT_REPORT_MODE;
@@ -176,8 +171,10 @@ void app_init(int argc, char *argv[])
app_assert_status(sc);
app_log_info("NCP host initialised." APP_LOG_NL);
- app_log_info("Selected CTE mode: %s" APP_LOG_NL,
- cte_mode_string[aoa_cte_get_mode()]);
+ sc = aoa_parse_cte_mode_to_string(aoa_cte_get_mode(), &cte_mode_string);
+ if (sc == SL_STATUS_OK) {
+ app_log_info("Selected CTE mode: %s" APP_LOG_NL, cte_mode_string);
+ }
app_log_info("Press Crtl+C to quit" APP_LOG_NL APP_LOG_NL);
ncp_reset();
}
@@ -298,6 +295,9 @@ static void subscribe_config(void)
sc = mqtt_subscribe(&mqtt_handle, topic);
app_assert_status(sc);
+
+ sc = mqtt_subscribe(&mqtt_handle, AOA_TOPIC_CONFIG_BROADCAST);
+ app_assert_status(sc);
}
/**************************************************************************//**
@@ -320,19 +320,21 @@ static void subscribe_correction(void)
/**************************************************************************//**
* Check the received topic
*****************************************************************************/
-static sl_status_t check_config_topic(const char* topic_literal,
- const char* topic,
- size_t topic_size)
+static sl_status_t check_config_topic(const char* topic)
{
- char topic_buffer[sizeof(topic_literal) + sizeof(aoa_id_t)];
-
- snprintf(topic_buffer, sizeof(topic_buffer), topic_literal, locator_id);
+ aoa_id_t loc_id;
- if (strncmp(topic_buffer, topic, topic_size) == 0) {
+ if (strcmp(topic, AOA_TOPIC_CONFIG_BROADCAST) == 0) {
+ // Broadcast config
return SL_STATUS_OK;
- } else {
- return SL_STATUS_NOT_FOUND;
}
+ if (sscanf(topic, AOA_TOPIC_CONFIG_SCAN, loc_id) == 1) {
+ if (aoa_id_compare(loc_id, locator_id) == 0) {
+ // Unicast config
+ return SL_STATUS_OK;
+ }
+ }
+ return SL_STATUS_NOT_FOUND;
}
/**************************************************************************//**
@@ -342,8 +344,30 @@ static void on_message(mqtt_handle_t *handle,
const char *topic,
const char *payload)
{
- int result;
+ (void)handle;
aoa_id_t loc_id, tag_id;
+
+ if (check_config_topic(topic) == SL_STATUS_OK) {
+ parse_config(payload);
+ ncp_reset();
+ return;
+ }
+
+ if (sscanf(topic, AOA_TOPIC_CORRECTION_SCAN, loc_id, tag_id) == 2) {
+ on_correction(loc_id, tag_id, (char *)payload);
+ return;
+ }
+
+ app_log_error("Failed to parse topic: %s." APP_LOG_NL, topic);
+}
+
+/**************************************************************************//**
+ * Correction message arrived callback.
+ *****************************************************************************/
+static void on_correction(aoa_id_t loc_id,
+ aoa_id_t tag_id,
+ char *correction_str)
+{
aoa_angle_t correction;
bd_addr tag_addr;
uint8_t tag_addr_type;
@@ -355,51 +379,39 @@ static void on_message(mqtt_handle_t *handle,
sc = aoa_angle_get_config(locator_id, &angle_config);
app_assert_status(sc);
- (void)handle;
-
- if (check_config_topic(AOA_TOPIC_CONFIG_PRINT,
- topic,
- sizeof(AOA_TOPIC_CONFIG_PRINT)) == SL_STATUS_OK) {
- parse_config(payload);
-
- ncp_reset();
- } else if (report_mode == ANGLE_REPORT) {
- // Parse topic
- result = sscanf(topic, AOA_TOPIC_CORRECTION_SCAN, loc_id, tag_id);
- app_assert(result == 2,
- "Failed to parse correction topic: %d." APP_LOG_NL,
- result);
-
- if (aoa_id_compare(loc_id, locator_id) != 0) {
- // Accidentally got a wrong message
- return;
- }
- // Find asset tag in the database
- sc = aoa_id_to_address(tag_id, tag_addr.addr, &tag_addr_type);
- if (SL_STATUS_OK == sc) {
- sc = aoa_db_get_tag_by_address(&tag_addr, &tag);
- }
- if (SL_STATUS_OK == sc) {
- // Parse payload
- sc = aoa_deserialize_angle((char *)payload, &correction);
- app_assert_status(sc);
+ if (report_mode != ANGLE_REPORT) {
+ // Ignore correction messages if not in angle report mode.
+ return;
+ }
+ if (aoa_id_compare(loc_id, locator_id) != 0) {
+ // Accidentally got a wrong message.
+ return;
+ }
+ // Find asset tag in the database
+ sc = aoa_id_to_address(tag_id, tag_addr.addr, &tag_addr_type);
+ if (SL_STATUS_OK == sc) {
+ sc = aoa_db_get_tag_by_address(&tag_addr, &tag);
+ }
+ if (SL_STATUS_OK == sc) {
+ // Parse payload
+ sc = aoa_deserialize_angle(correction_str, &correction);
+ app_assert_status(sc);
- if (aoa_sequence_compare(tag->sequence, correction.sequence)
- <= angle_config->angle_correction_delay) {
- app_log("Apply correction #%d for asset tag '%s'" APP_LOG_NL,
- correction.sequence,
- tag_id);
- ec = aoa_set_correction((aoa_state_t *)tag->user_data,
- &correction,
- locator_id);
- app_assert(ec == SL_RTL_ERROR_SUCCESS,
- "[E: %d] Failed to set correction values" APP_LOG_NL,
- ec);
- } else {
- app_log("Omit correction #%d for asset tag '%s'" APP_LOG_NL,
- correction.sequence,
- tag_id);
- }
+ if (aoa_sequence_compare(tag->sequence, correction.sequence)
+ <= angle_config->angle_correction_delay) {
+ app_log("Apply correction #%d for asset tag '%s'" APP_LOG_NL,
+ correction.sequence,
+ tag_id);
+ ec = aoa_set_correction((aoa_state_t *)tag->user_data,
+ &correction,
+ locator_id);
+ app_assert(ec == SL_RTL_ERROR_SUCCESS,
+ "[E: %d] Failed to set correction values" APP_LOG_NL,
+ ec);
+ } else {
+ app_log("Omit correction #%d for asset tag '%s'" APP_LOG_NL,
+ correction.sequence,
+ tag_id);
}
}
}
diff --git a/app/bluetooth/example_host/bt_host_cpc_hci_bridge/bridge.c b/app/bluetooth/example_host/bt_host_cpc_hci_bridge/bridge.c
index c654884d04..abcc6a496f 100644
--- a/app/bluetooth/example_host/bt_host_cpc_hci_bridge/bridge.c
+++ b/app/bluetooth/example_host/bt_host_cpc_hci_bridge/bridge.c
@@ -33,19 +33,25 @@
*
******************************************************************************/
#include "sl_cpc.h"
+#include
#include
#include
#include
#include
-#include
#include
#include
#include
#include
+#include
// set this to 1 for more runtime log messages
#define DEBUG 0
+#define SUCCESS 0
+#define FAILURE (-1)
+#define TIMEOUT_IN_SEC 0
+#define TIMEOUT_IN_USEC 5000
+
#define TO_CPC_BUF_SIZE 256
#define FROM_CPC_BUF_SIZE SL_CPC_READ_MINIMUM_SIZE
#define INST_NAME_LEN 100
@@ -56,6 +62,8 @@
#define CPC_TRANSMIT_WINDOW 1
#define SYMLINK_PATH "pts_hci"
+#define MAX(x, y) ((x) > (y) ? (x) : (y))
+
// cpc related structures
static cpc_handle_t lib_handle;
static cpc_endpoint_t endpoint;
@@ -67,6 +75,7 @@ static char cpc_instance[INST_NAME_LEN];
static int pty_m;
static int pty_s;
+static int ep_sock_fd;
// end the receiving loop if signal is received.
static volatile bool run = true;
@@ -74,14 +83,7 @@ static volatile bool run = true;
static volatile bool has_reset = false;
static void reset_callback(void);
-
-// two worker threads
-static pthread_t thread_rx;
-static pthread_t thread_tx;
-
-// Static receive function
-static void *cpc_to_pty_func(void *ptr);
-static void *pty_to_cpc_func(void *ptr);
+static int cpc_poll_fds(void);
// Custom signal handler.
static void signal_handler(int sig)
@@ -123,10 +125,14 @@ uint32_t startup(void)
perror("cpc_open_endpoint ");
return ret;
}
+ ep_sock_fd = ret;
// Open virtual UART device
ret = openpty(&pty_m, &pty_s, NULL, NULL, NULL);
if (ret >= 0) {
+ int flags = fcntl(pty_m, F_GETFL, 0);
+ flags = flags | O_NONBLOCK;
+ fcntl(pty_m, F_SETFL, flags);
char *pName = ttyname(pty_s);
printf("Name of secondary pty side is <%s>\n", pName);
remove(SYMLINK_PATH);
@@ -182,10 +188,12 @@ int reset_cpc(void)
&endpoint,
SL_CPC_ENDPOINT_BLUETOOTH_RCP,
CPC_TRANSMIT_WINDOW);
+
if (ret < 0) {
perror(" open endpoint ");
}
+ ep_sock_fd = ret;
return ret;
}
@@ -211,21 +219,6 @@ int main(int argc, char *argv[])
if (startup() < 0) {
exit(EXIT_FAILURE);
}
- // Creating receiving working threads
- ret = pthread_create(&thread_rx, NULL, cpc_to_pty_func, NULL);
- if (ret) {
- printf("Error - pthread_create(thread_rx) return code: %d\n", ret);
- exit(EXIT_FAILURE);
- }
- ret = pthread_create(&thread_tx, NULL, pty_to_cpc_func, NULL);
- if (ret) {
- printf("Error - pthread_create(thread_tx) return code: %d\n", ret);
- exit(EXIT_FAILURE);
- }
-
- if (DEBUG) {
- printf("\nCPC - VHCI bridge working, main thread is going to sleep\n\n");
- }
// Reset cpc communication if daemon signals
while (run) {
@@ -235,23 +228,58 @@ int main(int argc, char *argv[])
perror("reset ");
exit(EXIT_FAILURE);
}
+ } else {
+ ret = cpc_poll_fds();
+ if (ret < 0) {
+ perror("select error");
+ }
}
- nanosleep((const struct timespec[]){{ 0, CPC_RESET_SLEEP_NS } }, NULL);
}
}
-/**************************************************************************//**
- * Working thread from CPCd
- *****************************************************************************/
-void *cpc_to_pty_func(void *ptr)
+int cpc_poll_fds(void)
{
+ int ret;
+ int max_fd;
ssize_t size = 0;
+ struct timeval tv;
+ tv.tv_sec = TIMEOUT_IN_SEC;
+ tv.tv_usec = TIMEOUT_IN_USEC;
- // unused variable
- (void)ptr;
+ fd_set readfds;
- while (run) {
- // Read data from cpc
+ FD_ZERO(&readfds);
+ FD_SET(pty_m, &readfds);
+ FD_SET(ep_sock_fd, &readfds);
+
+ max_fd = MAX(pty_m, ep_sock_fd);
+
+ ret = select(max_fd + 1, &readfds, NULL, NULL, &tv);
+ if ((ret < 0) && (errno != EINTR)) {
+ return ret;
+ }
+
+ if (FD_ISSET(pty_m, &readfds)) {
+ size = read(pty_m, data_to_cpc, TO_CPC_BUF_SIZE);
+ if (size > 0) {
+ if (DEBUG) {
+ printf("Len to cpc %zd\n", size);
+ printf("Data to cpc: ");
+ for (int i = 0; i < size; i++) {
+ printf("%x ", data_to_cpc[i]);
+ }
+ printf("\n");
+ }
+ // Write data to cpc
+ cpc_write_endpoint(endpoint, &data_to_cpc[0], size, 0);
+ memset(&data_to_cpc[0], 0, TO_CPC_BUF_SIZE);
+ } else if (errno != EAGAIN && errno != ECONNRESET) {
+ perror("pty_to_cpc_func error");
+ return FAILURE;
+ }
+ }
+
+ if (FD_ISSET(ep_sock_fd, &readfds)) {
size = cpc_read_endpoint(endpoint,
&data_from_cpc[0],
FROM_CPC_BUF_SIZE,
@@ -268,49 +296,11 @@ void *cpc_to_pty_func(void *ptr)
// Write data to pty
write(pty_m, &data_from_cpc[0], size);
memset(&data_from_cpc[0], 0, FROM_CPC_BUF_SIZE);
- } else if (has_reset) {
- // intentionally left blank
} else if (errno != EAGAIN && errno != ECONNRESET) {
perror("cpc_to_pty_func error ");
- exit(-1);
+ return FAILURE;
}
- nanosleep((const struct timespec[]){{ 0, THREAD_SLEEP_NS } }, NULL);
}
- return NULL;
-}
-/**************************************************************************//**
- * Working thread to CPCd
- *****************************************************************************/
-void *pty_to_cpc_func(void *ptr)
-{
- ssize_t size = 0;
-
- // unused variable
- (void)ptr;
-
- while (run) {
- // Read data from pty
- size = read(pty_m, data_to_cpc, TO_CPC_BUF_SIZE);
- if (size > 0) {
- if (DEBUG) {
- printf("Len to cpc %zd\n", size);
- printf("Data to cpc: ");
- for (int i = 0; i < size; i++) {
- printf("%x ", data_to_cpc[i]);
- }
- printf("\n");
- }
- // Write data to cpc
- cpc_write_endpoint(endpoint, &data_to_cpc[0], size, 0);
- memset(&data_to_cpc[0], 0, TO_CPC_BUF_SIZE);
- } else if (has_reset) {
- // intentionally left blank
- } else if (errno != EAGAIN && errno != ECONNRESET) {
- perror("pty_to_cpc_func error");
- exit(-1);
- }
- nanosleep((const struct timespec[]){{ 0, THREAD_SLEEP_NS } }, NULL);
- }
- return NULL;
+ return SUCCESS;
}
diff --git a/app/bluetooth/example_host/bt_host_cpc_hci_bridge/makefile b/app/bluetooth/example_host/bt_host_cpc_hci_bridge/makefile
index d971cd13ce..90ffb9f811 100644
--- a/app/bluetooth/example_host/bt_host_cpc_hci_bridge/makefile
+++ b/app/bluetooth/example_host/bt_host_cpc_hci_bridge/makefile
@@ -95,7 +95,7 @@ bridge.c
LIBS = $(CPC_DIR)/daemon/build/libcpc.so
-override LDFLAGS += -lpthread -lutil
+override LDFLAGS += -lutil
################################################################################
# Rules #
diff --git a/app/bluetooth/example_host/bt_host_ota_dfu/main.c b/app/bluetooth/example_host/bt_host_ota_dfu/main.c
index 77f60aac7e..7e35449f59 100644
--- a/app/bluetooth/example_host/bt_host_ota_dfu/main.c
+++ b/app/bluetooth/example_host/bt_host_ota_dfu/main.c
@@ -359,7 +359,7 @@ void ota_change_state(enum ota_states new_state)
case OTA_SCAN:
{
addr_found = 0;
- sl_bt_scanner_start(sl_bt_gap_1m_phy, sl_bt_scanner_discover_generic);
+ sl_bt_scanner_start(sl_bt_gap_phy_1m, sl_bt_scanner_discover_generic);
app_log("Scanning...");
}
break;
@@ -380,7 +380,7 @@ void ota_change_state(enum ota_states new_state)
}
//move to connect state, connect to device address
- sc = sl_bt_connection_open(remote_address, remote_address_type, sl_bt_gap_1m_phy, &connection);
+ sc = sl_bt_connection_open(remote_address, remote_address_type, sl_bt_gap_phy_1m, &connection);
if (sc) {
ERROR_EXIT("Error, open failed,0x%x", sc);
}
@@ -502,15 +502,15 @@ void print_address(bd_addr address)
}
}
-static int parse_scan_data(uint8array *data, bd_addr *addr)
+static int parse_scan_data(uint8_t *data, uint8_t len, bd_addr *addr)
{
uint8_t i = 0;
- while (i < data->len) {
- if (data->data[i + 1] == GAP_ADDR_TYPE) {
- memcpy(addr, &data->data[i + 3], sizeof(bd_addr));
+ while (i < len) {
+ if (data[i + 1] == GAP_ADDR_TYPE) {
+ memcpy(addr, &data[i + 3], sizeof(bd_addr));
return 0;
} else {
- i += data->data[i] + 1;
+ i += data[i] + 1;
}
}
@@ -589,6 +589,33 @@ int hw_init(int argc, char* argv[])
return ret;
}
+static void handle_scan_event(uint8_t *address,
+ uint8_t address_type,
+ uint8_t *data,
+ uint8_t data_len)
+{
+ if (!addr_found) {
+ bd_addr addr;
+ if (!memcmp(address, &remote_public_address, sizeof(bd_addr))) {
+ memcpy(&remote_address, address, sizeof(bd_addr));
+ remote_address_type = address_type;
+ addr_found = 1;
+ } else if (parse_scan_data(data, data_len, &addr) == 0) {
+ if (!memcmp(&addr, &remote_public_address, sizeof(bd_addr))) {
+ memcpy(&remote_address, address, sizeof(bd_addr));
+ remote_address_type = address_type;
+ addr_found = 1;
+ }
+ }
+ if (addr_found) {
+ sl_bt_scanner_stop();
+ app_log("OK\n");
+ app_log("Device address found, connecting.\n");
+ ota_change_state(OTA_CONNECT);
+ }
+ }
+}
+
/**
* The main program.
*/
@@ -834,26 +861,24 @@ int main(int argc, char* argv[])
case OTA_SCAN:
switch (SL_BT_MSG_ID(p->header)) {
- case sl_bt_evt_scanner_scan_report_id:
- if (!addr_found) {
- bd_addr addr;
- if (!memcmp(&p->data.evt_scanner_scan_report.address, &remote_public_address, sizeof(bd_addr))) {
- memcpy(&remote_address, &p->data.evt_scanner_scan_report.address, sizeof(bd_addr));
- remote_address_type = p->data.evt_scanner_scan_report.address_type;
- addr_found = 1;
- } else if (parse_scan_data(&p->data.evt_scanner_scan_report.data, &addr) == 0) {
- if (!memcmp(&addr, &remote_public_address, sizeof(bd_addr))) {
- memcpy(&remote_address, &p->data.evt_scanner_scan_report.address, sizeof(bd_addr));
- remote_address_type = p->data.evt_scanner_scan_report.address_type;
- addr_found = 1;
- }
- }
- if (addr_found) {
- sl_bt_scanner_stop();
- app_log("OK\n");
- app_log("Device address found, connecting.\n");
- ota_change_state(OTA_CONNECT);
- }
+ case sl_bt_evt_scanner_legacy_advertisement_report_id:
+ if (p->data.evt_scanner_legacy_advertisement_report.event_flags
+ & SL_BT_SCANNER_EVENT_FLAG_CONNECTABLE) {
+ handle_scan_event(p->data.evt_scanner_legacy_advertisement_report.address.addr,
+ p->data.evt_scanner_legacy_advertisement_report.address_type,
+ p->data.evt_scanner_legacy_advertisement_report.data.data,
+ p->data.evt_scanner_legacy_advertisement_report.data.len);
+ }
+ break;
+ case sl_bt_evt_scanner_extended_advertisement_report_id:
+ if ((p->data.evt_scanner_extended_advertisement_report.event_flags
+ & SL_BT_SCANNER_EVENT_FLAG_CONNECTABLE)
+ && (p->data.evt_scanner_extended_advertisement_report.data_completeness
+ == sl_bt_scanner_data_status_complete)) {
+ handle_scan_event(p->data.evt_scanner_extended_advertisement_report.address.addr,
+ p->data.evt_scanner_extended_advertisement_report.address_type,
+ p->data.evt_scanner_extended_advertisement_report.data.data,
+ p->data.evt_scanner_extended_advertisement_report.data.len);
}
break;
default:
diff --git a/app/bluetooth/example_host/bt_host_positioning/app.c b/app/bluetooth/example_host/bt_host_positioning/app.c
index d39b79b3c6..37ba1e2235 100644
--- a/app/bluetooth/example_host/bt_host_positioning/app.c
+++ b/app/bluetooth/example_host/bt_host_positioning/app.c
@@ -32,6 +32,7 @@
#include
#include
#include
+#include
#include
#include
#include "app.h"
@@ -74,21 +75,26 @@
// -----------------------------------------------------------------------------
// Private variables
static mqtt_handle_t mqtt_handle = MQTT_DEFAULT_HANDLE;
+static aoa_id_t mqtt_client_id;
static aoa_id_t positioning_id = "";
static aoa_report_mode_t *loc_report_mode = NULL;
+static angle_queue_config_t angle_queue_config = ANGLE_QUEUE_DEFAULT_CONFIG;
// -----------------------------------------------------------------------------
// Private function declarations
+static char *get_app_name(char *arg_0);
static void parse_config_file(const char *filename);
static void parse_config(const char *payload);
+static void parse_locator_config(void);
static void on_message(mqtt_handle_t *handle,
const char *topic,
const char *payload);
-static void subscribe_topic(char *topic_template,
- size_t topic_size,
- aoa_locator_t *loc);
-static void subscribe_config(void);
-static sl_status_t check_config_topic(const char* topic);
+static void on_locator_report(aoa_id_t loc_id,
+ aoa_id_t tag_id,
+ aoa_report_mode_t report_mode,
+ const char *payload);
+static void locator_subscription(aoa_id_t loc_id, bool subscribe);
+static void on_new_positioning_id(char *new_id);
static void angle_queue_on_angles_ready(aoa_id_t tag_id,
uint32_t angle_count,
aoa_angle_t *angle_list,
@@ -103,6 +109,7 @@ void app_init(int argc, char *argv[])
int opt;
char *port_str = NULL;
char *config_file = NULL;
+ char *app_name = get_app_name(argv[0]);
// Process command line options.
while ((opt = getopt(argc, argv, OPTSTRING)) != -1) {
@@ -128,7 +135,7 @@ void app_init(int argc, char *argv[])
// Print help.
case 'h':
- app_log(USAGE, argv[0]);
+ app_log(USAGE, app_name);
app_log(OPTIONS);
exit(EXIT_SUCCESS);
@@ -136,18 +143,28 @@ void app_init(int argc, char *argv[])
default:
sc = app_log_set_option((char)opt, optarg);
if (sc != SL_STATUS_OK) {
- app_log(USAGE, argv[0]);
+ app_log(USAGE, app_name);
exit(EXIT_FAILURE);
}
}
}
- // Configuration file is mandatory.
- if (config_file == NULL) {
- app_log(USAGE, argv[0]);
- exit(EXIT_FAILURE);
+ // MQTT client init.
+ snprintf(mqtt_client_id, sizeof(mqtt_client_id), "%s_%i", app_name, getpid());
+ mqtt_handle.client_id = mqtt_client_id;
+ mqtt_handle.on_message = on_message;
+
+ sc = mqtt_init(&mqtt_handle);
+ app_assert_status(sc);
+
+ sc = mqtt_subscribe(&mqtt_handle, AOA_TOPIC_CONFIG_BROADCAST);
+ app_assert_status(sc);
+
+ angle_queue_config.on_angles_ready = &angle_queue_on_angles_ready;
+
+ if (config_file != NULL) {
+ parse_config_file(config_file);
}
- parse_config_file(config_file);
app_log("Press Crtl+C to quit" APP_LOG_NL APP_LOG_NL);
}
@@ -171,12 +188,28 @@ void app_deinit(void)
sc = mqtt_deinit(&mqtt_handle);
app_assert_status(sc);
- aoa_loc_destroy();
+ aoa_loc_destroy_tags();
+ aoa_loc_destroy_locators();
+ (void)aoa_loc_deinit();
angle_queue_deinit();
}
/**************************************************************************//**
- * Configuration file parser
+ * Application name helper.
+ *****************************************************************************/
+static char *get_app_name(char *arg_0)
+{
+ char *app_name = basename(arg_0);
+ // Remove the trailing .exe on Windows.
+ char *extension = strstr(app_name, ".exe");
+ if (extension != NULL) {
+ *extension = '\0';
+ }
+ return app_name;
+}
+
+/**************************************************************************//**
+ * Configuration file parser.
*****************************************************************************/
static void parse_config_file(const char *filename)
{
@@ -194,46 +227,26 @@ static void parse_config(const char *payload)
{
sl_status_t sc;
aoa_locator_t *loc;
- aoa_id_t locator_id;
- struct sl_rtl_loc_locator_item item;
- aoa_angle_config_t *angle_config;
- angle_queue_config_t angle_queue_config = ANGLE_QUEUE_DEFAULT_CONFIG;
- float mask_min = 0;
- float mask_max = 0;
- uint8_t *antenna_switch_pattern = NULL;
- uint8_t antenna_switch_pattern_size = 0;
- enum sl_rtl_aox_array_type antenna_array_type;
char *str_config;
sc = aoa_parse_init(payload);
app_assert_status(sc);
- sc = aoa_parse_string_config(&str_config, "id", NULL);
- if (sc == SL_STATUS_OK) {
- aoa_id_copy(positioning_id, str_config);
- }
-
- if (positioning_id != mqtt_handle.client_id) {
- mqtt_handle.on_message = on_message;
- mqtt_handle.client_id = positioning_id;
-
- sc = mqtt_init(&mqtt_handle);
- app_assert_status(sc);
- app_log_nl();
- }
- subscribe_config();
-
- aoa_loc_destroy();
- aoa_angle_reset_configs();
angle_queue_deinit();
+ aoa_loc_destroy_tags();
+ (void)aoa_loc_deinit();
sc = aoa_loc_init();
app_assert_status(sc);
- angle_queue_config.on_angles_ready = &angle_queue_on_angles_ready;
+ app_log_info("----------CONFIG START----------" APP_LOG_NL);
+
+ sc = aoa_parse_string_config(&str_config, "id", NULL);
+ if (sc == SL_STATUS_OK) {
+ app_log_info("Positioning ID set to: %s" APP_LOG_NL, str_config);
+ on_new_positioning_id(str_config);
+ }
- app_log_info("Parsing positioning configuration:" APP_LOG_NL);
- app_log_nl();
sc = aoa_parse_string_config(&str_config, "estimationModeLocation", NULL);
if (sc == SL_STATUS_OK) {
sc = aoa_parse_estimation_mode_from_string(str_config, &aoa_loc_config.estimation_mode);
@@ -296,15 +309,83 @@ static void parse_config(const char *payload)
aoa_loc_config.max_sequence_diff = angle_queue_config.max_sequence_diff;
- app_log_nl();
- app_log_info("Parsing locator configurations:" APP_LOG_NL);
+ sc = aoa_parse_check_config_exist("locators", NULL);
+ if (sc == SL_STATUS_OK) {
+ // Configuration contains locators.
+ if (aoa_loc_config.locator_count > 0) {
+ // Clear current locators.
+ for (uint32_t i = 0; i < aoa_loc_config.locator_count; i++) {
+ aoa_loc_get_locator_by_index(i, &loc);
+ locator_subscription(loc->id, false);
+ }
+ aoa_loc_destroy_locators();
+ aoa_angle_reset_configs();
+ }
+ parse_locator_config();
+
+ aoa_loc_config.locator_count = aoa_loc_get_number_of_locators();
+ if (aoa_loc_config.locator_count > 0) {
+ angle_queue_config.locator_count = aoa_loc_config.locator_count;
+ // Parse report modes of the locators.
+ loc_report_mode = (aoa_report_mode_t *)realloc(loc_report_mode,
+ aoa_loc_config.locator_count
+ * sizeof(aoa_report_mode_t));
+ for (uint32_t i = 0; i < aoa_loc_config.locator_count; i++) {
+ aoa_loc_get_locator_by_index(i, &loc);
+ sc = aoa_parse_string_config(&str_config, "reportMode", loc->id);
+ if (sc == SL_STATUS_OK) {
+ sc = aoa_parse_report_mode_from_string(str_config, &loc_report_mode[i]);
+ if (sc == SL_STATUS_OK) {
+ app_log_info("Report mode set to: %s" APP_LOG_NL, str_config);
+ } else {
+ app_log_error("Failed to set report mode to %s" APP_LOG_NL, str_config);
+ }
+ }
+ locator_subscription(loc->id, true);
+ }
+ app_log_info("Locator count: %d" APP_LOG_NL, aoa_loc_config.locator_count);
+ }
+ }
+ app_log_info("-----------CONFIG END-----------" APP_LOG_NL);
+
+ // If no locator configured, just wait for MQTT config
+ if (aoa_loc_config.locator_count > 0) {
+ sc = aoa_loc_finalize_config();
+ app_assert_status(sc);
+
+ sc = angle_queue_init(&angle_queue_config);
+ app_assert_status(sc);
+ }
+
+ sc = aoa_parse_deinit();
+ app_assert_status(sc);
+}
+
+/**************************************************************************//**
+ * Parse locator specific configuration.
+ * @pre aoa_parse_init
+ * @post aoa_parse_deinit
+ *****************************************************************************/
+static void parse_locator_config(void)
+{
+ sl_status_t sc;
+ aoa_locator_t *loc;
+ aoa_id_t locator_id;
+ struct sl_rtl_loc_locator_item item;
+ aoa_angle_config_t *angle_config;
+ float mask_min = 0;
+ float mask_max = 0;
+ uint8_t *antenna_switch_pattern = NULL;
+ uint8_t antenna_switch_pattern_size = 0;
+ enum sl_rtl_aox_array_type antenna_array_type;
+ char *str_config;
+
while (aoa_parse_locator(locator_id, &item) == SL_STATUS_OK) {
- app_log_nl();
sc = aoa_loc_add_locator(locator_id, item, &loc);
app_assert_status_f(sc, "Failed to allocate memory for locator");
sc = aoa_angle_add_config(locator_id, &angle_config);
app_assert_status_f(sc, "Failed to allocate memory for locator");
- app_log_info("Locator added:" APP_LOG_NL);
+ app_log_info("----LOCATOR----" APP_LOG_NL);
app_log_info("id: %s," APP_LOG_NL, loc->id);
app_log_info("coordinate: %f %f %f" APP_LOG_NL,
loc->item.coordinate_x,
@@ -316,7 +397,6 @@ static void parse_config(const char *payload)
loc->item.orientation_z_axis_degrees);
loc->functional = true;
- app_log_nl();
sc = aoa_parse_string_config(&str_config, "aoxMode", locator_id);
if (sc == SL_STATUS_OK) {
sc = aoa_parse_aox_mode_from_string(str_config, &angle_config->aox_mode);
@@ -448,104 +528,68 @@ static void parse_config(const char *payload)
sc = aoa_angle_finalize_config(locator_id);
app_assert_status(sc);
}
- app_log_nl();
- aoa_loc_config.locator_count = aoa_loc_get_number_of_locators();
-
- // If no locator configured, just wait for MQTT config
- if (0 != aoa_loc_config.locator_count) {
- angle_queue_config.locator_count = aoa_loc_config.locator_count;
- loc_report_mode = (aoa_report_mode_t *)realloc(loc_report_mode,
- aoa_loc_config.locator_count
- * sizeof(aoa_report_mode_t));
- sc = aoa_loc_finalize_config();
- app_assert_status(sc);
-
- for (uint32_t i = 0; i < aoa_loc_config.locator_count; i++) {
- aoa_loc_get_locator_by_index(i, &loc);
- sc = aoa_parse_string_config(&str_config, "reportMode", loc->id);
- if (sc == SL_STATUS_OK) {
- sc = aoa_parse_report_mode_from_string(str_config, &loc_report_mode[i]);
- if (sc == SL_STATUS_OK) {
- app_log_info("Report mode set to: %s" APP_LOG_NL, str_config);
- } else {
- app_log_error("Failed to set report mode to %s" APP_LOG_NL, str_config);
- }
- }
-
- subscribe_topic(AOA_TOPIC_ANGLE_PRINT,
- sizeof(AOA_TOPIC_ANGLE_PRINT),
- loc);
-
- subscribe_topic(AOA_TOPIC_IQ_REPORT_PRINT,
- sizeof(AOA_TOPIC_IQ_REPORT_PRINT),
- loc);
- }
- sc = angle_queue_init(&angle_queue_config);
- app_assert_status(sc);
- }
-
- app_log_nl();
- app_log_info("Locator count: %d" APP_LOG_NL, aoa_loc_config.locator_count);
-
- sc = aoa_parse_deinit();
- app_assert_status(sc);
}
/**************************************************************************//**
- * Subscribe for a topic.
+ * Manage locator subscriptions.
*****************************************************************************/
-static void subscribe_topic(char *topic_template,
- size_t topic_size,
- aoa_locator_t *loc)
+static void locator_subscription(aoa_id_t loc_id, bool subscribe)
{
sl_status_t sc;
- size_t size = (topic_size + sizeof(aoa_id_t) + 1);
- char *topic = malloc(size);
- app_assert(NULL != topic, "Failed to allocate memory for MQTT topic.");
+ const char angle_topic_template[] = AOA_TOPIC_ANGLE_PRINT;
+ char angle_topic[sizeof(angle_topic_template) + sizeof(aoa_id_t) + 1];
+ snprintf(angle_topic, sizeof(angle_topic), angle_topic_template, loc_id, "+");
- snprintf(topic, size, topic_template, loc->id, "+");
+ if (subscribe) {
+ sc = mqtt_subscribe(&mqtt_handle, angle_topic);
+ } else {
+ sc = mqtt_unsubscribe(&mqtt_handle, angle_topic);
+ }
+ app_assert_status(sc);
- app_log_info("Subscribing to topic '%s'." APP_LOG_NL, topic);
+ const char iq_report_topic_template[] = AOA_TOPIC_IQ_REPORT_PRINT;
+ char iq_report_topic[sizeof(iq_report_topic_template) + sizeof(aoa_id_t) + 1];
+ snprintf(iq_report_topic, sizeof(iq_report_topic), iq_report_topic_template, loc_id, "+");
- sc = mqtt_subscribe(&mqtt_handle, topic);
+ if (subscribe) {
+ sc = mqtt_subscribe(&mqtt_handle, iq_report_topic);
+ } else {
+ sc = mqtt_unsubscribe(&mqtt_handle, iq_report_topic);
+ }
app_assert_status(sc);
- free(topic);
}
/**************************************************************************//**
- * Subscribe for config topic.
+ * Handle new positioning ID.
*****************************************************************************/
-static void subscribe_config(void)
+static void on_new_positioning_id(char *new_id)
{
const char topic_template[] = AOA_TOPIC_CONFIG_PRINT;
char topic[sizeof(topic_template) + sizeof(aoa_id_t) + 1];
sl_status_t sc;
- snprintf(topic, sizeof(topic), topic_template, positioning_id);
-
- app_log_info("Subscribing to topic '%s'." APP_LOG_NL, topic);
+ if (strlen(new_id) == 0) {
+ // Positioning ID is invalid, nothing to do.
+ return;
+ }
- sc = mqtt_subscribe(&mqtt_handle, topic);
- app_assert_status(sc);
-}
+ if (aoa_id_compare(positioning_id, new_id) == 0) {
+ // Positioning ID is unchanged, nothing to do.
+ return;
+ }
-/**************************************************************************//**
- * Check the received topic
- *****************************************************************************/
-static sl_status_t check_config_topic(const char* topic)
-{
- char topic_buffer[sizeof(AOA_TOPIC_CONFIG_PRINT) + sizeof(aoa_id_t)];
+ if (strlen(positioning_id) > 0) {
+ snprintf(topic, sizeof(topic), topic_template, positioning_id);
+ sc = mqtt_unsubscribe(&mqtt_handle, topic);
+ app_assert_status(sc);
+ }
- snprintf(topic_buffer,
- sizeof(topic_buffer),
- AOA_TOPIC_CONFIG_PRINT,
- positioning_id);
+ // Store new ID.
+ aoa_id_copy(positioning_id, new_id);
- if (strncmp(topic_buffer, topic, sizeof(AOA_TOPIC_CONFIG_PRINT)) == 0) {
- return SL_STATUS_OK;
- } else {
- return SL_STATUS_NOT_FOUND;
- }
+ snprintf(topic, sizeof(topic), topic_template, positioning_id);
+ sc = mqtt_subscribe(&mqtt_handle, topic);
+ app_assert_status(sc);
}
/**************************************************************************//**
@@ -555,35 +599,55 @@ static void on_message(mqtt_handle_t *handle,
const char *topic,
const char *payload)
{
- int result;
+ aoa_id_t pos_id;
aoa_id_t loc_id;
aoa_id_t tag_id;
- uint32_t locator_idx;
- aoa_asset_tag_t *tag;
- aoa_locator_t *locator;
- aoa_angle_t angle;
- sl_status_t sc;
- aoa_iq_report_t iq_report;
- int8_t samples[256];
- aoa_report_mode_t report_mode = ANGLE_REPORT;
(void)handle;
- if (check_config_topic(topic) == SL_STATUS_OK) {
- // Unsubscribe from all topics
- sc = mqtt_unsubscribe_all(&mqtt_handle);
- app_assert_status(sc);
+ if (strcmp(topic, AOA_TOPIC_CONFIG_BROADCAST) == 0) {
+ // Broadcast config
parse_config(payload);
return;
}
- // Parse topic.
- if (2 != sscanf(topic, AOA_TOPIC_ANGLE_SCAN, loc_id, tag_id)) {
- result = sscanf(topic, AOA_TOPIC_IQ_REPORT_SCAN, loc_id, tag_id);
- app_assert(result == 2, "Failed to parse topic: %d." APP_LOG_NL, result);
- report_mode = IQ_REPORT;
+ if (sscanf(topic, AOA_TOPIC_CONFIG_SCAN, pos_id) == 1) {
+ if (aoa_id_compare(pos_id, positioning_id) == 0) {
+ // Unicast config
+ parse_config(payload);
+ }
+ return;
+ }
+
+ if (sscanf(topic, AOA_TOPIC_ANGLE_SCAN, loc_id, tag_id) == 2) {
+ on_locator_report(loc_id, tag_id, ANGLE_REPORT, payload);
+ return;
+ }
+
+ if (sscanf(topic, AOA_TOPIC_IQ_REPORT_SCAN, loc_id, tag_id) == 2) {
+ on_locator_report(loc_id, tag_id, IQ_REPORT, payload);
+ return;
}
+ app_log_error("Failed to parse topic: %s." APP_LOG_NL, topic);
+}
+
+/**************************************************************************//**
+ * IQ and angle report handler callback.
+ *****************************************************************************/
+static void on_locator_report(aoa_id_t loc_id,
+ aoa_id_t tag_id,
+ aoa_report_mode_t report_mode,
+ const char *payload)
+{
+ sl_status_t sc;
+ uint32_t locator_idx;
+ aoa_asset_tag_t *tag;
+ aoa_locator_t *locator;
+ aoa_angle_t angle;
+ aoa_iq_report_t iq_report;
+ int8_t samples[256];
+
// Find locator.
sc = aoa_loc_get_locator_by_id(loc_id, &locator_idx, &locator);
if (sc != SL_STATUS_OK) {
diff --git a/app/bluetooth/example_host/bt_host_throughput/app.c b/app/bluetooth/example_host/bt_host_throughput/app.c
index 035751d5a9..4a387ed35a 100644
--- a/app/bluetooth/example_host/bt_host_throughput/app.c
+++ b/app/bluetooth/example_host/bt_host_throughput/app.c
@@ -94,7 +94,7 @@
typedef struct {
uint16_t connection_interval;
- sl_bt_gap_phy_and_coding_type_t phy;
+ sl_bt_gap_phy_coding_t phy;
uint16_t mtu_size;
sl_bt_gatt_client_config_flag_t test_type;
throughput_mode_t mode;
@@ -163,14 +163,14 @@ void app_init(int argc, char *argv[])
// PHY to use
case 'p':
- test_parameters.phy = (sl_bt_gap_phy_and_coding_type_t)strtoul(optarg,
- NULL,
- 0);
+ test_parameters.phy = (sl_bt_gap_phy_coding_t)strtoul(optarg,
+ NULL,
+ 0);
// Validate input value
- if (test_parameters.phy != sl_bt_gap_1m_phy_uncoded
- && test_parameters.phy != sl_bt_gap_2m_phy_uncoded
- && test_parameters.phy != sl_bt_gap_coded_phy_125k
- && test_parameters.phy != sl_bt_gap_coded_phy_500k) {
+ if (test_parameters.phy != sl_bt_gap_phy_coding_1m_uncoded
+ && test_parameters.phy != sl_bt_gap_phy_coding_2m_uncoded
+ && test_parameters.phy != sl_bt_gap_phy_coding_125k_coded
+ && test_parameters.phy != sl_bt_gap_phy_coding_500k_coded) {
app_log_critical("PHY must be one of these: 1 => 1M, 2 => 2M, "
"4 => 125k, 8 => 500k" APP_LOG_NL);
exit(EXIT_FAILURE);
@@ -285,7 +285,7 @@ void app_init(int argc, char *argv[])
app_log_info("Resetting NCP..." APP_LOG_NL);
// Reset NCP to ensure it gets into a defined state.
// Once the chip successfully boots, boot event should be received.
- sl_bt_system_reset(0);
+ sl_bt_system_reset(sl_bt_system_boot_mode_normal);
}
/**************************************************************************//**
diff --git a/app/bluetooth/example_host/bt_host_voice/app.c b/app/bluetooth/example_host/bt_host_voice/app.c
index 3236fa2bd3..ed4e25f99f 100644
--- a/app/bluetooth/example_host/bt_host_voice/app.c
+++ b/app/bluetooth/example_host/bt_host_voice/app.c
@@ -327,7 +327,7 @@ void sl_bt_on_event(sl_bt_msg_t* evt)
connect_remote(CONF_get()->remote_address);
} else {
DEBUG_INFO("Scanning for VoBLE devices...");
- sc = sl_bt_scanner_start(sl_bt_gap_1m_phy, sl_bt_scanner_discover_generic);
+ sc = sl_bt_scanner_start(sl_bt_gap_phy_1m, sl_bt_scanner_discover_generic);
app_assert(sc == SL_STATUS_OK,
"[E: 0x%04x] Failed to start discovery #1\n",
(int)sc);
@@ -527,7 +527,7 @@ void sl_bt_on_event(sl_bt_msg_t* evt)
// -------------------------------
// This event is triggered when a scan report received
- case sl_bt_evt_scanner_scan_report_id:
+ case sl_bt_evt_scanner_legacy_advertisement_report_id:
SCAN_Process_scan_response(evt);
if (SCAN_Is_Device_Found()) {
@@ -631,7 +631,7 @@ static void connect_remote(bd_addr remote_address)
}
//move to connect state, connect to device address
- sc = sl_bt_connection_open(remote_address, /* le_gap_address_type_public = */ 0, sl_bt_gap_1m_phy, &ble_connection);
+ sc = sl_bt_connection_open(remote_address, /* le_gap_address_type_public = */ 0, sl_bt_gap_phy_1m, &ble_connection);
if (sc != SL_STATUS_OK) {
ERROR_EXIT("Error, open failed,%x", sc);
}
diff --git a/app/bluetooth/example_host/bt_host_voice/scan.c b/app/bluetooth/example_host/bt_host_voice/scan.c
index 5ff861aff4..22fb3e749a 100644
--- a/app/bluetooth/example_host/bt_host_voice/scan.c
+++ b/app/bluetooth/example_host/bt_host_voice/scan.c
@@ -95,8 +95,9 @@ static void print_address(bd_addr address)
**************************************************************************************************/
void SCAN_Process_scan_response(sl_bt_msg_t *evt)
{
- if ( is_voble_service(evt->data.evt_scanner_scan_report.data.data, evt->data.evt_scanner_scan_report.data.len) ) {
- memcpy(&CONF_get()->remote_address, &evt->data.evt_scanner_scan_report.address, sizeof(bd_addr));
+ if ( is_voble_service(evt->data.evt_scanner_legacy_advertisement_report.data.data,
+ evt->data.evt_scanner_legacy_advertisement_report.data.len) ) {
+ memcpy(&CONF_get()->remote_address, &evt->data.evt_scanner_legacy_advertisement_report.address, sizeof(bd_addr));
app_log("\r"); DEBUG_INFO("VoBLE device found: "); print_address(CONF_get()->remote_address); app_log("\n");
sl_status_t sc = sl_bt_scanner_stop();
app_assert(sc == SL_STATUS_OK,
diff --git a/app/bluetooth/example_host/btmesh_host_provisioner/app.c b/app/bluetooth/example_host/btmesh_host_provisioner/app.c
index 572e82c480..a67c43c69f 100644
--- a/app/bluetooth/example_host/btmesh_host_provisioner/app.c
+++ b/app/bluetooth/example_host/btmesh_host_provisioner/app.c
@@ -169,6 +169,14 @@ static void app_on_scan_timer(sl_simple_timer_t *timer, void *data);
*******************************************************************************/
static void app_on_reset_timer(sl_simple_timer_t *timer, void *data);
+/***************************************************************************//**
+* Add user event filter via sl_bt_user_manage_event_filter
+*
+* @param[in] event_id ID of the event to be filtered
+* @return Status of the sl_bt_user_manage_event_filter command
+*******************************************************************************/
+static sl_status_t app_add_user_event_filter(const uint32_t event_id);
+
// -----------------------------------------------------------------------------
// Static Variables
@@ -381,21 +389,16 @@ void sl_bt_on_event(sl_bt_msg_t *evt)
// Do not call any stack command before receiving this boot event!
case sl_bt_evt_system_boot_id:
{
- // Filter scanner report events as it would send a message every 5 ms
- // and clog UART while scanning for unprovisioned nodes
- uint8_t user_data[SL_NCP_EVT_FILTER_CMD_ADD_LEN];
- uint32_t command_id = sl_bt_evt_scanner_scan_report_id;
-
- user_data[0] = SL_NCP_EVT_FILTER_CMD_ADD_ID;
- user_data[1] = (command_id >> 0);
- user_data[2] = (command_id >> 8);
- user_data[3] = (command_id >> 16);
- user_data[4] = (command_id >> 24);
- sc = sl_bt_user_manage_event_filter(SL_NCP_EVT_FILTER_CMD_ADD_LEN,
- user_data);
- app_assert(sc == SL_STATUS_OK,
- "[E: 0x%04x] Failed to enable filtering on the target\n",
- (int)sc);
+ // Filter legacy and new scanner report events as it would send a message
+ // every 5 ms and clog UART while scanning for unprovisioned nodes
+ sc = app_add_user_event_filter(sl_bt_evt_scanner_scan_report_id);
+ app_assert_status_f(sc, "Failed to enable filtering on the target" APP_LOG_NEW_LINE);
+
+ sc = app_add_user_event_filter(sl_bt_evt_scanner_legacy_advertisement_report_id);
+ app_assert_status_f(sc, "Failed to enable filtering on the target" APP_LOG_NEW_LINE);
+
+ sc = app_add_user_event_filter(sl_bt_evt_scanner_extended_advertisement_report_id);
+ app_assert_status_f(sc, "Failed to enable filtering on the target" APP_LOG_NEW_LINE);
// Print boot message.
app_log_info("Bluetooth stack booted: v%d.%d.%d-b%d" APP_LOG_NEW_LINE,
@@ -741,6 +744,21 @@ void app_parse_address(char *input, size_t length, uint16_t *address)
}
}
+sl_status_t app_add_user_event_filter(const uint32_t event_id)
+{
+ sl_status_t sc = SL_STATUS_OK;
+ uint8_t user_data[SL_NCP_EVT_FILTER_CMD_ADD_LEN];
+
+ user_data[0] = SL_NCP_EVT_FILTER_CMD_ADD_ID;
+ user_data[1] = event_id >> 0;
+ user_data[2] = event_id >> 8;
+ user_data[3] = event_id >> 16;
+ user_data[4] = event_id >> 24;
+
+ sc = sl_bt_user_manage_event_filter(SL_NCP_EVT_FILTER_CMD_ADD_LEN, user_data);
+ return sc;
+}
+
// -----------------------------------------------------------------------------
// Callbacks
diff --git a/app/common/app_common.properties b/app/common/app_common.properties
index b67e68ddc3..080045fba7 100644
--- a/app/common/app_common.properties
+++ b/app/common/app_common.properties
@@ -7,5 +7,5 @@ dependantSdkVersion=4.1.0
prop.subLabel=Platform\\ 4.1.0.0
# General properties are prepended with "prop."
-prop.file.templatesFile=platform_development_templates.xml platform_test_templates.xml platform_alpha_templates.xml builtin_templates.xml platform_production_templates.xml platform_internal_templates.xml
+prop.file.templatesFile=platform_beta_templates.xml platform_development_templates.xml platform_test_templates.xml platform_alpha_templates.xml builtin_templates.xml platform_production_templates.xml platform_internal_templates.xml
prop.file.demosFile= platform_production_demos.xml platform_beta_demos.xml platform_alpha_demos.xml platform_deprecated_demos.xml
diff --git a/app/common/example/audio_classifier/audio_classifier.slcp b/app/common/example/audio_classifier/audio_classifier.slcp
index 11deb34b93..be07bd2bc9 100644
--- a/app/common/example/audio_classifier/audio_classifier.slcp
+++ b/app/common/example/audio_classifier/audio_classifier.slcp
@@ -32,7 +32,7 @@ component:
- id: device_init
- id: tensorflow_lite_micro
- id: ml_audio_feature_generation
- - id: printf
+ - id: printf
- id: iostream_recommended_stream
- id: iostream_retarget_stdio
- id: simple_led
@@ -41,11 +41,16 @@ component:
- id: micriumos_kernel
- id: power_manager
- id: sleeptimer
-config_file:
+config_file:
- path: config/audio_classifier_config.h
- - path: "config/tflite/audio_classifier.tflite"
+ - path: "tflite_models/tflite/keyword_spotting_on_off.tflite"
file_id: flatbuffer_file_id
directory: "tflite"
+ unless: [tensorflow_lite_micro_accelerated_kernels]
+ - path: "tflite_models/tflite/keyword_spotting_on_off_v2.tflite"
+ file_id: flatbuffer_file_id
+ directory: "tflite"
+ condition: [tensorflow_lite_micro_accelerated_kernels]
define:
- name: DEBUG_EFM
- name: TF_LITE_STATIC_MEMORY
@@ -64,8 +69,8 @@ configuration:
value: "4096"
- name: SL_ML_AUDIO_FEATURE_GENERATION_AUDIO_GAIN
value: "2"
- - name: SL_TFLITE_MICRO_ARENA_SIZE
- value: "7000"
+ - name: SL_TFLITE_MICRO_ARENA_SIZE
+ value: "50000"
- name: SL_HEAP_SIZE
value: "0x2000"
- name: SL_SIMPLE_LED_LED1_PIN
@@ -74,6 +79,8 @@ configuration:
toolchain_settings:
- option: gcc_compiler_option
value: "-Wno-unused-parameter"
+ - option: gcc_compiler_option
+ value: "-Wno-missing-field-initializers"
readme:
- path: readme.md
ui_hints:
diff --git a/app/common/example/audio_classifier/readme.md b/app/common/example/audio_classifier/readme.md
index 8d4f832584..bc072b0b06 100644
--- a/app/common/example/audio_classifier/readme.md
+++ b/app/common/example/audio_classifier/readme.md
@@ -30,21 +30,28 @@ being filtered out in the audio classifier application based on the label text.
By default any labels that start with an underscore are ignored when processing
results. This behavior can be disabled in the application configuration file.
-## Model
-The default model used in this application is called "audio_classifier.tflite"
-and is able to classify audio into 4 different classes labeled "on", "off",
-"_unknown_", "_silence_". The source for the model can be found here: https://github.com/siliconlabs/mltk/blob/master/mltk/models/siliconlabs/keyword_spotting_on_off.py
+## Model
+The application uses one of two different available models
+(```keyword_spotting_on_off.tflite``` or ```keyword_spotting_on_off_v2.tflite```)
+as the default model, depending on whether the application is generated for a
+development board featuring an MVP hardware accelerator or not. When an MVP
+hardware accelerator is featured on the board, inference will run at a faster
+speed such that a larger model can be chosen, yielding more accurate keyword
+detections.
+
+Details about the model architectures and scripts for generating the models can
+be found in the [Silicon Labs machine learning applications](https://github.com/SiliconLabs/machine_learning_applications/tree/main/) repository, under
+```voice/keyword_spotting/model```.
The application is designed to work with an audio classification model created
using the Silicon Labs Machine Learning Toolkit
([MLTK](https://siliconlabs.github.io/mltk)). Use the MLTK to train a new audio
classifier model and replace the model inside this example with the new audio
classification model. To replace the audio classification model with a new model
-created using the MLTK you can rename the new .tflite file to
-"audio_classifier.tflite" and copy it into the config/tflite folder of this
-project. After a new .tflite file is added to the project Simplicity Studio will
-automatically use the [flatbuffer converter tool](https://docs.silabs.com/gecko-platform/latest/machine-learning/tensorflow/flatbuffer-conversion)
-to convert a .tflite file into a c file which is added to the project.
+created using the MLTK simply replace the .tflite file in the config/tflite folder
+of this project with your new. tflite file. After a new .tflite file is added
+to the project Simplicity Studio will automatically use the [flatbuffer converter tool](https://docs.silabs.com/gecko-platform/latest/machine-learning/tensorflow/flatbuffer-conversion)
+to convert the .tflite file into a c file which is added to the project.
In order for the audio classification to work correctly we need to use the same
audio feature generator configuration parameters for inference as is used when
diff --git a/app/common/example/audio_classifier/recognize_commands.cc b/app/common/example/audio_classifier/recognize_commands.cc
index 90bee9e517..4f21d4058b 100644
--- a/app/common/example/audio_classifier/recognize_commands.cc
+++ b/app/common/example/audio_classifier/recognize_commands.cc
@@ -19,6 +19,7 @@
#include
#include
+
RecognizeCommands::RecognizeCommands(tflite::ErrorReporter* error_reporter,
int32_t average_window_duration_ms,
uint8_t detection_threshold,
@@ -41,6 +42,10 @@ TfLiteStatus RecognizeCommands::ProcessLatestResults(
const TfLiteTensor* latest_results, const int32_t current_time_ms,
uint8_t* found_command_index, uint8_t* score, bool* is_new_command)
{
+ int8_t current_top_index = 0;
+ uint32_t current_top_score = 0;
+ uint8_t converted_scores[category_count];
+
if ((latest_results->dims->size != 2)
|| (latest_results->dims->data[0] != 1)
|| (latest_results->dims->data[1] != category_count)) {
@@ -53,14 +58,6 @@ TfLiteStatus RecognizeCommands::ProcessLatestResults(
return kTfLiteError;
}
- if (latest_results->type != kTfLiteInt8) {
- TF_LITE_REPORT_ERROR(
- error_reporter_,
- "The results for recognition should be int8_t elements, but are %d",
- latest_results->type);
- return kTfLiteError;
- }
-
if ((!previous_results_.empty())
&& (current_time_ms < previous_results_.front().time_)) {
TF_LITE_REPORT_ERROR(
@@ -71,55 +68,86 @@ TfLiteStatus RecognizeCommands::ProcessLatestResults(
return kTfLiteError;
}
- // Add the latest results to the head of the queue.
- previous_results_.push_back({current_time_ms, latest_results->data.int8});
-
- // Prune any earlier results that are too old for the averaging window.
- const int64_t time_limit = current_time_ms - average_window_duration_ms_;
- while ((!previous_results_.empty())
- && previous_results_.front().time_ < time_limit) {
- previous_results_.pop_front();
+ // Convert the model output to uint8
+ if (latest_results->type == kTfLiteFloat32) {
+ for (int i = 0; i < category_count; ++i) {
+ converted_scores[i] = (uint8_t)(latest_results->data.f[i] * 255);
+ }
+ } else if (latest_results->type == kTfLiteInt8) {
+ for (int i = 0; i < category_count; ++i) {
+ converted_scores[i] = (uint8_t)(latest_results->data.int8[i] + 128);
+ }
+ } else {
+ TF_LITE_REPORT_ERROR(error_reporter_, "Unsupported output tensor data type, must be int8 or float32");
+ return kTfLiteError;
}
- // If there are too few results, assume the result will be unreliable and
- // bail.
- const int32_t how_many_results = previous_results_.size();
- if ((how_many_results < minimum_count_)) {
- *found_command_index = previous_top_label_index_;
- *score = 0;
- *is_new_command = false;
- return kTfLiteOk;
- }
+ // If the minimum count is 0, then disable averaging and only consider the latest result
+ if (minimum_count_ == 0) {
+ // Find the current highest scoring category
+ for (int i = 0; i < category_count; i++) {
+ if (converted_scores[i] > current_top_score) {
+ current_top_score = converted_scores[i];
+ current_top_index = i;
+ }
+ }
+ } else {
+ // Add the latest results to the head of the queue.
+ previous_results_.push_back({current_time_ms, converted_scores});
+
+ // Prune any earlier results that are too old for the averaging window.
+ const int64_t time_limit = current_time_ms - average_window_duration_ms_;
+ while ((!previous_results_.empty())
+ && previous_results_.front().time_ < time_limit) {
+ previous_results_.pop_front();
+ }
- // Calculate the average score across all the results in the window.
- int32_t average_scores[category_count];
- for (int offset = 0; offset < previous_results_.size(); ++offset) {
- // Iterates the amount of times to achieve average_window_duration
- PreviousResultsQueue::Result previous_result =
- previous_results_.from_front(offset);
- const int8_t* scores = previous_result.scores;
- for (int i = 0; i < category_count; ++i) {
- if (offset == 0) {
- average_scores[i] = scores[i] + 128;
- } else {
- average_scores[i] += scores[i] + 128;
+ // If there are too few results, assume the result will be unreliable and
+ // bail.
+ static int consecutive_min_count = 0;
+ const int32_t how_many_results = previous_results_.size();
+ if ((how_many_results < minimum_count_)) {
+ ++consecutive_min_count;
+ if (consecutive_min_count % 10 == 0) {
+ printf("Too few samples for averaging. This likely means the inference loop is taking too long.\n");
+ printf("Either decrease the 'minimum_count' and/or increase 'average_window_duration_ms'\n");
+ }
+ *found_command_index = previous_top_label_index_;
+ *score = 0;
+ *is_new_command = false;
+ return kTfLiteOk;
+ }
+ consecutive_min_count = 0;
+
+ // Calculate the average score across all the results in the window.
+ uint32_t average_scores[category_count];
+ for (int offset = 0; offset < previous_results_.size(); ++offset) {
+ // Iterates the amount of times to achieve average_window_duration
+ PreviousResultsQueue::Result previous_result =
+ previous_results_.from_front(offset);
+ const uint8_t* scores = previous_result.scores;
+ for (int i = 0; i < category_count; ++i) {
+ if (offset == 0) {
+ average_scores[i] = scores[i];
+ } else {
+ average_scores[i] += scores[i];
+ }
}
}
- }
- for (int i = 0; i < category_count; ++i) {
- average_scores[i] /= how_many_results;
- }
+ for (int i = 0; i < category_count; ++i) {
+ average_scores[i] /= how_many_results;
+ }
- // Find the current highest scoring category.
- int8_t current_top_index = 0;
- int32_t current_top_score = 0;
- for (int i = 0; i < category_count; ++i) {
- if (average_scores[i] > current_top_score) {
- current_top_score = average_scores[i];
- current_top_index = i;
+ // Find the current highest scoring category.
+ for (int i = 0; i < category_count; ++i) {
+ if (average_scores[i] > current_top_score) {
+ current_top_score = average_scores[i];
+ current_top_index = i;
+ }
}
}
+
const char *current_top_label = get_category_label(current_top_index);
// If we've recently had another label trigger, assume one that occurs too
@@ -147,7 +175,7 @@ TfLiteStatus RecognizeCommands::ProcessLatestResults(
prev_time_ms = current_time_ms;
ptr += sprintf(ptr, "[%6ld] (%3d) ", current_time_ms, diff);
for (int i = 0; i < category_count; ++i) {
- ptr += sprintf(ptr, "%3ld ", average_scores[i]);
+ ptr += sprintf(ptr, "%3d ", converted_scores[i]);
}
*ptr++ = 0;
puts(buffer);
diff --git a/app/common/example/audio_classifier/recognize_commands.h b/app/common/example/audio_classifier/recognize_commands.h
index 3c96dd02e5..a21eb31428 100644
--- a/app/common/example/audio_classifier/recognize_commands.h
+++ b/app/common/example/audio_classifier/recognize_commands.h
@@ -42,13 +42,13 @@ class PreviousResultsQueue {
struct Result {
Result() : time_(0), scores() {
}
- Result(int32_t time, int8_t * input_scores) : time_(time) {
+ Result(int32_t time, uint8_t * input_scores) : time_(time) {
for (int i = 0; i < category_count; ++i) {
scores[i] = input_scores[i];
}
}
int32_t time_;
- int8_t scores[MAX_CATEGORY_COUNT];
+ uint8_t scores[MAX_CATEGORY_COUNT];
};
int size()
diff --git a/app/common/example/voice_control_light/config/tflite/keyword_spotting_on_off.tflite b/app/common/example/audio_classifier/tflite_models/tflite/keyword_spotting_on_off.tflite
similarity index 100%
rename from app/common/example/voice_control_light/config/tflite/keyword_spotting_on_off.tflite
rename to app/common/example/audio_classifier/tflite_models/tflite/keyword_spotting_on_off.tflite
diff --git a/app/common/example/audio_classifier/tflite_models/tflite/keyword_spotting_on_off_v2.tflite b/app/common/example/audio_classifier/tflite_models/tflite/keyword_spotting_on_off_v2.tflite
new file mode 100644
index 0000000000..8f926c576b
Binary files /dev/null and b/app/common/example/audio_classifier/tflite_models/tflite/keyword_spotting_on_off_v2.tflite differ
diff --git a/app/common/example/cpc_secondary_vcom_security_micriumos/cpc_secondary_vcom_security_micriumos.slcp b/app/common/example/cpc_secondary_vcom_security_micriumos/cpc_secondary_vcom_security_micriumos.slcp
index 5b48c6815a..83b7cbe319 100644
--- a/app/common/example/cpc_secondary_vcom_security_micriumos/cpc_secondary_vcom_security_micriumos.slcp
+++ b/app/common/example/cpc_secondary_vcom_security_micriumos/cpc_secondary_vcom_security_micriumos.slcp
@@ -1,4 +1,4 @@
-project_name: cpc_secondary_vcom_micriumos_security
+project_name: cpc_secondary_vcom_security_micriumos
package: platform
quality: production
label: Platform - CPC Secondary with Micrium OS and Security Enabled
diff --git a/app/common/example/dci_swd_programming/readme.md b/app/common/example/dci_swd_programming/readme.md
index 549c38215b..5e6aabff32 100644
--- a/app/common/example/dci_swd_programming/readme.md
+++ b/app/common/example/dci_swd_programming/readme.md
@@ -54,7 +54,7 @@ The following SWD operations are supported in this example:
1. Upgrade the kit’s firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
2. Open any terminal program and connect to the kit’s VCOM port.
-3. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide, check `Platform()` checkbox to browse the platform examples).
+3. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide).
4. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in the Simplicity Studio 5 User's Guide).
5. Run the example and follow the instructions shown on the console.
diff --git a/app/common/example/psa_crypto_aead/readme.md b/app/common/example/psa_crypto_aead/readme.md
index af33b22096..f7b34de0af 100644
--- a/app/common/example/psa_crypto_aead/readme.md
+++ b/app/common/example/psa_crypto_aead/readme.md
@@ -94,7 +94,7 @@ The following PSA Crypto APIs are used in this example:
1. Upgrade the kit’s firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
2. Upgrade the device’s SE firmware to the latest version when Series 2 device is used (see `Secure Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
3. Open any terminal program and connect to the kit’s VCOM port (if using `Device Console` in Simplicity Studio 5, `Line terminator:` must be set to `None`).
-4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide, check `Platform()` checkbox to browse the platform examples).
+4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide).
5. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in the Simplicity Studio 5 User's Guide).
6. Run the example and follow the instructions shown on the console.
diff --git a/app/common/example/psa_crypto_asymmetric_key/readme.md b/app/common/example/psa_crypto_asymmetric_key/readme.md
index e19030c8d3..c4e637b889 100644
--- a/app/common/example/psa_crypto_asymmetric_key/readme.md
+++ b/app/common/example/psa_crypto_asymmetric_key/readme.md
@@ -105,7 +105,7 @@ The following PSA Crypto APIs are used in this example:
1. Upgrade the kit’s firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
2. Upgrade the device’s SE firmware to the latest version when Series 2 device is used (see `Secure Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
3. Open any terminal program and connect to the kit’s VCOM port (if using `Device Console` in Simplicity Studio 5, `Line terminator:` must be set to `None`).
-4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide, check `Platform()` checkbox to browse the platform examples).
+4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide).
5. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in the Simplicity Studio 5 User's Guide).
6. Run the example and follow the instructions shown on the console.
diff --git a/app/common/example/psa_crypto_cipher/app_process.c b/app/common/example/psa_crypto_cipher/app_process.c
index 50fb80d462..c097d520e8 100644
--- a/app/common/example/psa_crypto_cipher/app_process.c
+++ b/app/common/example/psa_crypto_cipher/app_process.c
@@ -630,7 +630,7 @@ void app_process_action(void)
printf(" + Destroying a %d-bit %s key... ", sizeof(cfb_key) * 8,
symmetric_key_storage_string[symmetric_key_storage_select]);
if (destroy_key() != PSA_SUCCESS) {
- return;
+ break;
}
// Start encryption
encrypt_decrypt = false;
@@ -771,7 +771,7 @@ void app_process_action(void)
printf(" + Destroying a %d-bit %s key... ", sizeof(ctr_key) * 8,
symmetric_key_storage_string[symmetric_key_storage_select]);
if (destroy_key() != PSA_SUCCESS) {
- return;
+ break;
}
// Start encryption
encrypt_decrypt = false;
@@ -913,7 +913,7 @@ void app_process_action(void)
printf(" + Destroying a %d-bit %s key... ", sizeof(chacha20_key) * 8,
symmetric_key_storage_string[symmetric_key_storage_select]);
if (destroy_key() != PSA_SUCCESS) {
- return;
+ break;
}
encrypt_decrypt = false;
print_key_storage();
diff --git a/app/common/example/psa_crypto_cipher/readme.md b/app/common/example/psa_crypto_cipher/readme.md
index bd94afc7d1..74d547fd79 100644
--- a/app/common/example/psa_crypto_cipher/readme.md
+++ b/app/common/example/psa_crypto_cipher/readme.md
@@ -129,7 +129,7 @@ The following PSA Crypto APIs are used in this example:
1. Upgrade the kit’s firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
2. Upgrade the device’s SE firmware to the latest version when Series 2 device is used (see `Secure Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
3. Open any terminal program and connect to the kit’s VCOM port (if using `Device Console` in Simplicity Studio 5, `Line terminator:` must be set to `None`).
-4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide, check `Platform()` checkbox to browse the platform examples).
+4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide).
5. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in the Simplicity Studio 5 User's Guide).
6. Run the example and follow the instructions shown on the console.
diff --git a/app/common/example/psa_crypto_dsa/readme.md b/app/common/example/psa_crypto_dsa/readme.md
index 1b74fa3f2f..6addc193d1 100644
--- a/app/common/example/psa_crypto_dsa/readme.md
+++ b/app/common/example/psa_crypto_dsa/readme.md
@@ -159,7 +159,7 @@ The following PSA Crypto APIs are used in this example:
1. Upgrade the kit’s firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
2. Upgrade the device’s SE firmware to the latest version when Series 2 device is used (see `Secure Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
3. Open any terminal program and connect to the kit’s VCOM port (if using `Device Console` in Simplicity Studio 5, `Line terminator:` must be set to `None`).
-4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide, check `Platform()` checkbox to browse the platform examples).
+4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide).
5. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in the Simplicity Studio 5 User's Guide).
6. Run the example and follow the instructions shown on the console.
diff --git a/app/common/example/psa_crypto_ecdh/readme.md b/app/common/example/psa_crypto_ecdh/readme.md
index 59187cde80..049d2e07ad 100644
--- a/app/common/example/psa_crypto_ecdh/readme.md
+++ b/app/common/example/psa_crypto_ecdh/readme.md
@@ -89,7 +89,7 @@ The following PSA Crypto APIs are used in this example:
1. Upgrade the kit’s firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
2. Upgrade the device’s SE firmware to the latest version when Series 2 device is used (see `Secure Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
3. Open any terminal program and connect to the kit’s VCOM port (if using `Device Console` in Simplicity Studio 5, `Line terminator:` must be set to `None`).
-4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide, check `Platform()` checkbox to browse the platform examples).
+4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide).
5. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in the Simplicity Studio 5 User's Guide).
6. Run the example and follow the instructions shown on the console.
diff --git a/app/common/example/psa_crypto_hash/readme.md b/app/common/example/psa_crypto_hash/readme.md
index 9447aa3529..bacc875200 100644
--- a/app/common/example/psa_crypto_hash/readme.md
+++ b/app/common/example/psa_crypto_hash/readme.md
@@ -62,7 +62,7 @@ The following PSA Crypto APIs are used in this example:
1. Upgrade the kit’s firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
2. Upgrade the device’s SE firmware to the latest version when Series 2 device is used (see `Secure Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
3. Open any terminal program and connect to the kit’s VCOM port (if using `Device Console` in Simplicity Studio 5, `Line terminator:` must be set to `None`).
-4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide, check `Platform()` checkbox to browse the platform examples).
+4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide).
5. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in the Simplicity Studio 5 User's Guide).
6. Run the example and follow the instructions shown on the console.
diff --git a/app/common/example/psa_crypto_kdf/readme.md b/app/common/example/psa_crypto_kdf/readme.md
index 38c85bcfc2..f78e30b171 100644
--- a/app/common/example/psa_crypto_kdf/readme.md
+++ b/app/common/example/psa_crypto_kdf/readme.md
@@ -125,7 +125,7 @@ The following PSA Crypto APIs are used in this example:
1. Upgrade the kit’s firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
2. Upgrade the device’s SE firmware to the latest version when Series 2 device is used (see `Secure Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
3. Open any terminal program and connect to the kit’s VCOM port (if using `Device Console` in Simplicity Studio 5, `Line terminator:` must be set to `None`).
-4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide, check `Platform()` checkbox to browse the platform examples).
+4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide).
5. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in the Simplicity Studio 5 User's Guide).
6. Run the example and follow the instructions shown on the console.
diff --git a/app/common/example/psa_crypto_mac/readme.md b/app/common/example/psa_crypto_mac/readme.md
index 37c2e4ec31..9083841eb4 100644
--- a/app/common/example/psa_crypto_mac/readme.md
+++ b/app/common/example/psa_crypto_mac/readme.md
@@ -107,7 +107,7 @@ The following PSA Crypto APIs are used in this example:
1. Upgrade the kit’s firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
2. Upgrade the device’s SE firmware to the latest version when Series 2 device is used (see `Secure Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
3. Open any terminal program and connect to the kit’s VCOM port (if using `Device Console` in Simplicity Studio 5, `Line terminator:` must be set to `None`).
-4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide, check `Platform()` checkbox to browse the platform examples).
+4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide).
5. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in the Simplicity Studio 5 User's Guide).
6. Run the example and follow the instructions shown on the console.
diff --git a/app/common/example/psa_crypto_symmetric_key/readme.md b/app/common/example/psa_crypto_symmetric_key/readme.md
index 91355a4541..e4ad232640 100644
--- a/app/common/example/psa_crypto_symmetric_key/readme.md
+++ b/app/common/example/psa_crypto_symmetric_key/readme.md
@@ -97,7 +97,7 @@ The following PSA Crypto APIs are used in this example:
1. Upgrade the kit’s firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
2. Upgrade the device’s SE firmware to the latest version when Series 2 device is used (see `Secure Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
3. Open any terminal program and connect to the kit’s VCOM port (if using `Device Console` in Simplicity Studio 5, `Line terminator:` must be set to `None`).
-4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide, check `Platform()` checkbox to browse the platform examples).
+4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide).
5. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in the Simplicity Studio 5 User's Guide).
6. Run the example and follow the instructions shown on the console.
diff --git a/app/common/example/psa_crypto_x509/readme.md b/app/common/example/psa_crypto_x509/readme.md
index ed32a6db30..6eab62c672 100644
--- a/app/common/example/psa_crypto_x509/readme.md
+++ b/app/common/example/psa_crypto_x509/readme.md
@@ -157,7 +157,7 @@ The following Mbed TLS APIs are used in this example:
1. Upgrade the kit’s firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
2. Upgrade the device’s SE firmware to the latest version when Series 2 device is used (see `Secure Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
3. Open any terminal program and connect to the kit’s VCOM port (if using `Device Console` in Simplicity Studio 5, `Line terminator:` must be set to `None`).
-4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide, check `Platform()` checkbox to browse the platform examples).
+4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide).
5. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in the Simplicity Studio 5 User's Guide).
6. Run the example and follow the instructions shown on the console.
diff --git a/app/common/example/se_manager_asymmetric_key_handling/readme.md b/app/common/example/se_manager_asymmetric_key_handling/readme.md
index a5cd8f8e44..002f6e48a4 100644
--- a/app/common/example/se_manager_asymmetric_key_handling/readme.md
+++ b/app/common/example/se_manager_asymmetric_key_handling/readme.md
@@ -77,7 +77,7 @@ The following SE Manager APIs are used in this example:
1. Upgrade the kit’s firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
2. Upgrade the device’s SE firmware to the latest version (see `Secure Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
3. Open any terminal program and connect to the kit’s VCOM port (if using `Device Console` in Simplicity Studio 5, `Line terminator:` must be set to `None`).
-4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide, check `Platform()` checkbox to browse the platform examples).
+4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide).
5. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in the Simplicity Studio 5 User's Guide).
6. Run the example and follow the instructions shown on the console.
diff --git a/app/common/example/se_manager_attestation/readme.md b/app/common/example/se_manager_attestation/readme.md
index 25b3b32bea..d392c41296 100644
--- a/app/common/example/se_manager_attestation/readme.md
+++ b/app/common/example/se_manager_attestation/readme.md
@@ -1,5 +1,8 @@
-#SE Manager Attestation
+# SE Manager Attestation
+
+
This example uses the SE Manager API to fetch attestation tokens on the supported Series 2 device.
+
The example also contains code that demonstrates how the tokens can be parsed and printed in a human-readable format.
Parsing and printing of tokens on the actual device might not be a strictly typical use case, but it is nevertheless included in order to showcase the structure and capabilities of the supported attestation tokens.
@@ -9,27 +12,35 @@ An attestation token provided by the SE Manager API is a COSE_Sign1 structure th
The example redirects standard I/O to the virtual serial port (VCOM) of the kit. By default, the serial port setting is 115200 bps and 8-N-1 configuration.
-The example has been instrumented with code to count the number of clock cycles spent in different operations. The results are printed on the VCOM serial port console. This feature can be disabled by defining SE_MANAGER_PRINT=0 (default is 1) in the IDE setting (Preprocessor->Defined symbols).
+The example has been instrumented with code to count the number of clock cycles spent in different operations. The results are printed on the VCOM serial port console. This feature can be disabled by defining `SE_MANAGER_PRINT=0` (default is 1) in the IDE setting (`Preprocessor->Defined symbols`).
+
+## SE Manager API
+
-##SE Manager API
The following SE Manager APIs are used in this example:
-sl_se_init
-sl_se_deinit
-sl_se_init_command_context
-sl_se_deinit_command_context
-sl_se_get_random
-sl_se_attestation_get_psa_iat_token
-sl_se_attestation_get_config_token
-
-##Getting Started
-Upgrade the kit’s firmware to the latest version (see Adapter Firmware under General Device Information in the Simplicity Studio 5 User's Guide).
-Upgrade the device’s SE firmware to the latest version (see Secure Firmware under General Device Information in the Simplicity Studio 5 User's Guide).
-Open any terminal program and connect to the kit’s VCOM port.
-Create this platform example project in the Simplicity IDE (see Examples in the Simplicity Studio 5 User's Guide, check Platform() checkbox to browse the platform examples).
-Build the example and download it to the kit (see Simple Build and Flash Programmer in the Simplicity Studio 5 User's Guide).
-Run the example and the console should display the process steps of this example.
-
-##Additional Information
-###Resources
-[SE Manager API](https://docs.silabs.com/gecko-platform/latest/service/api/group-sl-se-manager)
+
+* `sl_se_init`
+* `sl_se_deinit`
+* `sl_se_init_command_context`
+* `sl_se_deinit_command_context`
+* `sl_se_get_random`
+* `sl_se_attestation_get_psa_iat_token`
+* `sl_se_attestation_get_config_token`
+
+
+## Getting Started
+
+
+1. Upgrade the kit’s firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
+2. Upgrade the device’s SE firmware to the latest version (see `Secure Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
+3. Open any terminal program and connect to the kit’s VCOM port (if using `Device Console` in Simplicity Studio 5, `Line terminator:` must be set to `None`).
+4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide).
+5. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in the Simplicity Studio 5 User's Guide).
+6. Run the example and follow the instructions shown on the console.
+
+
+## Resources
+
+
+[SE Manager API](https://docs.silabs.com/gecko-platform/latest/service/api/group-sl-se-manager)
\ No newline at end of file
diff --git a/app/common/example/se_manager_block_cipher/readme.md b/app/common/example/se_manager_block_cipher/readme.md
index eb6a01e66c..2cf37c79c0 100644
--- a/app/common/example/se_manager_block_cipher/readme.md
+++ b/app/common/example/se_manager_block_cipher/readme.md
@@ -117,7 +117,7 @@ The following SE Manager APIs are used in this example:
1. Upgrade the kit’s firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
2. Upgrade the device’s SE firmware to the latest version (see `Secure Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
3. Open any terminal program and connect to the kit’s VCOM port (if using `Device Console` in Simplicity Studio 5, `Line terminator:` must be set to `None`).
-4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide, check `Platform()` checkbox to browse the platform examples).
+4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide).
5. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in the Simplicity Studio 5 User's Guide).
6. Run the example and follow the instructions shown on the console.
diff --git a/app/common/example/se_manager_ecdh/readme.md b/app/common/example/se_manager_ecdh/readme.md
index 1a44f7f977..a68877ba40 100644
--- a/app/common/example/se_manager_ecdh/readme.md
+++ b/app/common/example/se_manager_ecdh/readme.md
@@ -73,7 +73,7 @@ The following SE Manager APIs are used in this example:
1. Upgrade the kit’s firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
2. Upgrade the device’s SE firmware to the latest version (see `Secure Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
3. Open any terminal program and connect to the kit’s VCOM port (if using `Device Console` in Simplicity Studio 5, `Line terminator:` must be set to `None`).
-4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide, check `Platform()` checkbox to browse the platform examples).
+4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide).
5. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in the Simplicity Studio 5 User's Guide).
6. Run the example and follow the instructions shown on the console.
diff --git a/app/common/example/se_manager_ecjpake/readme.md b/app/common/example/se_manager_ecjpake/readme.md
index 5ce1bac026..0b465981ef 100644
--- a/app/common/example/se_manager_ecjpake/readme.md
+++ b/app/common/example/se_manager_ecjpake/readme.md
@@ -43,7 +43,7 @@ The following SE Manager APIs are used in this example:
1. Upgrade the kit’s firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
2. Upgrade the device’s SE firmware to the latest version (see `Secure Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
3. Open any terminal program and connect to the kit’s VCOM port.
-4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide, check `Platform()` checkbox to browse the platform examples).
+4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide).
5. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in the Simplicity Studio 5 User's Guide).
6. Run the example and the console should display the process steps of this example.
diff --git a/app/common/example/se_manager_hash/readme.md b/app/common/example/se_manager_hash/readme.md
index 78c6007507..208ff61d56 100644
--- a/app/common/example/se_manager_hash/readme.md
+++ b/app/common/example/se_manager_hash/readme.md
@@ -68,7 +68,7 @@ The following SE Manager APIs are used in this example:
1. Upgrade the kit’s firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
2. Upgrade the device’s SE firmware to the latest version (see `Secure Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
3. Open any terminal program and connect to the kit’s VCOM port (if using `Device Console` in Simplicity Studio 5, `Line terminator:` must be set to `None`).
-4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide, check `Platform()` checkbox to browse the platform examples).
+4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide).
5. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in the Simplicity Studio 5 User's Guide).
6. Run the example and follow the instructions shown on the console.
diff --git a/app/common/example/se_manager_host_firmware_upgrade/readme.md b/app/common/example/se_manager_host_firmware_upgrade/readme.md
index 72d97cdc28..251de07cf5 100644
--- a/app/common/example/se_manager_host_firmware_upgrade/readme.md
+++ b/app/common/example/se_manager_host_firmware_upgrade/readme.md
@@ -39,7 +39,7 @@ The following SE Manager APIs are used in this example:
1. Upgrade the kit’s firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
2. Upgrade the device’s SE firmware to the latest version (see `Secure Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
3. Open any terminal program and connect to the kit’s VCOM port (if using `Device Console` in Simplicity Studio 5, `Line terminator:` must be set to `None`).
-4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide, check `Platform()` checkbox to browse the platform examples).
+4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide).
5. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in the Simplicity Studio 5 User's Guide).
6. Run the example and follow the instructions shown on the console.
diff --git a/app/common/example/se_manager_kdf/readme.md b/app/common/example/se_manager_kdf/readme.md
index 68c9bee934..5dc9702d3d 100644
--- a/app/common/example/se_manager_kdf/readme.md
+++ b/app/common/example/se_manager_kdf/readme.md
@@ -42,7 +42,7 @@ The following SE Manager APIs are used in this example:
1. Upgrade the kit’s firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
2. Upgrade the device’s SE firmware to the latest version (see `Secure Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
3. Open any terminal program and connect to the kit’s VCOM port.
-4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide, check `Platform()` checkbox to browse the platform examples).
+4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide).
5. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in the Simplicity Studio 5 User's Guide).
6. Run the example and the console should display the process steps of this example.
diff --git a/app/common/example/se_manager_key_provisioning/readme.md b/app/common/example/se_manager_key_provisioning/readme.md
index abf8212e98..58d438fd24 100644
--- a/app/common/example/se_manager_key_provisioning/readme.md
+++ b/app/common/example/se_manager_key_provisioning/readme.md
@@ -75,7 +75,7 @@ The following SE Manager APIs are used in this example:
1. Upgrade the kit’s firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
2. Upgrade the device’s SE firmware to the latest version (see `Secure Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
3. Open any terminal program and connect to the kit’s VCOM port (if using `Device Console` in Simplicity Studio 5, `Line terminator:` must be set to `None`).
-4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide, check `Platform()` checkbox to browse the platform examples).
+4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide).
5. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in the Simplicity Studio 5 User's Guide).
6. Run the example and follow the instructions shown on the console.
diff --git a/app/common/example/se_manager_se_firmware_upgrade/app_se_firmware_image.c b/app/common/example/se_manager_se_firmware_upgrade/app_se_firmware_image.c
index 744cf5647b..b320d6e0ca 100644
--- a/app/common/example/se_manager_se_firmware_upgrade/app_se_firmware_image.c
+++ b/app/common/example/se_manager_se_firmware_upgrade/app_se_firmware_image.c
@@ -8106,6 +8106,905 @@ SL_ALIGN(4) static const uint8_t se_firmware_image[] SL_ATTRIBUTE_ALIGN(4) =
0x7A, 0xE3, 0xBB, 0x17, 0xC8, 0x3C, 0x83, 0xCA, 0xAC, 0xCA, 0x7B, 0x24, 0xAF, 0x5D, 0x5D, 0x9E, 0xCD, 0x56, 0x6B, 0x38, 0xE9, 0x12, 0x5A, 0xF1, 0x4F, 0xF0, 0x3B, 0xA7, 0x12, 0xA0, 0xE8, 0x5E, 0x51, 0xCD, 0xAF, 0xEB, 0xA2, 0x8D, 0x7B, 0x82,
0xA3, 0x43, 0x2D, 0x7A, 0x04, 0xB8, 0x61, 0x05, 0x25, 0x4E, 0xD3, 0x20, 0xB3, 0x6C, 0x24, 0x2F, 0x7C, 0x14, 0xD8, 0x19, 0x6B, 0x3A, 0x45, 0xEE, 0xFA, 0x26, 0xA0, 0xC4, 0x3F, 0xE6, 0x89, 0xCA, 0xC4, 0x69, 0xE6, 0xAB, 0x41, 0x46, 0x57, 0xBE,
0xAB, 0x1A, 0x0F, 0x84, 0x40, 0x9E, 0xFA, 0x9D, 0x44, 0x31, 0x21, 0xBB, 0x7D, 0x1C, 0x63, 0x7B, 0x62, 0xCC, 0x6A, 0xD1, 0x64, 0x3C, 0x15, 0xA1, 0xCB
+#elif (_SILICON_LABS_32B_SERIES_2_CONFIG == 7) // EFR32xG27 v2.2.0
+ 0xEB, 0x17, 0xA6, 0x5E, 0x45, 0x8C, 0x00, 0x00, 0xA8, 0x8B, 0x00, 0x00, 0x00, 0x02, 0x02, 0x06, 0x01, 0x01, 0x00, 0x00, 0x73, 0x86, 0xD4, 0x38, 0x58, 0xEA, 0xB9, 0x8F, 0xCF, 0xF5, 0xDA, 0xF9, 0x22, 0xFA, 0x4B, 0x0F, 0x49, 0xED, 0x2F, 0x6D,
+ 0xC9, 0xDD, 0x73, 0xA5, 0xAA, 0x85, 0x5B, 0xCF, 0xC3, 0xD2, 0x9C, 0x4C, 0x00, 0xA9, 0xFB, 0x36, 0x32, 0x96, 0x9E, 0x90, 0xE0, 0xBE, 0xDD, 0x14, 0xEC, 0x23, 0xFA, 0x78, 0xF8, 0x77, 0xE7, 0x12, 0x7F, 0xF7, 0xD0, 0x85, 0x98, 0xF9, 0x71, 0x51,
+ 0xD2, 0xDA, 0x3D, 0x92, 0xC7, 0xC7, 0x0F, 0x13, 0xA4, 0xB3, 0x18, 0xDD, 0xD0, 0x65, 0x59, 0x6F, 0x06, 0xBE, 0x24, 0x3E, 0x00, 0x0C, 0xD0, 0xCD, 0x4A, 0xCE, 0x67, 0xFE, 0x9F, 0x82, 0x40, 0x82, 0xFB, 0xB7, 0x2E, 0xD1, 0xD9, 0xFC, 0x2E, 0xE9,
+ 0xC4, 0x8F, 0xF3, 0xD3, 0xA3, 0x3B, 0xB1, 0x09, 0xFA, 0x3E, 0x1E, 0x19, 0xA2, 0x0B, 0xBF, 0x7F, 0xFA, 0x3D, 0x92, 0xD0, 0x18, 0xA3, 0xDF, 0xE0, 0x28, 0xE2, 0xA6, 0x74, 0x27, 0xB3, 0x52, 0x12, 0x32, 0xDF, 0x47, 0x67, 0x42, 0xAD, 0xA9, 0xEA,
+ 0xB1, 0x4C, 0x80, 0x56, 0x75, 0x20, 0xEF, 0xB9, 0x71, 0xD6, 0xFE, 0xD7, 0xCA, 0x47, 0xEC, 0xA9, 0xA3, 0xAE, 0xE2, 0x3E, 0x74, 0xC5, 0xD3, 0x43, 0x01, 0x4D, 0xC3, 0x1D, 0xD8, 0x05, 0x97, 0x29, 0xAB, 0x5D, 0xC8, 0xEE, 0x20, 0x1C, 0x3C, 0xCC,
+ 0x1C, 0xC3, 0x57, 0xC1, 0xFA, 0x75, 0x55, 0x18, 0x9A, 0xDE, 0x49, 0x47, 0xAA, 0xDB, 0xAA, 0xDD, 0xDE, 0xF3, 0x9C, 0x9B, 0xF5, 0x92, 0x95, 0xC3, 0x55, 0xA3, 0x7D, 0x7A, 0x67, 0x9E, 0xAD, 0x69, 0x4D, 0xCA, 0x92, 0x20, 0xBA, 0x86, 0x96, 0x37,
+ 0x6E, 0x56, 0xBF, 0x5F, 0x8B, 0x6C, 0x64, 0x38, 0xC6, 0x80, 0xA3, 0x5D, 0x33, 0x7A, 0x30, 0x90, 0xEA, 0xD9, 0x7E, 0xFB, 0x97, 0x9A, 0xA8, 0x79, 0x79, 0x2F, 0x1D, 0x9D, 0xA4, 0x1F, 0x53, 0x91, 0x85, 0x39, 0x79, 0x58, 0xD3, 0x07, 0x5A, 0xE4,
+ 0x89, 0x07, 0x9C, 0xDA, 0xC4, 0x67, 0x43, 0x83, 0x49, 0x1E, 0x0C, 0x2A, 0x5C, 0x93, 0x58, 0x5F, 0x03, 0x8B, 0xE7, 0xD6, 0x13, 0x1F, 0x7D, 0xCD, 0xCE, 0x8B, 0xB5, 0xCC, 0x5E, 0xB7, 0xB0, 0x79, 0xC9, 0x7C, 0xBE, 0xE5, 0xDA, 0xC1, 0xA4, 0x6B,
+ 0xF2, 0x51, 0x84, 0x0C, 0x23, 0x31, 0x1F, 0x93, 0x4E, 0x32, 0x29, 0xBF, 0x5B, 0x82, 0x8C, 0x20, 0x6C, 0xF6, 0xD6, 0xD9, 0x25, 0xA0, 0x17, 0x32, 0x48, 0x3A, 0x75, 0x65, 0x2F, 0x7E, 0x5B, 0xC1, 0xB3, 0x45, 0x01, 0x7B, 0x86, 0x18, 0x04, 0x23,
+ 0x6B, 0xCE, 0xAF, 0x8D, 0x0A, 0x6E, 0x76, 0xAB, 0xD0, 0xC0, 0x30, 0xB9, 0x62, 0x57, 0x2E, 0x61, 0xB9, 0x8F, 0x59, 0x5C, 0x3B, 0xC8, 0xA4, 0x52, 0x58, 0xDC, 0x04, 0xE2, 0x41, 0xDB, 0xA3, 0xB3, 0x7B, 0x2F, 0xCB, 0xF5, 0x7E, 0xA8, 0x62, 0x48,
+ 0x4B, 0xFE, 0xC4, 0x1B, 0xE8, 0xB2, 0xDC, 0xFB, 0x25, 0xC4, 0x66, 0xD2, 0xD5, 0x04, 0x55, 0x5B, 0x00, 0x92, 0x11, 0x9F, 0x3D, 0xE5, 0xC0, 0x8B, 0x73, 0x51, 0xDD, 0xDD, 0xE3, 0xE8, 0x2D, 0xFB, 0x0E, 0xE1, 0xD6, 0xA4, 0xC2, 0xFC, 0x32, 0xB8,
+ 0xA8, 0xED, 0x88, 0x63, 0x9D, 0xFF, 0xFB, 0x4E, 0x8E, 0x48, 0x67, 0x43, 0x99, 0x71, 0xD8, 0x2F, 0xCB, 0x4A, 0x86, 0x4D, 0xF5, 0xBD, 0x73, 0xDB, 0x88, 0x9B, 0xAB, 0x06, 0xEE, 0xBF, 0x78, 0xD4, 0xC9, 0x9D, 0x3D, 0x91, 0x0C, 0x7B, 0x54, 0x4D,
+ 0xE1, 0xD1, 0xCA, 0x61, 0x25, 0xFE, 0xDC, 0x3D, 0x4F, 0x6C, 0x74, 0xC4, 0x4F, 0x4B, 0x28, 0xFC, 0x83, 0x9F, 0xBC, 0x33, 0xCF, 0x8D, 0x20, 0x50, 0xF2, 0xB3, 0x69, 0x8A, 0x41, 0x91, 0x70, 0xA3, 0x43, 0x88, 0xEE, 0x0C, 0x2F, 0x10, 0x2A, 0xF0,
+ 0x1A, 0x57, 0x87, 0xAF, 0x9C, 0x7E, 0xA4, 0x0D, 0x93, 0x74, 0x77, 0xBB, 0xC9, 0x1C, 0x28, 0xE7, 0xF4, 0xBE, 0x68, 0x4E, 0xA9, 0xB9, 0x85, 0xDA, 0x01, 0x25, 0xD9, 0x19, 0xC8, 0xAA, 0xEC, 0x35, 0x95, 0x12, 0x2F, 0x68, 0xDD, 0x1A, 0xC8, 0x8E,
+ 0xC8, 0xEF, 0x2D, 0xA3, 0x18, 0x6C, 0x2A, 0xCB, 0x8E, 0x0F, 0xBF, 0x5C, 0x60, 0xEC, 0x7F, 0x1D, 0x62, 0xA3, 0x3B, 0xCC, 0xE2, 0xC9, 0xED, 0x6E, 0x17, 0x36, 0xA6, 0x6B, 0x4A, 0x23, 0x7D, 0x64, 0x31, 0x05, 0xDC, 0x1D, 0x2B, 0x44, 0xEB, 0x8E,
+ 0x86, 0x87, 0x36, 0x88, 0xFE, 0x40, 0x59, 0xF5, 0x67, 0xB2, 0xEB, 0xDB, 0x55, 0xA5, 0x2A, 0xB0, 0x27, 0xEE, 0x98, 0x21, 0xFE, 0xB8, 0x4F, 0xB8, 0x3C, 0x1B, 0x3C, 0x26, 0x16, 0x95, 0xFF, 0xE2, 0xA4, 0xC6, 0xD8, 0x29, 0x65, 0x01, 0x96, 0x99,
+ 0xAE, 0xA0, 0x1E, 0xFD, 0xF6, 0x41, 0xC0, 0xAB, 0x8E, 0xB7, 0x87, 0x9F, 0x9C, 0xE2, 0x30, 0x69, 0x16, 0x79, 0xA8, 0xD6, 0x62, 0x16, 0x31, 0x2F, 0x2D, 0xDA, 0x4E, 0x78, 0x2A, 0x0A, 0x21, 0x68, 0x36, 0xDA, 0xDB, 0x2A, 0x37, 0xF9, 0x3C, 0xDD,
+ 0xF4, 0x8C, 0x63, 0x73, 0x52, 0xA4, 0x6C, 0x9B, 0x99, 0x65, 0xD1, 0xEE, 0xE1, 0x2E, 0x60, 0x4F, 0x0B, 0x86, 0x31, 0xA9, 0x8E, 0xC1, 0xE2, 0x62, 0xB3, 0xC4, 0x36, 0x3B, 0xF0, 0x61, 0x73, 0x0F, 0xFF, 0xE2, 0x71, 0xE1, 0xC1, 0x31, 0x05, 0xED,
+ 0x8C, 0x02, 0x12, 0xC7, 0x62, 0xB6, 0xB7, 0x94, 0x1E, 0x00, 0x53, 0x0D, 0xEA, 0x29, 0xDA, 0xA8, 0x63, 0x56, 0xA1, 0x06, 0xEE, 0x6D, 0xF1, 0x00, 0xEB, 0x78, 0x96, 0x41, 0x01, 0x25, 0x74, 0x4D, 0xB1, 0xC8, 0xCA, 0xA0, 0xA2, 0x7B, 0x7B, 0x47,
+ 0x4A, 0xC3, 0xEE, 0x17, 0x31, 0xA2, 0x22, 0x72, 0xC7, 0x5E, 0x38, 0x0A, 0x97, 0x33, 0x87, 0xA6, 0x9A, 0x05, 0x82, 0xB7, 0x48, 0x0D, 0xEC, 0xFC, 0xAF, 0x2A, 0x16, 0x17, 0x5C, 0x70, 0xDD, 0x07, 0x57, 0xE4, 0x3E, 0xAA, 0xFD, 0x5F, 0x66, 0x90,
+ 0xDF, 0x37, 0x0B, 0xCB, 0xFD, 0xB2, 0xB4, 0xE2, 0x5D, 0x63, 0x81, 0x7A, 0xDF, 0x11, 0xE1, 0x17, 0x29, 0xD3, 0xCD, 0x70, 0xB5, 0xFC, 0xA1, 0x94, 0x0E, 0x55, 0xB7, 0x22, 0x9A, 0xFE, 0x67, 0xBE, 0x22, 0x7E, 0xF0, 0x6B, 0x8F, 0xA6, 0xA8, 0xE6,
+ 0x4A, 0x26, 0x11, 0x32, 0xAC, 0x05, 0xBF, 0x8C, 0x9B, 0x1D, 0xF7, 0x78, 0xBE, 0xA9, 0xC7, 0x8D, 0x2F, 0x8A, 0xAE, 0x01, 0x67, 0x3F, 0x5B, 0x43, 0x18, 0xC0, 0x86, 0x72, 0x35, 0x05, 0xAD, 0x93, 0xAC, 0x10, 0x7F, 0x51, 0xD3, 0xF3, 0x83, 0x78,
+ 0x0E, 0xE4, 0x9B, 0xA6, 0x2F, 0xB7, 0x74, 0xAF, 0xE9, 0x5F, 0xB7, 0x40, 0x2B, 0x7C, 0x0E, 0x33, 0xBA, 0x36, 0xE8, 0xB5, 0x67, 0x51, 0xEF, 0x85, 0x24, 0xAA, 0x98, 0x34, 0xAC, 0xD9, 0xA8, 0x0E, 0x45, 0xE9, 0x5B, 0x61, 0xDE, 0xB8, 0x0B, 0x3F,
+ 0x7C, 0x16, 0xB0, 0xFA, 0xA3, 0x52, 0xAF, 0x1C, 0xA0, 0xC1, 0xE9, 0x79, 0x8C, 0x8E, 0x13, 0x20, 0x2A, 0x04, 0x32, 0x3C, 0x09, 0xBC, 0xB2, 0xFD, 0xDF, 0x7E, 0xCA, 0x7B, 0xD7, 0x79, 0x27, 0x1E, 0xF4, 0xCF, 0x7C, 0x78, 0x9B, 0x33, 0xF4, 0xBC,
+ 0xB7, 0xF6, 0x27, 0x02, 0xE3, 0xE5, 0xE6, 0x9F, 0x9D, 0x27, 0xB6, 0x33, 0xB7, 0x4C, 0xF3, 0x2B, 0x84, 0xA6, 0xC0, 0x34, 0xDB, 0x31, 0xCB, 0xFA, 0x24, 0x98, 0xD7, 0x99, 0xFD, 0xFC, 0x13, 0x2E, 0x26, 0xDF, 0x38, 0x49, 0x25, 0x2F, 0x2B, 0x93,
+ 0x7B, 0x30, 0x17, 0xF8, 0x54, 0xC7, 0x6B, 0xF9, 0xC9, 0x86, 0x9A, 0x6B, 0x70, 0x0A, 0x4D, 0x24, 0x4D, 0x90, 0x77, 0x8F, 0xF8, 0x24, 0x4E, 0x41, 0x9B, 0xDB, 0x5C, 0xB7, 0x30, 0x0B, 0xA4, 0x35, 0x2B, 0xE6, 0x7E, 0x38, 0x36, 0xBF, 0xCB, 0xEC,
+ 0x2A, 0xB3, 0x3D, 0x58, 0x49, 0x68, 0x3C, 0xCD, 0xF0, 0x95, 0x89, 0x2F, 0xB3, 0x03, 0x43, 0x1C, 0x5C, 0x83, 0x7C, 0x44, 0x7C, 0x2B, 0xC7, 0xD3, 0x3F, 0x64, 0x62, 0x8A, 0xED, 0xE6, 0xF1, 0xF6, 0x95, 0x28, 0x85, 0x9D, 0x77, 0x90, 0x6D, 0xD2,
+ 0x2F, 0x6A, 0x12, 0xD7, 0x00, 0x65, 0x51, 0xEF, 0xA3, 0xA4, 0xBF, 0x8C, 0x1C, 0x02, 0x1D, 0xC4, 0x3C, 0x54, 0x55, 0xB0, 0x24, 0x5A, 0x6E, 0xE3, 0x54, 0xA1, 0x3E, 0x85, 0xA8, 0xF1, 0xDF, 0x9E, 0xD2, 0x5F, 0x9E, 0x1C, 0xF5, 0xDD, 0xDA, 0x85,
+ 0x92, 0x92, 0xA6, 0x2F, 0xD1, 0xEB, 0x3D, 0x59, 0x9B, 0x73, 0x2D, 0x8A, 0x66, 0xA7, 0xFC, 0xF2, 0x15, 0xFA, 0x3B, 0x8F, 0x82, 0x3A, 0xE3, 0x1B, 0xC4, 0xD6, 0x8B, 0x9D, 0x11, 0x3B, 0x9A, 0x19, 0x7C, 0xAA, 0xBD, 0xA5, 0x78, 0xB5, 0x58, 0x64,
+ 0x1E, 0x8A, 0x90, 0x61, 0xBA, 0x06, 0xA8, 0xD5, 0x49, 0x8C, 0xB4, 0x56, 0x86, 0xB7, 0x77, 0xE0, 0x43, 0x01, 0x23, 0xCB, 0xFD, 0x96, 0xFA, 0x34, 0xFE, 0x78, 0xA3, 0x69, 0x83, 0x1E, 0xC8, 0x28, 0x2B, 0xCC, 0xEE, 0xFA, 0xBD, 0x5A, 0x2D, 0xFF,
+ 0x36, 0x93, 0xED, 0x68, 0x67, 0x7E, 0x1F, 0xB5, 0x04, 0x02, 0xEA, 0xB1, 0xA4, 0x56, 0x99, 0x50, 0x2C, 0xF2, 0xE2, 0xFC, 0x37, 0xA8, 0x65, 0x1E, 0x31, 0xBD, 0x32, 0xBC, 0xB3, 0x02, 0x1B, 0xA4, 0xDD, 0x6D, 0x48, 0x98, 0xF2, 0xD6, 0x94, 0x2F,
+ 0xBF, 0x4B, 0xF6, 0x28, 0xFA, 0x0F, 0x51, 0x3C, 0x71, 0xD9, 0x27, 0x3E, 0x88, 0x47, 0xAA, 0xA3, 0x77, 0x77, 0xD4, 0xC4, 0x4C, 0x77, 0x9B, 0x06, 0x62, 0x8A, 0x56, 0xAA, 0xD0, 0x48, 0x6F, 0x79, 0xEB, 0xF2, 0xA3, 0xA6, 0xE0, 0xB1, 0x18, 0xA5,
+ 0x7F, 0x5E, 0x2E, 0x9C, 0x4E, 0xDD, 0x55, 0x19, 0x34, 0x1D, 0x39, 0xFB, 0x06, 0xAD, 0xCF, 0x0B, 0xB6, 0x10, 0x2C, 0x3B, 0x74, 0x8D, 0xCC, 0x22, 0x6B, 0x97, 0x44, 0xC9, 0xBC, 0x5E, 0x8C, 0x40, 0x2A, 0xBD, 0x0D, 0x0F, 0x8F, 0x07, 0xD1, 0xE4,
+ 0x15, 0x1E, 0x2B, 0xEE, 0xA3, 0x59, 0x2B, 0x97, 0x01, 0x1D, 0x09, 0x07, 0xC7, 0x7C, 0x9D, 0x3B, 0xFD, 0x8A, 0xCA, 0xD5, 0xD2, 0xF1, 0x7D, 0x56, 0x08, 0xF2, 0x34, 0x5E, 0x6D, 0x21, 0x58, 0xC5, 0x7D, 0xC1, 0xBB, 0xAC, 0x1B, 0xF6, 0x70, 0xFD,
+ 0xFD, 0x81, 0x41, 0x36, 0x73, 0xA3, 0x7B, 0x42, 0x35, 0x00, 0x71, 0x4B, 0xAE, 0x2C, 0xB6, 0x85, 0x08, 0xB2, 0xC6, 0x83, 0x67, 0xEC, 0xD3, 0xBF, 0x89, 0x4B, 0x5A, 0x6E, 0x76, 0x21, 0x61, 0x2F, 0x14, 0xE4, 0x5E, 0x79, 0x15, 0x6B, 0xEF, 0x52,
+ 0x59, 0x5B, 0xEF, 0x24, 0x47, 0x5D, 0x3D, 0xCD, 0xF6, 0x4F, 0x48, 0xA8, 0x19, 0x3F, 0xF1, 0x97, 0xA2, 0x09, 0x45, 0xF8, 0x5A, 0x0E, 0x5C, 0x75, 0x17, 0x53, 0xF3, 0x17, 0x88, 0xF4, 0xF0, 0x26, 0x09, 0xA9, 0xBB, 0x0A, 0x2C, 0x43, 0x70, 0xD9,
+ 0x18, 0x51, 0x6E, 0xD9, 0x25, 0x0D, 0x80, 0x7F, 0xDF, 0x56, 0xE9, 0x28, 0xB8, 0x5D, 0xA5, 0xB7, 0x07, 0x50, 0xBA, 0xD1, 0x02, 0x0B, 0x39, 0x01, 0xEE, 0xDE, 0xDC, 0x8C, 0x51, 0xC0, 0x9B, 0xE2, 0xD3, 0x60, 0xA9, 0xE9, 0x70, 0x3A, 0x11, 0x20,
+ 0xB6, 0x75, 0x61, 0x48, 0x03, 0xFB, 0x41, 0x1C, 0x05, 0xE6, 0x2F, 0x21, 0x75, 0x2C, 0x7E, 0x85, 0x0A, 0xA7, 0xBC, 0x00, 0xAD, 0xC2, 0x4B, 0x42, 0x7A, 0xE2, 0xA8, 0xC9, 0x34, 0x06, 0x7A, 0x58, 0x0A, 0x62, 0x13, 0xAF, 0x30, 0xB0, 0xF4, 0x8D,
+ 0x89, 0x06, 0xD0, 0xDA, 0x73, 0xEB, 0x50, 0x52, 0x6D, 0xF1, 0xDD, 0x9B, 0x76, 0x59, 0xDD, 0x02, 0x23, 0x57, 0xFA, 0x35, 0x10, 0xEF, 0x17, 0xD8, 0x5A, 0xCA, 0xAE, 0x0C, 0xF3, 0xC9, 0x7E, 0x39, 0x44, 0x6B, 0x10, 0x8F, 0x3C, 0xE9, 0x36, 0xD3,
+ 0xBE, 0x79, 0xDB, 0x62, 0xEF, 0xD4, 0x9A, 0xFE, 0xE1, 0xFA, 0x14, 0x89, 0x43, 0x5D, 0xCD, 0x26, 0x2A, 0xD2, 0xCD, 0xAA, 0xDB, 0xE6, 0xF2, 0xE0, 0x16, 0x16, 0x0F, 0x81, 0x3E, 0x7E, 0x0D, 0x40, 0x42, 0xD2, 0x23, 0x6A, 0xEB, 0xD6, 0x06, 0x9B,
+ 0xFE, 0x96, 0x28, 0xF8, 0x69, 0x81, 0xFB, 0x71, 0x94, 0x0C, 0x7B, 0xA1, 0xDC, 0xCF, 0xB7, 0x03, 0x30, 0xB0, 0xED, 0xF7, 0xAE, 0x52, 0x10, 0xCD, 0x78, 0x2D, 0x2E, 0x3C, 0x48, 0x8D, 0x22, 0x47, 0x62, 0x91, 0xE2, 0xD2, 0x83, 0xA9, 0x6E, 0x77,
+ 0xFA, 0xB9, 0xAD, 0x1A, 0xCA, 0x5C, 0xFB, 0xEE, 0xED, 0x64, 0xD6, 0x07, 0xA5, 0x45, 0x08, 0xFA, 0xDC, 0x07, 0x66, 0x4E, 0xBD, 0xE0, 0xA4, 0xBD, 0x88, 0xCA, 0x63, 0x0E, 0xBF, 0x49, 0xD7, 0x79, 0xCE, 0xA6, 0xAD, 0x6E, 0xC2, 0xA3, 0xFC, 0x22,
+ 0xEA, 0x6D, 0xD4, 0x0B, 0xC5, 0xEB, 0x4A, 0xDF, 0x5F, 0x03, 0xAC, 0xCF, 0xD7, 0xA8, 0x41, 0x1E, 0xE4, 0xF1, 0x68, 0xC2, 0xC5, 0x6A, 0xAA, 0x4C, 0x89, 0xC9, 0xC5, 0x68, 0xB8, 0x89, 0x7B, 0x04, 0x6B, 0x74, 0x06, 0xCF, 0x0E, 0xE9, 0x2C, 0x4C,
+ 0xCE, 0x7C, 0x3A, 0x28, 0x79, 0xD3, 0x22, 0xA2, 0x72, 0x1D, 0xE5, 0x5B, 0x1F, 0x40, 0x37, 0x21, 0x82, 0x63, 0xCD, 0x45, 0x0C, 0x7E, 0x21, 0x76, 0x28, 0x80, 0x2D, 0x67, 0xC3, 0x2B, 0x4A, 0x92, 0x14, 0xFF, 0xB3, 0xD3, 0xEF, 0xB0, 0x98, 0xCF,
+ 0x62, 0xA9, 0x13, 0xE1, 0xFF, 0x20, 0x80, 0xDA, 0x07, 0xDF, 0xEB, 0xFA, 0xF3, 0xB8, 0xD5, 0xA5, 0xD6, 0x33, 0x69, 0x53, 0x70, 0xD8, 0x92, 0x84, 0x1B, 0x1E, 0x9F, 0x87, 0x4E, 0x68, 0x20, 0x4E, 0xAF, 0xA7, 0xB5, 0xC5, 0x87, 0x01, 0xFD, 0x21,
+ 0x97, 0x2F, 0x33, 0x59, 0x0F, 0x83, 0x6A, 0x6A, 0x0E, 0xFC, 0x91, 0x8E, 0x63, 0x8B, 0x82, 0x09, 0x83, 0x1E, 0xE1, 0xA0, 0xC2, 0xD7, 0xF4, 0x8F, 0xD7, 0xEA, 0x7E, 0x56, 0xAD, 0x33, 0xF6, 0x4E, 0x6B, 0x66, 0xCE, 0x28, 0xF1, 0x2F, 0x00, 0xB7,
+ 0xBA, 0x79, 0x88, 0x81, 0x60, 0x9D, 0x9D, 0xAB, 0xD1, 0x5E, 0x47, 0xEF, 0xF6, 0xFE, 0x32, 0xDE, 0x91, 0x0E, 0xF3, 0xB9, 0xA9, 0x91, 0xF8, 0xB2, 0x9A, 0xB3, 0x2A, 0x0E, 0x51, 0x13, 0x76, 0x85, 0x72, 0x1C, 0xA5, 0xCC, 0x82, 0xE6, 0x39, 0x36,
+ 0x86, 0x2E, 0xB0, 0x33, 0x76, 0xA2, 0xEB, 0xFB, 0x71, 0xC4, 0x4B, 0xDD, 0x89, 0x80, 0x98, 0xF0, 0x5B, 0x0D, 0x5F, 0xED, 0x66, 0xB0, 0x0B, 0x50, 0x96, 0xE9, 0x7C, 0x7A, 0x83, 0xDE, 0x23, 0xA6, 0x99, 0xF9, 0x18, 0x80, 0x95, 0xBF, 0x03, 0x32,
+ 0xC2, 0x15, 0x8A, 0xC2, 0x15, 0xBC, 0x5B, 0x45, 0x69, 0xD0, 0xBD, 0xCB, 0x35, 0x4C, 0x58, 0x4D, 0x0A, 0x3D, 0x35, 0x2B, 0x32, 0xF6, 0xDB, 0x74, 0x40, 0xDF, 0x13, 0x2C, 0x41, 0x7D, 0x84, 0x03, 0x52, 0x83, 0x86, 0x85, 0xBE, 0xC4, 0xF5, 0xCB,
+ 0x45, 0x8F, 0xFD, 0x2A, 0x1C, 0xB2, 0x8F, 0xD3, 0x13, 0x00, 0xFB, 0xE9, 0xBD, 0xC0, 0x93, 0x0C, 0x86, 0x7D, 0x56, 0x02, 0x05, 0x7B, 0x41, 0x55, 0x31, 0xB7, 0xED, 0xBD, 0x2F, 0x07, 0x99, 0xF6, 0x00, 0xF2, 0xC7, 0x18, 0xD9, 0x43, 0x88, 0x4E,
+ 0xA8, 0x7F, 0x20, 0x9E, 0xF3, 0x14, 0xD8, 0x0D, 0xB3, 0xBE, 0x3B, 0x31, 0xF8, 0x97, 0xD6, 0x4D, 0xF2, 0x41, 0xB1, 0x61, 0x05, 0x08, 0x2E, 0x91, 0xB7, 0x81, 0x91, 0xC4, 0xBF, 0xD8, 0x24, 0x8A, 0x59, 0xA7, 0xAD, 0x32, 0xBE, 0x79, 0x0E, 0xF4,
+ 0xF4, 0x67, 0x11, 0xB0, 0x71, 0x48, 0xBE, 0x1E, 0x7F, 0xD3, 0x90, 0x14, 0x14, 0x2D, 0xCE, 0x73, 0xDE, 0x5D, 0x4B, 0x4B, 0xB9, 0x45, 0x7B, 0x92, 0xBB, 0x14, 0x73, 0xE1, 0xDF, 0xCB, 0x1A, 0x19, 0x1B, 0xF7, 0x45, 0xC6, 0xEB, 0x9B, 0x4D, 0x17,
+ 0x87, 0xE9, 0x4D, 0xFA, 0xF6, 0xC1, 0xCE, 0x17, 0x2B, 0xB4, 0xAC, 0x76, 0xF7, 0xB5, 0x37, 0xB5, 0x1A, 0x08, 0x37, 0x6D, 0xF6, 0x70, 0xC6, 0xAC, 0x7F, 0x72, 0x86, 0x09, 0x47, 0x24, 0x77, 0xB8, 0x7B, 0x39, 0xA1, 0x31, 0x44, 0x2E, 0x2B, 0x8B,
+ 0x8D, 0x78, 0xB7, 0xE8, 0x38, 0x57, 0x22, 0xF4, 0xB1, 0x5C, 0x24, 0x15, 0x6C, 0xE3, 0xE5, 0x04, 0xC0, 0x32, 0xB5, 0x9D, 0x8F, 0x2D, 0xE9, 0x12, 0xD3, 0x43, 0x3E, 0xB8, 0xE9, 0xB0, 0x9D, 0x1C, 0x71, 0xE4, 0x40, 0x54, 0x78, 0x30, 0x2C, 0xB4,
+ 0xA8, 0xE1, 0x25, 0x3C, 0xD7, 0x9B, 0x55, 0xEA, 0xF1, 0x60, 0x42, 0x5D, 0x2E, 0xD3, 0x1F, 0x97, 0x7B, 0xCA, 0x08, 0xCB, 0x29, 0xF3, 0x60, 0x9E, 0x26, 0xE5, 0x79, 0x51, 0x99, 0xE4, 0x98, 0xD9, 0x60, 0x45, 0x25, 0x09, 0x73, 0x45, 0xC9, 0x1D,
+ 0xF5, 0x15, 0x04, 0x89, 0x2B, 0x52, 0x2F, 0x00, 0xB2, 0xE2, 0x59, 0x80, 0xB6, 0x79, 0x22, 0xB3, 0x50, 0x90, 0xAC, 0x3C, 0xD2, 0x7E, 0xBE, 0x08, 0xE4, 0x6C, 0x9F, 0x1A, 0x25, 0x64, 0x04, 0x69, 0x6F, 0xE4, 0x58, 0xD3, 0x1D, 0x50, 0xEB, 0x86,
+ 0x5D, 0x64, 0x5F, 0x54, 0xB2, 0xDD, 0x1D, 0x5A, 0x0C, 0x9B, 0x1C, 0x61, 0x89, 0x09, 0x57, 0x22, 0x4E, 0x64, 0xB3, 0xFD, 0x70, 0xCF, 0x32, 0x82, 0x87, 0xF8, 0x4A, 0xFE, 0x27, 0x61, 0xC8, 0x9E, 0x23, 0x5A, 0x98, 0x92, 0xB3, 0xE6, 0xBF, 0xF0,
+ 0xD3, 0x57, 0x8A, 0x97, 0x1C, 0x0E, 0x4E, 0xCE, 0x70, 0x27, 0x4E, 0x6A, 0x45, 0x6F, 0x03, 0xAB, 0x37, 0x74, 0x8D, 0x1D, 0x80, 0x5F, 0xBD, 0xA2, 0xAB, 0x30, 0xE2, 0x9D, 0xCF, 0xC1, 0xC0, 0xC2, 0x70, 0x6F, 0x84, 0x32, 0x28, 0x6D, 0x8B, 0xDC,
+ 0x0C, 0xC5, 0xF1, 0x60, 0x2F, 0x06, 0x5F, 0xFB, 0x6F, 0x72, 0x0E, 0xD4, 0xEB, 0xD2, 0x11, 0x71, 0x54, 0xD1, 0x4F, 0xE9, 0x84, 0xB3, 0x63, 0x3E, 0x34, 0x40, 0x25, 0x47, 0x8E, 0x51, 0x2B, 0x7F, 0xE3, 0x7D, 0xEF, 0xB8, 0x00, 0xE8, 0x86, 0xEE,
+ 0x48, 0xEA, 0xF7, 0x63, 0x55, 0x8E, 0x24, 0x10, 0x04, 0x07, 0xF4, 0xDD, 0x41, 0xCD, 0xFB, 0x27, 0x5B, 0x15, 0xB4, 0x4D, 0xCD, 0xF0, 0x19, 0xDB, 0xCE, 0x37, 0x68, 0x22, 0x88, 0x6F, 0xFD, 0x3B, 0xA1, 0x01, 0xF9, 0x33, 0xE1, 0xAE, 0x1E, 0x81,
+ 0x3F, 0x1D, 0xFF, 0x95, 0x6C, 0x94, 0x77, 0xB5, 0xAE, 0xD3, 0x5E, 0x66, 0xE1, 0x9F, 0xE5, 0xBB, 0x2C, 0xF2, 0x15, 0xAE, 0x38, 0xED, 0x34, 0xB2, 0x11, 0x50, 0xF6, 0x60, 0xC1, 0xDC, 0x12, 0xCF, 0xD1, 0x88, 0xF4, 0x8A, 0x9F, 0xA0, 0x0B, 0xD7,
+ 0x19, 0x53, 0xEA, 0x18, 0x12, 0xCF, 0x42, 0xEA, 0x4A, 0x10, 0x21, 0xC8, 0xD3, 0x8F, 0xB5, 0x11, 0x3D, 0xFF, 0x83, 0x64, 0xC5, 0xE7, 0xA0, 0xBD, 0x2A, 0x94, 0xAF, 0x43, 0x4C, 0x13, 0x0C, 0x02, 0xCD, 0x0B, 0xBE, 0xA4, 0x8F, 0xBE, 0xD1, 0x83,
+ 0x72, 0x50, 0x8A, 0x3B, 0x94, 0x90, 0x08, 0xEA, 0x51, 0x27, 0xEF, 0x87, 0x2B, 0x5A, 0x6A, 0x7E, 0x4D, 0x86, 0xE9, 0x93, 0xC4, 0xD6, 0xDD, 0x5D, 0x24, 0xD0, 0x13, 0x78, 0x08, 0x4B, 0x43, 0xC5, 0x0B, 0xFF, 0x96, 0x38, 0x54, 0xFA, 0xD3, 0x21,
+ 0x09, 0x54, 0x61, 0xB7, 0xE5, 0x31, 0xD6, 0xF9, 0x83, 0x52, 0x4F, 0x4A, 0xF2, 0xE5, 0x80, 0x12, 0x6F, 0x18, 0x64, 0x5F, 0xAB, 0xFE, 0x2C, 0x91, 0x2E, 0x02, 0xCB, 0x20, 0x43, 0x37, 0xBA, 0xB8, 0x5F, 0x25, 0x83, 0xD3, 0x1E, 0xAE, 0x7E, 0x2D,
+ 0x1D, 0x6B, 0xB7, 0x40, 0xCD, 0x65, 0xD0, 0x6E, 0xC9, 0xD2, 0x7B, 0xCC, 0x09, 0xF8, 0x5E, 0x42, 0x21, 0x6E, 0x43, 0xA2, 0x29, 0x9F, 0x40, 0x89, 0xA7, 0x49, 0x20, 0x78, 0xE0, 0x19, 0x33, 0xA5, 0xC9, 0x3D, 0x4B, 0x14, 0x47, 0x1A, 0xC6, 0xF7,
+ 0x41, 0xEE, 0x4C, 0x2E, 0xEF, 0x4E, 0x85, 0xA9, 0x7D, 0x1E, 0x6A, 0x1D, 0x29, 0xBF, 0xC8, 0x7C, 0x44, 0x25, 0xAC, 0xDC, 0xDD, 0x34, 0xAF, 0x29, 0x6E, 0xF7, 0x54, 0xCB, 0x00, 0xD4, 0x8B, 0x3F, 0x62, 0x43, 0x72, 0x56, 0x74, 0x49, 0x95, 0x21,
+ 0x14, 0x0D, 0xDC, 0xD3, 0xA5, 0x69, 0x27, 0x4D, 0x89, 0x7C, 0x7A, 0xE6, 0x51, 0x5F, 0xFD, 0xD9, 0x6D, 0xE9, 0xFE, 0x1B, 0xA6, 0xBD, 0x86, 0x06, 0xAB, 0x36, 0xD8, 0x33, 0xA6, 0x56, 0x1B, 0x29, 0x07, 0x85, 0xE4, 0xA0, 0x40, 0xF5, 0x9D, 0xE4,
+ 0x8B, 0xBE, 0x15, 0x50, 0x75, 0xCB, 0x57, 0x70, 0x55, 0x95, 0x84, 0x5C, 0x5E, 0x83, 0xCF, 0x5B, 0x98, 0xE3, 0x09, 0x8B, 0x10, 0xB0, 0xB5, 0x72, 0x5D, 0xDB, 0x40, 0x88, 0x1D, 0xAE, 0xDB, 0xF2, 0x7A, 0xE1, 0xEC, 0xAE, 0xD7, 0x69, 0xF3, 0x43,
+ 0xB7, 0xC6, 0x65, 0x66, 0x0A, 0xB2, 0x50, 0x14, 0x30, 0x17, 0xE0, 0x60, 0x1E, 0xAA, 0x7E, 0x93, 0xE0, 0x1F, 0x31, 0x5C, 0xCC, 0x60, 0x1E, 0x40, 0xEA, 0x86, 0xF7, 0x6F, 0xB8, 0x57, 0x95, 0xFA, 0xA5, 0x9C, 0x5D, 0x0E, 0x6A, 0x10, 0xF4, 0x8B,
+ 0xDC, 0x00, 0x40, 0xD1, 0x8A, 0x64, 0xB6, 0xA5, 0xB1, 0x12, 0x90, 0x8C, 0x25, 0x3E, 0xC5, 0x13, 0xAE, 0x44, 0x0B, 0x88, 0x93, 0xBF, 0x5D, 0x5F, 0x91, 0x5E, 0x51, 0x0D, 0x82, 0xED, 0xB2, 0xC5, 0x00, 0x4A, 0xD5, 0x71, 0x00, 0xAF, 0x11, 0x28,
+ 0x74, 0xC3, 0x31, 0x08, 0xEC, 0xD5, 0xCE, 0xF6, 0x90, 0x4E, 0xB4, 0x38, 0x8F, 0x5F, 0x40, 0x4F, 0x24, 0xB2, 0xBA, 0x71, 0x63, 0x92, 0x05, 0x3F, 0xF4, 0x71, 0xCA, 0x5B, 0x0C, 0xDF, 0xDB, 0xBB, 0xCC, 0x9A, 0x3F, 0xD3, 0x98, 0x41, 0x2C, 0xA7,
+ 0xB2, 0x52, 0x5E, 0x3E, 0x6D, 0x18, 0x23, 0x3A, 0xB0, 0x94, 0xC7, 0xBD, 0x8C, 0x05, 0xA2, 0xEC, 0xA4, 0xEF, 0xAE, 0x3C, 0x82, 0x61, 0xE7, 0x63, 0x18, 0xA4, 0x10, 0xE4, 0xEA, 0xAC, 0x1F, 0x83, 0x77, 0x68, 0x53, 0xFC, 0x17, 0x5F, 0xC0, 0xBB,
+ 0xFF, 0x4A, 0xC0, 0x45, 0x5A, 0x45, 0xF9, 0x77, 0x73, 0x8A, 0xA8, 0xDB, 0xE8, 0x10, 0xDA, 0xC4, 0xF8, 0xBE, 0xDF, 0x4A, 0x84, 0xB7, 0xF9, 0xC4, 0x57, 0x07, 0x5D, 0x7F, 0xE8, 0x6F, 0x88, 0x68, 0x9C, 0x76, 0x64, 0x16, 0xE4, 0x11, 0x8D, 0x79,
+ 0x7B, 0x48, 0x27, 0x6E, 0xC5, 0x60, 0xFE, 0xCB, 0x6E, 0x52, 0xF8, 0x50, 0x48, 0x21, 0x90, 0xF0, 0x33, 0x80, 0x9E, 0x1D, 0x85, 0xAD, 0x1C, 0x91, 0x3D, 0x8B, 0xF3, 0xF7, 0x6F, 0x14, 0x6F, 0xD7, 0xE9, 0x27, 0x46, 0x63, 0xCA, 0xFB, 0x5C, 0x0E,
+ 0x79, 0x33, 0x1C, 0x4D, 0xBA, 0xFE, 0x46, 0xB1, 0x5E, 0xCE, 0x80, 0x9B, 0x6C, 0xD0, 0xAE, 0x4A, 0x6F, 0xA1, 0x8A, 0x4A, 0x60, 0x07, 0x5B, 0xE9, 0x1E, 0x1B, 0xE0, 0xFC, 0x57, 0x5B, 0x9F, 0xA2, 0xF0, 0x37, 0xA0, 0x43, 0x1E, 0x92, 0xD9, 0xE5,
+ 0x74, 0x91, 0x11, 0x8E, 0xB4, 0x1B, 0x9C, 0xC7, 0x98, 0x80, 0xF7, 0x11, 0x1C, 0xCB, 0xC2, 0x72, 0xDC, 0x8E, 0x2E, 0xE2, 0x86, 0xB1, 0x51, 0x19, 0xBF, 0x02, 0x93, 0xF5, 0x44, 0xD8, 0x80, 0x63, 0xAB, 0x86, 0xA5, 0x0A, 0x4D, 0x71, 0x67, 0x5F,
+ 0x60, 0x35, 0x3A, 0x13, 0xC0, 0xFB, 0x4B, 0x23, 0x73, 0x44, 0x93, 0x4A, 0xA3, 0x2E, 0xA0, 0xC6, 0xC9, 0x27, 0xDB, 0x13, 0x60, 0x48, 0xEF, 0x6D, 0x1C, 0x1B, 0x94, 0x06, 0x3D, 0x65, 0x1F, 0x72, 0x98, 0x47, 0xBA, 0x8D, 0x8A, 0x5A, 0xF4, 0xED,
+ 0xC0, 0x99, 0x29, 0xED, 0x0A, 0xF5, 0x76, 0x95, 0x38, 0xF7, 0x6C, 0xE2, 0xBC, 0x82, 0xF8, 0xAF, 0x67, 0x1D, 0xA0, 0x84, 0x62, 0x65, 0xE4, 0xD9, 0x29, 0xAB, 0x5F, 0x07, 0x16, 0x1F, 0x2F, 0x31, 0x49, 0xE6, 0x39, 0x69, 0x39, 0x9D, 0x1C, 0xD5,
+ 0x01, 0xEA, 0x91, 0x51, 0x92, 0xB5, 0x06, 0xFA, 0x0F, 0xE6, 0xB5, 0xF4, 0x6E, 0x8C, 0xD8, 0xEE, 0xC0, 0x60, 0xC8, 0x9F, 0x53, 0x2F, 0xEB, 0x97, 0xA4, 0xED, 0xDA, 0xFF, 0x2B, 0xE0, 0x58, 0x61, 0xCC, 0x8A, 0x56, 0xD0, 0xE0, 0x37, 0xA6, 0xFE,
+ 0x29, 0x22, 0xE4, 0xDB, 0x67, 0x64, 0x0F, 0x36, 0xC3, 0x61, 0x52, 0x73, 0x0B, 0x67, 0x03, 0xA0, 0x8B, 0xE9, 0x35, 0x14, 0x5C, 0x8E, 0x25, 0xB4, 0xE5, 0x02, 0x70, 0x71, 0xEF, 0x05, 0x5C, 0xCB, 0x58, 0xF0, 0x2B, 0x72, 0x02, 0xD9, 0xB2, 0x0A,
+ 0x88, 0xE4, 0x96, 0x10, 0x19, 0xD9, 0x40, 0x9C, 0x06, 0x3E, 0x01, 0xE1, 0xE2, 0xF9, 0x23, 0x8C, 0xFE, 0x35, 0x9B, 0x2B, 0xF1, 0xA5, 0x18, 0x94, 0x0A, 0xB8, 0xC7, 0xCD, 0xD6, 0xD7, 0x1F, 0x5F, 0x13, 0x29, 0x92, 0x2B, 0x9F, 0xE7, 0x11, 0x72,
+ 0x8E, 0xC4, 0x45, 0xFF, 0x23, 0xA6, 0xE9, 0x4D, 0x2D, 0xC3, 0x83, 0xCC, 0x5B, 0xC4, 0x12, 0x6F, 0x01, 0x61, 0x15, 0x26, 0xC7, 0x61, 0xA8, 0x3F, 0x64, 0x02, 0x71, 0xF3, 0x30, 0x50, 0x23, 0x41, 0x20, 0xDB, 0xFD, 0xFA, 0xD3, 0x30, 0xBE, 0x29,
+ 0xA1, 0x4F, 0x29, 0x3B, 0xDE, 0x44, 0x20, 0xE0, 0x8A, 0xA9, 0x7A, 0x44, 0x7D, 0xE2, 0x84, 0xBA, 0x67, 0x4A, 0xFB, 0xF1, 0xCE, 0xBB, 0x2A, 0xBE, 0xF3, 0xA7, 0x2C, 0xAB, 0x48, 0xF3, 0x13, 0xB1, 0x66, 0x1A, 0x41, 0x3B, 0x28, 0x97, 0x12, 0x56,
+ 0xE4, 0x04, 0x01, 0xFB, 0x6C, 0xCC, 0x66, 0xD1, 0xE1, 0xC4, 0x2C, 0x0C, 0xE7, 0xFA, 0x8F, 0xE6, 0x43, 0xC2, 0x03, 0x0D, 0xEC, 0xE8, 0xEA, 0x1F, 0xA4, 0x14, 0xEE, 0x29, 0x27, 0xFB, 0x5F, 0xF9, 0x0C, 0xF5, 0xC5, 0xD7, 0x41, 0x88, 0x33, 0x4C,
+ 0xB5, 0x1A, 0xD1, 0xB1, 0xEA, 0xF9, 0xB3, 0x94, 0xD0, 0x92, 0xA0, 0x53, 0xE6, 0x53, 0x42, 0x7E, 0x0C, 0x79, 0xD4, 0x9A, 0x7D, 0xA8, 0x37, 0x4C, 0xC3, 0x6D, 0xC4, 0xFC, 0x93, 0x2D, 0xA5, 0x1C, 0x34, 0x47, 0x98, 0x96, 0x3E, 0x05, 0x7F, 0xD6,
+ 0x28, 0x19, 0x2A, 0xF3, 0x77, 0x5F, 0x6C, 0x2E, 0xE0, 0x8B, 0x17, 0x94, 0xC9, 0xCA, 0xDE, 0x3C, 0x51, 0xA9, 0x3D, 0xC5, 0x18, 0x5E, 0x86, 0x39, 0xEF, 0x9C, 0x67, 0x62, 0x96, 0x54, 0xFC, 0x1F, 0xBC, 0xFF, 0xF7, 0xBE, 0x22, 0x57, 0x0C, 0x73,
+ 0xD8, 0x4D, 0xBE, 0xB3, 0xD2, 0x65, 0x7F, 0x84, 0x09, 0x37, 0x3F, 0x98, 0x19, 0xD3, 0x28, 0x10, 0xE9, 0xAA, 0x4A, 0xA5, 0x40, 0x3F, 0x4A, 0x12, 0x41, 0xC4, 0x41, 0xC8, 0xEC, 0x6F, 0x7C, 0x58, 0x9D, 0xB5, 0xDB, 0x09, 0x52, 0xCD, 0x45, 0x47,
+ 0x1D, 0x6C, 0x97, 0x43, 0xE8, 0xAF, 0x0D, 0x99, 0xCC, 0x4F, 0x50, 0x0C, 0x6C, 0xD5, 0xA1, 0x73, 0xD5, 0x59, 0x0F, 0x4D, 0xDC, 0xC8, 0x3F, 0xA6, 0x85, 0x05, 0x65, 0x0C, 0x77, 0x76, 0x30, 0xAB, 0xFC, 0xD8, 0x16, 0xC3, 0xFC, 0x58, 0x6C, 0x6F,
+ 0x44, 0xF7, 0x2F, 0xCE, 0x69, 0x98, 0xAA, 0x94, 0x02, 0x80, 0x95, 0x29, 0x13, 0xC6, 0x3D, 0x34, 0x8C, 0xE7, 0x05, 0xC8, 0xBA, 0x17, 0x33, 0xC4, 0x18, 0x4E, 0x13, 0xC4, 0xD5, 0x86, 0xFD, 0x21, 0xB5, 0x65, 0x36, 0xE0, 0x47, 0xFF, 0xD5, 0x10,
+ 0x0D, 0xC4, 0x0E, 0x92, 0x2A, 0xA5, 0x14, 0xC7, 0x76, 0x65, 0x48, 0xBA, 0xFD, 0x67, 0xBD, 0xD7, 0x24, 0xDE, 0x02, 0x70, 0x31, 0x19, 0x64, 0xF0, 0xE2, 0x91, 0x95, 0xAA, 0x0C, 0x21, 0x96, 0x0C, 0x9A, 0xF1, 0xDE, 0x13, 0x46, 0xFF, 0xE4, 0x66,
+ 0x77, 0xC3, 0x8D, 0xDF, 0xCF, 0xE3, 0x03, 0x5D, 0xB5, 0x3B, 0xAF, 0x52, 0x40, 0x12, 0x62, 0xC8, 0xF6, 0x3C, 0xF1, 0xDA, 0x94, 0x62, 0xF4, 0x38, 0x44, 0x23, 0x82, 0x37, 0x4B, 0x21, 0x1E, 0xB5, 0xE4, 0x02, 0x71, 0x81, 0x66, 0x5E, 0x3B, 0xC2,
+ 0x9D, 0x64, 0xA1, 0xBF, 0xAF, 0x00, 0x92, 0x7B, 0xD2, 0x15, 0xBC, 0x80, 0x10, 0x3C, 0x73, 0x89, 0xAC, 0xB7, 0xFE, 0x5F, 0xE6, 0xB5, 0x21, 0x6B, 0x5B, 0x48, 0xCE, 0xB8, 0xE8, 0x9B, 0x8B, 0xCE, 0x75, 0x07, 0x9B, 0x57, 0x96, 0xC0, 0xC9, 0x12,
+ 0xBC, 0xC0, 0x97, 0x22, 0x88, 0x3D, 0xF3, 0x08, 0xD7, 0xD7, 0x81, 0xCE, 0x6B, 0x0A, 0xE8, 0x67, 0x29, 0xC0, 0xF3, 0x8C, 0x85, 0x90, 0x1F, 0x75, 0x4B, 0x31, 0xB8, 0x22, 0xAB, 0x94, 0x74, 0x61, 0x6E, 0x4B, 0x59, 0x2C, 0x60, 0x68, 0x15, 0x9F,
+ 0x65, 0x9D, 0xC2, 0x71, 0xC3, 0xAB, 0x48, 0x7C, 0xA1, 0x99, 0xAA, 0x9E, 0x02, 0x24, 0xE4, 0xA5, 0xAD, 0x91, 0x07, 0xF5, 0x65, 0x48, 0x37, 0x70, 0x69, 0x82, 0x2F, 0xA7, 0xB9, 0xA7, 0xCF, 0x6F, 0xCD, 0x8E, 0x14, 0xE8, 0x05, 0x97, 0xD6, 0xBD,
+ 0x59, 0x98, 0xA8, 0xAC, 0x9D, 0x2C, 0xEA, 0x57, 0xA8, 0x4D, 0x1B, 0x70, 0x63, 0xE4, 0xDD, 0x11, 0x0C, 0xC0, 0xB5, 0xCF, 0x62, 0xE2, 0x99, 0x08, 0xBC, 0x73, 0x37, 0xC6, 0xB2, 0xCE, 0x89, 0x03, 0xF5, 0x6C, 0xAF, 0x51, 0x6D, 0xC2, 0x49, 0xEF,
+ 0x52, 0xB0, 0x40, 0xC6, 0x54, 0x3E, 0x80, 0x76, 0xE6, 0xE2, 0xD7, 0x85, 0x3C, 0x41, 0x77, 0xED, 0x98, 0x5D, 0x7E, 0x0F, 0x78, 0xAD, 0x5C, 0xFB, 0xC1, 0xE7, 0x0C, 0xF7, 0x6F, 0x57, 0xEC, 0xB8, 0xE1, 0x53, 0xA3, 0x74, 0x74, 0x64, 0x09, 0xC5,
+ 0xA4, 0x16, 0x3D, 0x9A, 0x79, 0xC3, 0xC1, 0xEB, 0x71, 0x5D, 0x7A, 0xC7, 0x63, 0x5E, 0x58, 0x68, 0x9D, 0x24, 0x28, 0xCA, 0xD0, 0xCB, 0x91, 0x42, 0xDC, 0x96, 0xD3, 0x32, 0xBB, 0xA1, 0xF0, 0xDC, 0x79, 0x44, 0x99, 0x21, 0x54, 0x7A, 0xB0, 0xCB,
+ 0x6D, 0xE5, 0x79, 0xF4, 0x56, 0x59, 0x89, 0x56, 0x17, 0xC3, 0x1A, 0xBF, 0xD3, 0x73, 0xD0, 0x57, 0x18, 0x41, 0xA7, 0x56, 0x32, 0x0F, 0xE0, 0xA4, 0xB8, 0x9A, 0xE9, 0xC4, 0x05, 0x15, 0x76, 0x17, 0x4E, 0x58, 0x3A, 0x5F, 0x31, 0x8B, 0x7F, 0x5A,
+ 0x17, 0x21, 0xFD, 0xC8, 0xD2, 0x6B, 0xB8, 0x71, 0x2C, 0xEE, 0xF0, 0x12, 0x85, 0x1C, 0x7C, 0x94, 0xAA, 0x02, 0xED, 0xAD, 0xE2, 0xEB, 0x72, 0x1B, 0x41, 0xCE, 0x6A, 0xEA, 0x96, 0xC7, 0x7A, 0x4C, 0x29, 0x15, 0xBD, 0xD3, 0x3D, 0xC4, 0x5C, 0x73,
+ 0xB9, 0xFB, 0xA3, 0xF7, 0xFB, 0x9C, 0x10, 0x35, 0x68, 0x80, 0xB7, 0x9B, 0x78, 0x4F, 0x68, 0x8C, 0x1E, 0xF2, 0x83, 0x46, 0xDA, 0x93, 0xDC, 0xD2, 0x6B, 0x9C, 0xDF, 0xC6, 0xD7, 0x26, 0x05, 0x4E, 0x5B, 0x41, 0xF9, 0x97, 0xCB, 0xA4, 0xBA, 0x71,
+ 0xB8, 0xFC, 0x99, 0x36, 0xFD, 0xE2, 0x07, 0x97, 0xF4, 0xE3, 0x61, 0x9B, 0xE9, 0x58, 0x1B, 0x15, 0x0A, 0x6C, 0xA1, 0x6F, 0x7C, 0xF0, 0xA4, 0x20, 0x5A, 0x75, 0xB0, 0xF2, 0xF4, 0xD3, 0xC0, 0x3A, 0x15, 0x6C, 0xE7, 0x79, 0x23, 0xA8, 0x17, 0xC8,
+ 0x17, 0x46, 0x51, 0x88, 0x23, 0x71, 0x77, 0xB4, 0x51, 0xF9, 0x8A, 0xC7, 0x2A, 0x3D, 0x59, 0x67, 0x2F, 0xEC, 0x84, 0x09, 0x32, 0xFC, 0x81, 0x0B, 0xBE, 0x2E, 0xF4, 0xEC, 0x65, 0x16, 0x84, 0x30, 0xB0, 0xAA, 0xD1, 0x74, 0xB3, 0xCA, 0xB6, 0xDA,
+ 0x8E, 0x3C, 0x6A, 0x4A, 0xE3, 0x77, 0xE0, 0x61, 0x6A, 0xB3, 0x73, 0x71, 0x55, 0xAE, 0x1D, 0x71, 0x98, 0xDF, 0x60, 0x41, 0xEF, 0x3B, 0x16, 0xFF, 0xCB, 0xFE, 0x5D, 0xF7, 0xFB, 0x27, 0x69, 0xA1, 0xCA, 0x6E, 0xA7, 0xAB, 0x34, 0xF5, 0x20, 0x8A,
+ 0xFC, 0x6A, 0xA5, 0x16, 0x22, 0x04, 0x81, 0xF2, 0x47, 0xC9, 0xB8, 0xBF, 0xB8, 0xD3, 0x82, 0xE6, 0xA5, 0x78, 0x3F, 0x8D, 0xF7, 0xF9, 0x8E, 0x67, 0x74, 0x71, 0x78, 0xFE, 0x73, 0x4D, 0xA6, 0x2F, 0xAA, 0x1B, 0xB7, 0xEB, 0x4D, 0x97, 0xE4, 0xE7,
+ 0xC5, 0xDB, 0x5B, 0xF0, 0x88, 0x70, 0x2B, 0x4C, 0xEB, 0xF6, 0x27, 0x1E, 0x6C, 0x3B, 0x27, 0x01, 0x6C, 0x4F, 0x3E, 0xC0, 0x0F, 0x7D, 0x0D, 0x9F, 0x8D, 0x3F, 0xED, 0x2A, 0xA1, 0x45, 0xE9, 0xDE, 0xF2, 0xD9, 0xF8, 0x91, 0xA1, 0x6E, 0x09, 0x37,
+ 0xBC, 0x47, 0x8C, 0x63, 0x79, 0x31, 0x87, 0x9C, 0x2A, 0x9E, 0xF5, 0x86, 0x91, 0x72, 0x90, 0x1D, 0x93, 0xBC, 0x53, 0x59, 0x7D, 0x42, 0x82, 0xB8, 0x67, 0xE0, 0xC2, 0x9E, 0x14, 0xF0, 0x8E, 0xB3, 0xC1, 0x31, 0x3A, 0xCB, 0x56, 0x0A, 0xF9, 0xE4,
+ 0xEE, 0xE8, 0x36, 0x7A, 0x27, 0xB5, 0x42, 0x44, 0x9D, 0xA1, 0xD2, 0xB4, 0x08, 0xCB, 0x9C, 0x9B, 0xEE, 0x1B, 0x89, 0xA3, 0x23, 0xD4, 0x8E, 0x60, 0xAB, 0xA6, 0x8D, 0x86, 0x39, 0xDF, 0x1E, 0x98, 0x0B, 0x53, 0xBD, 0x6C, 0x24, 0x05, 0x82, 0x76,
+ 0xB2, 0x81, 0x16, 0xB2, 0x76, 0x1E, 0x6C, 0xDA, 0x65, 0x0A, 0x1A, 0xE2, 0x75, 0x83, 0xCF, 0x38, 0x81, 0x02, 0x04, 0xB4, 0x4F, 0x6C, 0xD3, 0xE5, 0xEA, 0x05, 0x5E, 0x0D, 0x8E, 0x90, 0xE6, 0x30, 0x50, 0x2F, 0x6E, 0x29, 0x0A, 0xA6, 0x10, 0x1E,
+ 0x35, 0x37, 0x71, 0xB6, 0x84, 0x98, 0x8A, 0xCE, 0x8C, 0x11, 0x6C, 0xF9, 0x9C, 0x47, 0x50, 0x8A, 0xC6, 0xBF, 0x13, 0x04, 0x5A, 0x57, 0xE8, 0x8B, 0x8E, 0x54, 0xDD, 0x69, 0x2C, 0x01, 0x5C, 0x5D, 0x77, 0xD5, 0xD9, 0x90, 0x65, 0x3E, 0x22, 0x21,
+ 0x00, 0x91, 0x62, 0x8E, 0xE6, 0x3A, 0xC9, 0x01, 0xF2, 0xA0, 0x61, 0xAE, 0x57, 0x5A, 0x90, 0x38, 0x86, 0x01, 0x94, 0x93, 0xEB, 0xAF, 0x4D, 0x7E, 0x62, 0x2A, 0x2A, 0xC5, 0x2B, 0x99, 0xF9, 0x2B, 0x3C, 0x86, 0x7B, 0x3D, 0xE9, 0x71, 0x79, 0x62,
+ 0xD6, 0xA0, 0xD3, 0x58, 0x24, 0x37, 0xFA, 0x1E, 0x01, 0xB6, 0x36, 0x66, 0xE4, 0x97, 0xF3, 0x15, 0xFA, 0xD9, 0x89, 0x41, 0xDF, 0x9C, 0xCB, 0x24, 0xF9, 0x72, 0xC0, 0xBD, 0x7D, 0x9E, 0x4B, 0x6D, 0x43, 0x93, 0x10, 0xE8, 0x14, 0xAA, 0x7B, 0x9A,
+ 0x5C, 0xF6, 0xD5, 0x7E, 0x35, 0x9D, 0x3C, 0xF4, 0x6F, 0x5B, 0x7A, 0x70, 0xC8, 0x82, 0xD1, 0xDE, 0xC1, 0x26, 0x57, 0x59, 0x21, 0x14, 0x09, 0x2C, 0x61, 0x4A, 0xD1, 0x22, 0x40, 0xED, 0xF0, 0x78, 0xBC, 0x63, 0x87, 0xDE, 0xEA, 0x9C, 0x3C, 0x99,
+ 0x99, 0x4B, 0xA0, 0xAC, 0x5B, 0xA8, 0x31, 0xC9, 0x29, 0xB2, 0xF4, 0x87, 0x04, 0x8F, 0x60, 0x0C, 0x07, 0x92, 0x0F, 0x4F, 0x42, 0xFB, 0x6B, 0x53, 0x75, 0x16, 0x95, 0x37, 0x64, 0x63, 0x34, 0x6E, 0xB0, 0xEE, 0x0F, 0x85, 0x6A, 0x80, 0xF4, 0x09,
+ 0xD5, 0x9D, 0x49, 0xD3, 0x3B, 0x59, 0x50, 0x86, 0xF0, 0xCF, 0x8F, 0xFB, 0x11, 0xA2, 0x7C, 0xDC, 0x49, 0x4D, 0xB1, 0xE4, 0x26, 0x40, 0x0D, 0x56, 0x55, 0x7D, 0x06, 0x3F, 0x3F, 0x09, 0x92, 0x40, 0x50, 0xDB, 0x7F, 0xAC, 0x70, 0x09, 0x38, 0x7A,
+ 0x44, 0xA5, 0xB4, 0xE3, 0x19, 0xC4, 0xCF, 0x8A, 0xFD, 0x62, 0x9C, 0xD9, 0xDB, 0xB0, 0xD1, 0x18, 0x61, 0x21, 0x7D, 0x24, 0x30, 0x0C, 0x85, 0x83, 0x5A, 0xE9, 0xD9, 0xD6, 0x02, 0xF3, 0x25, 0x07, 0xB7, 0xF2, 0xE4, 0x08, 0xFD, 0x10, 0xC6, 0x05,
+ 0xED, 0xAA, 0x05, 0x40, 0xFA, 0x26, 0xA0, 0xBD, 0xFC, 0xCE, 0x96, 0x87, 0x77, 0x5C, 0x22, 0x3B, 0x50, 0xED, 0xCE, 0x7E, 0x36, 0xB3, 0xC5, 0x7E, 0xAD, 0x53, 0x0E, 0x2E, 0x65, 0xC9, 0xEC, 0xCA, 0xA5, 0x4F, 0xB9, 0x14, 0x97, 0x72, 0x1A, 0xFD,
+ 0x42, 0xD3, 0x85, 0x6C, 0xDB, 0x7F, 0xD9, 0x5B, 0xAB, 0x0C, 0x9C, 0xF7, 0xD6, 0x85, 0x6F, 0xA7, 0xA1, 0x2E, 0x0A, 0x3E, 0xB5, 0x97, 0x4C, 0x69, 0x3E, 0xD0, 0x1C, 0x72, 0xAF, 0xD6, 0xE9, 0xC8, 0xBE, 0x67, 0x95, 0x5F, 0x10, 0x4B, 0x1B, 0xC7,
+ 0xC9, 0x8A, 0xDD, 0x78, 0x79, 0x9A, 0x58, 0x12, 0x0A, 0xE0, 0x94, 0x9B, 0x34, 0xA6, 0xB7, 0xCE, 0x2F, 0xA6, 0x16, 0xDE, 0xCA, 0xB5, 0xAF, 0x0B, 0xC3, 0xD5, 0x65, 0x95, 0x39, 0xF2, 0x90, 0x1D, 0x6C, 0xC5, 0x83, 0x98, 0xD3, 0x7F, 0x04, 0xE8,
+ 0x19, 0x92, 0x4E, 0xD0, 0xBC, 0x5B, 0x95, 0xF8, 0x56, 0xD2, 0x7B, 0x8D, 0x0B, 0x3F, 0xF2, 0x4C, 0xA5, 0x8F, 0x36, 0x9D, 0x19, 0xD0, 0x55, 0xA1, 0xFD, 0xE1, 0xB4, 0x94, 0x8A, 0x21, 0x05, 0xEE, 0x4B, 0x5C, 0xCE, 0x01, 0x9B, 0xFE, 0xCF, 0x18,
+ 0x34, 0x5C, 0xAA, 0x65, 0xFF, 0xF9, 0x2A, 0x02, 0xDF, 0xEB, 0xA6, 0xC6, 0xD2, 0xA4, 0xF2, 0xF1, 0x06, 0x18, 0x10, 0xBF, 0x79, 0x80, 0x61, 0xED, 0x57, 0x43, 0x65, 0xF4, 0x08, 0x4D, 0x15, 0x6F, 0x3B, 0x65, 0xF3, 0xDE, 0xBB, 0xB2, 0x57, 0xA8,
+ 0x16, 0x7B, 0x6A, 0xE9, 0xA8, 0x3F, 0x66, 0x2E, 0x68, 0xE5, 0xCD, 0x9E, 0xCF, 0xF8, 0x34, 0xE4, 0x12, 0x95, 0x13, 0xF1, 0xFE, 0x87, 0x54, 0x43, 0x0B, 0x2C, 0x1E, 0x52, 0x7B, 0xAB, 0xBB, 0x2A, 0xB1, 0x49, 0x61, 0x00, 0xBC, 0x39, 0xF9, 0x01,
+ 0xA9, 0x30, 0x5E, 0xB7, 0xFC, 0x8B, 0x24, 0xB6, 0x13, 0x96, 0x63, 0x0B, 0x91, 0xD6, 0x1F, 0xA8, 0x06, 0x10, 0x4A, 0xD2, 0xBC, 0x73, 0x10, 0xF2, 0x82, 0xD1, 0xDE, 0x93, 0xD7, 0x36, 0xCC, 0xFA, 0x2D, 0xD3, 0x65, 0x70, 0xC4, 0xB2, 0x81, 0xCA,
+ 0xE9, 0xCC, 0x1D, 0xE3, 0x01, 0xBC, 0x1A, 0x8F, 0x0B, 0x10, 0xB7, 0x19, 0x42, 0xE7, 0x85, 0xBB, 0x87, 0x7F, 0x3B, 0x67, 0x2C, 0x46, 0xFC, 0xF8, 0x28, 0x3D, 0xE3, 0x2C, 0xEA, 0x82, 0xE5, 0xD9, 0xA1, 0xE2, 0xB5, 0xBD, 0x7C, 0x4D, 0xD1, 0x92,
+ 0xC1, 0xE2, 0x55, 0xFA, 0xE6, 0x6A, 0xA9, 0xE0, 0x91, 0x5F, 0xE3, 0x24, 0x13, 0x4F, 0x45, 0x73, 0xDC, 0x7A, 0xC4, 0xCA, 0x19, 0x33, 0xED, 0x75, 0x44, 0x1C, 0x8E, 0xEB, 0x3C, 0x6D, 0xF0, 0x9B, 0xFD, 0xE5, 0x3F, 0x63, 0xEE, 0x99, 0x98, 0x37,
+ 0x54, 0x9F, 0xBE, 0x26, 0xA9, 0xBE, 0x01, 0xDE, 0x3F, 0xF0, 0x22, 0x6F, 0xCC, 0xEC, 0x37, 0x74, 0xA7, 0x9E, 0xAD, 0x79, 0xD7, 0x47, 0xD5, 0x36, 0x29, 0x69, 0x71, 0x53, 0x7C, 0xCE, 0x37, 0xBB, 0x44, 0xDB, 0xBF, 0xEF, 0xDA, 0xCD, 0x9B, 0x65,
+ 0xD6, 0xEA, 0x5E, 0xC2, 0x98, 0x7D, 0x7D, 0x4F, 0x0A, 0x28, 0x84, 0x25, 0xBB, 0xF9, 0x61, 0x9E, 0x74, 0xBF, 0x68, 0xF1, 0x86, 0x30, 0x23, 0x59, 0x44, 0xB3, 0xD8, 0xED, 0xDE, 0xB6, 0xA9, 0xE0, 0x14, 0x39, 0x15, 0xE2, 0x3E, 0x90, 0xFD, 0x81,
+ 0xDE, 0x2D, 0xEF, 0x8F, 0x1C, 0xB1, 0x52, 0xD2, 0xE4, 0x00, 0x70, 0xE4, 0x6C, 0xFD, 0xED, 0x57, 0xCC, 0xE5, 0x3E, 0xF9, 0x1B, 0xEB, 0xB2, 0x72, 0x61, 0xC4, 0x85, 0x45, 0x7D, 0x66, 0xCB, 0xDD, 0xDD, 0xB3, 0xA9, 0xC3, 0xDA, 0xEA, 0x17, 0xCA,
+ 0x18, 0xEB, 0xBA, 0xD3, 0x2D, 0x58, 0xBD, 0xFA, 0x03, 0xE2, 0x05, 0x0E, 0x9A, 0x31, 0x73, 0x1E, 0x87, 0x45, 0x3B, 0x08, 0x5B, 0x80, 0x51, 0x80, 0x41, 0xF0, 0xDF, 0x83, 0xE1, 0x3D, 0xE3, 0xC5, 0x35, 0x2E, 0x35, 0x71, 0x54, 0x89, 0xA8, 0x44,
+ 0x01, 0xCF, 0xB5, 0xC7, 0xCD, 0x29, 0x2A, 0x63, 0xB0, 0x13, 0xD7, 0x56, 0xF8, 0x25, 0xEE, 0x36, 0x0C, 0xDE, 0x65, 0x90, 0xFA, 0x54, 0xFF, 0x55, 0x3B, 0x79, 0x96, 0xCE, 0x0C, 0xB4, 0x88, 0x51, 0xD3, 0xE8, 0xB0, 0x5C, 0x72, 0xB3, 0x42, 0x95,
+ 0x88, 0xE7, 0x04, 0x4C, 0x62, 0x2D, 0xAE, 0x97, 0x41, 0x92, 0x43, 0xA5, 0x69, 0x33, 0xC6, 0x67, 0x1E, 0xE6, 0x12, 0x7C, 0xD7, 0x8E, 0x3E, 0x9D, 0x2C, 0x00, 0x20, 0xEC, 0x56, 0x73, 0x41, 0x97, 0xA1, 0x76, 0x4F, 0x96, 0xBB, 0x07, 0xB2, 0xD7,
+ 0x1D, 0xC1, 0x43, 0x47, 0x4B, 0xC5, 0xD4, 0x7A, 0xFA, 0x19, 0x72, 0x5A, 0x07, 0xF9, 0x6E, 0xC5, 0xC2, 0x86, 0x55, 0xB7, 0x0D, 0x95, 0x95, 0x04, 0xDF, 0x79, 0x69, 0xAA, 0x8F, 0xD3, 0x15, 0x0F, 0xC9, 0xC9, 0xB5, 0xC9, 0xC2, 0x94, 0xBE, 0x77,
+ 0x24, 0x6F, 0x7E, 0xF7, 0xB7, 0x0C, 0xAE, 0x4C, 0xE5, 0xD4, 0x1D, 0x71, 0x0A, 0xD7, 0x42, 0x0D, 0x3F, 0x47, 0x1C, 0xF5, 0x25, 0x2F, 0x34, 0xD5, 0x71, 0x11, 0xAF, 0xB3, 0x66, 0x52, 0x8B, 0xB0, 0xC7, 0xB1, 0x61, 0xEF, 0x7E, 0xD8, 0x06, 0x04,
+ 0xF2, 0x8C, 0x95, 0x59, 0xB3, 0x4E, 0x75, 0x63, 0x66, 0x0F, 0xC1, 0x86, 0x2C, 0x2D, 0xB1, 0x5F, 0x5F, 0x07, 0xCF, 0x38, 0x91, 0x27, 0x8A, 0x63, 0x58, 0xA1, 0x2F, 0x28, 0xD7, 0x0B, 0x1F, 0x3F, 0xCB, 0x13, 0xB8, 0x79, 0xDA, 0xAE, 0xBB, 0x53,
+ 0x14, 0x45, 0x94, 0xCA, 0xEB, 0x18, 0xEA, 0x2F, 0xB6, 0xBF, 0x3D, 0xD1, 0x64, 0x82, 0x22, 0xBE, 0x83, 0x1E, 0xF7, 0x6B, 0x89, 0xD7, 0x69, 0x48, 0x92, 0xA0, 0x02, 0xAB, 0x90, 0xB1, 0x66, 0xA7, 0x82, 0x72, 0x4D, 0x4A, 0x8C, 0x3E, 0xB7, 0xEA,
+ 0xB4, 0x45, 0x71, 0x42, 0x01, 0x9B, 0x76, 0xA3, 0x44, 0x48, 0x4A, 0x9F, 0x6F, 0x23, 0xB2, 0xF8, 0x64, 0x47, 0x94, 0xC4, 0x8A, 0x5A, 0xF9, 0xFE, 0x39, 0x0A, 0x87, 0xC6, 0x2B, 0x1E, 0xE3, 0xF2, 0xE3, 0xAA, 0x8F, 0xF6, 0xE3, 0x75, 0xCE, 0xB9,
+ 0x09, 0xF1, 0x17, 0x96, 0xDC, 0x30, 0x5F, 0xE0, 0xF4, 0x33, 0x47, 0x5B, 0xD9, 0xA0, 0x62, 0x50, 0xDB, 0xAC, 0xEC, 0xBD, 0x70, 0x09, 0xF8, 0xD8, 0x35, 0x1F, 0x6E, 0xB5, 0x56, 0x80, 0xDE, 0x64, 0xF3, 0xED, 0x4C, 0x05, 0xC9, 0xD3, 0xFB, 0xA4,
+ 0xD0, 0xCF, 0x38, 0x46, 0x55, 0x11, 0x34, 0xEC, 0xB3, 0x61, 0xEB, 0x85, 0x5D, 0x93, 0xCE, 0xDA, 0xED, 0x6D, 0xA1, 0x32, 0xF5, 0x03, 0x72, 0x68, 0x5A, 0xC1, 0x35, 0x1C, 0x18, 0xA1, 0xC6, 0x73, 0x45, 0x21, 0xF0, 0x3E, 0xB0, 0xB6, 0x7B, 0x51,
+ 0x25, 0xC3, 0x62, 0xEB, 0xBB, 0xAE, 0x00, 0xE0, 0xE9, 0x99, 0x15, 0x5D, 0xB4, 0x3F, 0x04, 0x2E, 0x03, 0x05, 0x14, 0x96, 0x25, 0x62, 0x76, 0xCB, 0x83, 0xC9, 0x9C, 0xEF, 0x1B, 0x65, 0x54, 0x66, 0x92, 0xB2, 0xCF, 0x32, 0x60, 0xDA, 0x7C, 0x13,
+ 0x70, 0xE0, 0xD6, 0x8E, 0xDD, 0xA5, 0x00, 0xEE, 0x85, 0x9E, 0xC0, 0xC9, 0xC5, 0xE5, 0x00, 0xA1, 0x51, 0x51, 0xCF, 0x1A, 0xCB, 0x9A, 0xA2, 0xDF, 0x42, 0x52, 0x12, 0x7B, 0x5E, 0x4C, 0x33, 0xC1, 0x19, 0xCB, 0x9D, 0xA3, 0x21, 0xBE, 0x33, 0x35,
+ 0x97, 0xDF, 0x3C, 0xA5, 0x43, 0xFF, 0x4F, 0xE7, 0xF1, 0xF4, 0xEA, 0xCC, 0x81, 0x97, 0xD3, 0x54, 0x1A, 0xBB, 0x22, 0x4E, 0xB2, 0x85, 0x22, 0x3A, 0xD9, 0xC0, 0x18, 0x59, 0x2C, 0xA3, 0xC4, 0xDF, 0xD8, 0x9E, 0x8F, 0xB6, 0xF9, 0x64, 0xEE, 0x07,
+ 0xE5, 0x37, 0x8B, 0x4E, 0xAA, 0x1B, 0x4C, 0xB5, 0x55, 0x39, 0xB2, 0xD3, 0xFC, 0x77, 0x80, 0x17, 0x3F, 0x1A, 0x6A, 0xAD, 0xED, 0xAA, 0x5E, 0x6B, 0x34, 0x40, 0x79, 0x29, 0x0D, 0xFF, 0xB8, 0xB6, 0x84, 0xBB, 0xC7, 0x92, 0x1C, 0xA5, 0x9C, 0xA8,
+ 0xC5, 0xEE, 0xD6, 0x06, 0x70, 0x74, 0xC4, 0x45, 0x11, 0x99, 0x8B, 0xA1, 0x8C, 0xB0, 0xE7, 0x5F, 0x0F, 0x16, 0x24, 0xB3, 0xFB, 0x1B, 0x1B, 0x78, 0x38, 0xF4, 0x6C, 0x44, 0x87, 0xCE, 0x97, 0x63, 0x38, 0xDB, 0x26, 0x31, 0xD6, 0x56, 0x5D, 0x8F,
+ 0x66, 0x1B, 0x45, 0x8B, 0x55, 0xE3, 0x47, 0x10, 0xDD, 0xAA, 0xFE, 0x4E, 0x56, 0x58, 0xBE, 0x0E, 0xBF, 0x4C, 0x3A, 0xB4, 0x76, 0xB2, 0x13, 0xFC, 0x27, 0xF4, 0x09, 0xF1, 0x96, 0xE3, 0xF1, 0x81, 0x21, 0x2F, 0x74, 0x2A, 0xA4, 0x53, 0x80, 0xB4,
+ 0x82, 0x89, 0x8A, 0xDD, 0x67, 0x89, 0x5C, 0xC8, 0x02, 0xFC, 0x2F, 0x20, 0x30, 0xA4, 0x89, 0xBF, 0x33, 0xF6, 0x62, 0x5E, 0x05, 0x73, 0xB3, 0x19, 0x43, 0xC6, 0x37, 0x5C, 0x75, 0x8D, 0x34, 0x38, 0xFA, 0x3E, 0x15, 0x7D, 0xF6, 0x32, 0x80, 0xAC,
+ 0xAC, 0x13, 0x68, 0xF1, 0xFE, 0xF5, 0xDA, 0x17, 0xF2, 0x8C, 0x73, 0xAF, 0x0C, 0xDF, 0xA1, 0x30, 0xE7, 0xAD, 0x87, 0x0E, 0xE0, 0x9A, 0x84, 0xE3, 0x2C, 0x41, 0x18, 0xF8, 0xA8, 0xFC, 0xCA, 0xB2, 0xA0, 0x5A, 0xA0, 0x05, 0xCD, 0x0B, 0x82, 0xEB,
+ 0x0B, 0x81, 0x49, 0x68, 0xFD, 0xFE, 0xD6, 0x48, 0x09, 0x8F, 0x09, 0x72, 0xB3, 0x5C, 0xCD, 0x8C, 0x9F, 0xE7, 0x63, 0xED, 0xD2, 0x2D, 0x88, 0xE1, 0xA8, 0xA1, 0x7B, 0x55, 0x72, 0xC7, 0xF1, 0x89, 0xDF, 0x07, 0xCF, 0xDF, 0x86, 0xC4, 0xCA, 0xF5,
+ 0xDE, 0x22, 0x70, 0x5E, 0xD2, 0x17, 0xDD, 0x45, 0x1C, 0x1B, 0x2E, 0xDE, 0x05, 0xBF, 0x31, 0x63, 0x60, 0x64, 0xA4, 0xE2, 0x3B, 0xCF, 0x33, 0x7D, 0xD3, 0x78, 0x07, 0x2B, 0x3B, 0x40, 0xA2, 0x3D, 0xE9, 0x1E, 0x8F, 0x41, 0x46, 0x1B, 0x4C, 0xF2,
+ 0x9E, 0xB5, 0x87, 0x93, 0xB5, 0xF1, 0xCA, 0xFB, 0x75, 0x0E, 0x7E, 0xF5, 0xA3, 0x37, 0x2E, 0xD9, 0x5F, 0xBF, 0x7E, 0x0C, 0x39, 0x26, 0xFD, 0x97, 0x08, 0xAB, 0x59, 0x36, 0x65, 0xD5, 0xE0, 0x1A, 0xCB, 0x85, 0x87, 0xC4, 0xD9, 0xE3, 0x90, 0xDC,
+ 0xC6, 0x3C, 0x21, 0xF1, 0xD1, 0x51, 0xF8, 0xB8, 0xE7, 0xBA, 0x23, 0x28, 0x74, 0xF4, 0xB6, 0xA1, 0x0E, 0xAA, 0xAC, 0x64, 0x0F, 0xF0, 0x29, 0xA6, 0x7D, 0xAF, 0x1A, 0x5C, 0xB0, 0xBB, 0x7F, 0xB7, 0xA7, 0xA3, 0xAD, 0x1D, 0x0F, 0x61, 0x2D, 0x58,
+ 0xF4, 0x9C, 0x93, 0xE9, 0x4D, 0xFD, 0x11, 0x24, 0x4B, 0xD3, 0x6C, 0x61, 0x8D, 0xE3, 0x26, 0x90, 0x83, 0x20, 0x1C, 0x4F, 0xBB, 0x15, 0x00, 0x86, 0xEA, 0x2F, 0xC9, 0xF5, 0x4A, 0x7A, 0x06, 0x8F, 0xB9, 0x77, 0x05, 0x74, 0xE9, 0xF5, 0x3D, 0x80,
+ 0x2A, 0x04, 0xFF, 0x82, 0x16, 0x93, 0x25, 0x0C, 0x0B, 0xAF, 0xC2, 0x37, 0xE8, 0xAB, 0xC0, 0x14, 0xE9, 0x33, 0x06, 0xA2, 0x82, 0xE9, 0x56, 0x07, 0x5E, 0x2C, 0xC7, 0xF5, 0xEA, 0x97, 0x83, 0xCA, 0x6B, 0x4B, 0x79, 0x62, 0x37, 0x3B, 0x66, 0x73,
+ 0xF5, 0x7C, 0x71, 0xDF, 0xEC, 0xBE, 0x67, 0x90, 0x55, 0xD3, 0xEC, 0x81, 0x0D, 0x56, 0x2D, 0x10, 0x19, 0x34, 0x9E, 0xD5, 0xEC, 0x64, 0x15, 0xF0, 0x59, 0xA1, 0x75, 0xA0, 0xD3, 0x53, 0xC4, 0x5A, 0xA7, 0x9A, 0xD6, 0x2D, 0x6C, 0x7B, 0xED, 0x91,
+ 0xF1, 0x54, 0x06, 0x29, 0xA7, 0xE2, 0xCF, 0xC8, 0x80, 0x74, 0x1A, 0xCC, 0xD4, 0x30, 0xB7, 0xE2, 0x6F, 0x4C, 0x99, 0xB9, 0x93, 0xB7, 0x15, 0x9E, 0x1E, 0xC9, 0x15, 0x94, 0x74, 0x76, 0xAF, 0x7D, 0xDD, 0x5E, 0x2B, 0x2E, 0x1B, 0x4D, 0x0D, 0xF0,
+ 0xD9, 0x16, 0xF7, 0x82, 0x2E, 0x92, 0x3F, 0x27, 0xD8, 0x6B, 0x82, 0xEC, 0x32, 0x2F, 0xE4, 0x96, 0x06, 0x70, 0x8C, 0x8E, 0x6F, 0xB2, 0xDB, 0xA8, 0xF0, 0xB0, 0xB2, 0xAC, 0xE2, 0x9A, 0x7A, 0x69, 0x03, 0xF3, 0x34, 0x83, 0x6D, 0xD9, 0x23, 0xD4,
+ 0x0F, 0x6D, 0x73, 0x5A, 0x00, 0xBC, 0x8C, 0xB8, 0xAA, 0xD6, 0xA7, 0x07, 0x16, 0x24, 0x40, 0x27, 0x46, 0xCA, 0x75, 0xAC, 0x59, 0x1E, 0x6E, 0x52, 0xE3, 0x87, 0xEB, 0x41, 0x89, 0x54, 0xF4, 0x73, 0x9A, 0x65, 0x77, 0x65, 0xC1, 0xC2, 0xBC, 0x84,
+ 0x9D, 0xC6, 0xD0, 0xED, 0xB9, 0x79, 0xB4, 0x4A, 0x0C, 0x7C, 0x52, 0x75, 0xBE, 0x26, 0xEF, 0xD0, 0x45, 0xC5, 0x66, 0xF9, 0x28, 0x3F, 0x63, 0xCB, 0x16, 0x10, 0x88, 0x85, 0xE0, 0xF0, 0xA0, 0x05, 0x57, 0x76, 0x90, 0x26, 0x55, 0x4F, 0x6D, 0xAA,
+ 0x5A, 0xE5, 0xD4, 0xBC, 0x1E, 0x97, 0xA8, 0x8C, 0x64, 0xE9, 0x88, 0x4E, 0xDF, 0x83, 0x4B, 0x48, 0x56, 0x11, 0x9D, 0xB0, 0xB5, 0xC8, 0xFE, 0xFD, 0x0F, 0x50, 0x17, 0x7E, 0x20, 0x6B, 0x03, 0x6F, 0x6B, 0x1E, 0x60, 0x33, 0x80, 0xA8, 0x70, 0x49,
+ 0xB0, 0xF8, 0xD7, 0xB9, 0x7B, 0x3F, 0xDC, 0xBD, 0xEB, 0xD6, 0xCB, 0x16, 0xFE, 0x20, 0x31, 0x15, 0x44, 0xAE, 0xB6, 0xC2, 0xE9, 0xEE, 0x4E, 0x98, 0x3C, 0xAD, 0xD4, 0x0B, 0xA9, 0x8C, 0xAF, 0x5F, 0x1E, 0xDA, 0x5F, 0x6B, 0x3A, 0x51, 0x5B, 0xFE,
+ 0xE7, 0x7E, 0x7A, 0x37, 0xFD, 0xC1, 0x44, 0x6C, 0x90, 0x16, 0x6D, 0xE7, 0xDC, 0xC4, 0x93, 0x41, 0x3A, 0x53, 0x0A, 0x8C, 0x24, 0x0C, 0xFD, 0xED, 0x77, 0xEB, 0x7B, 0x70, 0xBB, 0x34, 0x53, 0xFB, 0x24, 0x40, 0x33, 0x19, 0x62, 0xFF, 0x7A, 0x7F,
+ 0x9C, 0xC0, 0xDB, 0x0A, 0xD1, 0xCC, 0x73, 0x2E, 0x4A, 0xC7, 0x29, 0x91, 0x19, 0xFA, 0x90, 0x28, 0xF9, 0x2A, 0x0F, 0xDC, 0x84, 0x2C, 0x41, 0x8A, 0x17, 0x6D, 0xB5, 0x2C, 0x36, 0x20, 0x37, 0x43, 0x31, 0x7F, 0x88, 0xF6, 0x7E, 0x54, 0xE0, 0x1E,
+ 0xB3, 0x63, 0xA4, 0xF6, 0xDF, 0xC4, 0x2A, 0xF9, 0x76, 0x69, 0xEC, 0x0A, 0x89, 0x8D, 0xC7, 0x70, 0xBD, 0x5C, 0x9B, 0x6A, 0x1C, 0xC3, 0x08, 0xA3, 0x69, 0x04, 0x77, 0x1E, 0xB1, 0xBD, 0xF7, 0xBF, 0xD2, 0xF0, 0x5E, 0x06, 0x17, 0x99, 0x48, 0xF4,
+ 0xF0, 0x32, 0xF6, 0xCE, 0x26, 0x14, 0x0C, 0x05, 0x34, 0x40, 0x0B, 0x5E, 0x6A, 0x3F, 0xC8, 0xAE, 0x4B, 0x91, 0x69, 0x57, 0xFD, 0x60, 0xBA, 0x89, 0x44, 0xB3, 0x6B, 0x5B, 0xA1, 0x64, 0x22, 0xCF, 0x69, 0x61, 0xE1, 0x27, 0xFA, 0x78, 0x2C, 0xD3,
+ 0x28, 0x2D, 0x8D, 0x42, 0x15, 0xBE, 0x4B, 0xC6, 0xBC, 0xC8, 0xC2, 0x31, 0x49, 0x85, 0xB3, 0x36, 0xF8, 0xC9, 0x86, 0xA0, 0x1A, 0x38, 0x79, 0xE7, 0x20, 0x81, 0x9A, 0x8A, 0xFB, 0x81, 0x7D, 0x30, 0x75, 0x51, 0x43, 0x67, 0xE9, 0x51, 0x5C, 0xE7,
+ 0x5B, 0x2C, 0x0D, 0x6D, 0x11, 0xA9, 0xEC, 0x71, 0x94, 0x10, 0xDA, 0xF9, 0x98, 0xFE, 0x4E, 0x03, 0xE8, 0x1D, 0x39, 0x12, 0x7E, 0xFA, 0x7D, 0x16, 0x49, 0xBC, 0x79, 0xE4, 0xC4, 0xBB, 0xCF, 0x6C, 0xCF, 0x08, 0xE2, 0x6A, 0x9D, 0x90, 0x16, 0xB1,
+ 0xBF, 0x1F, 0x5D, 0x2F, 0x47, 0x5A, 0x61, 0xA3, 0xF4, 0xA0, 0x8D, 0xB9, 0x68, 0x84, 0x6F, 0x72, 0xAA, 0xDE, 0xFC, 0xC5, 0x78, 0x77, 0xD6, 0xAA, 0x3F, 0xB8, 0x83, 0x40, 0xA5, 0xA4, 0x4A, 0x46, 0x2F, 0xEE, 0xCD, 0x7C, 0x81, 0x2D, 0xE8, 0x57,
+ 0xCD, 0xC5, 0xBB, 0x9D, 0x9C, 0xAB, 0xDF, 0x50, 0x81, 0xC1, 0x7B, 0x5A, 0x74, 0x27, 0xD1, 0xAA, 0xBE, 0xE1, 0x8C, 0x41, 0x3B, 0x6E, 0xEB, 0x7F, 0xF1, 0x99, 0xA8, 0x09, 0xB8, 0x1B, 0xDC, 0xDA, 0xC8, 0x45, 0xF0, 0x7C, 0x18, 0x5F, 0xAA, 0x55,
+ 0x9D, 0x9F, 0xFC, 0x89, 0x6C, 0x99, 0xAF, 0x38, 0xFD, 0x05, 0x5A, 0x81, 0x5E, 0x5C, 0x03, 0xFE, 0xE0, 0x62, 0x1E, 0x52, 0x0A, 0x0F, 0xEA, 0x3B, 0x05, 0x0B, 0xAB, 0x54, 0xB3, 0x70, 0x81, 0xFA, 0xEB, 0xB5, 0x5F, 0x4A, 0x8E, 0xFD, 0xA2, 0x20,
+ 0xB5, 0x51, 0x5E, 0x62, 0xE5, 0x26, 0xA0, 0xE1, 0x52, 0x0D, 0x03, 0x53, 0xB7, 0x92, 0x9D, 0x8C, 0x30, 0x33, 0xC7, 0xCF, 0xF5, 0xBA, 0x0B, 0x1E, 0xE4, 0xF2, 0x18, 0x44, 0xC2, 0x07, 0x44, 0x69, 0x45, 0x52, 0x48, 0xAD, 0x93, 0x48, 0xC9, 0xAA,
+ 0xE6, 0xC8, 0xE8, 0x41, 0x0A, 0xD3, 0x90, 0xE5, 0x31, 0x7C, 0x9D, 0x7C, 0x10, 0x7F, 0x84, 0x48, 0xB6, 0x76, 0xF0, 0xB8, 0x53, 0x7D, 0x05, 0xAF, 0x7F, 0x7B, 0x12, 0xE6, 0xB7, 0xFC, 0x27, 0xEA, 0x0C, 0xFE, 0x83, 0x7F, 0xBF, 0xD8, 0xAE, 0xCE,
+ 0xFA, 0xF5, 0x66, 0xAB, 0x3C, 0x61, 0x87, 0xDC, 0x4B, 0x86, 0x2F, 0x53, 0xE0, 0x6B, 0x65, 0x86, 0xD4, 0x41, 0xCD, 0x69, 0x15, 0x04, 0x95, 0xE4, 0x5B, 0x27, 0xD7, 0x44, 0x99, 0x85, 0x6F, 0x6C, 0x7D, 0xD3, 0xEF, 0x6D, 0xDF, 0xE9, 0x02, 0x91,
+ 0xE1, 0x4A, 0x3B, 0xAD, 0xF7, 0xFA, 0x29, 0x32, 0x70, 0x04, 0x7D, 0x51, 0xBE, 0x64, 0x94, 0x48, 0x6D, 0xAC, 0x20, 0x8B, 0xC7, 0x2D, 0x5B, 0xD4, 0x37, 0xE3, 0xAD, 0xCB, 0x69, 0x5E, 0x59, 0xDD, 0x1A, 0x50, 0xFE, 0x00, 0xCC, 0x6D, 0x99, 0xAC,
+ 0x3A, 0xFD, 0x9D, 0x88, 0x1A, 0xB1, 0x27, 0x25, 0x5B, 0xEF, 0xA8, 0x54, 0xC1, 0x8A, 0xD3, 0x18, 0x05, 0x3E, 0x60, 0xFA, 0xF7, 0x79, 0xCA, 0x71, 0x23, 0x9D, 0xF1, 0xF1, 0x75, 0x60, 0x79, 0x82, 0x1F, 0xB6, 0x48, 0x8C, 0x78, 0xC4, 0x59, 0x93,
+ 0x54, 0x37, 0xDE, 0xFB, 0x63, 0xDF, 0xF4, 0x04, 0xE9, 0x93, 0x7F, 0x4D, 0x6E, 0x54, 0x30, 0x89, 0x4D, 0xEA, 0x87, 0x10, 0x6C, 0x87, 0x6D, 0x64, 0x8B, 0x92, 0xD1, 0x05, 0x41, 0x5F, 0x09, 0x95, 0x71, 0xCB, 0x15, 0xEA, 0x6E, 0x4D, 0xFD, 0x41,
+ 0xDF, 0xB9, 0xBF, 0xFA, 0xAF, 0x27, 0xBE, 0x13, 0x34, 0x40, 0x60, 0x9E, 0x33, 0xC6, 0xE9, 0x48, 0x7C, 0x42, 0x37, 0x5B, 0xF0, 0xE5, 0x5B, 0x61, 0x5D, 0x99, 0x88, 0x30, 0x2C, 0x00, 0x1C, 0xFB, 0x0B, 0xD5, 0xA8, 0x36, 0xBE, 0x9F, 0xCB, 0xFB,
+ 0xC2, 0x9A, 0xE7, 0x27, 0x9A, 0x6B, 0xC7, 0x83, 0x6B, 0xC2, 0x6E, 0x09, 0x86, 0x7F, 0x46, 0x64, 0x2A, 0xF9, 0x7C, 0xDD, 0xAC, 0x55, 0x94, 0xA1, 0xC2, 0xFA, 0x81, 0x45, 0x34, 0x14, 0x6D, 0x18, 0x8A, 0x26, 0xCA, 0x46, 0xFB, 0x6E, 0xFA, 0x06,
+ 0x11, 0x02, 0xEB, 0xE4, 0x1E, 0x55, 0x82, 0x34, 0xA2, 0x9C, 0x28, 0x57, 0x56, 0x91, 0x02, 0x1B, 0xC0, 0x0E, 0x63, 0x9F, 0x39, 0xAC, 0x29, 0x87, 0x28, 0x71, 0x44, 0xC4, 0x6C, 0xFA, 0x40, 0xB9, 0x66, 0xA9, 0xBA, 0xE2, 0x04, 0xBE, 0xA7, 0x7C,
+ 0xE2, 0x8C, 0x44, 0x30, 0x6E, 0x1B, 0xD8, 0xA9, 0xF4, 0x5B, 0xA8, 0xD7, 0x5A, 0x29, 0xDE, 0x4E, 0xDB, 0x0E, 0xD5, 0xAB, 0x5E, 0x61, 0x12, 0x22, 0x41, 0x86, 0xDE, 0xAE, 0x84, 0xE7, 0x77, 0xD7, 0x1F, 0xE7, 0x5A, 0x92, 0xBE, 0x57, 0x22, 0x79,
+ 0x43, 0x7E, 0xA6, 0x35, 0xFC, 0x0E, 0x14, 0xC0, 0x0C, 0x30, 0x07, 0x08, 0x54, 0x6A, 0x98, 0x02, 0xDB, 0x91, 0x41, 0x89, 0x9E, 0xB9, 0xB5, 0x40, 0xC1, 0xA9, 0x52, 0x68, 0x41, 0x1E, 0x62, 0x22, 0xE7, 0x46, 0x8D, 0x4B, 0x70, 0x7C, 0x8E, 0x9D,
+ 0xD2, 0x89, 0xC2, 0x09, 0x3C, 0x9A, 0xBE, 0xFC, 0xC0, 0x66, 0x6C, 0x34, 0x6F, 0xEE, 0x27, 0x37, 0xB9, 0x70, 0x31, 0xD4, 0x8D, 0xD8, 0xD6, 0xEB, 0x45, 0x3B, 0xCE, 0xC4, 0xB5, 0x66, 0x20, 0xC5, 0x65, 0x0A, 0x0E, 0xB2, 0x1D, 0x6D, 0xF2, 0x72,
+ 0x8E, 0x07, 0xB3, 0x92, 0x63, 0x48, 0xAF, 0x9F, 0x63, 0x29, 0x50, 0xA7, 0xC7, 0xA6, 0xCF, 0xBB, 0x9D, 0xF8, 0x32, 0xC6, 0x93, 0x8B, 0x9A, 0x45, 0x6F, 0xFB, 0xE1, 0x9E, 0x49, 0xEF, 0x65, 0x96, 0x2A, 0xC6, 0x88, 0xB5, 0x25, 0xB7, 0x8E, 0x33,
+ 0x48, 0x64, 0xA6, 0xBA, 0x7D, 0x62, 0xD4, 0xCD, 0x27, 0x21, 0x99, 0x50, 0xE6, 0x4F, 0xC7, 0x9F, 0xDE, 0x3A, 0xAC, 0xDD, 0x7F, 0xE2, 0xC8, 0x60, 0x40, 0x97, 0x77, 0x17, 0xBD, 0x5E, 0xE5, 0x19, 0xDC, 0xE3, 0x85, 0x45, 0x2C, 0x30, 0xEF, 0x55,
+ 0x40, 0xAC, 0x09, 0x18, 0x13, 0x71, 0xAC, 0xB3, 0x20, 0x0A, 0xBA, 0x68, 0x4F, 0x07, 0x7A, 0xBA, 0x9D, 0x3B, 0xAE, 0x00, 0x30, 0xFF, 0x6B, 0xDC, 0xF3, 0x3E, 0x83, 0x47, 0xBC, 0xAC, 0x71, 0x4F, 0xE2, 0x7F, 0x75, 0xC0, 0x60, 0xEF, 0xF5, 0xF6,
+ 0x55, 0x43, 0x0E, 0x6C, 0x37, 0x98, 0xB6, 0x90, 0x46, 0xDB, 0x8F, 0x61, 0xC7, 0x98, 0x04, 0x83, 0x9A, 0xB8, 0x2D, 0x21, 0xAC, 0x02, 0x62, 0xA4, 0x02, 0x09, 0xB3, 0xE1, 0xE3, 0x73, 0x85, 0x84, 0x7E, 0x02, 0x38, 0xD3, 0x33, 0x64, 0x46, 0xB0,
+ 0xB8, 0x6D, 0xFD, 0x6D, 0x2F, 0x2B, 0xB6, 0x90, 0x96, 0xC6, 0xBB, 0xD1, 0x9A, 0x51, 0xC0, 0x28, 0xAE, 0x59, 0xF3, 0xDA, 0xA4, 0x9A, 0xA6, 0x9E, 0xEE, 0xA8, 0xC0, 0x2D, 0x0A, 0x61, 0xD3, 0x47, 0xA7, 0x24, 0x71, 0xA6, 0x6B, 0x61, 0x27, 0x77,
+ 0x40, 0x72, 0x2A, 0x73, 0x0D, 0x62, 0x06, 0x02, 0x87, 0x16, 0x95, 0xD0, 0x13, 0x9A, 0x1B, 0xEC, 0xFF, 0xCC, 0x57, 0xB2, 0xB5, 0x8B, 0xC8, 0xC0, 0xE5, 0xFF, 0x5F, 0x64, 0x25, 0xC1, 0x3B, 0x80, 0x32, 0x6C, 0xC5, 0x1F, 0x32, 0x84, 0x5D, 0x00,
+ 0x78, 0xD2, 0xE3, 0x07, 0x04, 0x42, 0xAE, 0x99, 0xAC, 0x80, 0x98, 0xA4, 0x36, 0xA2, 0x9E, 0x4A, 0x29, 0x5C, 0xCB, 0x1E, 0x5F, 0xEA, 0x36, 0xC1, 0xD5, 0x8C, 0xEB, 0xEB, 0x1F, 0x80, 0x7E, 0xBC, 0x72, 0x71, 0x03, 0x0C, 0x86, 0xA5, 0xFC, 0x18,
+ 0xFB, 0x48, 0x72, 0x48, 0x7C, 0xA0, 0x71, 0x5C, 0xD5, 0x83, 0x0F, 0x07, 0x38, 0xC1, 0xF6, 0x68, 0x16, 0xBF, 0x19, 0x09, 0xF3, 0xC0, 0xFB, 0x37, 0xA3, 0xD0, 0x81, 0x4A, 0x63, 0xF2, 0x82, 0x30, 0xA7, 0xA1, 0x36, 0x39, 0xEE, 0xB4, 0x47, 0xF2,
+ 0x62, 0xFA, 0xBD, 0xE4, 0xED, 0x3F, 0x1B, 0x4E, 0xCB, 0x9B, 0xCF, 0xB8, 0x64, 0x22, 0xAB, 0x4E, 0x34, 0xF2, 0x77, 0x97, 0xBF, 0xCD, 0x69, 0x43, 0xBC, 0xC1, 0x0A, 0xBA, 0xE5, 0xE3, 0xD4, 0x42, 0x81, 0x79, 0x3A, 0x51, 0x2B, 0x99, 0x16, 0xDD,
+ 0x08, 0xF9, 0xC3, 0x17, 0xD2, 0xF7, 0xDA, 0x6A, 0x26, 0xEE, 0xFE, 0x0A, 0x65, 0x0B, 0x11, 0x58, 0x47, 0xED, 0x0B, 0x52, 0x6B, 0x19, 0xBA, 0xAD, 0x34, 0xBB, 0xE1, 0x5D, 0x38, 0x0D, 0xC5, 0x0C, 0x22, 0x3F, 0xDC, 0x4F, 0x6C, 0xDB, 0xD1, 0x7B,
+ 0x44, 0x90, 0x91, 0x99, 0xD8, 0xFB, 0x71, 0x17, 0x18, 0x94, 0x64, 0x1C, 0x49, 0x43, 0x33, 0xBC, 0xC6, 0x70, 0xE8, 0x52, 0x04, 0x8C, 0xAD, 0xF9, 0x11, 0x16, 0xE9, 0xCC, 0xFB, 0x5F, 0xD6, 0x7D, 0xF2, 0x76, 0xDF, 0xC5, 0x21, 0xAE, 0xB4, 0xC8,
+ 0x4F, 0x17, 0x28, 0x90, 0xE2, 0x3C, 0xDC, 0x59, 0x44, 0x65, 0xD1, 0xA9, 0x9D, 0xC5, 0xBC, 0x1A, 0x64, 0x5F, 0xDB, 0x69, 0x65, 0x0A, 0xC1, 0x8D, 0x93, 0xE3, 0x03, 0xB2, 0x3A, 0x82, 0xEB, 0x67, 0x83, 0xE6, 0x44, 0xA6, 0x66, 0xE1, 0x6E, 0x09,
+ 0xA2, 0xB4, 0xD8, 0x0A, 0xB7, 0x9C, 0x79, 0xDA, 0xEF, 0x31, 0x39, 0x0B, 0x16, 0xA6, 0xD4, 0x14, 0x87, 0xEF, 0x9E, 0x9E, 0xA3, 0xFC, 0xB9, 0x6E, 0x24, 0x6C, 0x56, 0x56, 0x4F, 0xC9, 0xCE, 0x3A, 0xA5, 0x66, 0x33, 0xCD, 0xAB, 0xE3, 0x54, 0xA5,
+ 0x19, 0x3C, 0x07, 0x0E, 0x17, 0x66, 0x31, 0x57, 0x0B, 0x29, 0x95, 0x78, 0xEB, 0x10, 0x8D, 0xC7, 0xF3, 0xCB, 0x43, 0x2F, 0x66, 0x8A, 0xAE, 0x4C, 0x39, 0xFF, 0x98, 0x6C, 0x69, 0xB5, 0xB5, 0xF2, 0x2C, 0x0B, 0x03, 0x8D, 0x14, 0xC2, 0xDB, 0xD2,
+ 0x7D, 0x27, 0xE2, 0x42, 0xC1, 0x3A, 0xCC, 0x74, 0x6B, 0xDC, 0x89, 0xB9, 0x4F, 0x0B, 0x4F, 0x98, 0xE0, 0x32, 0xFB, 0x8D, 0x07, 0xB6, 0xC4, 0xBE, 0xBF, 0xA5, 0x33, 0xAD, 0x98, 0x9B, 0x89, 0x99, 0x54, 0xE8, 0xFF, 0xFF, 0x8B, 0x0C, 0x33, 0x71,
+ 0x8C, 0x59, 0xB5, 0xF5, 0x22, 0x1E, 0x6D, 0x7C, 0xAC, 0xFE, 0x20, 0x9A, 0x44, 0xFB, 0xBA, 0x49, 0x30, 0x8C, 0x47, 0xD9, 0x72, 0x63, 0xAE, 0xAA, 0x7A, 0x29, 0xCD, 0x81, 0xE6, 0xE0, 0x28, 0x8D, 0x19, 0x6B, 0x77, 0x6C, 0x18, 0xB2, 0x41, 0xDD,
+ 0x9E, 0xAA, 0x3E, 0x04, 0x1A, 0xF6, 0xE8, 0xD3, 0x39, 0x40, 0xA1, 0x56, 0xD2, 0xB2, 0x4F, 0x94, 0x50, 0x97, 0xF7, 0xCA, 0x78, 0xD1, 0x1B, 0xE8, 0xFB, 0x3D, 0x2C, 0x10, 0x4B, 0x29, 0x88, 0xB6, 0xDE, 0x8B, 0xD6, 0x5C, 0x49, 0x4C, 0xEE, 0x40,
+ 0xF6, 0x76, 0xD3, 0x69, 0xC9, 0x12, 0x01, 0x0A, 0x7B, 0x55, 0xD1, 0xF4, 0x4B, 0x10, 0x00, 0xD6, 0x88, 0xA7, 0x53, 0x96, 0x76, 0x5B, 0x24, 0x7A, 0x88, 0x8E, 0x6C, 0x3C, 0x92, 0x65, 0x4F, 0x6B, 0x41, 0x2B, 0x08, 0x2E, 0x59, 0x4A, 0x5A, 0xAF,
+ 0x12, 0x9E, 0xF4, 0x4A, 0xD6, 0x12, 0x50, 0x6A, 0xDF, 0x79, 0x3B, 0x71, 0x8F, 0xAC, 0xE3, 0x44, 0x89, 0x78, 0x73, 0x1A, 0x32, 0x80, 0xC7, 0x6B, 0x34, 0x57, 0xA7, 0x87, 0x2A, 0x15, 0x0C, 0x67, 0xFF, 0xCE, 0x79, 0x9D, 0x32, 0x91, 0x07, 0xF6,
+ 0x71, 0x61, 0xAB, 0x13, 0xF3, 0x93, 0x3A, 0x5A, 0x1C, 0xB1, 0x4B, 0x72, 0xF2, 0xCC, 0xB1, 0x0E, 0xC9, 0xF6, 0x1C, 0x2C, 0xE2, 0xA1, 0xD7, 0xCB, 0xD8, 0xB0, 0x7C, 0x56, 0x50, 0xF2, 0x3B, 0xEC, 0xA6, 0x8C, 0x32, 0x01, 0x90, 0xB5, 0x4D, 0x32,
+ 0x57, 0x46, 0x6C, 0x81, 0xFE, 0x76, 0x66, 0x7D, 0x9D, 0xD0, 0x0A, 0x7F, 0x35, 0x92, 0x19, 0x6A, 0xFC, 0x14, 0x82, 0xCE, 0x58, 0x77, 0x1E, 0x9B, 0xC4, 0x30, 0xA4, 0x2C, 0xA1, 0x69, 0xF1, 0xA8, 0x51, 0xE6, 0xA7, 0x13, 0x0E, 0xCF, 0x71, 0x82,
+ 0x6B, 0x94, 0x9D, 0xE4, 0x67, 0xA7, 0xA2, 0xB4, 0xA3, 0xE6, 0xEC, 0xD2, 0x7B, 0x7E, 0x94, 0x39, 0x8B, 0x21, 0xFC, 0x3C, 0x14, 0x44, 0xE9, 0xC6, 0x88, 0x5F, 0xEE, 0x41, 0x62, 0xBF, 0xA9, 0xFB, 0x46, 0x05, 0xBB, 0x67, 0x97, 0x7A, 0x0C, 0x03,
+ 0x95, 0x28, 0x4B, 0x82, 0x53, 0xD4, 0xC4, 0x3A, 0x80, 0x2B, 0x42, 0x2A, 0xF8, 0xBA, 0xD3, 0x54, 0xCD, 0x20, 0xD6, 0x48, 0xF1, 0x4C, 0x2B, 0xBC, 0x63, 0x24, 0x6E, 0x28, 0xD4, 0x11, 0x8D, 0x17, 0x2D, 0x39, 0xB7, 0xAD, 0xDE, 0x7E, 0x1A, 0x59,
+ 0xB2, 0x8F, 0x7E, 0xC6, 0x85, 0x7C, 0xFF, 0x75, 0x43, 0x3A, 0xF4, 0xA7, 0x78, 0xCB, 0xA7, 0xE2, 0xE3, 0x31, 0xC2, 0x2C, 0xE9, 0x12, 0x31, 0x4A, 0x41, 0x16, 0xAD, 0x3A, 0x10, 0x13, 0xA2, 0xEC, 0xD3, 0x47, 0x48, 0xFE, 0x0C, 0xF1, 0xBC, 0xCA,
+ 0xE1, 0xEA, 0x1D, 0x13, 0x9D, 0x00, 0x5A, 0x7D, 0x77, 0xB5, 0x43, 0x43, 0xAE, 0x47, 0xA0, 0x04, 0xAD, 0x52, 0x22, 0x06, 0xDA, 0x1A, 0xA6, 0x66, 0x03, 0xA8, 0xCB, 0xA8, 0x13, 0x2B, 0x26, 0xAA, 0xDA, 0xA8, 0xBE, 0x0E, 0x7E, 0x6C, 0x05, 0x97,
+ 0x01, 0x65, 0x04, 0x3C, 0x23, 0x10, 0x4E, 0xB5, 0x13, 0x46, 0xD4, 0x05, 0x7A, 0x17, 0x55, 0x60, 0x46, 0x27, 0x28, 0x8E, 0x98, 0xBC, 0x02, 0x90, 0x90, 0x7C, 0xC7, 0x28, 0x10, 0x33, 0x65, 0x3F, 0xA2, 0xB5, 0x02, 0x9B, 0x7B, 0x3B, 0xD8, 0xB1,
+ 0x3A, 0x1A, 0x5C, 0x7F, 0x3D, 0x34, 0xFA, 0x5A, 0xAD, 0x63, 0xD7, 0x5F, 0xF1, 0xAF, 0x92, 0x75, 0x4F, 0x24, 0xF7, 0x2F, 0x5A, 0x81, 0x32, 0xCA, 0xBC, 0x6F, 0x0D, 0xC9, 0xE0, 0x59, 0x02, 0x63, 0x01, 0xB2, 0x35, 0xEB, 0x87, 0x11, 0x21, 0xC6,
+ 0xCC, 0x2D, 0x9A, 0x35, 0xC5, 0x72, 0x22, 0xF8, 0x15, 0xD1, 0x76, 0x4F, 0xB0, 0xCF, 0xDC, 0xE1, 0x55, 0x3D, 0x77, 0x25, 0x2A, 0x82, 0xBE, 0x2C, 0x05, 0xD2, 0x5E, 0xE6, 0xE3, 0xF1, 0x96, 0x4D, 0x40, 0x9B, 0xEE, 0xE8, 0x5F, 0x25, 0x89, 0x98,
+ 0x01, 0xA4, 0xAA, 0x3C, 0xF2, 0x29, 0x5B, 0x79, 0xB8, 0xFA, 0x93, 0x8B, 0xBF, 0x6A, 0x18, 0x7A, 0xD5, 0xCE, 0x02, 0x8E, 0xB9, 0x60, 0x27, 0xD4, 0xF6, 0x07, 0x93, 0xD5, 0xCA, 0xFC, 0x0B, 0x38, 0xE6, 0x79, 0xC8, 0xDC, 0x98, 0xE5, 0xF1, 0x37,
+ 0x6D, 0x34, 0x0C, 0x65, 0x75, 0xBB, 0x64, 0xC6, 0x45, 0xAF, 0x98, 0xC3, 0x86, 0x74, 0x04, 0xC3, 0xBD, 0x96, 0x73, 0x02, 0x3D, 0x84, 0x4D, 0x85, 0x85, 0x22, 0x0D, 0x9D, 0x13, 0x0E, 0x81, 0x3D, 0x9B, 0x8A, 0xFA, 0x98, 0x9F, 0xBC, 0xE6, 0x89,
+ 0x32, 0xCE, 0xBA, 0x02, 0x2B, 0x72, 0x4F, 0x1C, 0x27, 0xB5, 0x1A, 0xD0, 0x4E, 0x36, 0xB2, 0xE6, 0xDF, 0xEB, 0xE1, 0xC7, 0x1A, 0xA6, 0xE5, 0x3A, 0xA6, 0x25, 0xF3, 0x65, 0xCF, 0xEB, 0x2C, 0xCE, 0x1A, 0x3F, 0xE9, 0xC1, 0xD4, 0xFF, 0x29, 0x1C,
+ 0x61, 0x4D, 0xD8, 0x54, 0xD6, 0xBF, 0xA1, 0x5F, 0x80, 0xE3, 0xF3, 0x34, 0x0E, 0xA4, 0x39, 0x0E, 0x67, 0xE6, 0x02, 0x6B, 0x2C, 0x6A, 0x7A, 0xF2, 0x70, 0xB0, 0xCE, 0xF1, 0xD4, 0xCC, 0xE5, 0x86, 0x79, 0x6F, 0x71, 0x24, 0x24, 0x96, 0x6B, 0xF1,
+ 0x61, 0xA5, 0xF6, 0xF6, 0x26, 0x5E, 0x39, 0x9C, 0x51, 0xA3, 0x42, 0x64, 0xA8, 0x12, 0x1E, 0x2E, 0x35, 0x9B, 0xAE, 0x91, 0xCA, 0xAB, 0x9B, 0x1C, 0x2F, 0x35, 0x90, 0xD6, 0xE0, 0xA7, 0xA4, 0x59, 0x4C, 0x83, 0x53, 0xED, 0x4B, 0x1D, 0xB7, 0xD4,
+ 0x09, 0xD8, 0xB7, 0x3A, 0x87, 0xA8, 0xD3, 0xDA, 0x90, 0x40, 0xB9, 0xB5, 0x7D, 0xA5, 0xAB, 0x02, 0x1A, 0x94, 0x0B, 0x4D, 0xCD, 0x8F, 0x72, 0xD0, 0x99, 0xAA, 0x31, 0xB4, 0xE7, 0x92, 0xAC, 0x0C, 0xDC, 0x4C, 0x32, 0x89, 0x5F, 0x9A, 0xAA, 0x7F,
+ 0x24, 0x65, 0xD5, 0xCD, 0x14, 0xCE, 0xDA, 0x5E, 0x63, 0xEF, 0x76, 0x5B, 0xC1, 0xAF, 0x47, 0xEE, 0x65, 0x03, 0x97, 0xCF, 0xD0, 0xEA, 0x64, 0x01, 0xC7, 0x2B, 0xB9, 0x93, 0x59, 0x80, 0xA9, 0xB4, 0xDE, 0x5A, 0xEC, 0xD9, 0x56, 0xB1, 0x7D, 0xF1,
+ 0x6C, 0xE8, 0x5C, 0x5A, 0x0C, 0x15, 0x42, 0x57, 0xE3, 0xF4, 0xF6, 0x45, 0x78, 0x47, 0xBA, 0xBB, 0x74, 0x67, 0xE7, 0xB0, 0x98, 0x3F, 0xA8, 0xF8, 0x16, 0x01, 0x08, 0x73, 0x24, 0xF7, 0x2B, 0x8F, 0x97, 0x3C, 0xF4, 0xE8, 0x84, 0xC0, 0x69, 0xCA,
+ 0x2E, 0x42, 0x01, 0xB8, 0x2A, 0x46, 0xB7, 0xF0, 0x21, 0x62, 0x9F, 0xBC, 0x45, 0xDC, 0x07, 0xDF, 0x97, 0x6F, 0x5D, 0x54, 0x66, 0xA7, 0x37, 0x84, 0x8E, 0x50, 0x08, 0x9F, 0x06, 0x24, 0x3E, 0xB2, 0x9C, 0xB0, 0xB3, 0xBC, 0x8A, 0x0F, 0x1B, 0x07,
+ 0x7B, 0x6C, 0x77, 0x19, 0x63, 0x9D, 0x4C, 0xF9, 0xD4, 0x36, 0x44, 0x79, 0xA6, 0xE1, 0x68, 0x52, 0xFB, 0x72, 0x21, 0x61, 0x4F, 0x92, 0x62, 0x33, 0x10, 0xA5, 0x4F, 0xB4, 0x08, 0x69, 0x71, 0x57, 0x4C, 0xA4, 0x26, 0x18, 0x81, 0x50, 0xF0, 0x04,
+ 0x28, 0xF4, 0x39, 0x83, 0x23, 0x45, 0x1B, 0x92, 0xA3, 0xF5, 0x7D, 0xF2, 0xAA, 0x4C, 0x47, 0x17, 0x34, 0x51, 0xD4, 0xC6, 0x77, 0x93, 0x54, 0x29, 0x96, 0xA6, 0x00, 0x7E, 0x50, 0x38, 0x97, 0xF3, 0x07, 0xD7, 0x79, 0x3D, 0x23, 0x7C, 0x40, 0xE5,
+ 0x9F, 0x43, 0xC6, 0xAC, 0xC2, 0x04, 0xE2, 0xD4, 0x38, 0x92, 0x16, 0xAC, 0xDF, 0xC0, 0x5E, 0xE4, 0x2E, 0xC9, 0xD6, 0x71, 0x8E, 0x58, 0x43, 0xE7, 0x1C, 0x64, 0x26, 0xB4, 0x8A, 0xDC, 0x0C, 0xA2, 0xB4, 0xC5, 0xAF, 0xBD, 0xD0, 0x7F, 0xBF, 0xEC,
+ 0xD9, 0xBA, 0x0D, 0x41, 0x6D, 0xFF, 0x32, 0x69, 0x1A, 0x8A, 0xE0, 0xFF, 0x45, 0xF6, 0x84, 0xA1, 0xC1, 0x64, 0x6B, 0x2D, 0x42, 0x80, 0x86, 0x9C, 0xC6, 0x34, 0x56, 0xFD, 0xAC, 0xEC, 0xB2, 0x9C, 0x53, 0x76, 0xC8, 0x46, 0x15, 0xE4, 0xFF, 0xAB,
+ 0xE7, 0x38, 0xAE, 0x96, 0x2B, 0x23, 0xE9, 0xF1, 0xF8, 0x24, 0x83, 0x8A, 0x31, 0x8C, 0x29, 0x90, 0x38, 0x4D, 0x81, 0x91, 0x6F, 0x02, 0xB7, 0x5F, 0x4E, 0xF7, 0x33, 0x45, 0x43, 0xDF, 0x80, 0xFE, 0x53, 0x7D, 0x12, 0x8F, 0xFE, 0x08, 0x2B, 0x4F,
+ 0xC8, 0x9A, 0x27, 0x58, 0x82, 0x4E, 0xC3, 0xB0, 0x71, 0x7D, 0x3D, 0x97, 0xB3, 0xD5, 0xC8, 0xAA, 0xEF, 0x9A, 0x2A, 0x57, 0xD0, 0x56, 0x9E, 0xB4, 0x39, 0xEA, 0x1C, 0x28, 0xC9, 0x44, 0x57, 0x20, 0xD6, 0xCA, 0x78, 0x3D, 0x67, 0x6E, 0x6F, 0x28,
+ 0x4E, 0x08, 0x81, 0x64, 0x30, 0x59, 0x79, 0xAE, 0x16, 0xD9, 0x16, 0xD5, 0x5A, 0x47, 0x01, 0xD6, 0x5D, 0x46, 0x41, 0x03, 0xD8, 0x3F, 0xFE, 0x1F, 0x1C, 0x3C, 0x0E, 0xCB, 0xF5, 0xFF, 0xD7, 0xB4, 0xA4, 0xC1, 0xB6, 0x56, 0x7A, 0x43, 0xF5, 0x29,
+ 0xE1, 0xF7, 0x19, 0x0F, 0x89, 0xA1, 0x70, 0x3E, 0x36, 0xB8, 0xB9, 0x14, 0xDA, 0x41, 0xDC, 0xC8, 0x3C, 0x10, 0xEB, 0xF1, 0xD5, 0x9B, 0xBF, 0xB1, 0x35, 0xE8, 0xE2, 0xC5, 0xA2, 0x02, 0x5B, 0x31, 0x71, 0x86, 0x5D, 0xFC, 0x65, 0x07, 0xFA, 0x2D,
+ 0x0B, 0xF1, 0x51, 0xF1, 0x7E, 0x60, 0xAC, 0xAD, 0xDD, 0x46, 0xB0, 0x53, 0x66, 0xDD, 0xA9, 0x94, 0x10, 0x44, 0x01, 0x8E, 0x66, 0x0F, 0x70, 0x84, 0x82, 0x4A, 0x61, 0x5F, 0xA1, 0xAE, 0xB8, 0xE3, 0x41, 0x91, 0x86, 0x17, 0x10, 0xFC, 0x65, 0x5D,
+ 0xAE, 0x5C, 0xDF, 0xA7, 0x64, 0xAE, 0xA7, 0x7B, 0x9B, 0xE4, 0x74, 0x11, 0xCC, 0xDD, 0xF6, 0x5C, 0xC8, 0x56, 0xCB, 0xF3, 0x87, 0x14, 0x85, 0x67, 0x61, 0x5B, 0xC8, 0xB6, 0xF4, 0xE2, 0xB0, 0x8E, 0xD7, 0x47, 0xD9, 0x10, 0x4A, 0xB0, 0x82, 0xD9,
+ 0x23, 0x61, 0xF1, 0xA2, 0x25, 0x4F, 0x5E, 0x47, 0xA1, 0x29, 0x71, 0x32, 0xF3, 0x7F, 0x79, 0xA9, 0x14, 0x9C, 0x75, 0x18, 0x8D, 0xF4, 0xB7, 0x88, 0xB3, 0x5A, 0x0A, 0x13, 0xB7, 0x20, 0xBB, 0x8C, 0xB0, 0x0E, 0x02, 0x1C, 0x6E, 0xB7, 0x87, 0xCC,
+ 0xA2, 0xA6, 0xAF, 0xE4, 0xD8, 0xE8, 0x33, 0xF9, 0x22, 0x7E, 0x0B, 0x90, 0xEB, 0x57, 0xBF, 0x5E, 0xB4, 0x48, 0x46, 0xD7, 0x0B, 0x38, 0xFA, 0xF2, 0xA7, 0xB5, 0x05, 0x3F, 0xA3, 0x5D, 0xB4, 0xE5, 0x8D, 0xB1, 0x5F, 0xF9, 0xE1, 0x8C, 0x0D, 0xF7,
+ 0x81, 0x2B, 0xA5, 0xD7, 0x8F, 0xFF, 0x76, 0xFF, 0x6C, 0x8C, 0x5A, 0x3B, 0x90, 0x06, 0xD0, 0xE8, 0x09, 0xB7, 0xE9, 0xB5, 0xF2, 0x55, 0x6A, 0xE5, 0xD4, 0x8F, 0x5D, 0xEC, 0x8D, 0xF1, 0xEB, 0x1B, 0xF6, 0x26, 0x94, 0xF9, 0xD7, 0x38, 0x8C, 0x2B,
+ 0xF7, 0x0D, 0x98, 0xC3, 0x1B, 0xB7, 0x62, 0x7B, 0x80, 0xF7, 0x47, 0x04, 0x0C, 0x32, 0xFA, 0x49, 0x4E, 0x72, 0x87, 0x29, 0xF3, 0x7A, 0xF6, 0x15, 0x38, 0x1D, 0x01, 0x73, 0x6B, 0x01, 0x23, 0xF4, 0x39, 0x75, 0x8C, 0x94, 0x75, 0xCB, 0xBB, 0x12,
+ 0x33, 0xD1, 0xD3, 0x7B, 0x6C, 0xF9, 0x6B, 0x8E, 0xBD, 0xC4, 0x81, 0xD7, 0xAC, 0x5E, 0x53, 0xE5, 0x56, 0xC3, 0x69, 0x77, 0x5E, 0x0D, 0x84, 0xC3, 0xF2, 0xB1, 0x75, 0x76, 0xBB, 0x36, 0xBE, 0xE5, 0x85, 0xCC, 0x3E, 0x78, 0xD8, 0xC6, 0x1E, 0x74,
+ 0x67, 0x78, 0x2C, 0xEA, 0xB8, 0x87, 0x8D, 0xA5, 0x7A, 0x5C, 0x6C, 0x35, 0xC5, 0x84, 0x0B, 0xCC, 0x59, 0xDF, 0x61, 0x10, 0x6E, 0x5C, 0x2A, 0x9C, 0xE4, 0x28, 0xB1, 0x2C, 0xB9, 0xCB, 0x2C, 0x26, 0x98, 0xB4, 0xC2, 0x37, 0xD2, 0x44, 0x48, 0x78,
+ 0xC8, 0xF0, 0x4A, 0xD5, 0xDE, 0xC3, 0x00, 0x0D, 0x74, 0x1A, 0x44, 0xBD, 0x2A, 0x6F, 0x6D, 0x6C, 0x52, 0xEA, 0xBF, 0xA3, 0xCE, 0x42, 0x5B, 0xBB, 0x4F, 0xC1, 0x36, 0x9C, 0x18, 0x1C, 0x94, 0x4B, 0x7C, 0x49, 0x33, 0x1A, 0x85, 0x12, 0x5E, 0x3E,
+ 0x1A, 0x2B, 0x34, 0xCC, 0xA5, 0xD9, 0xC1, 0x62, 0xCA, 0xE8, 0xF7, 0x74, 0x36, 0x2A, 0xDF, 0x18, 0x41, 0xA7, 0xDD, 0x26, 0xBD, 0xBA, 0x60, 0x53, 0x6D, 0x2B, 0xB9, 0x4B, 0xAC, 0xED, 0x8D, 0x7C, 0xAE, 0x27, 0x4C, 0xB1, 0x6B, 0x9D, 0x49, 0xCE,
+ 0x6E, 0xFB, 0xD8, 0xE1, 0xA2, 0x28, 0xDF, 0xAC, 0xBE, 0x6A, 0x92, 0x2F, 0x8F, 0x15, 0xAB, 0x4E, 0xFF, 0xC8, 0x6B, 0xBC, 0x69, 0xA5, 0xA8, 0x96, 0xB8, 0x1E, 0x8E, 0xBA, 0xCD, 0xCF, 0xDC, 0xF9, 0x1E, 0x85, 0xF2, 0x14, 0x7A, 0x18, 0x7C, 0x32,
+ 0xE4, 0xD1, 0x5F, 0x4A, 0xC8, 0x8C, 0xD7, 0xBB, 0xB5, 0x5F, 0x74, 0x70, 0x16, 0x5A, 0x8B, 0x41, 0x8F, 0x00, 0xEB, 0x8D, 0x05, 0x6A, 0x2D, 0xE8, 0xD4, 0xDD, 0x67, 0x8F, 0x42, 0xB3, 0x29, 0x3F, 0x32, 0x4A, 0x5F, 0x11, 0x94, 0x3F, 0x9E, 0x25,
+ 0x2A, 0xA3, 0xDF, 0xAD, 0xF4, 0xC0, 0x49, 0x8C, 0x9A, 0xAD, 0xB5, 0xED, 0xDB, 0xCE, 0xBD, 0x7E, 0xF6, 0x47, 0x89, 0x43, 0x9C, 0x09, 0x83, 0x97, 0x53, 0x5C, 0x72, 0x60, 0x51, 0xE2, 0x82, 0xF0, 0x32, 0xD3, 0x66, 0x90, 0x5F, 0x77, 0x5E, 0xDE,
+ 0x04, 0x22, 0xCC, 0x8B, 0xB1, 0xEC, 0x11, 0x27, 0x04, 0x0D, 0x75, 0xBA, 0x3A, 0x05, 0xF6, 0xFC, 0xA0, 0x68, 0x36, 0x2B, 0x12, 0x1B, 0xF1, 0x63, 0xD4, 0x9C, 0x3D, 0x5F, 0x1C, 0xEA, 0x64, 0x15, 0x5C, 0x63, 0xED, 0x4D, 0x5C, 0xB8, 0x6B, 0x07,
+ 0x2A, 0xFD, 0xEE, 0xD1, 0x1F, 0x93, 0x73, 0x32, 0xBD, 0x26, 0x04, 0xEA, 0xC6, 0x1A, 0xE1, 0x9C, 0x99, 0x81, 0x8C, 0x9E, 0x92, 0x43, 0x06, 0x05, 0x7B, 0x82, 0xBD, 0xC7, 0xE3, 0x4D, 0xF7, 0x72, 0x3F, 0xE7, 0xFD, 0x8B, 0xAD, 0x0E, 0x1E, 0x4D,
+ 0x99, 0x97, 0xC9, 0x42, 0x18, 0x8D, 0xD3, 0x20, 0xCD, 0x08, 0xA4, 0xCF, 0xC9, 0x71, 0x37, 0xB6, 0x20, 0x6F, 0x9E, 0x62, 0xFE, 0x30, 0x3D, 0x1B, 0x2D, 0x88, 0xDD, 0xE8, 0xFA, 0x04, 0x21, 0xD6, 0xE7, 0xA9, 0x3C, 0xBB, 0x3A, 0x5C, 0xF3, 0x0A,
+ 0xC9, 0x58, 0xE0, 0xD1, 0xA1, 0xC4, 0x5B, 0xEB, 0xCE, 0xBA, 0xA0, 0x9C, 0xD5, 0x83, 0x6F, 0xC7, 0x1F, 0x90, 0x25, 0xBE, 0xC4, 0x9D, 0x8C, 0xF7, 0x0A, 0xCE, 0x2B, 0x6D, 0x22, 0x96, 0xE5, 0x54, 0x31, 0xCA, 0x06, 0x37, 0xA8, 0x5F, 0x9B, 0x34,
+ 0x81, 0x36, 0xF4, 0xF4, 0x0D, 0x0A, 0x2C, 0x4B, 0x2B, 0x0F, 0xAF, 0xF0, 0xC1, 0x8A, 0x8B, 0xE4, 0xDF, 0x1B, 0xCD, 0x10, 0x82, 0x22, 0x06, 0x9C, 0x41, 0x9A, 0x3E, 0xC1, 0x5E, 0xA9, 0x99, 0x35, 0xAF, 0x9E, 0xCA, 0x37, 0x12, 0xE6, 0xA1, 0xE1,
+ 0x61, 0xB6, 0x4B, 0xE6, 0x14, 0x72, 0x46, 0x7B, 0x7C, 0x62, 0x91, 0xE1, 0x7D, 0x76, 0xC8, 0xA5, 0xE8, 0x10, 0x8A, 0x8D, 0x8F, 0xC7, 0x99, 0xF8, 0xA3, 0x3C, 0x9D, 0xCA, 0x8A, 0xA3, 0x76, 0xB6, 0xB3, 0xF8, 0xDA, 0xA0, 0x38, 0xC2, 0x8C, 0xE7,
+ 0x17, 0x03, 0xE4, 0x9E, 0x5B, 0xE5, 0x75, 0x05, 0x34, 0x22, 0xC8, 0x11, 0x46, 0xBC, 0x56, 0xF8, 0x7F, 0xB7, 0xE6, 0xB5, 0xFF, 0x3C, 0xC9, 0x65, 0x4D, 0x90, 0xE3, 0x94, 0x1B, 0xBA, 0x14, 0x92, 0xAA, 0x30, 0xE3, 0xC3, 0x43, 0x0A, 0x88, 0x6F,
+ 0x9F, 0x15, 0xE9, 0x3A, 0x4E, 0x25, 0x31, 0xAB, 0xC6, 0xEF, 0xB7, 0xFC, 0xED, 0x0D, 0xF6, 0x36, 0xA0, 0x94, 0xF6, 0x23, 0x55, 0xE9, 0xD9, 0xD6, 0xB5, 0x79, 0x13, 0x3C, 0xA8, 0x99, 0xC6, 0xA9, 0xD0, 0x6E, 0x97, 0x1F, 0x59, 0x49, 0x3E, 0x19,
+ 0xB8, 0x64, 0x3F, 0xA3, 0x45, 0xE5, 0xE9, 0xF8, 0x9B, 0x0E, 0x7C, 0xA3, 0x71, 0xB2, 0xD1, 0xE9, 0xE7, 0xF2, 0xB4, 0xA4, 0xAC, 0xAC, 0x5F, 0xDC, 0xE0, 0x55, 0x0B, 0xC0, 0x01, 0xD6, 0x98, 0x02, 0x16, 0xDC, 0xA4, 0xB2, 0x00, 0xF4, 0x01, 0xC3,
+ 0x18, 0xAB, 0x07, 0x73, 0x9B, 0xD1, 0x27, 0x20, 0xFB, 0xE8, 0x9F, 0xAF, 0xE7, 0xD0, 0x24, 0xDB, 0x19, 0x25, 0xFB, 0xAE, 0x8E, 0x28, 0x43, 0x73, 0x77, 0x03, 0xAB, 0x9A, 0x7D, 0xDB, 0x53, 0x48, 0xD3, 0xCD, 0xDC, 0x24, 0xCD, 0x7B, 0x93, 0x7C,
+ 0xEF, 0x81, 0x0F, 0x5B, 0xBB, 0x40, 0xEC, 0x73, 0x29, 0x91, 0x0B, 0x3C, 0x3E, 0x2C, 0x72, 0xAB, 0xD0, 0xC5, 0x65, 0xA4, 0x90, 0x23, 0xF8, 0xC6, 0x4E, 0x38, 0xAD, 0x9D, 0xD9, 0xB5, 0x5F, 0xE3, 0xB4, 0x2E, 0xAA, 0x73, 0x5E, 0x31, 0x83, 0x61,
+ 0x63, 0x8F, 0x8F, 0xE1, 0x14, 0x78, 0xA0, 0x70, 0x11, 0x9E, 0x78, 0x2F, 0x80, 0x14, 0x6E, 0x0B, 0x90, 0x50, 0xAB, 0x88, 0xCD, 0xA7, 0x65, 0xED, 0xBC, 0x7C, 0x66, 0x07, 0x2B, 0x90, 0x2A, 0x16, 0x13, 0x3A, 0x8D, 0x34, 0x77, 0xA6, 0xBA, 0x60,
+ 0x7B, 0x7D, 0x3C, 0x54, 0xCA, 0x01, 0x61, 0x76, 0xA9, 0x13, 0x36, 0xC4, 0x70, 0x42, 0x2A, 0x7B, 0x6F, 0xC7, 0x7B, 0xC7, 0xAE, 0x4C, 0x1E, 0x03, 0xB2, 0xA0, 0xD0, 0x63, 0xC0, 0x59, 0xD4, 0xFE, 0x1C, 0xDA, 0xFB, 0xE4, 0x55, 0x6C, 0x1F, 0x1E,
+ 0xF2, 0x54, 0xF3, 0xD5, 0x84, 0x0B, 0x7F, 0x31, 0x99, 0xF5, 0x55, 0xA0, 0xA8, 0xE7, 0x2F, 0x97, 0x4E, 0x9B, 0x6F, 0xCD, 0xB6, 0xC7, 0xE0, 0x4C, 0x8C, 0xEB, 0x0C, 0x1D, 0x4A, 0xAC, 0xDE, 0x7F, 0x30, 0xAB, 0x38, 0x6B, 0xBD, 0x9C, 0x39, 0xCA,
+ 0x0A, 0xC8, 0x12, 0x66, 0x27, 0x9E, 0xF1, 0x19, 0x2C, 0x3A, 0x8F, 0xEF, 0x22, 0x4D, 0x4F, 0x75, 0xD3, 0xCA, 0xD2, 0x87, 0x71, 0x11, 0x2D, 0x81, 0xA6, 0x85, 0x37, 0x95, 0xA2, 0x38, 0x82, 0xCC, 0x3C, 0xA5, 0x0A, 0x60, 0x72, 0xE7, 0xAC, 0x4F,
+ 0x68, 0xDD, 0xB0, 0x18, 0xE4, 0xD8, 0x49, 0xA3, 0x33, 0x09, 0xCE, 0x1B, 0xF2, 0x9A, 0x10, 0x05, 0xD3, 0x0D, 0x54, 0x3E, 0x6E, 0x14, 0x2A, 0xB2, 0xA6, 0x68, 0x85, 0xE2, 0x18, 0x6D, 0xBE, 0x22, 0xF4, 0xEC, 0x16, 0x0A, 0x4F, 0x96, 0xCF, 0xFD,
+ 0xD5, 0x09, 0x8E, 0xF8, 0xF7, 0xE2, 0xAF, 0x79, 0x05, 0x1D, 0x90, 0x23, 0x94, 0x2B, 0x26, 0x23, 0x6A, 0x5E, 0x8C, 0xF3, 0x75, 0x49, 0x6B, 0x38, 0x3A, 0x95, 0xB5, 0xA7, 0xE9, 0xE9, 0x16, 0x3A, 0x2E, 0xB2, 0x42, 0xD2, 0x84, 0x39, 0x4C, 0xCF,
+ 0x04, 0x14, 0xF4, 0x43, 0x28, 0xF9, 0x0A, 0x89, 0x88, 0xB5, 0x73, 0x43, 0xE6, 0x9D, 0xD0, 0xF0, 0x9B, 0x4E, 0x9B, 0x1F, 0xFE, 0x97, 0xCD, 0x40, 0x5D, 0x59, 0x5D, 0xD8, 0xF4, 0xE2, 0x02, 0x1F, 0xEE, 0x1C, 0xC9, 0x64, 0x9B, 0xB6, 0x5F, 0x8D,
+ 0x00, 0xC9, 0xF7, 0xAB, 0xA2, 0x83, 0xD9, 0x89, 0x21, 0xB9, 0x00, 0x93, 0x7A, 0x02, 0x31, 0x37, 0x49, 0x06, 0x0C, 0x43, 0x10, 0x92, 0x06, 0x4E, 0x09, 0x77, 0x96, 0x4E, 0x10, 0x8A, 0x6E, 0x4F, 0xB5, 0x12, 0x8F, 0x81, 0xEF, 0x43, 0x0D, 0xCB,
+ 0x4E, 0x31, 0xAC, 0xE7, 0x15, 0x71, 0xA2, 0x6C, 0xF2, 0xCC, 0xF8, 0x45, 0x3B, 0x27, 0xB6, 0xA2, 0x87, 0x95, 0x68, 0x6C, 0x82, 0x1A, 0x48, 0x09, 0x63, 0x6C, 0x7D, 0x4F, 0xE8, 0xF1, 0x4C, 0x9F, 0x11, 0xFB, 0x36, 0x02, 0x45, 0x98, 0x66, 0xA3,
+ 0x00, 0xD5, 0xEE, 0x1E, 0x61, 0x4C, 0xA9, 0x59, 0x80, 0xD5, 0x79, 0xF2, 0xB9, 0xA4, 0x40, 0x15, 0x0F, 0x91, 0x12, 0x9F, 0x9C, 0x75, 0x6C, 0x30, 0x5B, 0x17, 0x39, 0x8E, 0x83, 0x12, 0x66, 0x35, 0xEA, 0x9D, 0xC3, 0x53, 0xB7, 0x1A, 0xB9, 0x10,
+ 0x50, 0xC0, 0xB5, 0xAA, 0x59, 0xD0, 0x8B, 0x80, 0xC1, 0xD7, 0x82, 0x57, 0xD0, 0x81, 0xEF, 0xE4, 0xD2, 0x78, 0x17, 0xD4, 0xA9, 0x3B, 0x7B, 0x85, 0xD7, 0x62, 0xD3, 0x94, 0xB2, 0x3E, 0x02, 0x8D, 0x2B, 0x50, 0x39, 0xF8, 0x5C, 0xF5, 0xD0, 0xEE,
+ 0x69, 0x66, 0x4C, 0x48, 0x3A, 0xA3, 0x0A, 0xC3, 0x40, 0xA9, 0xC4, 0x99, 0xDF, 0xC4, 0xD3, 0x58, 0xA7, 0x36, 0xDA, 0x74, 0x7A, 0x17, 0x26, 0xF2, 0xA3, 0x9A, 0xD4, 0xF1, 0x82, 0x7E, 0x99, 0xAA, 0x0C, 0x9A, 0x23, 0xB2, 0x9E, 0x2B, 0x44, 0x23,
+ 0x8E, 0x32, 0xFB, 0x37, 0xE4, 0x9B, 0x95, 0x14, 0x2B, 0x74, 0x51, 0x33, 0x90, 0x3F, 0x4E, 0x94, 0x86, 0x94, 0xFD, 0x9E, 0xF4, 0x92, 0x02, 0xD5, 0x60, 0xB8, 0xB9, 0x9E, 0x51, 0xD9, 0x5C, 0x06, 0x88, 0x0A, 0x9B, 0x0C, 0x31, 0xAD, 0x42, 0x20,
+ 0xBB, 0x27, 0xFB, 0xD7, 0x93, 0x77, 0x33, 0x6C, 0xEB, 0xB2, 0xBC, 0xA2, 0x26, 0xCC, 0xC1, 0xAC, 0xDB, 0xE5, 0xA8, 0x02, 0xE2, 0xA2, 0x44, 0x89, 0x98, 0x06, 0xCB, 0xDA, 0x53, 0x03, 0x5B, 0x19, 0xD0, 0xD0, 0x22, 0x76, 0x22, 0x99, 0xFD, 0xAA,
+ 0xAF, 0xB0, 0xDB, 0xBA, 0x3C, 0x79, 0xD7, 0x82, 0xE8, 0x32, 0xB5, 0x04, 0x5F, 0x5D, 0x60, 0x6D, 0x4D, 0x5D, 0x26, 0x4B, 0x33, 0x66, 0x7F, 0xA0, 0xD6, 0x42, 0xE8, 0x70, 0xD0, 0x4E, 0xA7, 0x41, 0x41, 0x97, 0x5E, 0xA4, 0x44, 0xA5, 0xA0, 0x3C,
+ 0x2A, 0xFE, 0x0D, 0x61, 0x3E, 0xFD, 0x36, 0xDC, 0xFF, 0xB8, 0x2F, 0xF0, 0x63, 0xDD, 0x55, 0x91, 0x6B, 0x3E, 0xCE, 0x13, 0x29, 0x81, 0xCE, 0x3C, 0xB5, 0x12, 0x40, 0x87, 0xDC, 0x84, 0xAE, 0x98, 0x54, 0x3C, 0xF1, 0x8E, 0x41, 0x9A, 0xCE, 0xF6,
+ 0xF1, 0x61, 0x1B, 0xD0, 0x41, 0xB9, 0x4D, 0x22, 0x84, 0x7A, 0xC0, 0xD9, 0xC4, 0x23, 0x3A, 0x3E, 0xAF, 0x7F, 0x3C, 0xD2, 0xEA, 0x76, 0xEC, 0x57, 0x8B, 0xE6, 0x1B, 0x8F, 0xB8, 0xDC, 0xAB, 0xB8, 0xD3, 0x81, 0x56, 0xB3, 0x94, 0x16, 0x13, 0xD0,
+ 0xAC, 0x11, 0xC9, 0xE0, 0x4E, 0xB9, 0x0D, 0x0F, 0xF6, 0xDC, 0x6C, 0xB7, 0xF8, 0x43, 0x44, 0x5A, 0x1E, 0x40, 0x31, 0x17, 0x8C, 0xAE, 0x03, 0x53, 0xFB, 0xAD, 0xE6, 0xC6, 0x29, 0x50, 0x85, 0xD4, 0x78, 0x00, 0x2B, 0x58, 0x36, 0x9B, 0xE7, 0x10,
+ 0xA3, 0xA9, 0x4B, 0x2C, 0x77, 0x5D, 0x84, 0xA6, 0x81, 0xDB, 0x98, 0x61, 0x16, 0x92, 0x92, 0x9E, 0xE4, 0x69, 0x50, 0x8C, 0xED, 0x5A, 0x1B, 0x58, 0x08, 0xFB, 0xFA, 0x46, 0xF7, 0x5D, 0x4C, 0xF2, 0x25, 0xFE, 0xA4, 0xD0, 0x9B, 0x81, 0x09, 0x6C,
+ 0x8D, 0x30, 0x41, 0xF7, 0xEA, 0xEC, 0x23, 0xE8, 0x20, 0xE3, 0x83, 0x68, 0x10, 0xC6, 0x18, 0x3C, 0xD9, 0x81, 0xB9, 0x60, 0x0C, 0x86, 0x25, 0xF0, 0x7D, 0x51, 0xCC, 0xEF, 0x56, 0x06, 0x82, 0x98, 0x73, 0x0C, 0x12, 0x8E, 0x28, 0x4A, 0xD5, 0x94,
+ 0xC5, 0xDD, 0x14, 0xF6, 0xB0, 0x0A, 0x12, 0x16, 0x20, 0x57, 0x3E, 0x7E, 0x10, 0x63, 0xDE, 0x99, 0xB5, 0x12, 0x42, 0xF2, 0xBA, 0x61, 0x8A, 0xA2, 0x06, 0xCB, 0xED, 0x67, 0x6E, 0xCC, 0xA1, 0x05, 0x19, 0x6E, 0x44, 0x2B, 0x1F, 0xCF, 0xD6, 0x9E,
+ 0x6F, 0x7E, 0xBE, 0xDF, 0x59, 0xB2, 0xF2, 0x3E, 0x5E, 0x38, 0x76, 0x06, 0x3A, 0xE1, 0x4B, 0x02, 0x5C, 0xE2, 0xA1, 0x6C, 0x44, 0x8F, 0x09, 0x77, 0x6E, 0xCD, 0x4A, 0x8B, 0xCE, 0x51, 0x5A, 0x51, 0x21, 0x36, 0x87, 0x7C, 0xF5, 0x20, 0x16, 0xE0,
+ 0xF1, 0x6F, 0xE5, 0x19, 0x5E, 0x40, 0xB2, 0x5C, 0xA0, 0x3C, 0xB8, 0x32, 0xAF, 0xB6, 0x4E, 0x0A, 0xCD, 0x85, 0xE6, 0xAE, 0xF1, 0x5C, 0x99, 0xB7, 0x4C, 0xD8, 0x41, 0x54, 0x08, 0x9B, 0xB0, 0x6B, 0x93, 0x91, 0x28, 0xD3, 0x4F, 0xB0, 0x7A, 0x83,
+ 0x5A, 0xF6, 0x34, 0x62, 0xB9, 0x27, 0xCD, 0x1D, 0x0D, 0x3A, 0xB7, 0x89, 0x13, 0x41, 0x5C, 0xFA, 0x9D, 0x1A, 0x9C, 0xF6, 0xD2, 0xA0, 0x63, 0x0D, 0x8A, 0xEB, 0x52, 0xB5, 0x30, 0x93, 0x0B, 0x81, 0x53, 0xFE, 0x94, 0xB5, 0x80, 0x08, 0x6A, 0x91,
+ 0x68, 0x90, 0x10, 0x6B, 0x06, 0x3A, 0xA6, 0x17, 0xBC, 0x42, 0x7C, 0x63, 0x0C, 0x83, 0xCC, 0xC5, 0x66, 0x4E, 0x32, 0xF0, 0xA4, 0xE7, 0x23, 0x40, 0xF6, 0x87, 0x13, 0x15, 0xEA, 0x60, 0xD1, 0x17, 0x53, 0xA0, 0xA2, 0x4B, 0x63, 0x7B, 0xD7, 0x4B,
+ 0x59, 0x33, 0x5B, 0xA9, 0x80, 0x0D, 0xCA, 0xA7, 0x59, 0xA7, 0x50, 0xAE, 0x4B, 0xD0, 0x22, 0x90, 0x0E, 0x41, 0x99, 0xD8, 0x4B, 0xE1, 0x6D, 0x3C, 0xAD, 0xDA, 0xA4, 0x63, 0x41, 0xA5, 0xA4, 0x59, 0xE8, 0x5A, 0xEE, 0xC2, 0xEE, 0x3C, 0x11, 0x10,
+ 0xE4, 0xE5, 0x53, 0x19, 0x31, 0x25, 0x2D, 0x5C, 0xE5, 0x50, 0x04, 0xDF, 0x40, 0x92, 0x0C, 0xCB, 0x2F, 0xD8, 0x7B, 0x5D, 0x91, 0xA5, 0xEF, 0x08, 0x72, 0x29, 0x29, 0xF6, 0x9C, 0x2D, 0xC2, 0xA5, 0x42, 0x56, 0xC9, 0x7D, 0x8C, 0x8D, 0x16, 0xC9,
+ 0x1D, 0xFC, 0x13, 0xB6, 0x76, 0x78, 0xAD, 0xCF, 0x79, 0x4D, 0x41, 0xA1, 0x92, 0xD5, 0xE6, 0xE8, 0x82, 0xD0, 0x6F, 0x37, 0xBD, 0x4A, 0xC2, 0xB4, 0x68, 0x42, 0x72, 0xBB, 0x34, 0xD8, 0x5E, 0xAE, 0x8B, 0x65, 0x45, 0xCC, 0xBF, 0xE7, 0xA1, 0x56,
+ 0x82, 0x43, 0x3F, 0x16, 0x12, 0xFB, 0xD0, 0x3A, 0x1A, 0x63, 0xC8, 0x30, 0xAE, 0xEA, 0xAD, 0xF2, 0x71, 0x00, 0xA7, 0x0A, 0xAC, 0x63, 0x78, 0x8A, 0xA5, 0xC0, 0xB4, 0x2B, 0x1D, 0x8C, 0x82, 0xBD, 0x27, 0x97, 0xC6, 0x6A, 0x23, 0x6A, 0x57, 0x82,
+ 0xFD, 0xFF, 0x3C, 0x86, 0x25, 0x0D, 0x0E, 0xBA, 0xD6, 0xBD, 0x4F, 0xDB, 0x5F, 0xAD, 0x53, 0xEC, 0x9B, 0x24, 0x97, 0xAC, 0x72, 0x0D, 0xFB, 0xC2, 0xEC, 0x8E, 0xB3, 0x01, 0x23, 0xCD, 0xC7, 0x3A, 0x8B, 0x48, 0x85, 0x0B, 0x3F, 0xF2, 0xEE, 0x40,
+ 0x66, 0x00, 0xDF, 0x45, 0xB6, 0x34, 0xD4, 0x2D, 0x64, 0x7B, 0x8C, 0x68, 0x4A, 0xC2, 0x09, 0x58, 0x7F, 0x8B, 0x9C, 0x1F, 0x32, 0x4C, 0xF8, 0xB8, 0xA3, 0xD0, 0x58, 0xF3, 0x29, 0x48, 0x8B, 0x20, 0x97, 0xFD, 0x41, 0x0B, 0x88, 0x39, 0xAC, 0xE8,
+ 0x07, 0x5C, 0x0E, 0xCD, 0x3D, 0x6F, 0xF0, 0xA3, 0xAD, 0xA3, 0x66, 0xBE, 0x97, 0x9B, 0x34, 0xED, 0x1C, 0xB3, 0x02, 0x16, 0x03, 0x4B, 0xB8, 0x50, 0xA6, 0x1C, 0xE5, 0x16, 0x9C, 0x1B, 0x37, 0x93, 0x24, 0x1D, 0x07, 0x8B, 0x4B, 0x22, 0x21, 0xF7,
+ 0xDB, 0xFB, 0x77, 0x15, 0xD6, 0x32, 0xBD, 0x4A, 0x8A, 0x8F, 0xC6, 0x65, 0x0A, 0xEF, 0x79, 0x51, 0xD3, 0xAF, 0x13, 0x37, 0xE0, 0xA5, 0x1A, 0x7D, 0xF5, 0x81, 0x4E, 0xB5, 0x7A, 0x45, 0xBD, 0x14, 0x4C, 0x69, 0x42, 0x8C, 0x61, 0x95, 0x72, 0x8B,
+ 0xD0, 0x1B, 0xE5, 0x17, 0x28, 0x10, 0xAF, 0x64, 0x88, 0x57, 0xB2, 0x52, 0x42, 0xF7, 0xD3, 0xEA, 0xBE, 0x93, 0x94, 0x86, 0x80, 0x0E, 0xD8, 0x48, 0x5B, 0x1C, 0xF5, 0x4C, 0xCB, 0xD3, 0x30, 0xD0, 0x35, 0x30, 0xAC, 0x61, 0x1E, 0x96, 0xB4, 0xAA,
+ 0xF4, 0x68, 0x06, 0x5C, 0xB6, 0x57, 0x21, 0xF5, 0x01, 0x5F, 0x29, 0xCA, 0xE9, 0x3E, 0x3F, 0xF2, 0xDB, 0xBD, 0x09, 0x5D, 0x72, 0x8C, 0xB9, 0xA9, 0x37, 0x86, 0x37, 0x15, 0x1E, 0xD8, 0x05, 0x6C, 0x60, 0xC7, 0x2D, 0x5A, 0x2C, 0x8E, 0x19, 0x81,
+ 0x94, 0x0B, 0xEB, 0x48, 0x5B, 0xF9, 0x66, 0x5A, 0x60, 0xEC, 0x5C, 0x2C, 0x2B, 0xB3, 0xDD, 0x56, 0x67, 0xA5, 0x1E, 0x63, 0xA0, 0x5B, 0x9A, 0xED, 0xBF, 0x96, 0x63, 0xBF, 0x71, 0xF1, 0x79, 0x5C, 0xBD, 0xD7, 0x11, 0x9C, 0x7E, 0x04, 0xE9, 0xDD,
+ 0xC7, 0xD9, 0x35, 0x22, 0x12, 0x1F, 0x0D, 0x23, 0x68, 0x70, 0x7C, 0x4A, 0x52, 0xD2, 0xEF, 0x03, 0x90, 0xCF, 0x20, 0x3C, 0xB7, 0x94, 0xBC, 0xC6, 0x22, 0xE1, 0xC9, 0xD2, 0xC9, 0x80, 0x9B, 0xDF, 0x40, 0x2C, 0xAD, 0x58, 0x52, 0x82, 0x1C, 0x2C,
+ 0x6E, 0xB7, 0xF0, 0x00, 0x7D, 0x71, 0xD0, 0xC0, 0xB2, 0x40, 0x4B, 0xD4, 0x90, 0x4D, 0x16, 0x36, 0xBD, 0x83, 0xF8, 0x09, 0xE7, 0x64, 0xBF, 0xA4, 0xA6, 0xB7, 0xC0, 0x35, 0xEC, 0x25, 0x4E, 0x1A, 0x5C, 0x08, 0xF4, 0xE2, 0xA1, 0x53, 0xA4, 0x6B,
+ 0x73, 0xF4, 0x22, 0x11, 0xCA, 0x84, 0xC3, 0x8B, 0x8E, 0xE4, 0x41, 0x7F, 0xE0, 0x2A, 0x3B, 0x7B, 0xE9, 0x00, 0x7D, 0xBD, 0xDA, 0x28, 0x8D, 0x75, 0x55, 0x6D, 0x0F, 0x35, 0x3C, 0x73, 0x41, 0xFA, 0xC6, 0x54, 0x82, 0xFF, 0x71, 0x03, 0x20, 0x90,
+ 0x02, 0xB3, 0x19, 0x80, 0x50, 0x4D, 0x86, 0xD1, 0x0D, 0x29, 0x7E, 0xC4, 0xE3, 0xAD, 0xC7, 0xCE, 0x89, 0x51, 0x29, 0x98, 0x0D, 0x4F, 0x54, 0x15, 0x18, 0x50, 0xBE, 0xA3, 0xB0, 0x06, 0xAF, 0x95, 0xFB, 0xC6, 0xD1, 0xF7, 0x7C, 0xF0, 0xC8, 0x8E,
+ 0x90, 0xC6, 0x06, 0x15, 0x40, 0xF4, 0x64, 0x92, 0xC0, 0xE0, 0x89, 0x46, 0x21, 0xFE, 0xA6, 0xDA, 0xB6, 0x2E, 0x98, 0x3F, 0x33, 0x67, 0x98, 0xC2, 0x28, 0xD2, 0x57, 0xC3, 0x72, 0xFB, 0xDB, 0x3A, 0x6C, 0x71, 0x93, 0x1A, 0x66, 0x6F, 0xBB, 0x70,
+ 0x47, 0xB2, 0xCE, 0xDE, 0x9F, 0x8E, 0x1F, 0x2D, 0x71, 0x8E, 0xF7, 0x2C, 0xFD, 0x97, 0x2D, 0x81, 0x93, 0x76, 0xD5, 0x82, 0x45, 0xFB, 0x68, 0xF5, 0x37, 0xE5, 0xD5, 0x38, 0x4B, 0x4B, 0x8A, 0x9C, 0x7B, 0x83, 0xB1, 0xA5, 0xE4, 0xDD, 0xF6, 0x56,
+ 0x97, 0x6B, 0xD0, 0xD9, 0x37, 0xEC, 0xF5, 0x44, 0xC5, 0xC3, 0xCF, 0x65, 0xB4, 0x3B, 0x63, 0x85, 0x1B, 0x22, 0x1A, 0x51, 0x0C, 0xAF, 0xF8, 0xFB, 0x68, 0xD7, 0x6B, 0x3D, 0x34, 0xD0, 0xA2, 0xB2, 0x09, 0xE1, 0xF0, 0xD6, 0x11, 0x05, 0xCE, 0xC9,
+ 0xA2, 0xDF, 0x66, 0x9F, 0x5C, 0xCE, 0xB8, 0xE9, 0x2F, 0xA7, 0x0C, 0xCA, 0x0C, 0x94, 0xB2, 0x1D, 0x40, 0x57, 0x36, 0xC1, 0x1F, 0xB8, 0xE5, 0x3C, 0x42, 0x25, 0x8A, 0xB7, 0xD7, 0x68, 0x73, 0x0B, 0x32, 0xE0, 0xE0, 0x94, 0xE7, 0x75, 0x42, 0xA1,
+ 0xA9, 0x4F, 0x96, 0xB9, 0x0C, 0xD7, 0xBC, 0x64, 0xDF, 0x04, 0x68, 0x35, 0x0F, 0x85, 0x7C, 0x0D, 0x86, 0x5F, 0x56, 0xE3, 0xD8, 0x64, 0x80, 0x84, 0x0C, 0xE8, 0x22, 0x70, 0x1D, 0xAB, 0xAD, 0x8E, 0x6A, 0x36, 0x7B, 0x12, 0x5F, 0x5B, 0x24, 0xEB,
+ 0x62, 0x58, 0xB2, 0xE0, 0xD2, 0xCD, 0xF7, 0x99, 0xA8, 0xC9, 0x5D, 0x02, 0x39, 0xF2, 0xAA, 0x03, 0x83, 0x2F, 0x62, 0x73, 0x3C, 0x00, 0xFF, 0xB8, 0x58, 0xC7, 0x25, 0xB3, 0x4D, 0xE3, 0xA6, 0x9B, 0x24, 0xBE, 0x1A, 0x1C, 0x19, 0xC2, 0xCF, 0x3D,
+ 0xD2, 0x22, 0x3A, 0x79, 0x11, 0xFB, 0x55, 0x2D, 0x1C, 0x7A, 0xEB, 0x50, 0x8C, 0xF9, 0x23, 0x64, 0x5E, 0x33, 0x05, 0xDE, 0xAE, 0x15, 0xC9, 0x4D, 0x47, 0x67, 0xF4, 0xF3, 0xD1, 0xD7, 0x56, 0x42, 0x27, 0x14, 0x42, 0x0A, 0x98, 0x09, 0x82, 0xCD,
+ 0x99, 0x89, 0x03, 0x6A, 0x09, 0x12, 0x35, 0x9B, 0x9E, 0xB8, 0xFA, 0xB3, 0xAE, 0x51, 0x46, 0x68, 0xBB, 0x8C, 0xC8, 0xCF, 0xDB, 0x6B, 0xCD, 0x7E, 0x1B, 0x4B, 0x09, 0x1F, 0x0D, 0xBD, 0x5B, 0xC4, 0x56, 0x7C, 0x59, 0x4C, 0x0C, 0x1B, 0xA1, 0xBF,
+ 0xC9, 0x47, 0x6C, 0x26, 0xAA, 0xB6, 0x74, 0x1D, 0x22, 0x7D, 0x3E, 0x02, 0x9A, 0x88, 0x57, 0x38, 0x8E, 0x4D, 0xB6, 0xC6, 0x6E, 0x34, 0xCC, 0xA5, 0x33, 0x4E, 0x39, 0x8B, 0x29, 0x0F, 0xBE, 0xA2, 0x23, 0x01, 0xFE, 0x61, 0x75, 0x19, 0x55, 0x53,
+ 0xFC, 0x20, 0x44, 0xAA, 0x0A, 0xF6, 0x7E, 0x4A, 0x7E, 0x2B, 0xD9, 0x35, 0x50, 0xD8, 0x80, 0xE1, 0xB9, 0x7D, 0x45, 0xED, 0x61, 0x62, 0x03, 0xCD, 0x9B, 0xA5, 0xC8, 0x08, 0xA6, 0xB0, 0x7A, 0xED, 0x10, 0x75, 0xF5, 0x09, 0x76, 0x9C, 0xF3, 0x48,
+ 0x04, 0x21, 0x16, 0x5A, 0xD5, 0x51, 0x31, 0x0A, 0xD8, 0xF4, 0xD4, 0xB2, 0xC6, 0x21, 0x51, 0xD0, 0xDC, 0x71, 0xDD, 0x80, 0xC3, 0xA2, 0xC1, 0xA4, 0x18, 0x64, 0x3B, 0x6C, 0x27, 0xFB, 0x03, 0x4D, 0x5B, 0x3E, 0x05, 0xEE, 0x72, 0xA6, 0xB3, 0x26,
+ 0xC0, 0x6E, 0xB5, 0x4D, 0x52, 0xBC, 0xA2, 0xEB, 0x5A, 0xAB, 0x3C, 0x40, 0x95, 0xD3, 0x0E, 0xC7, 0x16, 0xE0, 0x88, 0x53, 0xBE, 0xC9, 0x73, 0x60, 0x05, 0xDB, 0x64, 0xED, 0xB9, 0xAC, 0xD2, 0x89, 0xB6, 0x04, 0x27, 0xC6, 0xA0, 0x0B, 0x20, 0x23,
+ 0x72, 0x74, 0x1F, 0x60, 0x8D, 0x8F, 0xC0, 0xE6, 0xA1, 0xF8, 0x9D, 0x14, 0x69, 0x4D, 0xFA, 0x9C, 0xDE, 0x89, 0x9A, 0xA5, 0x12, 0x0F, 0x06, 0x15, 0x3E, 0xFC, 0x9B, 0x7D, 0xA6, 0xF7, 0x6F, 0x16, 0x58, 0x75, 0xF0, 0xE1, 0x05, 0x5D, 0x22, 0x57,
+ 0x79, 0xF3, 0x0C, 0x79, 0xFC, 0x8C, 0xC3, 0x62, 0x7E, 0xA0, 0x9F, 0x02, 0xC8, 0x04, 0x1E, 0x67, 0xEF, 0x4E, 0xC4, 0x32, 0x20, 0x1D, 0x39, 0x29, 0x28, 0xC7, 0x4A, 0xCD, 0xA1, 0xB3, 0xED, 0xD9, 0xFC, 0x0A, 0x96, 0x6D, 0x9B, 0x3F, 0x21, 0x26,
+ 0xBE, 0xDF, 0x3D, 0xD9, 0xEF, 0xAD, 0x5B, 0xD3, 0x65, 0xB2, 0xF5, 0x6B, 0x4E, 0x65, 0x8B, 0x20, 0x88, 0xF5, 0xC2, 0x28, 0x9E, 0xB4, 0x09, 0x95, 0x46, 0x65, 0x71, 0x5F, 0x94, 0xDC, 0x7D, 0x54, 0x55, 0x93, 0x55, 0xA7, 0x8C, 0xB1, 0xAF, 0xCB,
+ 0x96, 0xAF, 0x88, 0x90, 0x26, 0xE3, 0x14, 0x38, 0x3D, 0x39, 0xC6, 0xCB, 0xCC, 0xE8, 0xBE, 0x24, 0x7B, 0x0D, 0x60, 0xAA, 0x14, 0x9B, 0x74, 0xE7, 0x63, 0xC6, 0x13, 0xBD, 0x9A, 0x79, 0x1F, 0x41, 0x87, 0x10, 0xA8, 0xC7, 0x1E, 0x25, 0xC5, 0x2F,
+ 0x56, 0x5E, 0xD4, 0xA6, 0x7C, 0x6C, 0xC2, 0xC3, 0x70, 0xD3, 0xFE, 0x13, 0x87, 0xF7, 0x2D, 0xA7, 0x5B, 0x38, 0x00, 0x12, 0x48, 0xE4, 0xD4, 0xE1, 0x9B, 0xD8, 0x35, 0x21, 0x6E, 0xF4, 0x63, 0x80, 0x28, 0x66, 0x7C, 0xA8, 0x93, 0xF9, 0x2F, 0xD1,
+ 0x94, 0x67, 0x25, 0x88, 0x93, 0x50, 0x41, 0xD0, 0xF7, 0xDE, 0xC1, 0x73, 0x75, 0xD8, 0xA2, 0x64, 0x09, 0x7D, 0x14, 0x85, 0x1A, 0xE3, 0x2A, 0x01, 0xD4, 0xE5, 0x8F, 0xE3, 0xAA, 0x2E, 0x03, 0x43, 0xD0, 0x3A, 0x55, 0xEF, 0x6C, 0xD8, 0x40, 0xA1,
+ 0x5C, 0xC6, 0x1C, 0x25, 0xA9, 0x46, 0x59, 0x8F, 0x54, 0x3E, 0x69, 0xE9, 0x03, 0xDC, 0xC7, 0x73, 0x0E, 0x56, 0x83, 0xC9, 0x6D, 0xA0, 0xCE, 0x9D, 0xCB, 0x79, 0x6B, 0x14, 0x04, 0xC8, 0x24, 0xEE, 0xEA, 0xA6, 0x1F, 0x07, 0xE5, 0xC7, 0x18, 0x0E,
+ 0x70, 0xCC, 0x75, 0xCF, 0x2B, 0xD7, 0x3C, 0x3F, 0xE3, 0xF4, 0x80, 0x73, 0xE3, 0xC7, 0xA6, 0x18, 0x16, 0x9E, 0x35, 0xAC, 0x6B, 0x13, 0xA3, 0xE7, 0xF4, 0x44, 0xA9, 0x45, 0x05, 0x5B, 0xB2, 0xC4, 0x34, 0x22, 0x1B, 0x9B, 0x56, 0xBF, 0x42, 0xC1,
+ 0x1E, 0xA0, 0x34, 0x34, 0x27, 0x95, 0x42, 0x3C, 0x17, 0x04, 0x92, 0xF5, 0x24, 0x24, 0xAF, 0xAF, 0x66, 0x0D, 0x02, 0xAC, 0x51, 0xB3, 0xF1, 0xF1, 0x04, 0xA1, 0x84, 0x29, 0x5E, 0x38, 0x94, 0x46, 0x57, 0x51, 0x47, 0x7C, 0xDF, 0x42, 0x86, 0x4F,
+ 0xA4, 0xE3, 0xCA, 0xAA, 0x59, 0x13, 0xDE, 0x96, 0xBA, 0xB1, 0xE1, 0xF2, 0xA7, 0xB8, 0xB6, 0xBF, 0x83, 0xF5, 0x0F, 0xCB, 0x62, 0x55, 0xF0, 0x2D, 0x7A, 0xF9, 0x14, 0x8F, 0xDB, 0xEB, 0x38, 0xC6, 0xF3, 0xA1, 0x0D, 0xF9, 0xFD, 0xAF, 0x06, 0x8E,
+ 0x7B, 0x08, 0x3E, 0x50, 0xC6, 0x85, 0x3E, 0x4E, 0x6E, 0xC4, 0x28, 0x88, 0xD4, 0x57, 0xBB, 0x6A, 0x8E, 0xED, 0x18, 0x89, 0xAD, 0xEC, 0x74, 0x41, 0x87, 0xF8, 0xEA, 0xCB, 0x0E, 0xE3, 0x4F, 0xA5, 0x49, 0x89, 0xBD, 0x3E, 0x01, 0x9E, 0x73, 0x30,
+ 0x9B, 0xD4, 0xB0, 0xAD, 0xED, 0x58, 0x87, 0xFD, 0x27, 0xEF, 0x2B, 0x37, 0x54, 0xBE, 0x87, 0x9E, 0x33, 0x02, 0x63, 0xE5, 0x29, 0x16, 0xB7, 0x45, 0x70, 0x67, 0x1A, 0x9F, 0x3C, 0x28, 0x2E, 0x2E, 0xA1, 0xA4, 0x1C, 0x13, 0x43, 0xEB, 0xF7, 0x72,
+ 0xAD, 0xED, 0x56, 0x23, 0x57, 0x98, 0x66, 0xF3, 0x5E, 0x0D, 0x17, 0x89, 0x60, 0xF1, 0x29, 0xB1, 0xD6, 0x83, 0x14, 0x91, 0x5F, 0xA8, 0x5B, 0xF9, 0x63, 0x04, 0x89, 0xAA, 0x36, 0x09, 0x3D, 0xD9, 0x0B, 0xB4, 0x5B, 0x2D, 0xB6, 0x2B, 0xED, 0x38,
+ 0xA2, 0x72, 0xC3, 0xEE, 0x23, 0xB6, 0x86, 0x52, 0xC7, 0xCD, 0xA4, 0x64, 0xC2, 0x46, 0xC0, 0x9F, 0x34, 0xBB, 0x2C, 0x36, 0x24, 0xA1, 0x79, 0x3A, 0xAA, 0x4F, 0x20, 0xD4, 0x72, 0xF8, 0xB2, 0xFA, 0xC3, 0xE9, 0x56, 0xF2, 0x33, 0x04, 0xE8, 0x49,
+ 0x63, 0xA7, 0x02, 0xAB, 0x8B, 0xBA, 0x09, 0x23, 0x7B, 0xC3, 0x11, 0xD1, 0x42, 0xD7, 0x6A, 0xAE, 0x7C, 0xE6, 0x8F, 0xD7, 0xDC, 0xF7, 0xCA, 0x2F, 0x8F, 0x0B, 0xD2, 0xE3, 0x8B, 0x35, 0x77, 0x46, 0x90, 0x2D, 0x67, 0xC0, 0xD4, 0x82, 0x49, 0xE5,
+ 0xA0, 0x18, 0x56, 0xFE, 0xDD, 0x13, 0x8B, 0x2C, 0xA2, 0xA9, 0x50, 0x15, 0x09, 0xDD, 0xFD, 0xC3, 0xD0, 0xC6, 0x44, 0xE2, 0xE8, 0xAC, 0xF5, 0x21, 0x54, 0xA8, 0xA8, 0x41, 0xDC, 0xD2, 0x13, 0x47, 0x16, 0x35, 0xF7, 0x88, 0x78, 0x27, 0x09, 0x38,
+ 0xDB, 0x84, 0xC7, 0x5D, 0x1C, 0x5A, 0xEF, 0x74, 0x87, 0x7A, 0xAA, 0xD4, 0x39, 0x30, 0x05, 0x24, 0xEB, 0x0D, 0xBB, 0xBD, 0xBE, 0x66, 0xC5, 0xF4, 0x40, 0x04, 0x64, 0xA8, 0x94, 0x10, 0x7C, 0xDC, 0x7F, 0x62, 0xB8, 0xC1, 0x48, 0x4B, 0xE5, 0x7D,
+ 0x17, 0x89, 0xCB, 0xC7, 0x26, 0xA2, 0xA7, 0xF7, 0xE6, 0xEA, 0xDE, 0x44, 0xC9, 0x5B, 0x1D, 0x37, 0xD0, 0x8C, 0x59, 0x2F, 0xB3, 0x0D, 0xE1, 0xC0, 0x30, 0x1B, 0xF5, 0x92, 0x72, 0x90, 0x26, 0xA7, 0x8C, 0xF5, 0x0C, 0x3A, 0x33, 0x3B, 0xB0, 0x88,
+ 0xAB, 0x09, 0x44, 0x51, 0xAD, 0xDA, 0x92, 0xE6, 0xCC, 0x93, 0x84, 0xE1, 0x1D, 0x82, 0x8A, 0xC0, 0xC6, 0x1C, 0x01, 0xAF, 0x77, 0xCF, 0x9F, 0xDA, 0x38, 0x17, 0xAD, 0x72, 0x4A, 0xA7, 0x80, 0x6C, 0xA5, 0xA7, 0x47, 0x61, 0x70, 0x01, 0x12, 0xE5,
+ 0x45, 0xAF, 0x10, 0x0E, 0x4A, 0x0D, 0x46, 0xBA, 0xB2, 0x13, 0x77, 0xD0, 0x5A, 0x0E, 0x3A, 0x04, 0x8F, 0x4E, 0x94, 0x86, 0x7B, 0x4E, 0x9C, 0x3C, 0x67, 0x49, 0x36, 0x04, 0x75, 0x73, 0x5F, 0x3B, 0x98, 0x5A, 0x88, 0x77, 0x7F, 0xCD, 0x5D, 0x45,
+ 0xA0, 0xE9, 0x15, 0x96, 0xA5, 0xF4, 0x0E, 0x1B, 0x96, 0xF2, 0x79, 0xEA, 0x0B, 0xB9, 0x84, 0xCA, 0xCE, 0x6C, 0x3E, 0xFA, 0x15, 0xEF, 0xD2, 0x7E, 0x26, 0x87, 0x61, 0x47, 0xB4, 0x47, 0xBA, 0xD0, 0x98, 0x9D, 0x4B, 0x9D, 0xA6, 0x3D, 0x28, 0x15,
+ 0xF3, 0x9B, 0x64, 0xA1, 0x80, 0xCC, 0x50, 0x50, 0x40, 0x20, 0x55, 0x5F, 0xB6, 0xA8, 0x53, 0x17, 0x5D, 0xB6, 0x47, 0x8C, 0xF4, 0xE8, 0x85, 0x0A, 0xBC, 0x11, 0x13, 0xD3, 0x7D, 0x13, 0xC5, 0xB1, 0xCE, 0xB8, 0x7B, 0x77, 0xFF, 0xA5, 0xC0, 0x7E,
+ 0xA0, 0x5F, 0xE9, 0xF5, 0x4C, 0x1A, 0xE9, 0x06, 0x96, 0xDF, 0x1D, 0xFD, 0xEF, 0x2F, 0x99, 0x38, 0x54, 0x42, 0x26, 0xBF, 0xC1, 0xA4, 0x40, 0xCA, 0xB4, 0x79, 0x4B, 0x89, 0x90, 0xD1, 0x0C, 0x99, 0xBB, 0xD7, 0x55, 0x65, 0x9E, 0x44, 0xAF, 0x8C,
+ 0xA4, 0x5A, 0x38, 0x30, 0x70, 0x68, 0xFF, 0x80, 0xDD, 0xDE, 0xB9, 0xBE, 0x2F, 0x75, 0x35, 0xFF, 0x5A, 0xAE, 0x90, 0xFF, 0xC2, 0x1F, 0x48, 0xD4, 0x88, 0xBD, 0x71, 0xD1, 0x5E, 0xB6, 0x0F, 0x42, 0x61, 0x6A, 0x85, 0xD5, 0xFB, 0xCC, 0xFE, 0x98,
+ 0x39, 0x37, 0xC6, 0x34, 0x27, 0xD5, 0x62, 0x68, 0xD0, 0x8E, 0x50, 0x42, 0x32, 0x24, 0xB2, 0x59, 0x03, 0x1A, 0x5E, 0x85, 0xB4, 0xAF, 0xDC, 0x34, 0x0D, 0x66, 0x18, 0x4A, 0x19, 0xDC, 0xAE, 0xA0, 0xE2, 0xCC, 0x7A, 0xB8, 0xAC, 0x1E, 0x12, 0x86,
+ 0xBA, 0x34, 0x04, 0x42, 0xA1, 0x0E, 0xD9, 0xDC, 0xE7, 0x20, 0x4F, 0xA6, 0xB3, 0x24, 0x33, 0x32, 0x4F, 0x0A, 0xD8, 0x3A, 0x35, 0xFD, 0x94, 0xA2, 0x90, 0x59, 0xA6, 0x00, 0x47, 0xD0, 0x2A, 0xB3, 0xA1, 0x05, 0x50, 0x22, 0xCA, 0x49, 0x62, 0x13,
+ 0x4F, 0x4D, 0xBC, 0x17, 0x67, 0x69, 0xE6, 0x8C, 0x52, 0xA3, 0x4D, 0xF2, 0x65, 0x4C, 0x9D, 0xC0, 0xDC, 0xD0, 0xDC, 0xDC, 0x4A, 0xE9, 0x54, 0xD3, 0xAA, 0x48, 0x78, 0x65, 0x48, 0x01, 0xFF, 0x8E, 0xEE, 0x5A, 0xBD, 0x09, 0xCD, 0x4C, 0x0D, 0xF5,
+ 0xFB, 0x51, 0x5C, 0x04, 0x6E, 0x39, 0x73, 0x19, 0xCF, 0x4D, 0x83, 0x04, 0x98, 0xBD, 0xA8, 0x18, 0x4F, 0xC2, 0xB3, 0x4C, 0xBC, 0xD1, 0xE2, 0x35, 0x8D, 0x86, 0x0D, 0x4E, 0xDD, 0x3D, 0xDD, 0x7E, 0x24, 0xEA, 0x2D, 0xD8, 0xDC, 0x4F, 0xC4, 0x67,
+ 0x41, 0x59, 0xDB, 0xF3, 0xD8, 0xE5, 0xDF, 0x41, 0xFC, 0x91, 0xE6, 0xCB, 0x06, 0x52, 0xB4, 0xD3, 0x90, 0x90, 0x7A, 0xE8, 0x9E, 0xBC, 0x96, 0x31, 0x0C, 0xD7, 0xFA, 0x3F, 0x12, 0xF5, 0xD1, 0xEC, 0x91, 0xAE, 0xB1, 0x4E, 0x75, 0x21, 0x3A, 0x09,
+ 0x54, 0xE7, 0xFF, 0x08, 0xBD, 0x14, 0xF6, 0x43, 0xBF, 0x1D, 0x02, 0x78, 0xD3, 0xB7, 0xFC, 0x89, 0x2C, 0xAA, 0x7E, 0x54, 0x2C, 0xA9, 0x83, 0x65, 0x45, 0x85, 0xD4, 0x4B, 0xB2, 0x49, 0xCD, 0xF8, 0x1D, 0xD3, 0xF2, 0xE7, 0x28, 0xB2, 0x0A, 0x68,
+ 0x21, 0x0E, 0xC0, 0xEF, 0xE0, 0x0C, 0xDF, 0x64, 0x00, 0xCC, 0x1C, 0x46, 0x8C, 0xF4, 0x0F, 0x83, 0xCF, 0x07, 0xB1, 0xEF, 0x50, 0xE9, 0xFC, 0xEC, 0x5F, 0x8E, 0x10, 0x99, 0x1F, 0x40, 0x11, 0x0B, 0x12, 0xA3, 0x30, 0xAD, 0xE2, 0x3A, 0x89, 0xC1,
+ 0x69, 0x4D, 0x80, 0x91, 0xD0, 0x77, 0x16, 0x91, 0x4C, 0x33, 0x2D, 0xE8, 0x3E, 0x1A, 0xD3, 0xFC, 0xFB, 0x16, 0xC7, 0xE7, 0x8E, 0xAE, 0xEC, 0x3D, 0x22, 0x86, 0xC0, 0x48, 0x21, 0xA6, 0x6D, 0x5D, 0xB4, 0x04, 0x22, 0x3D, 0xE2, 0x28, 0x74, 0x6E,
+ 0xDA, 0xD3, 0x5F, 0xD8, 0x25, 0x4F, 0x33, 0x85, 0xA0, 0x68, 0xD1, 0xC8, 0xB1, 0xD6, 0x55, 0xBA, 0xDE, 0x4A, 0x22, 0x7E, 0xC4, 0x5B, 0x65, 0xE0, 0xC3, 0x71, 0x2D, 0x60, 0xA3, 0x27, 0x86, 0x28, 0x3F, 0x8B, 0x14, 0x31, 0x18, 0xCE, 0x80, 0x7A,
+ 0x3B, 0x7A, 0x95, 0xCF, 0xBB, 0x0D, 0xCE, 0x8F, 0x8C, 0x74, 0x1B, 0x24, 0x5B, 0xA6, 0xF1, 0x52, 0xD3, 0x9B, 0xD2, 0x81, 0x8C, 0x02, 0x96, 0xA7, 0x71, 0x3A, 0x45, 0x66, 0x0A, 0xE6, 0x49, 0x4C, 0x62, 0xE8, 0x0D, 0x04, 0xAF, 0x6E, 0x72, 0x7E,
+ 0x06, 0x2B, 0x6F, 0x85, 0xEE, 0x52, 0x74, 0xA8, 0xDE, 0xEB, 0x22, 0xA9, 0x7D, 0x37, 0x8A, 0x54, 0x99, 0x25, 0xD8, 0xB5, 0x05, 0x69, 0x6A, 0x50, 0x60, 0x92, 0x6C, 0x62, 0xCD, 0x8E, 0xD7, 0x7D, 0x74, 0xDF, 0xF2, 0x57, 0x31, 0xE7, 0x73, 0xE9,
+ 0x88, 0x21, 0xDA, 0x49, 0x4F, 0x9D, 0x55, 0x01, 0xF5, 0x35, 0x41, 0x54, 0x7C, 0x1C, 0xF1, 0x8A, 0xDE, 0xE6, 0x97, 0xBD, 0xC8, 0x89, 0x02, 0x3D, 0x58, 0xC3, 0x5E, 0x90, 0x6A, 0x92, 0x06, 0x61, 0x48, 0x07, 0x29, 0xA3, 0x65, 0xB7, 0xCB, 0xD4,
+ 0x54, 0xA4, 0x88, 0x39, 0x60, 0x94, 0xF3, 0x78, 0x89, 0x14, 0x87, 0xDF, 0xAC, 0xA4, 0x5B, 0x88, 0x5C, 0x4A, 0xDF, 0x28, 0xAA, 0xB2, 0xB0, 0x70, 0x90, 0xF4, 0xD9, 0x40, 0x18, 0x00, 0x0E, 0x86, 0xA4, 0xF9, 0x7F, 0xD0, 0x13, 0xA9, 0x25, 0x1E,
+ 0xAB, 0x90, 0x55, 0x9F, 0x0C, 0x0D, 0x88, 0x3E, 0x68, 0xB0, 0xA6, 0xB3, 0xD1, 0x10, 0xBE, 0x20, 0xF5, 0x7F, 0xA4, 0xF1, 0xA5, 0x64, 0x52, 0x24, 0x66, 0xA5, 0xA6, 0xB7, 0xCB, 0x45, 0x6C, 0xF0, 0x43, 0xE0, 0x6E, 0xC3, 0xE9, 0x0D, 0xEA, 0xDD,
+ 0x46, 0x44, 0xAA, 0xEC, 0xC5, 0xB9, 0x37, 0xD1, 0xB7, 0xA2, 0x6B, 0x9F, 0x6D, 0xE2, 0x2F, 0x95, 0x05, 0x6E, 0x30, 0x5F, 0x4F, 0xC6, 0x82, 0x63, 0x9D, 0xEE, 0x40, 0x69, 0x8F, 0xA4, 0x6E, 0xC2, 0xC8, 0x72, 0x8D, 0x18, 0x93, 0x59, 0xB8, 0xD2,
+ 0xAE, 0x7B, 0x9E, 0x8C, 0x1E, 0xD9, 0x66, 0x7A, 0x72, 0x29, 0x2A, 0x32, 0x02, 0x91, 0xF0, 0x22, 0x97, 0xEC, 0x1C, 0x7C, 0xD2, 0xC6, 0x4B, 0x6A, 0xA2, 0x9A, 0xB8, 0x6F, 0x53, 0xEB, 0xFF, 0x6E, 0xFE, 0x96, 0xED, 0x43, 0x45, 0xF0, 0x19, 0x44,
+ 0x5A, 0xB9, 0x38, 0x36, 0xA8, 0xE9, 0x57, 0x37, 0xC5, 0x49, 0xA6, 0xF6, 0xF8, 0x74, 0x84, 0xA5, 0xC6, 0x34, 0xC2, 0xA5, 0x22, 0xC5, 0x63, 0x26, 0x67, 0x7C, 0x23, 0x85, 0x19, 0x31, 0xA6, 0x80, 0xA0, 0x0A, 0xD1, 0x0E, 0x1C, 0x12, 0x8C, 0xD4,
+ 0xB8, 0xA5, 0x03, 0xD3, 0x74, 0x8B, 0x3E, 0xE9, 0x41, 0x3F, 0x0D, 0x33, 0x27, 0xA9, 0xBC, 0xDB, 0x5B, 0x44, 0x6C, 0x76, 0xD4, 0x6F, 0x0F, 0xE1, 0xB6, 0x5A, 0x2E, 0x49, 0xF0, 0x86, 0xD5, 0x50, 0xE7, 0xD3, 0x68, 0xFD, 0xE6, 0x65, 0x89, 0x38,
+ 0x6D, 0x74, 0xA4, 0x41, 0x14, 0xEF, 0x2E, 0x9B, 0xCF, 0xC5, 0x0A, 0x38, 0x1D, 0x4C, 0x03, 0x43, 0x01, 0xE1, 0xF5, 0xEF, 0xBC, 0x8C, 0x0D, 0x73, 0x09, 0xD0, 0xA0, 0xC4, 0x91, 0x6B, 0xED, 0xB2, 0x03, 0x49, 0x62, 0x45, 0x55, 0xEF, 0x2F, 0x70,
+ 0x55, 0x38, 0xC9, 0xB8, 0xF3, 0x39, 0x2C, 0x02, 0x40, 0x55, 0xC8, 0xAD, 0x68, 0x39, 0x92, 0x65, 0x9F, 0x1C, 0xFF, 0xCF, 0xE2, 0x8D, 0xD3, 0x17, 0xF8, 0xA5, 0xF7, 0xEC, 0x9F, 0x60, 0xED, 0xBC, 0x72, 0x0B, 0x20, 0x88, 0x94, 0x94, 0x81, 0x54,
+ 0x44, 0xCE, 0x2D, 0x3A, 0x0A, 0x50, 0xA7, 0x51, 0xAD, 0x1A, 0x48, 0x6C, 0x16, 0xAE, 0x40, 0x71, 0xF6, 0x92, 0x25, 0x14, 0x59, 0xF5, 0x7C, 0x41, 0x9A, 0x45, 0xD6, 0xA9, 0xE7, 0xB3, 0xCD, 0x0B, 0xC9, 0x03, 0x3D, 0xE9, 0x92, 0x5D, 0x71, 0xE4,
+ 0x2B, 0x2D, 0xAA, 0xFD, 0x7F, 0x00, 0xD1, 0x29, 0x39, 0x81, 0x22, 0x2B, 0x04, 0xC8, 0x76, 0xDA, 0xED, 0x80, 0xEF, 0x08, 0x22, 0x04, 0xD3, 0x99, 0x55, 0x8F, 0x84, 0x02, 0xE2, 0xE2, 0x53, 0x52, 0x67, 0xED, 0x26, 0x6E, 0xF6, 0xD3, 0x61, 0xF0,
+ 0x00, 0xBB, 0xE3, 0x30, 0x6A, 0xEE, 0x8A, 0x5A, 0xED, 0x75, 0x8A, 0x69, 0x80, 0x76, 0xB0, 0x3A, 0x26, 0xCA, 0x34, 0xBF, 0x2A, 0x9C, 0xE5, 0x9A, 0x18, 0xC1, 0xB9, 0xAC, 0x14, 0x6C, 0x86, 0x58, 0x85, 0xAC, 0x1A, 0xF7, 0xC0, 0x16, 0x52, 0xAE,
+ 0x90, 0x97, 0xBB, 0xD6, 0x24, 0x1B, 0x5C, 0xB9, 0x26, 0x7C, 0x77, 0x63, 0xB9, 0x1A, 0xDF, 0x3F, 0x52, 0xC0, 0x12, 0x2A, 0x3F, 0xB9, 0x69, 0x1A, 0x63, 0x95, 0xA4, 0x24, 0xEC, 0x1A, 0x80, 0xFF, 0xDE, 0x28, 0xDB, 0xC1, 0xDB, 0xEA, 0xEA, 0xF6,
+ 0xBB, 0xA6, 0x18, 0x35, 0x71, 0x5E, 0x7E, 0xD6, 0x70, 0x8E, 0xF7, 0xE6, 0x94, 0x45, 0x55, 0x7B, 0x18, 0xDE, 0xA4, 0x19, 0xA2, 0x80, 0x3A, 0xF9, 0xB7, 0x93, 0x99, 0xD2, 0x12, 0xA7, 0xC7, 0x6A, 0x62, 0x54, 0x40, 0x47, 0x0B, 0x5D, 0xF4, 0x7B,
+ 0x08, 0x1A, 0x52, 0xC4, 0x90, 0x26, 0x7F, 0x54, 0x4F, 0x04, 0xE1, 0xE4, 0x9C, 0x6E, 0xC3, 0xFF, 0xBB, 0xDD, 0xF3, 0x78, 0x7A, 0xEC, 0x53, 0x5C, 0xFA, 0x85, 0x62, 0x27, 0x04, 0x0F, 0x8C, 0x44, 0x81, 0x9A, 0xFD, 0x0A, 0x8F, 0xB6, 0x1C, 0xAE,
+ 0xF7, 0x02, 0x4D, 0x07, 0x3B, 0xE3, 0x97, 0x4B, 0x2D, 0x39, 0x81, 0x40, 0x2E, 0x76, 0xCC, 0x32, 0x11, 0xB0, 0x3C, 0xB7, 0x8E, 0xBF, 0xE2, 0x25, 0x63, 0x93, 0x51, 0x71, 0xE9, 0xFF, 0x18, 0xCE, 0x84, 0x2C, 0xA6, 0x1E, 0x90, 0x5E, 0x18, 0x46,
+ 0xC7, 0x22, 0x46, 0xA6, 0xA9, 0x54, 0xD7, 0x4C, 0x2F, 0x23, 0x27, 0x30, 0xB0, 0x5B, 0xC2, 0x1D, 0xA1, 0x82, 0xEE, 0x0F, 0x73, 0xC3, 0xF2, 0x54, 0xD2, 0x39, 0x4E, 0x84, 0xD7, 0x55, 0xDD, 0x10, 0xBB, 0xB0, 0xDA, 0x6D, 0x3A, 0x51, 0x5C, 0xB2,
+ 0x97, 0x8E, 0xBE, 0x38, 0xFF, 0xB1, 0x07, 0x7F, 0x83, 0xA3, 0xEC, 0x13, 0xF3, 0x57, 0x71, 0x9A, 0xD7, 0x2D, 0xD2, 0xE3, 0x56, 0x3E, 0x1E, 0x36, 0x77, 0x63, 0xDA, 0x99, 0xBF, 0x2F, 0x58, 0xBF, 0x71, 0xD4, 0x05, 0x4E, 0x73, 0x39, 0x77, 0x64,
+ 0x7B, 0xBA, 0x0F, 0xD7, 0xF6, 0x38, 0xCC, 0x24, 0x62, 0x79, 0xDD, 0x08, 0x28, 0xC2, 0xF0, 0xC0, 0xF1, 0x5B, 0x16, 0xFD, 0xBA, 0xC3, 0x07, 0x86, 0x2F, 0xF5, 0xE7, 0xBF, 0x36, 0x13, 0x34, 0xBC, 0x1F, 0xAF, 0x8C, 0xD6, 0x3D, 0x69, 0x0B, 0x9A,
+ 0x20, 0xB4, 0x65, 0x1F, 0x66, 0xB2, 0xF1, 0x44, 0x6B, 0x2F, 0x44, 0x6E, 0x0C, 0xB5, 0x76, 0x54, 0x68, 0x23, 0x61, 0x62, 0x9B, 0x4E, 0x11, 0x93, 0xAA, 0x45, 0x37, 0xCF, 0x50, 0x8A, 0x24, 0xDC, 0xEE, 0x4F, 0xEE, 0xF9, 0xA5, 0x02, 0xFF, 0x3F,
+ 0x47, 0x9B, 0x5E, 0x64, 0x38, 0x29, 0x77, 0xD7, 0x48, 0x2A, 0x7B, 0xE6, 0xEA, 0x94, 0xDB, 0x5E, 0xE1, 0xCE, 0x08, 0x50, 0x0C, 0x44, 0x4F, 0x1E, 0x89, 0x4A, 0x42, 0xB5, 0x21, 0x1F, 0xC9, 0xA4, 0xD8, 0xC9, 0xA4, 0xA1, 0x30, 0x67, 0xC7, 0x90,
+ 0xA8, 0xDD, 0xB4, 0x15, 0x10, 0x8C, 0xC9, 0x03, 0x34, 0x15, 0xFB, 0xB7, 0x31, 0xE9, 0xA7, 0x99, 0xA3, 0x4C, 0x5E, 0x1D, 0x11, 0xAA, 0x98, 0x25, 0x0E, 0xA8, 0xFF, 0x94, 0xBC, 0x8F, 0xC3, 0xEC, 0x41, 0xF9, 0x2A, 0xA7, 0x28, 0xCF, 0x45, 0x92,
+ 0x55, 0x3C, 0xA5, 0xD7, 0x15, 0xBE, 0x18, 0x25, 0x9A, 0x91, 0x1E, 0x31, 0x07, 0x0F, 0x30, 0x1D, 0x88, 0xCC, 0xD9, 0x70, 0x39, 0x01, 0x6D, 0xD9, 0x06, 0x8F, 0xB1, 0xC8, 0x2D, 0xE6, 0x0B, 0x42, 0x69, 0xC1, 0x9B, 0xB5, 0x4E, 0x0D, 0x89, 0xE2,
+ 0x28, 0x9C, 0x75, 0xFB, 0x1F, 0xA7, 0x48, 0xFC, 0x54, 0xDE, 0x4A, 0x0C, 0x81, 0x29, 0xD4, 0x88, 0x0F, 0x41, 0x69, 0x46, 0x3B, 0xE2, 0x38, 0x49, 0xB6, 0xD1, 0xA2, 0xA4, 0x7F, 0x12, 0x74, 0xC3, 0x82, 0x7D, 0xEB, 0x79, 0xCD, 0x91, 0x8B, 0xC2,
+ 0x11, 0xF4, 0x9D, 0x02, 0xE8, 0x3E, 0xCB, 0x44, 0x66, 0x58, 0x53, 0x54, 0xAA, 0x2C, 0x82, 0x4B, 0xBB, 0x1B, 0xD4, 0x8E, 0xD9, 0xC8, 0x48, 0x91, 0xE9, 0x79, 0xB6, 0x02, 0xFF, 0xFA, 0x5B, 0xBE, 0x80, 0x15, 0x72, 0x20, 0x62, 0x35, 0x4B, 0xBF,
+ 0xD2, 0x47, 0x12, 0xFD, 0xC5, 0x70, 0x93, 0xF6, 0x4F, 0xF3, 0xF3, 0x0E, 0xAF, 0x2E, 0xDD, 0xF5, 0xA7, 0x34, 0x4F, 0x04, 0x17, 0x5A, 0x60, 0x7A, 0x38, 0x85, 0xE2, 0xF4, 0x14, 0x40, 0x98, 0x96, 0xC4, 0x58, 0xDF, 0xF4, 0x03, 0x40, 0x43, 0x48,
+ 0xCB, 0xB2, 0x82, 0xEA, 0x12, 0x18, 0x0F, 0x3C, 0x25, 0x71, 0xD2, 0xCB, 0x8A, 0x7F, 0xD5, 0x75, 0x8A, 0x89, 0x45, 0xC2, 0xA1, 0x20, 0x4E, 0xC5, 0x85, 0xAD, 0x88, 0xA5, 0x87, 0xE1, 0x14, 0x57, 0xED, 0x67, 0xAF, 0x67, 0x56, 0x4C, 0x7D, 0x10,
+ 0x65, 0x39, 0xFE, 0x4D, 0x1C, 0x12, 0xEF, 0x98, 0x62, 0x36, 0x88, 0x53, 0xFD, 0x02, 0xCF, 0x62, 0x61, 0xD2, 0x8C, 0x1A, 0xC3, 0x02, 0xC8, 0xDB, 0x7F, 0xD5, 0x4E, 0x27, 0x51, 0x01, 0x7A, 0x6A, 0x76, 0x45, 0x7F, 0x61, 0x1A, 0x65, 0x22, 0x40,
+ 0x5E, 0x93, 0xD6, 0x97, 0xB7, 0x7C, 0xB8, 0xC9, 0xD7, 0xC0, 0x17, 0x76, 0xD6, 0xDC, 0xB7, 0x0F, 0xB8, 0xBA, 0xF5, 0xC7, 0x09, 0x18, 0xF1, 0x0C, 0xBB, 0xF3, 0xC7, 0xE0, 0x2A, 0x18, 0x6B, 0xD6, 0x40, 0xD2, 0x9B, 0x62, 0x72, 0xC5, 0xAA, 0x43,
+ 0x8F, 0xBD, 0x0F, 0x00, 0x3A, 0xE0, 0x3B, 0x0E, 0x1F, 0x5F, 0x9C, 0x7B, 0xBC, 0x1B, 0xC3, 0x2A, 0xA0, 0x37, 0x34, 0xBA, 0x8E, 0x49, 0x4C, 0x33, 0x72, 0xF8, 0xDC, 0x99, 0x4A, 0x7B, 0xB2, 0xCC, 0xD1, 0xF5, 0x5C, 0x3C, 0x08, 0x62, 0x8A, 0x40,
+ 0x60, 0x00, 0x60, 0x46, 0x70, 0xDB, 0xF8, 0xEA, 0x0D, 0x8E, 0x2F, 0xEB, 0x23, 0x2C, 0xA6, 0x53, 0x2B, 0x0D, 0x20, 0x62, 0xB0, 0xFC, 0xCD, 0x54, 0x28, 0xB4, 0x8F, 0x30, 0xB2, 0x6E, 0xFE, 0x64, 0x49, 0x4A, 0xEE, 0x5C, 0xEC, 0x97, 0x4E, 0xEB,
+ 0x12, 0xC3, 0x6A, 0x50, 0x3B, 0x7A, 0xF1, 0x67, 0x7C, 0xB6, 0x59, 0xC3, 0x00, 0x20, 0x98, 0x6B, 0x0A, 0x29, 0x84, 0x79, 0x00, 0xDA, 0x1B, 0x0D, 0xA3, 0x39, 0x46, 0xC2, 0x8A, 0x7F, 0x06, 0xAF, 0x05, 0x92, 0xB4, 0x92, 0xD5, 0x7C, 0x84, 0x5C,
+ 0x6E, 0x1C, 0x9B, 0xDD, 0x0F, 0x35, 0xE9, 0xC2, 0x21, 0x8D, 0x4C, 0x5E, 0xF7, 0xF6, 0x7C, 0xFA, 0xED, 0x4F, 0x57, 0xF8, 0x1D, 0x46, 0x9C, 0xBD, 0xE3, 0x98, 0xB8, 0x27, 0xEB, 0x79, 0xEE, 0xC0, 0x9E, 0xA8, 0x68, 0xF7, 0x85, 0xEE, 0x03, 0xDC,
+ 0x5D, 0x28, 0xE2, 0x82, 0xAB, 0x2E, 0xD8, 0xF7, 0x20, 0xF8, 0x29, 0xCB, 0x07, 0x6D, 0x2B, 0x88, 0x84, 0xC3, 0x3C, 0x4B, 0x6F, 0x51, 0x0E, 0x44, 0x6B, 0xC4, 0x27, 0x1E, 0x42, 0xCC, 0x33, 0x05, 0xD0, 0xD5, 0x3C, 0x87, 0x20, 0x3F, 0x58, 0x70,
+ 0xC8, 0x78, 0xE5, 0xFC, 0x72, 0x81, 0xEB, 0x10, 0x2A, 0x76, 0xCD, 0x5D, 0x82, 0xBC, 0x5C, 0x1A, 0xC5, 0x0B, 0x1D, 0xF2, 0x31, 0x2C, 0xB6, 0xAB, 0x58, 0x5F, 0x45, 0xAA, 0xF7, 0x2E, 0x3F, 0xF8, 0xDD, 0x8A, 0x5E, 0x5E, 0xD6, 0xB2, 0xBC, 0x69,
+ 0x54, 0xD6, 0xF7, 0xD3, 0x54, 0x9C, 0x1B, 0x17, 0xE6, 0xFF, 0x4D, 0x08, 0x08, 0x09, 0x7F, 0xF0, 0xAA, 0x10, 0xEF, 0x48, 0x76, 0x7C, 0x17, 0x29, 0xE0, 0x1E, 0xE0, 0x79, 0x20, 0x6A, 0xEA, 0x24, 0xC4, 0xC9, 0x7F, 0xD4, 0xDC, 0x65, 0x1D, 0xB3,
+ 0xE0, 0x81, 0x1B, 0x56, 0xBA, 0x10, 0xEC, 0xC9, 0x8F, 0x15, 0xB5, 0xBB, 0x73, 0xEE, 0xF9, 0x72, 0x2D, 0x47, 0x6C, 0x1F, 0x57, 0xF3, 0x75, 0x2C, 0x67, 0x49, 0xB3, 0x7D, 0x1B, 0x1D, 0xE0, 0x38, 0x26, 0x47, 0xCD, 0x54, 0x63, 0x33, 0xED, 0xA0,
+ 0xC4, 0xF0, 0x67, 0xDD, 0x7B, 0x72, 0x36, 0xF6, 0x09, 0x8E, 0xF1, 0x19, 0xD7, 0xFE, 0x27, 0x5F, 0x77, 0xF0, 0x46, 0x84, 0xB1, 0x57, 0xFB, 0x41, 0xFB, 0x05, 0xFD, 0x97, 0xE6, 0x4F, 0x07, 0x27, 0x2D, 0x5C, 0xA2, 0x54, 0xAC, 0xE4, 0x51, 0xA3,
+ 0xCD, 0xEF, 0xD5, 0xEB, 0x7F, 0xBF, 0x60, 0x41, 0x72, 0x30, 0x08, 0x88, 0x63, 0xF0, 0xFA, 0x01, 0x97, 0xBD, 0xFC, 0xDC, 0x2F, 0x2E, 0x24, 0xA9, 0x51, 0xE4, 0x47, 0x13, 0x4A, 0xE2, 0x81, 0x37, 0x51, 0xA4, 0x5E, 0xA4, 0xCB, 0xD1, 0x52, 0x4F,
+ 0x85, 0xF0, 0x82, 0x7F, 0x2D, 0x35, 0x89, 0x9F, 0x46, 0x7E, 0x08, 0x2B, 0x0D, 0x32, 0xF7, 0x36, 0x76, 0x74, 0x8C, 0x99, 0x6F, 0xA9, 0x50, 0x5D, 0x90, 0xD4, 0x0E, 0x85, 0x8F, 0x60, 0x0D, 0xC3, 0x89, 0xB1, 0xA1, 0x38, 0x45, 0xB9, 0x09, 0x98,
+ 0xDB, 0x9C, 0x1A, 0x46, 0x39, 0x57, 0x10, 0x10, 0x4F, 0xE4, 0xCF, 0xB4, 0xA7, 0x42, 0x01, 0x44, 0x03, 0xBF, 0xEB, 0x99, 0x09, 0x92, 0x8B, 0x79, 0xD3, 0x19, 0xC0, 0x34, 0xBF, 0x0E, 0xCA, 0x88, 0x08, 0x04, 0x86, 0x0F, 0x7F, 0x63, 0x82, 0xF2,
+ 0x76, 0x8E, 0xBD, 0x6C, 0x49, 0xBC, 0x84, 0xEB, 0xB4, 0xAD, 0xE5, 0x2D, 0x83, 0xDF, 0xDA, 0x97, 0x8B, 0x30, 0xE1, 0x32, 0x10, 0xF4, 0xCF, 0xCB, 0x9D, 0xAC, 0x48, 0x51, 0x64, 0xAD, 0x5E, 0xA3, 0x38, 0xE8, 0x3B, 0x69, 0x77, 0xC7, 0x21, 0x91,
+ 0xDC, 0x74, 0x11, 0x4A, 0xB7, 0x66, 0x16, 0x06, 0x59, 0xD7, 0x0C, 0xF6, 0x1E, 0xEF, 0x26, 0x86, 0xD5, 0x7A, 0x9D, 0x4B, 0x30, 0x37, 0xFA, 0x88, 0x7A, 0x85, 0x5A, 0x87, 0x7B, 0xE2, 0x09, 0xFD, 0x8E, 0xCF, 0xFC, 0x6B, 0xD7, 0xAE, 0xAD, 0x0E,
+ 0xAD, 0x15, 0x91, 0xFA, 0x15, 0xD5, 0x77, 0x61, 0x0E, 0x0C, 0x82, 0x5A, 0x32, 0x66, 0xFD, 0xAD, 0x96, 0xD1, 0x8D, 0xF0, 0xCA, 0xF3, 0xD5, 0x7B, 0x0A, 0xF8, 0xA0, 0x37, 0x38, 0x5F, 0xC1, 0x83, 0xCF, 0xE2, 0xEC, 0xD4, 0x40, 0x1A, 0x21, 0x4E,
+ 0x87, 0x04, 0x87, 0x8F, 0x75, 0xDC, 0x72, 0x93, 0x4B, 0xE5, 0x87, 0x10, 0x55, 0x6A, 0x6B, 0xD6, 0x78, 0x70, 0xDA, 0xCA, 0xEB, 0xCB, 0x81, 0xD4, 0x69, 0x7E, 0x3D, 0x52, 0xC8, 0xD5, 0x9B, 0xB5, 0xB3, 0x29, 0x2C, 0x72, 0x92, 0x8C, 0x2D, 0x7A,
+ 0xEF, 0xDB, 0x1B, 0x91, 0xC8, 0x4A, 0x5B, 0x53, 0x91, 0x45, 0xFB, 0x9B, 0x73, 0xC5, 0x8E, 0xC4, 0xE6, 0x02, 0x9C, 0x28, 0xCB, 0x97, 0xFD, 0xFA, 0x61, 0xBE, 0x05, 0x7A, 0x20, 0x34, 0x81, 0x7A, 0xDA, 0xAB, 0x37, 0x0B, 0x23, 0x25, 0xEF, 0x84,
+ 0xAD, 0x71, 0xC4, 0xAC, 0x24, 0xEE, 0x93, 0x25, 0x1A, 0x08, 0xC1, 0xE5, 0x8C, 0x89, 0x87, 0x6A, 0xCD, 0x45, 0x6B, 0x63, 0x40, 0xAF, 0x87, 0x60, 0xCA, 0x2C, 0x0F, 0xF4, 0xB6, 0xA8, 0xFD, 0x83, 0xDC, 0x78, 0x6A, 0x49, 0x7E, 0x3F, 0x0F, 0xFC,
+ 0xFA, 0x00, 0x4A, 0x43, 0xC8, 0x26, 0x8B, 0x79, 0xA1, 0x56, 0x70, 0xC7, 0xCC, 0x9F, 0xF3, 0x4B, 0x82, 0x51, 0x1E, 0x8B, 0xD1, 0x43, 0x9C, 0x2B, 0x98, 0x69, 0x93, 0xB7, 0x25, 0x97, 0x6E, 0xC0, 0x7C, 0xAB, 0x3C, 0xAB, 0x97, 0x1A, 0x1D, 0xB8,
+ 0xBD, 0xED, 0x8A, 0xC3, 0x18, 0x0A, 0xA4, 0xC6, 0x91, 0x62, 0xCE, 0x8D, 0xD7, 0x7E, 0xAA, 0x76, 0xA7, 0xFB, 0x83, 0xFD, 0x5F, 0x2E, 0x0C, 0x3D, 0xB5, 0x49, 0xD7, 0x8A, 0x20, 0x04, 0xF7, 0x7B, 0x6E, 0x22, 0x50, 0x7C, 0xD0, 0x0D, 0x26, 0x1A,
+ 0xA8, 0x56, 0x95, 0xC0, 0x24, 0x0D, 0x59, 0xC2, 0x69, 0xDC, 0x35, 0x3D, 0x97, 0x58, 0xE2, 0xA4, 0x87, 0xA9, 0xFC, 0x27, 0x59, 0xD1, 0x34, 0x16, 0xFC, 0xC8, 0x5E, 0xAB, 0x8C, 0xC5, 0xF7, 0x93, 0x84, 0x8D, 0x0A, 0x44, 0xBF, 0xE5, 0x3F, 0x88,
+ 0x61, 0x8D, 0x46, 0x99, 0x4A, 0x3B, 0x16, 0x9C, 0x46, 0xCE, 0xB9, 0x6F, 0xB4, 0x6F, 0xE7, 0xED, 0x56, 0x5D, 0x2C, 0xC9, 0xC3, 0xB2, 0x69, 0x20, 0x38, 0x92, 0xBF, 0xF4, 0x9C, 0x69, 0xC1, 0xAC, 0xE5, 0x78, 0x38, 0xC8, 0xFD, 0x2D, 0x4B, 0x8B,
+ 0x37, 0xAD, 0x84, 0x5D, 0xE8, 0x77, 0x27, 0x3A, 0xE2, 0x86, 0x14, 0x59, 0x5E, 0x6B, 0x07, 0x31, 0x8E, 0x8C, 0xA1, 0x3F, 0x84, 0x87, 0xF8, 0x8A, 0x49, 0x60, 0x42, 0x7E, 0x3C, 0xA5, 0x31, 0x41, 0x91, 0x75, 0x18, 0xDB, 0x51, 0xD4, 0x64, 0x3E,
+ 0x06, 0x8E, 0xEC, 0x18, 0x6E, 0x89, 0xFD, 0xE1, 0x5D, 0x1E, 0xA0, 0xE4, 0x4A, 0x03, 0x3D, 0x00, 0x6C, 0x79, 0xE3, 0xCC, 0x04, 0x69, 0x97, 0x31, 0x7A, 0x59, 0x25, 0xE9, 0xA6, 0xDD, 0x43, 0xD8, 0x4E, 0x68, 0xF4, 0x09, 0xB8, 0xA9, 0x5A, 0xD8,
+ 0x21, 0x1C, 0x26, 0xE3, 0x78, 0x38, 0xCA, 0x6D, 0xC3, 0x02, 0x22, 0xD0, 0xF8, 0x5A, 0xA5, 0x92, 0x3B, 0xA3, 0x02, 0xC8, 0x88, 0x57, 0x0A, 0xAD, 0xF8, 0x90, 0x77, 0x0B, 0x83, 0x3A, 0x38, 0x84, 0x54, 0xC0, 0xF0, 0xC6, 0xB0, 0xB0, 0xE4, 0xA8,
+ 0xA2, 0x9C, 0x99, 0xC9, 0xE9, 0xE4, 0x85, 0x89, 0x5E, 0xF8, 0x5E, 0x16, 0x5B, 0x1E, 0x2A, 0xA7, 0x2E, 0x05, 0xB5, 0x5E, 0x8B, 0x72, 0x1D, 0xCF, 0xB5, 0x8A, 0x66, 0x02, 0x3B, 0xDF, 0x00, 0xF3, 0x8D, 0xE0, 0x0F, 0x23, 0xE1, 0xFF, 0x62, 0x5B,
+ 0x4E, 0x6F, 0x66, 0xC1, 0xDB, 0xBC, 0xE7, 0x56, 0x08, 0xDC, 0x8E, 0xCF, 0x1E, 0x9D, 0x05, 0x55, 0xDC, 0xC2, 0x06, 0xBB, 0x9F, 0x7B, 0x13, 0xCA, 0x80, 0xAF, 0x8D, 0x93, 0x02, 0x26, 0xF8, 0x18, 0xDA, 0x68, 0x19, 0xE2, 0x00, 0x26, 0xC5, 0x13,
+ 0x16, 0x3F, 0x67, 0x22, 0x19, 0x90, 0x2A, 0x63, 0x28, 0xEA, 0x84, 0x62, 0x2C, 0x98, 0xEE, 0xAF, 0xAE, 0x17, 0x90, 0x55, 0x50, 0xE4, 0xA8, 0x4F, 0x5E, 0x63, 0xE3, 0x7F, 0x9C, 0xD0, 0x1B, 0x2E, 0x23, 0xA7, 0x8A, 0xAB, 0x73, 0x33, 0x24, 0x2E,
+ 0xB3, 0xE7, 0xE1, 0x43, 0x0B, 0xEB, 0xFD, 0xA2, 0xD6, 0x6A, 0x87, 0x0A, 0x99, 0xF6, 0x41, 0xF6, 0x3F, 0x0C, 0x16, 0x43, 0x05, 0x0A, 0x52, 0xE0, 0x94, 0xD8, 0x13, 0x5C, 0xBD, 0xC4, 0x95, 0xA8, 0xCF, 0x9E, 0x58, 0x9D, 0x29, 0xB6, 0xB5, 0x87,
+ 0x13, 0x96, 0x6E, 0x7B, 0x34, 0xB5, 0xCC, 0x61, 0xB7, 0x9C, 0x0D, 0x31, 0x3F, 0x31, 0x56, 0x14, 0xA8, 0x3C, 0xB7, 0x78, 0x2C, 0x88, 0xA4, 0x8A, 0x35, 0x0E, 0x84, 0x57, 0x77, 0xCF, 0xF8, 0xE1, 0xC7, 0x70, 0x38, 0x06, 0x95, 0xD0, 0xD5, 0x5C,
+ 0x56, 0xC3, 0x7B, 0x10, 0x6F, 0x90, 0xD6, 0x8C, 0x92, 0x80, 0xC9, 0xF0, 0x8E, 0x57, 0xBF, 0xB3, 0x3F, 0xBF, 0x45, 0x20, 0x7E, 0xFE, 0x82, 0xD2, 0x90, 0x2E, 0x59, 0xB7, 0x43, 0x33, 0x27, 0xC9, 0xB9, 0x9A, 0x9D, 0x88, 0xE5, 0xF2, 0xE4, 0xA0,
+ 0x6C, 0x9D, 0x36, 0xC8, 0x42, 0x36, 0xC5, 0x4B, 0xBD, 0x0F, 0x26, 0x0B, 0x07, 0x19, 0x3E, 0x76, 0x7C, 0x27, 0xC0, 0xFE, 0x59, 0xE7, 0xA2, 0x04, 0xCA, 0x4D, 0x73, 0xC7, 0xC2, 0x9E, 0x41, 0x38, 0xEF, 0xDC, 0xEB, 0x54, 0xD5, 0xE4, 0x42, 0x26,
+ 0xF6, 0x5F, 0xB5, 0x13, 0x17, 0x92, 0xD6, 0x9B, 0xCB, 0xDF, 0x9F, 0x1F, 0x1E, 0xD3, 0x38, 0x27, 0x50, 0xC9, 0xE5, 0x9C, 0xFB, 0xF2, 0x02, 0xD4, 0x31, 0xC4, 0x86, 0x7D, 0x3F, 0x94, 0x56, 0xA3, 0xFD, 0xC1, 0x2A, 0xB9, 0xC6, 0x36, 0x7B, 0xA6,
+ 0xEC, 0x37, 0x9A, 0x04, 0x67, 0x8B, 0x45, 0x9C, 0xD7, 0xB1, 0xEF, 0x36, 0x1E, 0xB6, 0x11, 0xA0, 0xE8, 0xBD, 0xB6, 0x44, 0x5A, 0xB1, 0x40, 0x5B, 0x67, 0xBC, 0x94, 0x9C, 0x2F, 0x50, 0x78, 0xAA, 0xAB, 0xD0, 0x90, 0x67, 0xC8, 0x64, 0x58, 0x4D,
+ 0x06, 0x83, 0x02, 0xD2, 0x26, 0x45, 0x82, 0xF8, 0xFA, 0xD6, 0x57, 0xD0, 0x6E, 0x5E, 0x8C, 0x31, 0x20, 0xE7, 0x46, 0x12, 0x3E, 0x39, 0x12, 0xD5, 0x84, 0x74, 0x5F, 0x70, 0xAA, 0xC3, 0xCD, 0x85, 0x25, 0xAA, 0xD3, 0xCB, 0x56, 0xA6, 0x71, 0x6A,
+ 0xE8, 0x2C, 0x4D, 0xCB, 0x6B, 0x0F, 0x16, 0xB2, 0xA0, 0x84, 0xF4, 0xFC, 0xC6, 0x67, 0xD2, 0x35, 0xF7, 0x62, 0xAA, 0x5A, 0x3F, 0x17, 0xA7, 0x40, 0x14, 0xC2, 0xB2, 0x44, 0xD8, 0x49, 0x28, 0x5E, 0x34, 0xB0, 0x0A, 0xA3, 0xE3, 0xBF, 0xCF, 0xFA,
+ 0xC6, 0x8D, 0x2A, 0x80, 0xD2, 0x82, 0xFD, 0x6D, 0x35, 0x1E, 0x17, 0x0C, 0x1B, 0x51, 0xD6, 0x90, 0xAE, 0x91, 0x5E, 0x40, 0x28, 0x26, 0x56, 0xF3, 0x5B, 0xBB, 0xE3, 0x39, 0x78, 0x81, 0x1C, 0x68, 0x18, 0xB5, 0x41, 0x0C, 0x43, 0xB6, 0x86, 0x38,
+ 0xD1, 0x1B, 0xF5, 0x96, 0x2E, 0x2F, 0xAD, 0x1F, 0x48, 0xD9, 0xF5, 0xB7, 0x23, 0x85, 0x90, 0xD9, 0x58, 0x5D, 0x6E, 0x71, 0x75, 0x22, 0x15, 0xA0, 0x74, 0x72, 0xCC, 0x73, 0x20, 0x0C, 0xBB, 0x8B, 0x4C, 0xDE, 0xF8, 0xC8, 0x07, 0x79, 0x04, 0xF6,
+ 0x26, 0x78, 0x20, 0x8D, 0x49, 0x38, 0x26, 0x04, 0x0C, 0x1B, 0xF1, 0x62, 0x4F, 0xF6, 0x9F, 0x89, 0x78, 0x6C, 0x60, 0x7D, 0xE6, 0xB7, 0x1E, 0x88, 0xB5, 0x22, 0x6E, 0x5B, 0xD4, 0xE8, 0x2D, 0x4A, 0x5A, 0xCD, 0x11, 0xE3, 0x59, 0x20, 0x97, 0xE2,
+ 0xD8, 0x85, 0xAE, 0xAF, 0x3E, 0x2B, 0xD2, 0xF4, 0xD6, 0xB2, 0xA4, 0xA6, 0x26, 0x14, 0x10, 0xF4, 0xE4, 0xC1, 0x69, 0xE2, 0x04, 0x4C, 0x38, 0xB1, 0x32, 0xEB, 0xF3, 0xFA, 0x3D, 0x4E, 0x57, 0xB4, 0x41, 0x46, 0x77, 0x85, 0x59, 0x0F, 0x76, 0xDC,
+ 0x03, 0xED, 0xCB, 0xCC, 0x39, 0x80, 0xC0, 0x7F, 0x56, 0x23, 0xD8, 0x6F, 0x13, 0x02, 0x29, 0x1F, 0x52, 0xF8, 0x80, 0x8E, 0xDA, 0x73, 0x82, 0x02, 0xC7, 0xF4, 0x22, 0xAC, 0xBF, 0xBA, 0xE1, 0xC8, 0xE9, 0x11, 0xDB, 0x28, 0x87, 0x11, 0x62, 0x4E,
+ 0x00, 0xDC, 0xE9, 0x8B, 0x87, 0xF2, 0x39, 0xE9, 0xA2, 0x38, 0x20, 0x60, 0x55, 0xE2, 0x90, 0x2A, 0xA7, 0x03, 0xFD, 0x63, 0xA6, 0x25, 0x78, 0x8D, 0x0F, 0x70, 0x6D, 0x3F, 0x72, 0xB8, 0x5C, 0x4C, 0x87, 0xA7, 0xAB, 0x3E, 0x8E, 0x43, 0xA8, 0xD3,
+ 0x2D, 0x5E, 0x3C, 0x99, 0x41, 0xA0, 0xD7, 0xCE, 0xF0, 0x84, 0x84, 0x35, 0x87, 0x30, 0xB3, 0xDE, 0x29, 0xA0, 0x0A, 0xCC, 0x82, 0x26, 0x2D, 0x74, 0xA1, 0xA8, 0x46, 0xCF, 0x30, 0x83, 0x8A, 0xAD, 0xC6, 0xDB, 0x1B, 0x40, 0x97, 0x0B, 0xF8, 0xEE,
+ 0xCC, 0x6C, 0xF5, 0x55, 0x70, 0xB9, 0x51, 0x5C, 0xF5, 0xD7, 0xEE, 0x93, 0xCB, 0x3C, 0x10, 0x01, 0xAE, 0xDF, 0x35, 0x98, 0xDE, 0xE9, 0xA7, 0xDE, 0x51, 0x38, 0x7B, 0x31, 0xEB, 0x63, 0xED, 0xD5, 0x03, 0x1B, 0xCB, 0x24, 0x65, 0x68, 0x9F, 0x47,
+ 0x7C, 0x4D, 0x96, 0x57, 0xF1, 0xE0, 0xE1, 0x91, 0x3C, 0x07, 0x32, 0x62, 0xE1, 0x55, 0xF8, 0x65, 0xCF, 0x21, 0xCD, 0x34, 0xED, 0xAF, 0x57, 0xF4, 0x69, 0xED, 0x57, 0x77, 0x95, 0xB3, 0x01, 0xB0, 0x65, 0xFA, 0xB5, 0x15, 0x2E, 0x75, 0xB3, 0xF5,
+ 0x3D, 0x50, 0x74, 0xA1, 0xD2, 0x93, 0xAD, 0x6A, 0x0C, 0x85, 0x26, 0xB7, 0xB1, 0x89, 0xFC, 0x77, 0x15, 0xC5, 0x51, 0x73, 0x85, 0x25, 0xAC, 0xEE, 0xB8, 0xF2, 0xDE, 0x25, 0x2B, 0x25, 0xC4, 0x2E, 0x01, 0x9B, 0x71, 0x08, 0x40, 0x84, 0x43, 0xE1,
+ 0x4D, 0x28, 0xD4, 0x39, 0x1B, 0xD6, 0x58, 0xA3, 0x28, 0xEF, 0x3F, 0x1F, 0xF9, 0xFF, 0xE6, 0x2B, 0x42, 0x1A, 0xC9, 0x70, 0x1B, 0xC1, 0xC6, 0x53, 0x2B, 0x26, 0x2E, 0x16, 0x03, 0xE4, 0x89, 0x62, 0xD0, 0x05, 0x95, 0x4F, 0xFA, 0xB5, 0x23, 0xC4,
+ 0x09, 0x38, 0xCF, 0x24, 0x56, 0x13, 0x71, 0x83, 0x9E, 0xD6, 0xC8, 0x14, 0x49, 0x50, 0xAD, 0xEC, 0x4B, 0x48, 0x0E, 0xDD, 0x0E, 0xCA, 0x70, 0xCC, 0x78, 0x35, 0x1E, 0x55, 0x8E, 0x3B, 0x38, 0x74, 0x8A, 0xDA, 0xC6, 0x26, 0xD7, 0x5F, 0xB3, 0x00,
+ 0x53, 0xB4, 0x5F, 0x27, 0xC7, 0x7B, 0x23, 0xA2, 0xA0, 0x89, 0xC2, 0x23, 0x33, 0xC5, 0x39, 0x19, 0xB3, 0x38, 0xAE, 0x0F, 0x6B, 0xAD, 0x2C, 0x2C, 0x59, 0xF2, 0x70, 0x6C, 0xCF, 0x3D, 0xF8, 0x57, 0x79, 0x32, 0x40, 0xCE, 0x2D, 0x4B, 0x05, 0x7B,
+ 0x80, 0x7C, 0xB0, 0xDD, 0xB4, 0xB5, 0x3F, 0xEC, 0x1E, 0x20, 0x62, 0x9B, 0xF1, 0x03, 0xDF, 0xE4, 0x6F, 0x89, 0xF7, 0xEC, 0x51, 0xFA, 0x47, 0xEE, 0x95, 0x2B, 0xB3, 0x88, 0x61, 0x13, 0x76, 0x88, 0x63, 0xA4, 0x54, 0x83, 0x67, 0x61, 0x12, 0x35,
+ 0xFC, 0xBD, 0x21, 0xE1, 0x1B, 0x27, 0x02, 0x36, 0xDC, 0x51, 0xAA, 0x8E, 0xC1, 0x5D, 0x99, 0xD2, 0x2D, 0xEC, 0xAC, 0x14, 0x1D, 0xCA, 0xB3, 0x11, 0x59, 0x0D, 0x0A, 0xF9, 0x62, 0xB7, 0x5F, 0xFE, 0xAD, 0xC9, 0x31, 0x72, 0xCB, 0xDD, 0x09, 0x8D,
+ 0x20, 0xDB, 0x5E, 0xB1, 0x3C, 0x9D, 0xD0, 0x71, 0x55, 0xFC, 0x4C, 0x08, 0x6D, 0x84, 0xC7, 0x5D, 0x86, 0xE3, 0xA9, 0x18, 0x77, 0x30, 0xE2, 0x5F, 0x5A, 0xCF, 0x2B, 0xFE, 0xC0, 0x55, 0x1E, 0xFC, 0xD3, 0x4E, 0xCE, 0xBF, 0x59, 0x9C, 0xF5, 0x55,
+ 0x1E, 0x44, 0x04, 0xB1, 0xA7, 0x2E, 0xCB, 0x5C, 0xE1, 0x73, 0x6E, 0x2E, 0x3E, 0xC4, 0x4B, 0xF3, 0xCE, 0x99, 0x14, 0xB4, 0xFA, 0x0D, 0x7B, 0x23, 0x26, 0xEA, 0x1D, 0xF6, 0x7D, 0x23, 0xB3, 0xDB, 0xFC, 0x89, 0xB8, 0x86, 0xE8, 0x0A, 0x65, 0xDF,
+ 0x6E, 0xB3, 0x3B, 0xAD, 0x06, 0xA8, 0x78, 0x8C, 0x52, 0x2F, 0xCB, 0x56, 0x11, 0x9C, 0x5D, 0x92, 0x0E, 0x3D, 0x31, 0x16, 0xA5, 0x57, 0x57, 0xC4, 0xCB, 0x70, 0xB7, 0xD2, 0x3E, 0x1C, 0x9A, 0x34, 0xB9, 0xB2, 0x21, 0xE2, 0x61, 0x45, 0x11, 0x9A,
+ 0x1B, 0x5F, 0x57, 0x1A, 0xAF, 0x3F, 0x51, 0x84, 0xB0, 0x94, 0xF8, 0xD2, 0x8A, 0x4C, 0x0F, 0xBA, 0x36, 0x3D, 0x11, 0xF6, 0x09, 0x25, 0x52, 0xF9, 0x57, 0xCB, 0x96, 0xE3, 0xDF, 0xD6, 0x69, 0x71, 0x2C, 0xD6, 0xAD, 0xC2, 0xD1, 0xB7, 0xAF, 0xE8,
+ 0x29, 0xE3, 0x6D, 0x3C, 0x9B, 0x38, 0x3A, 0x2A, 0x54, 0xA9, 0x5C, 0x8F, 0xDE, 0x47, 0x57, 0xF9, 0x56, 0x51, 0x9E, 0xFD, 0x37, 0x4A, 0xD7, 0xDB, 0x29, 0x66, 0x28, 0x89, 0x22, 0x33, 0xB3, 0xAF, 0x37, 0xD6, 0x1A, 0xB3, 0x29, 0x37, 0x97, 0x70,
+ 0x58, 0x51, 0x4E, 0x28, 0xCC, 0xD2, 0x8A, 0x58, 0x41, 0x3E, 0x80, 0x8F, 0x4A, 0x25, 0x89, 0x22, 0xFB, 0xFE, 0xAD, 0x00, 0xD2, 0xBF, 0xCB, 0x45, 0xA6, 0x8A, 0x91, 0x16, 0xAE, 0xBE, 0x30, 0xE4, 0xCE, 0x72, 0x28, 0x2F, 0xA4, 0xB8, 0xA3, 0xF0,
+ 0x21, 0x58, 0x05, 0x53, 0x11, 0x5B, 0x20, 0xF8, 0x01, 0x84, 0x0A, 0xE0, 0x84, 0xC5, 0x13, 0x5C, 0xA4, 0xED, 0x76, 0x16, 0x7B, 0x23, 0xEC, 0x23, 0x65, 0xAF, 0xED, 0x45, 0x0E, 0xE3, 0xD6, 0x0A, 0x58, 0xF1, 0x37, 0x39, 0x5A, 0xBF, 0x2F, 0x57,
+ 0x56, 0x8F, 0xAB, 0xDD, 0x25, 0xC0, 0x4D, 0xAE, 0x6A, 0xE9, 0x3A, 0x6E, 0xB7, 0x88, 0x62, 0x0C, 0x3E, 0x14, 0xAA, 0x8B, 0xC2, 0xBE, 0x92, 0x5E, 0xD2, 0x6D, 0xEB, 0x3A, 0x32, 0x91, 0x03, 0x63, 0x7D, 0x84, 0xC0, 0xB0, 0xE9, 0x6B, 0x5A, 0x6F,
+ 0x09, 0x4A, 0x09, 0xE5, 0xF1, 0xD2, 0x16, 0x12, 0xFE, 0x07, 0x03, 0xBA, 0xA5, 0x90, 0x94, 0xA9, 0x1F, 0xDF, 0x50, 0xFB, 0xC4, 0xA7, 0x8B, 0x2F, 0x3C, 0x3B, 0xB6, 0x82, 0x05, 0x3A, 0x39, 0x99, 0xE0, 0x50, 0x60, 0x58, 0x08, 0xE3, 0xD6, 0x07,
+ 0x1E, 0x18, 0xF6, 0x20, 0xE2, 0x45, 0x24, 0xF8, 0x70, 0xA0, 0x64, 0x99, 0x3C, 0xCF, 0x3E, 0x98, 0xAC, 0x9E, 0x5D, 0xA9, 0x03, 0x57, 0xB5, 0xA4, 0x81, 0xAB, 0x15, 0x6F, 0xAB, 0x3A, 0x32, 0xBC, 0xA8, 0x01, 0xEC, 0xD3, 0x49, 0x0D, 0x53, 0x13,
+ 0xC6, 0xC3, 0x52, 0x5B, 0x06, 0x41, 0x5E, 0x18, 0x17, 0x3B, 0x87, 0x35, 0xE0, 0xEB, 0x77, 0xDB, 0x49, 0xD9, 0xB3, 0xCF, 0x12, 0x5A, 0xB7, 0x36, 0x47, 0x28, 0x25, 0x76, 0xCA, 0xE4, 0xC7, 0x5E, 0x22, 0x02, 0x31, 0x1E, 0xC8, 0x7F, 0x56, 0xDD,
+ 0xB6, 0x56, 0xE4, 0x05, 0x5A, 0xEE, 0x38, 0x21, 0x50, 0xCC, 0x0B, 0x05, 0xE4, 0xDB, 0xB6, 0xA7, 0xDB, 0x50, 0x30, 0x42, 0xB1, 0x0B, 0x89, 0xE1, 0x15, 0xE1, 0xE8, 0x9D, 0xA9, 0xB9, 0x24, 0x72, 0x43, 0xED, 0xBA, 0x2B, 0xEF, 0x1C, 0x03, 0xE5,
+ 0x79, 0x59, 0xE7, 0xDF, 0xFC, 0xEC, 0xF1, 0xC5, 0x09, 0xC5, 0x72, 0x4E, 0x56, 0xC3, 0x1D, 0x15, 0xF7, 0xE6, 0x0C, 0x17, 0x19, 0xDB, 0xD1, 0xB7, 0xF6, 0xB4, 0xEA, 0xB0, 0x7C, 0x17, 0x43, 0x9D, 0x34, 0xC3, 0xA7, 0x2A, 0x47, 0xE5, 0x90, 0x27,
+ 0x0C, 0x51, 0xF6, 0xEC, 0x46, 0x9C, 0x55, 0x11, 0x2E, 0x07, 0x95, 0xDD, 0x03, 0xC5, 0x8F, 0x26, 0xBE, 0x6C, 0x9D, 0xCF, 0xED, 0x2D, 0x98, 0x28, 0x82, 0x9F, 0x37, 0x68, 0xED, 0xBC, 0x24, 0x0B, 0xA5, 0x42, 0x3F, 0x0C, 0xE1, 0x61, 0x90, 0x38,
+ 0xDA, 0xE2, 0x3F, 0x0E, 0x4F, 0xA7, 0xD2, 0xB3, 0xEC, 0x7E, 0xCD, 0x39, 0x30, 0xCE, 0xA4, 0x18, 0x23, 0x73, 0x7E, 0x5A, 0xE3, 0x1D, 0x88, 0xCE, 0xD9, 0xB6, 0xC7, 0x85, 0x7C, 0xE2, 0x45, 0x3B, 0x71, 0xEC, 0x9D, 0xD6, 0x0F, 0x4A, 0xDD, 0xA2,
+ 0x4D, 0xC7, 0xC8, 0xD1, 0x0C, 0x08, 0x2D, 0x8F, 0xE2, 0x91, 0x47, 0x4D, 0xFB, 0xA3, 0xD1, 0xEB, 0x2A, 0x1D, 0x20, 0x48, 0xF5, 0x9A, 0x0A, 0xFE, 0xC5, 0xA2, 0x86, 0x02, 0xB7, 0x67, 0x1F, 0xD7, 0xF4, 0x8E, 0xAB, 0xFE, 0x72, 0xF6, 0xC1, 0x5A,
+ 0x68, 0xF0, 0x9F, 0xAB, 0x8C, 0x08, 0xCA, 0xE0, 0x86, 0xB9, 0x60, 0x29, 0x0F, 0x24, 0xFF, 0xAC, 0xE2, 0x10, 0xF1, 0x67, 0x17, 0xA5, 0xDC, 0x80, 0xA0, 0x67, 0xBC, 0xE9, 0xA3, 0x1F, 0x0A, 0xD2, 0x34, 0xBB, 0x5A, 0x6E, 0x76, 0x63, 0x37, 0xA8,
+ 0x60, 0x68, 0x75, 0x31, 0x89, 0x40, 0x2D, 0xDB, 0x0D, 0x7A, 0xEC, 0x7E, 0xD9, 0xF6, 0x26, 0x0F, 0x5B, 0x78, 0x44, 0x26, 0x41, 0x5D, 0xF9, 0x80, 0x9C, 0x4C, 0x7C, 0x9C, 0xE4, 0x2A, 0xB5, 0x97, 0x60, 0x04, 0x00, 0xDE, 0x2E, 0xF4, 0xE2, 0x54,
+ 0xC9, 0x38, 0x55, 0xDB, 0x29, 0x20, 0x39, 0x89, 0xB2, 0x33, 0xCA, 0xE5, 0xFD, 0x78, 0xA9, 0x8F, 0x80, 0xB0, 0x88, 0xB4, 0x69, 0x4A, 0x15, 0xA2, 0x8D, 0x3F, 0x17, 0xE5, 0x84, 0xF8, 0x6A, 0x0C, 0xEE, 0x59, 0x49, 0x48, 0x88, 0xC4, 0xCF, 0x69,
+ 0x85, 0x41, 0x8E, 0x83, 0x2C, 0xC9, 0x53, 0x33, 0x91, 0xE4, 0x01, 0xFD, 0xB4, 0xAF, 0x5F, 0xD0, 0xAF, 0x1C, 0x72, 0xF5, 0xD7, 0xCB, 0xE8, 0xED, 0x50, 0x6D, 0xE0, 0x6D, 0xCE, 0x44, 0xB7, 0xAD, 0x68, 0xA7, 0xE6, 0x86, 0x51, 0x69, 0xD3, 0xB7,
+ 0x4A, 0x9E, 0x3D, 0xFC, 0xFF, 0x44, 0xD1, 0xB8, 0x67, 0xFC, 0x5B, 0xBC, 0x3E, 0xCC, 0x7D, 0xAF, 0xE2, 0x28, 0x15, 0x54, 0xFD, 0x33, 0xD0, 0x8F, 0x41, 0x12, 0xC2, 0x41, 0xE7, 0xFD, 0x4F, 0x7D, 0xC5, 0x5C, 0xBB, 0x52, 0x29, 0x91, 0xD1, 0xF7,
+ 0xCC, 0x71, 0x36, 0x1C, 0xA2, 0x02, 0xC8, 0xF1, 0x0C, 0xCA, 0xE0, 0xF0, 0x4D, 0x2F, 0xC9, 0xFE, 0x9A, 0x68, 0x13, 0xF6, 0xFF, 0xAE, 0xFB, 0xCB, 0xE2, 0x4C, 0xFF, 0x92, 0x01, 0x10, 0x27, 0xFF, 0x46, 0xDA, 0x43, 0x1E, 0x2D, 0xE1, 0xE1, 0xE7,
+ 0xFA, 0xC2, 0xF9, 0xA0, 0x41, 0x25, 0x3F, 0x23, 0xC4, 0x1A, 0x12, 0xE8, 0x0E, 0x93, 0x3D, 0xD2, 0xD2, 0x43, 0xB4, 0xA5, 0x4D, 0xD6, 0x61, 0xCD, 0x1A, 0x0E, 0x22, 0x66, 0xE3, 0x74, 0x19, 0xC7, 0xC1, 0x42, 0x7F, 0x02, 0x29, 0x3B, 0xB8, 0x93,
+ 0xC3, 0xC9, 0xEC, 0x3A, 0x6C, 0x36, 0x75, 0x37, 0x20, 0x65, 0x19, 0x79, 0xDA, 0x0E, 0xE0, 0xC5, 0xC2, 0x79, 0xDA, 0x15, 0xE0, 0x03, 0xDC, 0x92, 0x66, 0x92, 0xBB, 0x42, 0xCE, 0x45, 0x97, 0x28, 0x82, 0x89, 0xF7, 0x59, 0xD9, 0x8B, 0xF7, 0x7D,
+ 0x1E, 0x5E, 0x60, 0x31, 0x62, 0x53, 0xD7, 0x14, 0xF6, 0x97, 0xC5, 0x2E, 0x2E, 0x79, 0xFF, 0x99, 0xA3, 0xC6, 0xA0, 0xBF, 0xF5, 0xD0, 0x02, 0x3E, 0x53, 0xE5, 0x47, 0x70, 0x9A, 0x8D, 0x45, 0x77, 0x01, 0x14, 0x77, 0x13, 0x2B, 0xA2, 0x76, 0x3D,
+ 0xEF, 0x80, 0x9A, 0xCE, 0xCB, 0xB2, 0xB8, 0x3B, 0x73, 0xB7, 0x02, 0xA2, 0x1D, 0xA0, 0x6B, 0x47, 0x70, 0x38, 0x90, 0xD0, 0x83, 0x5E, 0x5F, 0x95, 0xD6, 0xEF, 0xBB, 0x73, 0x4B, 0xE6, 0xBE, 0xE0, 0x11, 0x46, 0x39, 0xC4, 0x22, 0x3B, 0x5E, 0x5E,
+ 0x37, 0xB0, 0xDD, 0xE1, 0x7E, 0xA3, 0xCE, 0x45, 0x3E, 0xF1, 0xF8, 0x22, 0xF7, 0xDB, 0x53, 0x10, 0xAF, 0x4D, 0x87, 0x06, 0xB8, 0x5B, 0xCF, 0xB6, 0xA0, 0x98, 0xCA, 0x49, 0xCD, 0x96, 0xF1, 0x43, 0xD3, 0x12, 0xC3, 0xC3, 0x8D, 0x47, 0x2C, 0x20,
+ 0xB3, 0xB7, 0x0E, 0x75, 0xAE, 0x79, 0x0B, 0x64, 0x99, 0x31, 0xB3, 0x31, 0xC1, 0x8D, 0x8F, 0x96, 0xBD, 0x6E, 0x8A, 0x97, 0xB9, 0x9F, 0x64, 0x75, 0xC2, 0xC4, 0xD3, 0xD5, 0x34, 0xEC, 0x78, 0x10, 0x5D, 0x58, 0xF6, 0x64, 0xBB, 0xD8, 0x0D, 0x5E,
+ 0x0D, 0xD0, 0x1D, 0xBD, 0x0C, 0xB1, 0x27, 0x67, 0x2B, 0xC0, 0x33, 0x0B, 0x85, 0x79, 0x58, 0x1C, 0xC3, 0xC6, 0x2A, 0xC7, 0x6B, 0x97, 0xCC, 0x2E, 0xFE, 0x6A, 0x8F, 0x01, 0xB8, 0xD1, 0xF4, 0x79, 0x9D, 0xA9, 0x9F, 0xC4, 0x91, 0xD4, 0x68, 0x31,
+ 0xD9, 0x1E, 0x31, 0x1A, 0x07, 0xE2, 0xE0, 0xC9, 0x87, 0x27, 0xDB, 0x07, 0xF8, 0x39, 0xED, 0x89, 0xA2, 0x6A, 0x6F, 0x30, 0x61, 0xB6, 0xAC, 0x20, 0x6A, 0xA5, 0xF4, 0xCC, 0x10, 0x60, 0x98, 0x25, 0x10, 0xDD, 0xAD, 0x88, 0x3C, 0x93, 0xAB, 0xBD,
+ 0x86, 0x3F, 0xD4, 0x58, 0xC8, 0x7E, 0x5F, 0x17, 0x6A, 0x4B, 0xDF, 0x42, 0x6B, 0xC4, 0x3C, 0x54, 0x47, 0x4B, 0x35, 0xAE, 0x30, 0x26, 0x77, 0x96, 0xD9, 0x60, 0x0D, 0xDF, 0x63, 0xF6, 0x93, 0x7A, 0x6E, 0x44, 0xC1, 0x07, 0x47, 0x8F, 0xAC, 0x03,
+ 0xD1, 0xA7, 0x15, 0x42, 0xF0, 0xFD, 0xC9, 0xB0, 0xEB, 0xD7, 0x71, 0x97, 0x6B, 0x99, 0x74, 0x16, 0xEF, 0x7B, 0x65, 0xF9, 0x06, 0x4F, 0x7C, 0x75, 0xB0, 0xB6, 0x88, 0xD5, 0x4B, 0xF3, 0x83, 0x51, 0x06, 0xD6, 0xDF, 0x4F, 0x84, 0xDF, 0x1C, 0xE3,
+ 0x23, 0x62, 0x9D, 0x0A, 0x44, 0x1F, 0x6C, 0x51, 0xCE, 0x0A, 0x16, 0x11, 0x83, 0x4C, 0xEC, 0xA8, 0xD5, 0x52, 0xE5, 0x59, 0x2F, 0x9F, 0x93, 0x65, 0x1D, 0x3F, 0xEE, 0x7C, 0xEC, 0x9A, 0xF0, 0x2B, 0xE6, 0xE5, 0x15, 0x0B, 0xE2, 0xAB, 0xB4, 0x68,
+ 0xB5, 0x0E, 0xD1, 0xF6, 0xAB, 0x12, 0x7E, 0xBA, 0x2C, 0x1A, 0xD1, 0xF2, 0x80, 0x18, 0x33, 0x71, 0x3D, 0x0E, 0x09, 0xC6, 0xB2, 0x12, 0xF0, 0x42, 0xE0, 0x75, 0x9C, 0x4C, 0x9E, 0x81, 0x90, 0xBE, 0x4B, 0x99, 0x94, 0x64, 0xEF, 0x88, 0x88, 0xE6,
+ 0x32, 0x46, 0x7B, 0xAF, 0x41, 0xB8, 0x4A, 0x52, 0x93, 0xF6, 0x6C, 0x5E, 0xB6, 0x07, 0xF7, 0x85, 0xF3, 0x8D, 0x89, 0x76, 0xFB, 0x70, 0xB5, 0xD1, 0xF8, 0x01, 0x36, 0x98, 0xC9, 0x9C, 0x42, 0xA4, 0x86, 0x5D, 0x26, 0x28, 0xFE, 0x60, 0x20, 0xAA,
+ 0x28, 0x40, 0xAD, 0x23, 0x0A, 0x0A, 0x9D, 0xCA, 0x44, 0xA3, 0xF1, 0x18, 0xEE, 0x07, 0xF1, 0x48, 0xE9, 0x05, 0x9D, 0xFF, 0xC7, 0x9A, 0xE4, 0x5D, 0xAE, 0x6F, 0xC5, 0xF5, 0x00, 0x43, 0x85, 0x2B, 0x3C, 0x58, 0xF6, 0x28, 0x70, 0x66, 0x9F, 0xBE,
+ 0x6E, 0xC1, 0x0C, 0x55, 0xF9, 0x7F, 0xE3, 0x08, 0xE9, 0xD2, 0xD9, 0xDE, 0xF1, 0x14, 0x83, 0x64, 0x68, 0x8D, 0x5A, 0xCA, 0x2F, 0x58, 0xAD, 0x40, 0xDD, 0x7A, 0x72, 0xFD, 0x7F, 0x96, 0xA4, 0xE7, 0x61, 0x9B, 0xCF, 0xA5, 0x87, 0x42, 0x50, 0x6F,
+ 0x4F, 0x80, 0x7F, 0x35, 0x0A, 0x68, 0x9C, 0x6C, 0xED, 0xB7, 0xEB, 0xF9, 0x5A, 0xEA, 0x35, 0x8A, 0x16, 0xA2, 0xE8, 0x6D, 0x88, 0x9C, 0xD6, 0xFE, 0x79, 0xE8, 0x21, 0x93, 0x3E, 0x72, 0xCA, 0x39, 0xF1, 0x4A, 0x92, 0x67, 0x46, 0x74, 0xD1, 0x86,
+ 0xD6, 0x99, 0x47, 0xD8, 0x36, 0xFC, 0xEE, 0x07, 0xFA, 0x86, 0x39, 0x08, 0xF7, 0xD9, 0xC8, 0x3F, 0x20, 0x38, 0x07, 0xE4, 0x8D, 0xA5, 0xEC, 0x55, 0x23, 0x83, 0x16, 0xB5, 0xCE, 0x7D, 0x36, 0xAD, 0x3E, 0x46, 0x0F, 0xF2, 0xBC, 0xC1, 0x71, 0x07,
+ 0x4F, 0x13, 0x12, 0x5D, 0x5F, 0xFE, 0xF5, 0x9F, 0xF8, 0x97, 0xFB, 0x3A, 0xCE, 0x7C, 0x8B, 0xA6, 0xAA, 0xC1, 0x16, 0x60, 0x91, 0x4E, 0x94, 0xA1, 0x99, 0xA0, 0x16, 0x2A, 0xE4, 0x95, 0xA9, 0x6B, 0xE0, 0x11, 0x87, 0xB7, 0x98, 0xAF, 0x51, 0x06,
+ 0xE1, 0x15, 0x84, 0xC1, 0xBB, 0x18, 0x30, 0xFA, 0x35, 0x04, 0x8C, 0xA2, 0xF7, 0x18, 0xD7, 0xF3, 0x6C, 0x9F, 0xEC, 0xD6, 0x89, 0x1A, 0xBF, 0x5B, 0xD4, 0x8C, 0xC7, 0xB7, 0x2F, 0x3C, 0xA1, 0xC9, 0x7F, 0x91, 0xDB, 0xC7, 0xB4, 0x48, 0xF5, 0xEE,
+ 0xDA, 0x3A, 0x3F, 0x93, 0x1A, 0xB9, 0xBE, 0xFC, 0xAB, 0x8D, 0xDF, 0xEF, 0x9C, 0xC1, 0x49, 0x4C, 0x8A, 0x6F, 0xC0, 0x72, 0x62, 0xB6, 0xCE, 0x87, 0x2C, 0x5D, 0x32, 0xBD, 0x28, 0xE5, 0x1E, 0xC8, 0x37, 0x20, 0xAD, 0xDB, 0x7F, 0xE9, 0xCF, 0x8C,
+ 0x17, 0x5A, 0x99, 0x7A, 0xB2, 0x16, 0x0E, 0xDF, 0xCB, 0x71, 0xF6, 0x7F, 0x8B, 0xDF, 0xCD, 0xBC, 0xAF, 0x38, 0x1B, 0xD2, 0xC8, 0x49, 0x84, 0x65, 0xF5, 0xD2, 0x44, 0x2B, 0x8A, 0x7E, 0xC1, 0x4B, 0x58, 0x51, 0x71, 0x36, 0xEE, 0x85, 0xBA, 0xBF,
+ 0xB0, 0x34, 0xCE, 0x67, 0x3D, 0xA1, 0x0E, 0xD0, 0xAD, 0xDF, 0x9B, 0x07, 0x37, 0x02, 0x40, 0xCC, 0x5A, 0xD6, 0x7C, 0x53, 0x5F, 0x5E, 0x97, 0xFD, 0x29, 0xB0, 0x6C, 0x68, 0x99, 0x55, 0xA5, 0x6D, 0x13, 0x33, 0x62, 0xF0, 0xF5, 0x63, 0xCD, 0x2F,
+ 0x7B, 0xD3, 0xAB, 0x35, 0x81, 0x77, 0xE9, 0x8F, 0xA0, 0x83, 0x88, 0x4F, 0x61, 0xC0, 0x5B, 0xD9, 0x7D, 0x88, 0x69, 0x88, 0xA4, 0x2A, 0x55, 0x94, 0xDF, 0x2F, 0xEA, 0x95, 0x64, 0x9D, 0x2D, 0x56, 0x8E, 0x9F, 0x3D, 0x00, 0xCD, 0xFB, 0xB7, 0xB1,
+ 0xE5, 0x5D, 0x03, 0x6D, 0x0B, 0xF5, 0x2D, 0x40, 0x4D, 0x03, 0xC7, 0xDC, 0x9D, 0x53, 0x1D, 0x54, 0x35, 0xD9, 0x8F, 0x6A, 0x95, 0x23, 0x77, 0xC8, 0x0D, 0x74, 0xD4, 0x92, 0x98, 0x40, 0xC6, 0x9F, 0xE9, 0x25, 0x2C, 0xD1, 0x73, 0x18, 0x0A, 0x78,
+ 0xF8, 0x36, 0x36, 0xD2, 0x20, 0x75, 0x58, 0x35, 0x7C, 0xBD, 0xD0, 0x9D, 0x34, 0x42, 0xCB, 0x98, 0xFE, 0x81, 0x96, 0x0A, 0x13, 0xB3, 0x51, 0x63, 0x1C, 0x6B, 0xBB, 0x8D, 0xED, 0x23, 0x54, 0xFD, 0x78, 0xC4, 0x1C, 0x74, 0x9E, 0xD1, 0xC2, 0x0C,
+ 0x68, 0x30, 0x9E, 0x7F, 0x12, 0x18, 0xC7, 0x93, 0x20, 0x13, 0x96, 0x22, 0xD0, 0xDA, 0x7E, 0x8E, 0x83, 0x92, 0x0E, 0xD3, 0x60, 0x72, 0x67, 0xB1, 0x05, 0x83, 0xBB, 0xDC, 0x77, 0x00, 0x5B, 0x86, 0xC2, 0x7D, 0x70, 0x7D, 0x3A, 0xE8, 0x68, 0x79,
+ 0xFD, 0x7A, 0x04, 0x5C, 0xF3, 0x46, 0x5D, 0x81, 0x0A, 0x37, 0x53, 0x70, 0x94, 0x77, 0x55, 0x59, 0xD1, 0x10, 0x75, 0x79, 0xB8, 0x44, 0xA8, 0x5A, 0xA3, 0x8D, 0x52, 0x7E, 0xEC, 0x5E, 0xF8, 0x73, 0x08, 0x72, 0xFE, 0x30, 0xE9, 0xC1, 0x1A, 0x23,
+ 0x73, 0x24, 0xBF, 0x53, 0x45, 0x47, 0xC7, 0x01, 0x29, 0xB4, 0x70, 0xA1, 0xF4, 0x43, 0x2A, 0xB9, 0x82, 0xFC, 0x1E, 0xA8, 0x11, 0x6D, 0xD9, 0x5A, 0x4F, 0xDE, 0x3A, 0x9F, 0xC1, 0x05, 0x31, 0x7E, 0x04, 0xAA, 0x76, 0x7C, 0x1B, 0x81, 0x45, 0x84,
+ 0x4C, 0x52, 0x1B, 0x56, 0x25, 0x20, 0x9E, 0x0E, 0x7F, 0x86, 0xF7, 0xF9, 0x94, 0x8D, 0x0B, 0xB7, 0xE3, 0x72, 0xF9, 0xAD, 0x2E, 0x4B, 0x2C, 0x85, 0x65, 0x52, 0x34, 0xB3, 0x4D, 0xF1, 0xD6, 0x10, 0x04, 0x55, 0x11, 0xCB, 0xCB, 0x27, 0xBB, 0x40,
+ 0x53, 0xCE, 0xB5, 0xA5, 0xEF, 0xC5, 0xF5, 0xCF, 0x1C, 0x2F, 0x2F, 0x95, 0x2E, 0xED, 0x2C, 0x86, 0x9E, 0xAA, 0x07, 0x8A, 0xFF, 0xB9, 0x7B, 0xED, 0x1B, 0xC6, 0x3C, 0xEC, 0xA5, 0x8B, 0x49, 0x0C, 0x80, 0xEA, 0x93, 0x61, 0x1A, 0xDA, 0xAD, 0x3C,
+ 0x88, 0x12, 0x9A, 0x46, 0x92, 0xD2, 0x1F, 0xED, 0x8D, 0x50, 0xFA, 0x0C, 0x44, 0xC3, 0xA2, 0x75, 0xC9, 0xA0, 0xEB, 0x87, 0xAE, 0x86, 0x91, 0xBE, 0xA2, 0xA3, 0xFA, 0xA2, 0x43, 0x32, 0x72, 0x3F, 0x77, 0x7C, 0x65, 0x0B, 0xD1, 0xC9, 0x7C, 0x69,
+ 0xF5, 0xDB, 0x8B, 0x28, 0x70, 0x48, 0x7C, 0xD9, 0xFE, 0xA4, 0x2F, 0xF1, 0x1F, 0xC5, 0x48, 0x1A, 0xB2, 0x36, 0x4F, 0x47, 0x63, 0x41, 0xA2, 0xC4, 0xB0, 0x7D, 0xA3, 0x41, 0xC4, 0x20, 0xFD, 0x2D, 0xEB, 0x86, 0x56, 0xB0, 0x6D, 0xAB, 0x35, 0xD5,
+ 0x7D, 0x17, 0xCA, 0xD0, 0x65, 0xE2, 0x56, 0xD4, 0xD1, 0x28, 0x6A, 0x5C, 0xEA, 0x84, 0xD0, 0x69, 0x2A, 0x50, 0x4E, 0x68, 0xA8, 0xC6, 0x3D, 0x53, 0x3C, 0x61, 0x88, 0xFE, 0x89, 0x5E, 0x6C, 0xBA, 0x6A, 0xEA, 0xE9, 0x81, 0x81, 0x34, 0x54, 0x72,
+ 0xC3, 0x84, 0x45, 0x0B, 0x80, 0x23, 0x01, 0x3F, 0xB4, 0xCF, 0x44, 0xCB, 0x55, 0x60, 0x37, 0xA2, 0x76, 0xB4, 0xFA, 0x5C, 0x7F, 0x7B, 0x6C, 0xA1, 0xF2, 0x1F, 0x0B, 0x98, 0x12, 0x14, 0xA3, 0x95, 0x8B, 0x94, 0x45, 0xBD, 0xB3, 0xCD, 0x5F, 0xA1,
+ 0x03, 0x55, 0xFC, 0xFB, 0x3C, 0xA4, 0x20, 0x7B, 0xE7, 0x18, 0x36, 0xA4, 0xA6, 0x78, 0xFA, 0x4F, 0xAD, 0xDF, 0x0E, 0xAD, 0x81, 0x22, 0xF9, 0x23, 0xAA, 0x5C, 0x62, 0xB7, 0x29, 0x16, 0x47, 0x6B, 0x71, 0x08, 0xE1, 0x83, 0x05, 0xD2, 0x0C, 0x5F,
+ 0xA6, 0x2F, 0xB6, 0x28, 0x66, 0xB6, 0x89, 0x9C, 0xFB, 0xEE, 0xCA, 0x80, 0x40, 0x9C, 0x76, 0x94, 0xB9, 0x8D, 0x39, 0x99, 0xDA, 0x51, 0x42, 0x44, 0xF8, 0xDB, 0xA2, 0x80, 0x3D, 0x6E, 0x2A, 0xC7, 0x6C, 0xD1, 0x03, 0xC5, 0x12, 0x10, 0x6C, 0x5F,
+ 0xD5, 0xB0, 0x6B, 0x98, 0xE8, 0x09, 0xF1, 0x37, 0xDB, 0xB0, 0xD5, 0xBF, 0xC2, 0xB8, 0x28, 0x27, 0xEC, 0xDA, 0x95, 0xCE, 0x4C, 0x45, 0x3C, 0xBA, 0xB2, 0xDF, 0x00, 0xB2, 0x77, 0xE1, 0x51, 0x92, 0x5A, 0x58, 0x38, 0x11, 0xB3, 0xC1, 0x2E, 0x87,
+ 0x01, 0x9C, 0xB3, 0x24, 0xE1, 0x4B, 0x1A, 0x9B, 0xCC, 0xE9, 0x7A, 0x61, 0x2A, 0xA9, 0xAD, 0x6B, 0x08, 0xE5, 0xA7, 0x14, 0x30, 0x69, 0xDF, 0x3F, 0xCC, 0xBF, 0xFD, 0xB0, 0x57, 0xBC, 0x54, 0xBA, 0x1A, 0x49, 0xC5, 0x26, 0xA5, 0x6A, 0xA7, 0x8F,
+ 0x82, 0x66, 0x51, 0xBF, 0xD7, 0xCD, 0xD0, 0x3F, 0x56, 0x2A, 0xA0, 0x01, 0x21, 0x8F, 0xDB, 0x8B, 0xFC, 0x78, 0x29, 0xE8, 0x75, 0xC2, 0xB9, 0x7E, 0x19, 0xFE, 0xE6, 0xE5, 0x3B, 0x40, 0xCC, 0x18, 0xC2, 0xDF, 0xA2, 0x77, 0x2C, 0xC3, 0x86, 0x9E,
+ 0x32, 0x7D, 0x96, 0x7B, 0x55, 0x1D, 0xB6, 0x86, 0x33, 0x42, 0x2C, 0xB0, 0xEE, 0x4B, 0x2F, 0x6A, 0xC9, 0xE7, 0x72, 0x1E, 0xF0, 0x79, 0x05, 0x15, 0x8D, 0x0D, 0x23, 0x78, 0x72, 0xCD, 0x76, 0x4C, 0xEC, 0xAD, 0x19, 0x13, 0x16, 0x12, 0x2D, 0x56,
+ 0x32, 0x5D, 0xD6, 0x92, 0xC4, 0x2F, 0x83, 0x10, 0x19, 0xDD, 0x2D, 0x88, 0x82, 0x89, 0xFD, 0xA5, 0xF6, 0xEF, 0xDF, 0x3F, 0x3A, 0xF7, 0xDA, 0xBE, 0x9D, 0x23, 0xB3, 0xD3, 0x87, 0x4F, 0x37, 0xAB, 0x28, 0x1B, 0x02, 0x9E, 0xA9, 0xF3, 0xDE, 0x77,
+ 0xCE, 0x36, 0x68, 0x45, 0xFA, 0x7B, 0x1C, 0x1D, 0xFD, 0xD0, 0x60, 0xA5, 0x2C, 0xD4, 0xD5, 0xA0, 0xFF, 0xEE, 0x69, 0x84, 0xB1, 0x45, 0xFB, 0x2B, 0xAA, 0xA2, 0x04, 0x55, 0x3E, 0x89, 0xB8, 0x94, 0xB1, 0xA0, 0x24, 0x2C, 0x85, 0xEB, 0x70, 0xB7,
+ 0x88, 0x56, 0x23, 0x9B, 0x43, 0x08, 0xAD, 0x7C, 0xCD, 0x65, 0xC8, 0xE0, 0xE5, 0xB4, 0x77, 0x5E, 0x94, 0xB7, 0x7C, 0x54, 0xED, 0xE1, 0xB2, 0xF4, 0x07, 0x39, 0xA9, 0x09, 0x16, 0x57, 0x34, 0xFF, 0xC7, 0x1B, 0x8A, 0x2A, 0x14, 0x19, 0xDB, 0xC9,
+ 0xCE, 0xFA, 0xA1, 0xDC, 0xF5, 0xA8, 0x42, 0xE1, 0x6C, 0xC4, 0x8A, 0xB9, 0x41, 0xA5, 0x16, 0xDF, 0x20, 0xEB, 0xF2, 0x7D, 0x68, 0x27, 0x93, 0x02, 0xFF, 0xF8, 0xB1, 0xD8, 0x9B, 0xA9, 0x5B, 0xCF, 0x59, 0xD7, 0x9A, 0xF5, 0x77, 0x33, 0x2A, 0xE1,
+ 0xDC, 0x3B, 0xF4, 0x75, 0x47, 0x2C, 0xC5, 0xB7, 0xEE, 0x3E, 0x43, 0xFE, 0x86, 0xC9, 0x57, 0x2F, 0xDB, 0xD0, 0xD6, 0x6B, 0x3D, 0x07, 0x99, 0xD0, 0x4B, 0x6D, 0x9C, 0x36, 0x1B, 0xBC, 0x16, 0xD7, 0x7D, 0x7F, 0x34, 0x99, 0x5B, 0x92, 0xAB, 0x58,
+ 0x75, 0xA3, 0x0E, 0x02, 0xF4, 0x94, 0xC7, 0x4A, 0xC7, 0xBA, 0xFD, 0x1C, 0xC2, 0x28, 0x94, 0x17, 0x27, 0x62, 0x06, 0x16, 0xBD, 0x38, 0x3A, 0x49, 0x32, 0x34, 0xE6, 0x6C, 0x88, 0x5E, 0xD3, 0xB9, 0xD3, 0x72, 0xF3, 0x11, 0xCA, 0xCA, 0x36, 0xF9,
+ 0x45, 0x01, 0x04, 0x77, 0x9C, 0x44, 0xD6, 0x2E, 0xAF, 0x1A, 0x30, 0xAD, 0x56, 0x9C, 0x19, 0xC4, 0x99, 0x4B, 0x7A, 0x3F, 0xD5, 0x42, 0xE8, 0x04, 0x9A, 0xC5, 0xDB, 0xB8, 0x80, 0x24, 0x66, 0x41, 0x58, 0x9F, 0x79, 0xC8, 0x4A, 0x1F, 0x33, 0x1F,
+ 0x6E, 0x98, 0xBA, 0x1A, 0xB1, 0x74, 0x5E, 0xBF, 0xAD, 0xC9, 0x3F, 0x6F, 0xB9, 0xF6, 0x59, 0xBC, 0xA9, 0xF2, 0x95, 0x1F, 0x9A, 0x86, 0x6A, 0x7C, 0x94, 0x13, 0x06, 0x6B, 0xA4, 0xDB, 0x83, 0x7C, 0x55, 0xA2, 0x87, 0x3F, 0xFA, 0x6C, 0x7B, 0x28,
+ 0x6A, 0x15, 0x18, 0x1B, 0x48, 0x2D, 0x96, 0x0E, 0x01, 0xE8, 0x20, 0xEF, 0x67, 0x50, 0xB9, 0x68, 0xDC, 0xEA, 0xE4, 0x4F, 0x6F, 0xA8, 0xE4, 0xDC, 0xD2, 0x11, 0xB1, 0xC9, 0x1F, 0xD7, 0xD3, 0x3E, 0x92, 0x24, 0xC4, 0x28, 0x5E, 0xC0, 0x01, 0xDA,
+ 0xC3, 0xD3, 0x2B, 0xE0, 0xA5, 0xA4, 0x2E, 0xB2, 0xEB, 0x62, 0x42, 0x2D, 0x35, 0xF8, 0x39, 0x8C, 0x2A, 0xAD, 0x14, 0xA7, 0x85, 0x3D, 0xB7, 0xD6, 0xE2, 0x89, 0x57, 0x3A, 0xE2, 0x47, 0x41, 0x34, 0x0A, 0x8C, 0x40, 0x8E, 0xE3, 0xF2, 0x50, 0xC6,
+ 0xCC, 0xDF, 0x5E, 0x1F, 0xF8, 0x2A, 0xB9, 0x34, 0xDB, 0x8F, 0x77, 0xDA, 0x09, 0x42, 0x77, 0x68, 0x6D, 0x5F, 0x1D, 0xA8, 0xD1, 0x93, 0x1B, 0x40, 0xEF, 0xB4, 0x23, 0x13, 0x8F, 0x58, 0x0D, 0xF4, 0xCE, 0x9F, 0x7E, 0xBB, 0x45, 0x09, 0xE0, 0xB5,
+ 0xD9, 0x67, 0x54, 0x83, 0x1C, 0x01, 0x04, 0x40, 0xC7, 0x1D, 0xB6, 0xB3, 0xBC, 0x81, 0x80, 0xF2, 0xCB, 0x76, 0xC7, 0xC8, 0xF1, 0x39, 0xF1, 0x8E, 0x91, 0x13, 0x70, 0x48, 0xA9, 0x3B, 0x5E, 0xD0, 0xDE, 0x02, 0xEC, 0xA4, 0x01, 0x72, 0x33, 0x21,
+ 0xCD, 0xC8, 0xB8, 0xD2, 0xAD, 0x0C, 0x61, 0x97, 0x90, 0x34, 0x69, 0x3D, 0xD2, 0x93, 0xE8, 0x41, 0x66, 0x42, 0x5B, 0xF6, 0xF5, 0xBD, 0xE5, 0xCD, 0xA8, 0x2D, 0x38, 0xE6, 0x5F, 0x0B, 0x03, 0xC9, 0x7E, 0x64, 0x8C, 0xFC, 0x9C, 0x81, 0x20, 0x85,
+ 0x8A, 0xB3, 0xE8, 0x8C, 0x7C, 0x59, 0xD5, 0xED, 0xC2, 0xD8, 0xCF, 0xF0, 0x52, 0x4B, 0xC2, 0xE4, 0x00, 0x7D, 0x36, 0x19, 0x3C, 0xE8, 0x1A, 0x82, 0x93, 0xE1, 0xD5, 0x9F, 0x83, 0xE8, 0xC4, 0x3B, 0x82, 0xB2, 0xFB, 0x9F, 0x76, 0x5E, 0xD3, 0x63,
+ 0xD7, 0x29, 0xF1, 0x9C, 0xF4, 0x41, 0x17, 0x45, 0xCF, 0xAA, 0x05, 0x56, 0xAB, 0x9B, 0xFF, 0xC7, 0x73, 0xEC, 0x9E, 0x8A, 0xC7, 0xA7, 0xEE, 0xE8, 0x6C, 0xFF, 0x4A, 0x5F, 0x85, 0x68, 0x2E, 0x79, 0x66, 0xFC, 0x55, 0x50, 0x61, 0xAA, 0x78, 0x58,
+ 0xCF, 0xB9, 0x29, 0xC7, 0x99, 0xE5, 0x12, 0xD4, 0x6B, 0x6E, 0x18, 0xCD, 0x3A, 0x6D, 0x4C, 0x99, 0x7A, 0xF7, 0xDD, 0x99, 0x6B, 0x30, 0x66, 0x7E, 0x70, 0x05, 0xAB, 0x38, 0x7F, 0x64, 0x66, 0x57, 0xA1, 0x6D, 0x41, 0x0E, 0x3C, 0x2E, 0x91, 0x8F,
+ 0xE5, 0x13, 0xC4, 0x0C, 0xCC, 0xDE, 0x27, 0x5A, 0xCC, 0x5D, 0xFF, 0x69, 0xBF, 0xCC, 0xF2, 0x33, 0x4D, 0xD8, 0xA2, 0x66, 0x8C, 0x38, 0x5B, 0x9B, 0xF9, 0xB1, 0xB3, 0x0F, 0x4B, 0x54, 0x5D, 0x52, 0x1B, 0xAD, 0xE9, 0xCB, 0xE5, 0x89, 0x8E, 0x50,
+ 0x31, 0x1A, 0xC2, 0x36, 0x29, 0xF2, 0x60, 0x5D, 0xA8, 0xCC, 0xA7, 0xA4, 0x72, 0x66, 0x1B, 0x32, 0x21, 0xEA, 0xC4, 0x67, 0x18, 0xE3, 0x36, 0x4E, 0x2B, 0x1E, 0x10, 0xD3, 0xD9, 0x35, 0x0F, 0xC5, 0xB3, 0x8E, 0x93, 0xF0, 0xDE, 0x9B, 0xE1, 0x3A,
+ 0xCD, 0x98, 0x82, 0x09, 0x99, 0xE8, 0x47, 0x26, 0xD5, 0x89, 0xE6, 0x95, 0xF3, 0x07, 0xFF, 0x62, 0x2C, 0xE7, 0x25, 0x53, 0xD5, 0x31, 0x65, 0xA2, 0xAF, 0x55, 0xEF, 0x7A, 0x44, 0xAD, 0xD9, 0x3B, 0x20, 0xD2, 0xD5, 0x75, 0xCA, 0x4C, 0xAA, 0x10,
+ 0x28, 0xE7, 0x77, 0x98, 0x95, 0xA4, 0xF7, 0x98, 0x13, 0x67, 0x5F, 0xDB, 0xF4, 0x24, 0x9D, 0x4F, 0xEB, 0x81, 0xBE, 0x43, 0xD1, 0x71, 0xFE, 0x1A, 0xA7, 0xA5, 0xE7, 0x86, 0xBE, 0xE9, 0x45, 0x86, 0x80, 0xE8, 0xB2, 0xA5, 0x46, 0x9C, 0x45, 0x5B,
+ 0x93, 0x9F, 0x16, 0x1D, 0x24, 0xA7, 0x3F, 0x27, 0x9C, 0xAC, 0xD1, 0x03, 0x8D, 0xDD, 0x25, 0xE2, 0x7F, 0x7E, 0xB4, 0x63, 0x81, 0x9F, 0xBE, 0xE5, 0x73, 0x14, 0x5D, 0xC8, 0x38, 0xAB, 0x31, 0x8E, 0x43, 0xD5, 0x79, 0x17, 0xA9, 0xC3, 0x55, 0xF9,
+ 0x4C, 0xBE, 0x12, 0xC8, 0x63, 0x7A, 0x13, 0xC9, 0x1D, 0xE2, 0x79, 0x84, 0x0C, 0xD7, 0xAA, 0x94, 0x41, 0x5D, 0xAD, 0x44, 0x97, 0x09, 0x30, 0x8B, 0xBC, 0x15, 0x6D, 0x60, 0x2F, 0x4F, 0x3F, 0xEF, 0x49, 0x14, 0xF4, 0xD8, 0xCB, 0x9F, 0x09, 0x20,
+ 0xCB, 0xD6, 0x2F, 0xC0, 0x74, 0x7A, 0xA3, 0x21, 0xD7, 0x36, 0x46, 0x02, 0x7A, 0x97, 0x2C, 0x53, 0xEC, 0x78, 0x90, 0x61, 0x5C, 0x47, 0x42, 0x8F, 0xD3, 0xB5, 0x43, 0x8A, 0xDA, 0x60, 0xDF, 0x61, 0x83, 0x4D, 0x63, 0xA0, 0x90, 0x3C, 0x0C, 0x85,
+ 0x95, 0xF0, 0x2E, 0x16, 0x74, 0xBD, 0xC3, 0xA2, 0xB8, 0xE2, 0x10, 0x05, 0x95, 0xC9, 0xCE, 0x1D, 0x21, 0x2E, 0x13, 0xD6, 0xF5, 0xBC, 0xCE, 0x61, 0x74, 0x79, 0xCC, 0xEA, 0xB9, 0x1B, 0xE2, 0x38, 0x8A, 0xE4, 0x59, 0xCE, 0xEA, 0x69, 0x10, 0x1A,
+ 0xAE, 0x47, 0x43, 0x4F, 0x2C, 0xE0, 0xA6, 0x9F, 0x1E, 0x25, 0x43, 0x53, 0x21, 0x32, 0x0C, 0xF8, 0x16, 0x78, 0xE7, 0xB2, 0x67, 0x02, 0x45, 0xA5, 0xF3, 0xF0, 0x43, 0xF9, 0x73, 0x80, 0x13, 0xD6, 0xB3, 0xC5, 0x5E, 0xFB, 0x5A, 0xCF, 0x8C, 0x99,
+ 0x40, 0xF4, 0x22, 0xE0, 0x8E, 0x76, 0xE5, 0xAF, 0xD6, 0xBA, 0xE8, 0x94, 0x3E, 0xBA, 0x3E, 0x61, 0xF2, 0x60, 0x97, 0xFD, 0x60, 0xD7, 0xB9, 0x4A, 0x92, 0x64, 0x14, 0x8B, 0x45, 0xDE, 0x82, 0xFF, 0x86, 0xDC, 0x92, 0xB3, 0x4C, 0x44, 0x08, 0x1B,
+ 0x95, 0x04, 0x53, 0x29, 0x37, 0xD6, 0xBA, 0x07, 0xFC, 0x9F, 0x42, 0xDC, 0x98, 0x4B, 0xB8, 0xB2, 0xC4, 0x1D, 0x5F, 0x00, 0xDC, 0x33, 0xCA, 0x90, 0xDA, 0x31, 0x6E, 0x28, 0x9D, 0xC7, 0xB6, 0x29, 0xF7, 0x56, 0xFF, 0x33, 0x0A, 0x88, 0x63, 0x24,
+ 0xF2, 0xDD, 0x10, 0xCC, 0x42, 0x26, 0x33, 0xB1, 0xDA, 0xAE, 0xA3, 0xCF, 0x59, 0xE3, 0x3B, 0x00, 0xA4, 0x65, 0xBF, 0x1A, 0xEA, 0xFE, 0x63, 0xB7, 0x74, 0xAC, 0x6F, 0x38, 0x85, 0x68, 0xAF, 0x07, 0x57, 0xDB, 0xF3, 0x52, 0xAC, 0xAC, 0x0D, 0x92,
+ 0xE2, 0xAD, 0x72, 0x8F, 0xAE, 0x5A, 0xC9, 0x36, 0xF2, 0xA7, 0x0A, 0xDE, 0x1C, 0xA7, 0x19, 0xCE, 0xD4, 0x1F, 0xC2, 0x60, 0xBE, 0x60, 0x0A, 0x37, 0x27, 0x75, 0xFC, 0xD0, 0xC2, 0x8D, 0x9E, 0x05, 0x06, 0x37, 0xA3, 0xCA, 0xF2, 0x69, 0xA1, 0x27,
+ 0xEF, 0xBC, 0xED, 0x80, 0x9D, 0xB4, 0xC5, 0x09, 0xEC, 0xED, 0x87, 0xA0, 0x44, 0x48, 0xD9, 0xB7, 0xC6, 0xDF, 0xF2, 0x52, 0x9D, 0xB6, 0x52, 0xF4, 0x1B, 0x6D, 0x2E, 0xC3, 0xB5, 0x74, 0xFA, 0x24, 0xC9, 0x02, 0x5E, 0x84, 0xD6, 0xC2, 0x4C, 0x9C,
+ 0x88, 0x66, 0x98, 0xAC, 0x6B, 0x93, 0x39, 0xE8, 0xBD, 0x2E, 0x3D, 0xF3, 0x8F, 0x7E, 0x64, 0x00, 0x56, 0x79, 0x73, 0xDC, 0x20, 0xCC, 0xF7, 0x77, 0x51, 0x0C, 0x70, 0x19, 0xD5, 0x8F, 0x60, 0xA5, 0xE6, 0x5C, 0x3A, 0x08, 0x5B, 0xFC, 0x09, 0x8C,
+ 0x7B, 0x5E, 0x08, 0x91, 0x80, 0x8A, 0xA5, 0xBA, 0x70, 0xF8, 0x2B, 0xBC, 0xC5, 0x6A, 0x8F, 0x4B, 0x31, 0x24, 0x65, 0x69, 0x5F, 0x0D, 0x84, 0xDF, 0xD3, 0xBC, 0xA4, 0xCC, 0xED, 0x5D, 0x96, 0x2B, 0x44, 0xFF, 0x9B, 0xCE, 0xC4, 0x4F, 0x83, 0xA8,
+ 0x4C, 0x7B, 0x99, 0xE4, 0x7C, 0x19, 0x30, 0x8D, 0x22, 0x8E, 0xEC, 0x5E, 0x03, 0x8F, 0xC5, 0xC2, 0x90, 0x3C, 0xF1, 0x2D, 0x16, 0xFE, 0xB7, 0xD3, 0x95, 0xA2, 0x53, 0x16, 0xA9, 0x11, 0x31, 0x00, 0x46, 0x53, 0x92, 0xA3, 0x71, 0x32, 0x9E, 0x24,
+ 0x07, 0x9E, 0x1F, 0x7E, 0x67, 0x50, 0xAE, 0x5F, 0x55, 0x14, 0x5E, 0xD3, 0x56, 0x33, 0x05, 0x4C, 0xBA, 0x5E, 0xC7, 0x00, 0xB3, 0x8D, 0x47, 0x7C, 0x06, 0xD5, 0xAE, 0xDC, 0x4B, 0x5D, 0xD7, 0x5C, 0x6D, 0x0B, 0x3A, 0x8F, 0x63, 0xAB, 0x57, 0x7D,
+ 0x66, 0xEB, 0x1A, 0x55, 0xA3, 0x5E, 0xEB, 0x6E, 0xA4, 0xF1, 0x8F, 0x35, 0x50, 0xA5, 0x2D, 0x70, 0x09, 0x55, 0x5B, 0xFD, 0x74, 0x35, 0x5A, 0x0B, 0x79, 0xA0, 0xC4, 0x19, 0x9B, 0xFD, 0x71, 0x18, 0xC1, 0x16, 0x8C, 0x37, 0xEB, 0x1E, 0x6B, 0x1C,
+ 0xC7, 0xCC, 0x63, 0x2E, 0xC9, 0x26, 0x07, 0x76, 0xDF, 0x60, 0xF3, 0xAB, 0x13, 0xA4, 0x9E, 0xDA, 0x76, 0xDE, 0xB6, 0x7E, 0x8E, 0x4E, 0xA5, 0x26, 0xF2, 0xEC, 0x23, 0xDC, 0x48, 0x52, 0x44, 0xCE, 0xBD, 0x11, 0x8A, 0x25, 0x70, 0x45, 0x4E, 0x38,
+ 0xB8, 0x04, 0x53, 0x05, 0xE3, 0xF7, 0x6D, 0x36, 0xE6, 0xC0, 0x4C, 0x95, 0x1E, 0x44, 0x1E, 0x31, 0x88, 0x85, 0xEE, 0x67, 0xEC, 0xE9, 0x45, 0x7B, 0xBB, 0x60, 0x66, 0x16, 0xBE, 0xCA, 0xC3, 0xB3, 0x03, 0x5F, 0xA8, 0xEE, 0x44, 0x1C, 0xF3, 0x2A,
+ 0xDB, 0x0D, 0x20, 0x6E, 0x43, 0x2A, 0xB6, 0x1F, 0xE2, 0x2C, 0x57, 0x8F, 0xC2, 0x66, 0xE5, 0xAD, 0xB2, 0x06, 0x64, 0x34, 0x69, 0x7D, 0xC9, 0xD1, 0x6D, 0x88, 0x73, 0xD5, 0xF2, 0x60, 0xCA, 0x37, 0xF5, 0x26, 0xE6, 0x02, 0x28, 0x0E, 0x15, 0x48,
+ 0xE2, 0x69, 0x1F, 0x61, 0xB0, 0xDC, 0x08, 0x92, 0x12, 0x26, 0x92, 0x85, 0x26, 0xAB, 0x1F, 0xC3, 0x13, 0x14, 0x6B, 0x06, 0xA8, 0x51, 0xAD, 0xED, 0x8D, 0x5B, 0x35, 0x65, 0x5E, 0x0C, 0x01, 0x30, 0x99, 0xBC, 0x54, 0xA9, 0x7D, 0x57, 0xF0, 0xBC,
+ 0x15, 0x4D, 0x71, 0x94, 0x4F, 0xC2, 0x1F, 0x46, 0xB0, 0x3E, 0x64, 0x39, 0x11, 0xB6, 0xA9, 0x52, 0x62, 0xD8, 0xED, 0x34, 0xFF, 0x8F, 0x72, 0x26, 0xB7, 0xB8, 0xEF, 0x11, 0x27, 0x8D, 0xD8, 0x9F, 0x31, 0x89, 0xF2, 0x5F, 0x36, 0x17, 0x81, 0xB4,
+ 0xD8, 0xF3, 0x02, 0x2A, 0x93, 0xCD, 0xC5, 0x7E, 0x85, 0x37, 0xD4, 0x1E, 0x65, 0xE9, 0xD7, 0xD0, 0xFC, 0x7D, 0x8D, 0xBA, 0x77, 0x02, 0xF6, 0xC2, 0x2B, 0xE4, 0xA2, 0x82, 0x28, 0x9F, 0x87, 0xF5, 0x07, 0xB5, 0x17, 0x52, 0xA5, 0xA0, 0x76, 0xDA,
+ 0xEB, 0xC3, 0x36, 0x23, 0xF3, 0x72, 0x6C, 0xB2, 0xE2, 0xD4, 0xE2, 0xAC, 0xBE, 0x6C, 0xE5, 0x3C, 0xAB, 0x6D, 0x09, 0xDD, 0x70, 0x6F, 0x8C, 0x76, 0x3A, 0xCB, 0xAD, 0x1D, 0x5C, 0x69, 0x07, 0xD5, 0xDA, 0xA5, 0xD7, 0x01, 0x1C, 0xAD, 0x93, 0x61,
+ 0xB8, 0x47, 0xC6, 0x00, 0x41, 0x6E, 0x71, 0xC6, 0x8A, 0x23, 0x8D, 0x7A, 0xF7, 0x21, 0x86, 0x32, 0x8A, 0x84, 0x35, 0x8A, 0x8A, 0xEF, 0x8A, 0xDA, 0xA4, 0x39, 0x10, 0xB8, 0xAB, 0x56, 0x4E, 0xD9, 0x54, 0xB9, 0x87, 0x64, 0x06, 0xAE, 0x73, 0x4F,
+ 0xDF, 0xD0, 0x73, 0xB6, 0x1D, 0x33, 0xA5, 0x58, 0x28, 0xD2, 0xA1, 0xE9, 0xF4, 0x44, 0x81, 0x7F, 0xB6, 0x75, 0x04, 0xD3, 0x33, 0x56, 0x1B, 0x8F, 0xDD, 0x35, 0x58, 0xDE, 0x62, 0x90, 0x69, 0x80, 0xD1, 0xCE, 0xA8, 0x00, 0xD6, 0xF7, 0x24, 0x09,
+ 0xA3, 0xA9, 0xEC, 0xAA, 0x10, 0xAC, 0xC6, 0x3D, 0x29, 0x76, 0x5A, 0xB0, 0x9B, 0x81, 0x90, 0x19, 0xCC, 0x14, 0x60, 0xD8, 0x74, 0x3F, 0x14, 0x23, 0xBF, 0x2F, 0x81, 0x55, 0xE3, 0x4B, 0x77, 0x1D, 0xB9, 0x59, 0x81, 0x15, 0x91, 0x27, 0xAD, 0xD7,
+ 0xBA, 0x1F, 0x20, 0xAD, 0xD3, 0x2F, 0x82, 0xFC, 0x5C, 0x09, 0x16, 0xCC, 0x6E, 0x47, 0xA6, 0xA0, 0xE0, 0x1D, 0xD9, 0xCA, 0xC9, 0x98, 0x65, 0xAA, 0xEB, 0x2A, 0x8E, 0x5E, 0x8F, 0xD9, 0xAB, 0xCD, 0x2A, 0x21, 0x76, 0x57, 0xC9, 0x1E, 0xBB, 0x1B,
+ 0xF7, 0x0F, 0x5D, 0x02, 0x7D, 0x8C, 0xDB, 0x08, 0xA9, 0x88, 0x1B, 0xCD, 0x04, 0xB4, 0x68, 0x45, 0x51, 0x8D, 0xAA, 0x39, 0xF0, 0x82, 0xA4, 0xD4, 0xDE, 0x71, 0x04, 0xE5, 0xFF, 0xFB, 0xEA, 0x39, 0x80, 0xB1, 0x2B, 0x6F, 0x87, 0x66, 0x83, 0x34,
+ 0x61, 0xC5, 0xCF, 0x8E, 0x68, 0x75, 0x22, 0x56, 0x2D, 0x51, 0xEE, 0x77, 0x6E, 0xCF, 0x44, 0x51, 0xEA, 0x1A, 0xCC, 0x97, 0xE3, 0x98, 0xC8, 0xBE, 0x32, 0x9D, 0x95, 0xD2, 0x28, 0x13, 0x41, 0xB5, 0xB5, 0xBA, 0x76, 0x86, 0x98, 0xBB, 0xF0, 0x25,
+ 0x2C, 0x3E, 0xDF, 0xC4, 0x1C, 0x8D, 0xF4, 0x14, 0xA2, 0x99, 0x7E, 0x90, 0x11, 0x26, 0xD3, 0x53, 0x72, 0x4A, 0x4E, 0x64, 0xC7, 0x2E, 0xF0, 0x88, 0xB3, 0x85, 0xAA, 0xBC, 0x07, 0xAE, 0x29, 0xDC, 0xE6, 0xB3, 0x6C, 0xC2, 0x4D, 0x4D, 0xE2, 0x2E,
+ 0x96, 0xF0, 0xAA, 0x67, 0x6E, 0xED, 0xBA, 0xF7, 0x6B, 0x17, 0x61, 0xCB, 0xB2, 0xE6, 0xE6, 0xDC, 0x66, 0x13, 0x75, 0x66, 0x34, 0x5E, 0x9A, 0x9D, 0xBB, 0x9C, 0xDE, 0xB9, 0xB0, 0x64, 0x3E, 0x9A, 0x0C, 0xD5, 0x43, 0x2E, 0xB3, 0xF1, 0x32, 0x73,
+ 0x3A, 0x47, 0x11, 0x24, 0x8B, 0xED, 0x15, 0xC1, 0xE3, 0x0A, 0xDC, 0x31, 0x06, 0x87, 0x5A, 0x70, 0x9A, 0x4C, 0xFE, 0xA5, 0x23, 0x71, 0xAB, 0x0A, 0x2D, 0x92, 0x77, 0x02, 0xBA, 0xC1, 0x7E, 0x64, 0xDF, 0x69, 0x3B, 0xC9, 0x73, 0x17, 0x1E, 0xD8,
+ 0x3A, 0x80, 0xFA, 0x44, 0x75, 0xED, 0xFA, 0x62, 0x41, 0xAB, 0x66, 0x3A, 0x1B, 0x57, 0x1D, 0xB7, 0xEB, 0xDC, 0x7F, 0xE0, 0xB0, 0xAB, 0x95, 0x36, 0x7C, 0xF1, 0xF5, 0xEB, 0xB8, 0xA6, 0xAB, 0xA3, 0xED, 0xBE, 0xF6, 0xEF, 0x3F, 0x78, 0xA3, 0x47,
+ 0xFB, 0xB1, 0xA1, 0x65, 0x72, 0x9A, 0x22, 0xCA, 0xDE, 0xF1, 0x8D, 0x28, 0xC3, 0x10, 0x2B, 0xB7, 0xDC, 0x13, 0x5F, 0xEA, 0x06, 0x6A, 0x40, 0x6D, 0xD7, 0x45, 0xED, 0xD0, 0x76, 0xD8, 0x79, 0x55, 0xE1, 0x53, 0x03, 0xF9, 0x09, 0xCB, 0x2F, 0x0F,
+ 0x27, 0x1E, 0x2A, 0x1F, 0x8D, 0x1C, 0x34, 0x44, 0x58, 0x04, 0x20, 0xCB, 0x5A, 0x73, 0x6E, 0xFB, 0xB0, 0x94, 0xA4, 0x4A, 0xBC, 0xA0, 0xD5, 0x85, 0x3A, 0xCE, 0x14, 0xE1, 0x21, 0x35, 0xA5, 0x5E, 0x77, 0x5A, 0x46, 0x14, 0xBC, 0x42, 0xF4, 0xDF,
+ 0xC4, 0xEC, 0x08, 0x49, 0xE7, 0x98, 0xE9, 0x5C, 0x73, 0x44, 0x21, 0xC2, 0xD2, 0x5C, 0xAF, 0x48, 0x37, 0x2B, 0x15, 0x00, 0xFE, 0x4D, 0x8A, 0x15, 0x96, 0x6B, 0x99, 0xAF, 0x12, 0x6D, 0x33, 0xF4, 0x33, 0x3E, 0xCE, 0xE1, 0xA7, 0x71, 0xB0, 0x7E,
+ 0x16, 0x47, 0x9B, 0x40, 0xDA, 0xE4, 0x1F, 0xF9, 0xC8, 0x3A, 0xA7, 0xFD, 0xF0, 0x0D, 0xD7, 0xFC, 0x9D, 0x6E, 0x81, 0x7F, 0x30, 0x65, 0x60, 0xC4, 0x55, 0x29, 0x7C, 0x8A, 0x5B, 0x66, 0xCC, 0x8B, 0x38, 0xA6, 0x97, 0xAD, 0xFB, 0x11, 0xE2, 0xF1,
+ 0xCA, 0xB4, 0x94, 0x44, 0xE7, 0xA4, 0x75, 0x93, 0x8D, 0x0C, 0x65, 0xCD, 0x83, 0x11, 0x9A, 0xA3, 0x61, 0xDF, 0x80, 0x21, 0x8F, 0x3D, 0x62, 0x49, 0xBD, 0x01, 0xB3, 0xD5, 0x5B, 0xD2, 0xF4, 0x55, 0xA4, 0xDF, 0xCB, 0x7B, 0xD3, 0x4B, 0xD1, 0x74,
+ 0x77, 0xB3, 0xAE, 0x1F, 0x21, 0x35, 0x29, 0x82, 0x2A, 0x80, 0x21, 0xF7, 0xCA, 0x13, 0x51, 0xD9, 0x32, 0xA3, 0x74, 0x46, 0xCB, 0x23, 0x2A, 0x6C, 0x3B, 0x14, 0xC0, 0x00, 0x17, 0x4A, 0xA5, 0xFE, 0x8A, 0x94, 0xB9, 0x47, 0xD5, 0x9C, 0xB5, 0x5C,
+ 0x22, 0x17, 0x48, 0x7B, 0x2C, 0xE4, 0xC1, 0x34, 0xDB, 0x67, 0x0F, 0xB5, 0x3F, 0x6D, 0xFB, 0x12, 0x39, 0xA7, 0xE5, 0x85, 0x71, 0x27, 0x63, 0xEB, 0x0F, 0x83, 0xEF, 0xC9, 0x7D, 0xFF, 0xC3, 0xC7, 0xC6, 0x77, 0x5F, 0xA7, 0xB5, 0x78, 0x94, 0xB5,
+ 0x01, 0xC3, 0xFA, 0x5E, 0x67, 0x32, 0x93, 0x7B, 0xCE, 0x62, 0x73, 0x7B, 0xC6, 0x42, 0x8B, 0x99, 0x03, 0x4D, 0x06, 0xD5, 0x66, 0x01, 0x8B, 0xBC, 0xA1, 0x53, 0x6D, 0x1B, 0x4B, 0x59, 0xB1, 0xCE, 0x0B, 0x59, 0x36, 0x95, 0x0B, 0xBA, 0x94, 0x8C,
+ 0xE7, 0xC2, 0x64, 0x1E, 0x4B, 0x48, 0x63, 0x35, 0x26, 0x0F, 0xD8, 0x4B, 0x7B, 0x24, 0x2E, 0x1A, 0x6D, 0x74, 0x99, 0x15, 0x65, 0x6B, 0x30, 0x94, 0x6E, 0x71, 0x51, 0xE5, 0xBA, 0x53, 0xFE, 0x80, 0x66, 0x4D, 0xA4, 0xF1, 0xC4, 0x3F, 0x53, 0xCD,
+ 0x3F, 0xD7, 0x52, 0xFB, 0xB0, 0x4B, 0xAC, 0x39, 0x91, 0xBF, 0x98, 0x90, 0x43, 0x04, 0x9A, 0x53, 0xCA, 0x0F, 0x96, 0x46, 0xC8, 0x80, 0xAA, 0xAF, 0xD6, 0x5F, 0x7E, 0xE8, 0xEE, 0x78, 0xC9, 0xF9, 0x83, 0x4F, 0x75, 0x63, 0xB0, 0xE5, 0x20, 0x29,
+ 0x27, 0x63, 0x2C, 0xCC, 0xBF, 0xFC, 0xE0, 0x5F, 0x32, 0x41, 0x15, 0x07, 0xE1, 0x34, 0xE9, 0x0D, 0x22, 0xB7, 0xAF, 0x2C, 0x78, 0xD3, 0x35, 0xD6, 0x26, 0x50, 0x28, 0x56, 0x23, 0x8F, 0x9E, 0x2C, 0x46, 0xA9, 0x94, 0x8A, 0x61, 0x84, 0xAC, 0xBA,
+ 0x0A, 0xB9, 0x73, 0xB6, 0x38, 0x2C, 0xF2, 0x93, 0x8A, 0x73, 0x41, 0xCE, 0x7C, 0x0D, 0xE9, 0x25, 0x17, 0x05, 0x3E, 0xD0, 0xB6, 0xDD, 0xCB, 0xB2, 0x25, 0x29, 0xA4, 0x6F, 0x00, 0x77, 0x69, 0x53, 0xCE, 0xDA, 0x57, 0x23, 0xBD, 0x44, 0x97, 0x4D,
+ 0x49, 0x1E, 0x40, 0xF0, 0xCE, 0xD1, 0xF7, 0x4E, 0xAD, 0xDC, 0xF3, 0xFB, 0xD9, 0xEB, 0x0B, 0x7A, 0xEE, 0x05, 0x56, 0x48, 0x80, 0xB6, 0x4B, 0xE3, 0x6B, 0xBF, 0xCB, 0xA3, 0xE4, 0x3D, 0xDC, 0x9B, 0x9F, 0x54, 0x25, 0xBF, 0x11, 0xBC, 0x9B, 0x94,
+ 0xE3, 0x0F, 0x6D, 0x5F, 0xA7, 0x09, 0x15, 0x18, 0xF4, 0x00, 0xC9, 0xC5, 0xE0, 0x07, 0xDA, 0xCF, 0x48, 0x9A, 0x4D, 0x20, 0x33, 0xE3, 0xF5, 0x2A, 0xDE, 0xDB, 0x1B, 0x8C, 0x07, 0x85, 0x09, 0x44, 0x2C, 0x4E, 0x17, 0xEE, 0x09, 0x0F, 0x3B, 0xEA,
+ 0x39, 0x35, 0x9E, 0xA9, 0xDE, 0xA5, 0x93, 0x6D, 0x5B, 0x7A, 0x21, 0xE2, 0x40, 0x1B, 0x46, 0x9D, 0xDF, 0xA3, 0x32, 0x70, 0x38, 0x89, 0x58, 0x3D, 0xED, 0x7B, 0x06, 0x7B, 0x42, 0xD3, 0xF6, 0xDB, 0x86, 0xC1, 0x21, 0x5C, 0x8F, 0x15, 0xC0, 0x41,
+ 0xB9, 0x5E, 0x6B, 0xE3, 0xD5, 0x50, 0xF1, 0xB1, 0x48, 0x7C, 0xB8, 0x44, 0xE7, 0x40, 0x8C, 0xB2, 0xEA, 0x24, 0x1F, 0x76, 0x15, 0x61, 0x8F, 0x9F, 0x5E, 0x2B, 0x1F, 0xE5, 0x79, 0xC9, 0x4D, 0xC3, 0x39, 0x00, 0x85, 0x49, 0x9C, 0xC5, 0xF3, 0x42,
+ 0x66, 0xF8, 0x2A, 0x03, 0x20, 0x6F, 0x11, 0x24, 0x3A, 0xD5, 0xBD, 0xC1, 0x9B, 0x4E, 0xA8, 0x3B, 0xB7, 0xFE, 0x68, 0x9E, 0x16, 0xA2, 0xA5, 0x4B, 0x1B, 0x47, 0xBA, 0xB2, 0xAB, 0x89, 0xDB, 0x15, 0xA9, 0x70, 0x37, 0x96, 0x41, 0x2D, 0x6B, 0x0A,
+ 0x13, 0x0A, 0x08, 0xEF, 0xBD, 0x88, 0x3E, 0x53, 0xD2, 0x9A, 0x51, 0xDE, 0xBB, 0xDE, 0x64, 0x6D, 0xEE, 0xE1, 0x85, 0xD2, 0x77, 0x68, 0x46, 0x78, 0xF3, 0x7D, 0x81, 0x2F, 0x64, 0x16, 0x4E, 0xDB, 0xFC, 0x32, 0xBB, 0x04, 0x00, 0x6D, 0x4E, 0x8B,
+ 0x75, 0x3B, 0x02, 0x03, 0x9E, 0x27, 0x2C, 0x6D, 0x03, 0x87, 0x32, 0x72, 0x94, 0xDC, 0xB2, 0x34, 0x23, 0x67, 0xC3, 0xC8, 0x9F, 0xE6, 0x7C, 0xC1, 0x49, 0xC4, 0x70, 0x4D, 0x4C, 0x55, 0x5A, 0x9E, 0x9A, 0x7C, 0xC6, 0x7F, 0x1B, 0xA9, 0xF3, 0x4C,
+ 0x60, 0x42, 0xE9, 0x8E, 0x20, 0x6E, 0x2F, 0x49, 0xB3, 0x24, 0x76, 0x06, 0xB2, 0xB0, 0x26, 0x9F, 0xAD, 0x70, 0x98, 0xC4, 0x07, 0x95, 0x04, 0xB6, 0x54, 0x7C, 0x10, 0xFD, 0x2C, 0x85, 0x58, 0x4F, 0x02, 0x95, 0xC7, 0xEA, 0x20, 0x33, 0x4A, 0x58,
+ 0xF9, 0xB6, 0x4B, 0x3D, 0x0E, 0x9D, 0x0A, 0x2B, 0x81, 0x94, 0x98, 0x85, 0x04, 0xA1, 0x1A, 0xFF, 0xF0, 0x46, 0xBC, 0x4C, 0x2E, 0xC2, 0x43, 0xFE, 0x95, 0x8D, 0x80, 0x7B, 0x84, 0xB3, 0x99, 0x9D, 0xE5, 0xC4, 0xF0, 0xD4, 0xE0, 0x96, 0x90, 0x56,
+ 0x93, 0x32, 0x7C, 0x79, 0x60, 0xA3, 0x31, 0x6B, 0x4F, 0xAB, 0x3C, 0x0B, 0x69, 0x10, 0x51, 0x12, 0xD5, 0x22, 0x3A, 0x3E, 0xCA, 0x5F, 0xE2, 0x32, 0x8F, 0x9C, 0x37, 0x55, 0x5F, 0x7E, 0x6C, 0x12, 0xFB, 0xC0, 0xA7, 0xDC, 0x5C, 0xB4, 0xB1, 0x5F,
+ 0x4F, 0xBE, 0x18, 0xAF, 0x5A, 0x01, 0x15, 0xA8, 0x6B, 0x72, 0xAE, 0xBA, 0x72, 0xED, 0x93, 0x38, 0x14, 0x3B, 0x3C, 0x6C, 0x46, 0xE2, 0xE0, 0x1E, 0xFB, 0x6C, 0xD1, 0xEF, 0x65, 0x98, 0xF6, 0x8B, 0x7C, 0xBA, 0x12, 0x65, 0x78, 0x44, 0x0A, 0x09,
+ 0x0B, 0x0F, 0xAE, 0xA2, 0x60, 0x35, 0xA9, 0x3D, 0xAC, 0x88, 0x4E, 0x26, 0x10, 0x67, 0x4E, 0x9E, 0xCD, 0x67, 0xAC, 0xF3, 0x7F, 0xA2, 0xFA, 0xD1, 0xEB, 0x7B, 0xBD, 0xD2, 0x63, 0xD9, 0xB4, 0x34, 0x1C, 0xD9, 0xFE, 0x40, 0xE8, 0x0F, 0xE2, 0x1B,
+ 0x53, 0x2C, 0xFD, 0x3A, 0x19, 0x7A, 0x37, 0x10, 0xB1, 0x72, 0x4A, 0x89, 0x1E, 0xFC, 0xF0, 0x27, 0xDF, 0xAF, 0x2B, 0x14, 0x28, 0x86, 0x9F, 0x7D, 0xBC, 0xDA, 0x12, 0x36, 0xC1, 0xF6, 0x48, 0x56, 0xB9, 0x20, 0x09, 0xB0, 0x16, 0xEC, 0xFB, 0x70,
+ 0x34, 0xC2, 0xF0, 0x6D, 0xD0, 0x39, 0x84, 0xE8, 0x69, 0xA4, 0xF0, 0xCB, 0xB2, 0x60, 0xE7, 0x5E, 0x50, 0x0B, 0x74, 0x0C, 0x55, 0x8C, 0x57, 0x46, 0x7B, 0x29, 0xFA, 0x2E, 0xA3, 0xC6, 0x8F, 0x57, 0xA3, 0x54, 0x74, 0xC5, 0x05, 0x64, 0x1E, 0x4A,
+ 0x4C, 0x9E, 0x47, 0xC9, 0xBC, 0x87, 0x2D, 0x7B, 0xA6, 0x8C, 0x3F, 0xBD, 0x47, 0x25, 0x06, 0xB2, 0xFC, 0x90, 0xE5, 0xBA, 0xC0, 0xAE, 0x97, 0x95, 0x6B, 0x1A, 0xE1, 0x28, 0x94, 0x47, 0x6D, 0xA6, 0x53, 0xF9, 0xFD, 0x50, 0xB9, 0x2B, 0xF0, 0x0D,
+ 0x58, 0x58, 0xEC, 0xA1, 0x2E, 0xD6, 0x03, 0xE0, 0x5D, 0x10, 0xE9, 0xD6, 0x6F, 0xE9, 0x77, 0xEC, 0xDB, 0x1B, 0xE8, 0x47, 0x71, 0x58, 0xED, 0x9D, 0x96, 0x68, 0x38, 0xE8, 0xA5, 0xC5, 0xA9, 0xF4, 0xB5, 0x77, 0x66, 0x56, 0xEF, 0x7C, 0xEC, 0xFD,
+ 0xBF, 0x20, 0x9D, 0x58, 0x4A, 0x58, 0xE3, 0x15, 0x5A, 0xA3, 0x07, 0x30, 0x6E, 0x96, 0x0F, 0x76, 0x25, 0x50, 0x8A, 0x4B, 0x0B, 0x87, 0xC0, 0x9C, 0x52, 0x1C, 0xE5, 0x69, 0x04, 0x63, 0x8A, 0x59, 0x0D, 0x77, 0x6D, 0xFA, 0xD2, 0xC8, 0x46, 0x0B,
+ 0xA8, 0x58, 0xA1, 0xA8, 0x28, 0xB4, 0x48, 0xC5, 0x04, 0x04, 0x2C, 0x52, 0x45, 0xD2, 0xC0, 0x60, 0xD4, 0xC9, 0x17, 0x7C, 0xAC, 0x93, 0x94, 0x30, 0xC2, 0xE4, 0x97, 0xB1, 0x43, 0xE1, 0xD5, 0x9C, 0x9B, 0xA4, 0x00, 0x15, 0x38, 0x78, 0xF9, 0x37,
+ 0x20, 0x06, 0x65, 0x6F, 0xDF, 0x89, 0xE6, 0x14, 0x62, 0x0F, 0x4E, 0x14, 0x83, 0x0D, 0xF4, 0xB1, 0x5C, 0x4F, 0x7F, 0xB7, 0x96, 0x98, 0xC1, 0xC1, 0xDB, 0xFC, 0x23, 0x04, 0x3F, 0x82, 0xCD, 0xC1, 0xCB, 0xE5, 0x9D, 0xC8, 0x97, 0x14, 0x26, 0x8A,
+ 0x07, 0x40, 0xE5, 0xEC, 0xA7, 0x5B, 0x59, 0x37, 0x0E, 0x66, 0x17, 0xE7, 0x39, 0x0A, 0x1B, 0xAA, 0x06, 0xD6, 0xA6, 0xCD, 0x82, 0x69, 0x02, 0x4D, 0xC5, 0xA8, 0x42, 0x3B, 0x96, 0xFB, 0xB4, 0x41, 0x86, 0x26, 0xB5, 0xFC, 0x39, 0xDE, 0x12, 0x98,
+ 0x82, 0x57, 0x15, 0x8E, 0x61, 0x63, 0x01, 0x0A, 0xD2, 0x78, 0xEB, 0xF2, 0xD2, 0xE7, 0x63, 0x86, 0xB1, 0x7C, 0x51, 0x59, 0x2A, 0xF2, 0x1B, 0x98, 0xEB, 0x39, 0x0C, 0x74, 0x45, 0xE9, 0xE9, 0x81, 0xA3, 0x6D, 0xD7, 0x07, 0x1F, 0xA2, 0x2D, 0xF0,
+ 0x34, 0xC1, 0xB1, 0xCC, 0xFF, 0xC0, 0x9B, 0x91, 0x2D, 0x37, 0x59, 0xE5, 0xB5, 0x71, 0x33, 0xA8, 0x99, 0x00, 0xE2, 0x97, 0x02, 0x82, 0x38, 0x22, 0xE4, 0xCC, 0x42, 0x4C, 0x1A, 0xF9, 0xE1, 0x2B, 0x49, 0x7B, 0x19, 0x84, 0xA2, 0xE1, 0xDF, 0xC3,
+ 0xA9, 0x39, 0x48, 0xD2, 0x10, 0x6F, 0x85, 0x0D, 0x29, 0x40, 0xF7, 0xE2, 0xD5, 0x06, 0x3C, 0xFB, 0x31, 0x09, 0x0B, 0xBB, 0x80, 0xCF, 0x5D, 0x26, 0xB8, 0x61, 0xBE, 0xA9, 0xBA, 0x57, 0x62, 0xB4, 0x91, 0xCC, 0x8D, 0x44, 0xEF, 0x48, 0x4B, 0x2A,
+ 0x5F, 0x44, 0x7C, 0x6D, 0xB7, 0x1D, 0xAB, 0xC5, 0x1E, 0xD9, 0x93, 0x29, 0xD4, 0x1F, 0x69, 0x97, 0x7B, 0xC2, 0x93, 0xBA, 0x0F, 0xE9, 0x22, 0xE2, 0xDE, 0x4E, 0x9E, 0xAC, 0x59, 0x52, 0xF7, 0xE9, 0x08, 0x5C, 0x8D, 0xC8, 0x1C, 0xBF, 0x89, 0x3C,
+ 0x8B, 0xEF, 0xC9, 0xC1, 0x39, 0x46, 0x0A, 0xB0, 0x78, 0x3A, 0x3C, 0xD3, 0xAD, 0x18, 0x20, 0x1E, 0x08, 0x5C, 0xB5, 0xFC, 0xB2, 0x4E, 0x8A, 0x7F, 0x8F, 0xCF, 0xAD, 0xAF, 0x2D, 0x59, 0xC1, 0xD1, 0x8C, 0x81, 0x73, 0x7D, 0xF5, 0xA3, 0x92, 0x43,
+ 0x79, 0x90, 0x6A, 0x3B, 0x9F, 0x03, 0x99, 0xC4, 0xCD, 0xDB, 0x06, 0x73, 0x5C, 0x27, 0x93, 0xAC, 0xD1, 0x44, 0x3D, 0x26, 0x92, 0x92, 0xAC, 0xA1, 0x2F, 0x46, 0x2F, 0x55, 0xA4, 0x6F, 0x90, 0xEF, 0x74, 0xD5, 0xCF, 0xD3, 0xEB, 0x0E, 0xA2, 0x24,
+ 0xF1, 0xEF, 0xFE, 0x01, 0x11, 0xFD, 0x28, 0xB8, 0x4C, 0x7B, 0x1E, 0x2E, 0x98, 0xB9, 0x65, 0x8E, 0x8B, 0x40, 0x6D, 0x3F, 0xCF, 0xBE, 0x4B, 0x68, 0xAE, 0x08, 0x7E, 0x93, 0x5D, 0xE7, 0x42, 0x5A, 0xCA, 0x57, 0x20, 0xD3, 0x94, 0xFE, 0x38, 0x26,
+ 0x2B, 0x50, 0x16, 0x0C, 0xCA, 0x45, 0xD1, 0x56, 0x3B, 0xD2, 0x05, 0x87, 0x73, 0x28, 0x51, 0xEB, 0xA4, 0x0A, 0xA4, 0x4E, 0xE3, 0x03, 0xF5, 0xE1, 0xD7, 0x42, 0xB5, 0x1E, 0x98, 0x60, 0x18, 0xD4, 0x97, 0xFA, 0x6B, 0x47, 0x2E, 0x7C, 0x47, 0x93,
+ 0x6C, 0xB8, 0x82, 0xF2, 0x98, 0x3C, 0x1D, 0x6F, 0x7E, 0xE4, 0xB8, 0xCC, 0x85, 0x30, 0x35, 0x36, 0xCF, 0x57, 0x55, 0x39, 0xA6, 0x22, 0x19, 0xC2, 0x45, 0x0B, 0xE5, 0xC5, 0x3F, 0xC4, 0xFB, 0xC4, 0xC6, 0x9B, 0x22, 0x4A, 0x7B, 0x37, 0x70, 0x8D,
+ 0x39, 0x97, 0xFC, 0x91, 0x4A, 0x1B, 0x5F, 0xED, 0xDA, 0x32, 0x55, 0xB3, 0x95, 0x91, 0xE7, 0xEB, 0xBA, 0xD8, 0xF4, 0xC8, 0xDC, 0x21, 0xDC, 0x7A, 0xBC, 0xE3, 0x0A, 0xAE, 0xB5, 0x9F, 0x33, 0xAF, 0x75, 0xAB, 0x8F, 0x22, 0xF8, 0xF2, 0xE4, 0x30,
+ 0xDD, 0x81, 0x93, 0x03, 0x55, 0x68, 0xAF, 0xAA, 0xDF, 0x8B, 0x7A, 0xD8, 0x36, 0x14, 0x17, 0x63, 0x49, 0x60, 0xF0, 0x00, 0x82, 0x53, 0xF2, 0x19, 0x3B, 0x8D, 0xDC, 0xFC, 0x82, 0x8E, 0xE4, 0x33, 0x3C, 0x28, 0xBE, 0x8E, 0xE9, 0xEF, 0xA4, 0x2B,
+ 0x7D, 0x90, 0x65, 0x5B, 0x51, 0xCF, 0xC5, 0xBD, 0x2B, 0x75, 0x9A, 0xA3, 0xB7, 0x9A, 0x78, 0x3C, 0x0D, 0xD2, 0x2B, 0xFB, 0x41, 0xF9, 0x3D, 0x7B, 0x6D, 0x6B, 0x56, 0x53, 0xF7, 0x97, 0x19, 0x19, 0xC6, 0x88, 0xFC, 0x8C, 0x1B, 0x20, 0xD8, 0x68,
+ 0xDA, 0x95, 0xCB, 0x16, 0x7F, 0x58, 0x16, 0x9B, 0xC7, 0x0E, 0x88, 0x8C, 0x8D, 0x9B, 0xC2, 0x24, 0xE9, 0xA1, 0x85, 0x1F, 0x1E, 0xF8, 0x40, 0x2A, 0xA0, 0xF4, 0xD2, 0x56, 0xE4, 0x2C, 0x51, 0xB6, 0x47, 0x63, 0x78, 0x2A, 0x11, 0xEC, 0xDA, 0xAD,
+ 0x06, 0x0A, 0x55, 0xF8, 0xA9, 0x6D, 0x52, 0x76, 0x12, 0xE5, 0xF4, 0xAA, 0x66, 0x86, 0xFC, 0xEE, 0x89, 0x5A, 0x27, 0xEB, 0xB3, 0xC2, 0xCD, 0xA1, 0x57, 0x11, 0xB7, 0x0F, 0xA7, 0xEC, 0x0E, 0xDE, 0x48, 0x63, 0xDF, 0x50, 0xA5, 0xCF, 0xC4, 0xA6,
+ 0x87, 0x46, 0xD6, 0xE4, 0xC4, 0x9E, 0xF7, 0x8D, 0xD5, 0x92, 0xF6, 0xAF, 0x57, 0xDF, 0x4B, 0x3B, 0x80, 0x74, 0x23, 0x24, 0x12, 0x07, 0x13, 0x75, 0x36, 0x0F, 0xA8, 0xEC, 0xAC, 0xA3, 0x70, 0x74, 0x04, 0xB9, 0x99, 0xA4, 0x68, 0x8B, 0x11, 0x14,
+ 0x82, 0x13, 0x62, 0x6A, 0x34, 0x93, 0xAE, 0x1D, 0x60, 0x29, 0xC2, 0x8E, 0xDE, 0xF9, 0xC7, 0xCB, 0x69, 0x3B, 0x59, 0x03, 0xC4, 0xDB, 0xD3, 0x8F, 0x6D, 0xB2, 0x67, 0xD8, 0xC0, 0x24, 0x55, 0x3C, 0x27, 0xF4, 0x15, 0x73, 0xD4, 0x7D, 0x12, 0x00,
+ 0x37, 0xD2, 0xAE, 0xB8, 0x28, 0x3B, 0x2E, 0x1C, 0xD5, 0xD5, 0xF0, 0xE5, 0x7F, 0x6C, 0x52, 0x5C, 0x5D, 0x8B, 0x62, 0x4C, 0x96, 0x1B, 0xFD, 0xD1, 0x99, 0x01, 0x60, 0x25, 0x24, 0x29, 0x2C, 0x2F, 0xBF, 0x76, 0xC9, 0x51, 0x47, 0xB4, 0x4A, 0xA1,
+ 0xEA, 0x4F, 0x6F, 0x4D, 0x97, 0xE9, 0xA2, 0x17, 0xEF, 0xCD, 0x36, 0xA9, 0x04, 0xEB, 0x0D, 0xA7, 0x04, 0x41, 0xB8, 0x6C, 0xBE, 0x95, 0x44, 0xCC, 0x80, 0x09, 0xCF, 0xE1, 0x91, 0xE8, 0x45, 0xE1, 0x39, 0x29, 0x1F, 0x2D, 0x66, 0x98, 0x02, 0xAA,
+ 0x04, 0xF4, 0x65, 0x34, 0x91, 0x7C, 0x77, 0x90, 0x98, 0x43, 0xFD, 0xE8, 0xF3, 0x71, 0x7D, 0xD0, 0x44, 0x2B, 0x63, 0x1F, 0xEF, 0x1E, 0x9B, 0x26, 0xF1, 0x26, 0xD1, 0x54, 0xE3, 0xD8, 0x21, 0x97, 0xBD, 0x8F, 0x2A, 0xA3, 0xC6, 0x76, 0x24, 0xBD,
+ 0x0D, 0xC0, 0x45, 0xE2, 0x02, 0x7D, 0xAA, 0x54, 0xF0, 0xD9, 0xFA, 0x8E, 0xD4, 0xC8, 0x5A, 0xFC, 0x42, 0x26, 0xA6, 0xDB, 0xB3, 0x7D, 0xE5, 0x33, 0x68, 0x5F, 0x93, 0xCE, 0x7E, 0xD7, 0x13, 0xB0, 0x88, 0xA7, 0x78, 0x7D, 0x97, 0x18, 0xE0, 0xC2,
+ 0x07, 0x30, 0x90, 0x21, 0xE0, 0x5B, 0x93, 0xB9, 0xCA, 0xC5, 0x3E, 0x4F, 0xE4, 0x9F, 0x2C, 0x44, 0x91, 0xD6, 0x09, 0x54, 0x26, 0xF8, 0xC8, 0x6C, 0x7A, 0x3C, 0x16, 0x4D, 0x9C, 0xF7, 0x8D, 0xDA, 0x8B, 0x2A, 0xA8, 0x37, 0xC8, 0x9F, 0x7A, 0x45,
+ 0xE1, 0x83, 0xED, 0xA6, 0x8F, 0x0D, 0x6F, 0xD5, 0x8F, 0x96, 0x2C, 0x67, 0x52, 0xBD, 0xA4, 0x68, 0xEB, 0xEA, 0xC2, 0xD2, 0x7D, 0x3B, 0x92, 0xDF, 0x6F, 0xF2, 0xEC, 0x0B, 0xBE, 0xF9, 0x2D, 0xE5, 0x30, 0x61, 0xE7, 0x6D, 0x55, 0x19, 0x01, 0xDA,
+ 0x34, 0x35, 0xE2, 0x70, 0x91, 0x42, 0xEE, 0x4B, 0x38, 0x47, 0x5E, 0x3B, 0x1D, 0xE4, 0xDB, 0x61, 0xB9, 0xD6, 0x3E, 0xC2, 0x2E, 0x15, 0x52, 0x68, 0x70, 0x30, 0xAC, 0x35, 0xF8, 0x88, 0xD7, 0x9D, 0xCD, 0x59, 0x6F, 0x32, 0x4B, 0xAF, 0xDB, 0xE2,
+ 0xAD, 0x66, 0xF7, 0xF4, 0x6B, 0x90, 0x76, 0xB7, 0x2D, 0xF6, 0x66, 0xF4, 0x4B, 0xB6, 0xB4, 0x3C, 0x79, 0x7A, 0x1E, 0xF5, 0x3F, 0xE0, 0x3F, 0x4D, 0xDB, 0x21, 0xEE, 0x05, 0x44, 0x29, 0x29, 0xEE, 0x41, 0xB2, 0x4F, 0xFD, 0xBF, 0x26, 0x29, 0x2F,
+ 0x5B, 0xB3, 0x35, 0x5B, 0xDA, 0x8E, 0xB6, 0x6B, 0xA8, 0x18, 0x32, 0x29, 0xC8, 0x6D, 0xB7, 0xA9, 0x1B, 0x6E, 0xE3, 0xDB, 0xC6, 0xC4, 0x94, 0x05, 0x4B, 0xDF, 0xFB, 0x52, 0x2E, 0x38, 0x59, 0xBF, 0xFD, 0x54, 0x59, 0xF0, 0x1B, 0x83, 0x77, 0x8E,
+ 0x78, 0xE8, 0xDD, 0x25, 0x74, 0xE1, 0xF0, 0xF0, 0xA2, 0x37, 0x2F, 0x7C, 0xB1, 0x70, 0xA9, 0x1C, 0xBF, 0x34, 0xBD, 0x76, 0x85, 0xBD, 0x47, 0x02, 0x85, 0x0B, 0x2A, 0xBB, 0xA8, 0xDD, 0x27, 0xBD, 0x8D, 0x31, 0x54, 0x27, 0x2C, 0x9E, 0x4A, 0xBD,
+ 0xA7, 0xDA, 0xBD, 0xAC, 0xFC, 0xBA, 0xF9, 0xA9, 0x19, 0xBC, 0x00, 0xC9, 0x94, 0x0B, 0x29, 0x44, 0x2E, 0x65, 0x11, 0xA5, 0x94, 0x93, 0x3A, 0x9E, 0xB4, 0x9D, 0xF7, 0x62, 0x0A, 0xE8, 0x81, 0x9B, 0xB3, 0xA3, 0xC6, 0x9F, 0xD6, 0x33, 0x99, 0x7B,
+ 0xA3, 0xFA, 0x3B, 0xA3, 0xC0, 0xD2, 0x78, 0x5F, 0x6B, 0x34, 0xB2, 0x83, 0xAF, 0xBB, 0xE6, 0x87, 0x59, 0x8B, 0xE4, 0x29, 0xFB, 0x41, 0xE5, 0x91, 0x32, 0x11, 0xC1, 0xDC, 0x77, 0x8E, 0x6E, 0x83, 0x31, 0x33, 0xD7, 0x3D, 0xCC, 0x16, 0x8B, 0xB2,
+ 0x3A, 0x1F, 0xF3, 0x5E, 0x3D, 0x06, 0xAB, 0xC8, 0x81, 0xFD, 0xC4, 0x63, 0xBA, 0x41, 0xD2, 0x14, 0xF8, 0xB6, 0xE6, 0x24, 0xD2, 0x21, 0xB5, 0x94, 0xA9, 0x50, 0x4B, 0x84, 0x52, 0x16, 0x61, 0x16, 0xAF, 0x1E, 0x8A, 0x59, 0x45, 0xAE, 0x1F, 0xF7,
+ 0xC4, 0xAD, 0xA3, 0xFF, 0xCE, 0x7E, 0xC3, 0x36, 0xD8, 0xF2, 0x78, 0x74, 0x53, 0x4C, 0xF2, 0xE4, 0x98, 0xFB, 0x60, 0x64, 0x03, 0xE3, 0xC6, 0xB1, 0xB8, 0xDF, 0xB5, 0xBE, 0xBF, 0x00, 0x6B, 0xD2, 0xD8, 0x87, 0xD7, 0xFF, 0xA1, 0x5B, 0xBF, 0x33,
+ 0x30, 0xE8, 0x3E, 0xC6, 0xD1, 0xA2, 0x50, 0xBE, 0xB9, 0x77, 0x6E, 0xEE, 0xEC, 0xD8, 0x8A, 0x30, 0xB2, 0x98, 0x7F, 0x2C, 0x6C, 0x12, 0x90, 0x05, 0x05, 0xC9, 0x97, 0x70, 0x9E, 0xE7, 0xCE, 0x96, 0xEA, 0xB9, 0x7A, 0x5A, 0x85, 0xAB, 0x1F, 0xF5,
+ 0x16, 0x50, 0xB0, 0xC6, 0x83, 0x67, 0x42, 0x3B, 0xDF, 0x21, 0xDF, 0x66, 0x72, 0x48, 0xED, 0x27, 0x2B, 0xE2, 0x58, 0x5B, 0x22, 0xB4, 0xDA, 0xF1, 0x5F, 0x67, 0x10, 0x4D, 0x53, 0xAB, 0xBA, 0x22, 0x35, 0x8E, 0xCC, 0xFF, 0x1F, 0x55, 0x19, 0xB9,
+ 0x37, 0x57, 0x26, 0xD8, 0xB5, 0x0B, 0x92, 0xB9, 0x51, 0x9C, 0x86, 0x25, 0x0D, 0xB6, 0xF6, 0x9D, 0x3C, 0xD2, 0xF9, 0xA3, 0x07, 0xC8, 0x70, 0xAB, 0xB7, 0x04, 0x36, 0xA7, 0x91, 0xDD, 0x47, 0xB4, 0x54, 0x97, 0x83, 0x42, 0x6D, 0x85, 0xA0, 0x49,
+ 0x48, 0xDB, 0x1C, 0x4F, 0x87, 0x47, 0x81, 0x90, 0xB6, 0x5C, 0xDE, 0x6B, 0x1F, 0x8D, 0xEB, 0xC6, 0xC3, 0x32, 0x4F, 0x67, 0xCD, 0x08, 0xEC, 0xB0, 0xC1, 0x79, 0x84, 0xAE, 0x56, 0x92, 0x49, 0xDA, 0x13, 0xEE, 0x23, 0x42, 0x99, 0x26, 0xD6, 0x46,
+ 0x0C, 0xD8, 0xF5, 0x74, 0xA9, 0x89, 0xE7, 0x21, 0xF5, 0x41, 0x40, 0x3D, 0x84, 0x63, 0x15, 0x3A, 0x02, 0x7C, 0x20, 0x79, 0x16, 0x2B, 0x35, 0xEF, 0xFE, 0x48, 0x67, 0x97, 0x42, 0x49, 0x49, 0xAB, 0xDA, 0xCB, 0x86, 0x98, 0x08, 0xB5, 0xA9, 0x96,
+ 0xAB, 0xBE, 0x7F, 0x35, 0x1B, 0xF6, 0xD9, 0x50, 0x00, 0x57, 0x90, 0x4B, 0xC9, 0xA4, 0x66, 0x95, 0xF6, 0x4F, 0x41, 0x43, 0x8C, 0xD6, 0xAC, 0xD8, 0xD9, 0x8C, 0xD8, 0xAF, 0x8A, 0x06, 0x18, 0xB6, 0x9F, 0x22, 0xDF, 0xE3, 0xD1, 0x83, 0xFD, 0xE7,
+ 0x97, 0x14, 0x8A, 0x5C, 0x0E, 0x26, 0x4E, 0x36, 0xD4, 0x1A, 0x12, 0x69, 0xB2, 0x95, 0x06, 0x4B, 0x5B, 0x96, 0xFC, 0xE9, 0x7F, 0xD1, 0x77, 0xF2, 0x19, 0x41, 0x8A, 0xA7, 0xB6, 0x5A, 0x0C, 0xD3, 0x40, 0x28, 0xF7, 0xB5, 0xBD, 0xE1, 0xB7, 0x08,
+ 0xF6, 0x67, 0x27, 0x20, 0x31, 0x03, 0xDD, 0x22, 0xEE, 0xBB, 0xF0, 0x7C, 0x83, 0x84, 0x2D, 0x95, 0x38, 0x3F, 0xBA, 0x5C, 0xC7, 0x44, 0x1C, 0xCC, 0xC0, 0xD0, 0xAE, 0x43, 0xBE, 0x76, 0x77, 0x72, 0x67, 0x09, 0x6B, 0x68, 0x9A, 0x30, 0xF2, 0x2F,
+ 0x3C, 0x84, 0xC4, 0x6B, 0x80, 0x92, 0xB0, 0x8E, 0xCC, 0xD6, 0x0C, 0x63, 0x74, 0x89, 0x02, 0xB1, 0xB7, 0xC4, 0xD2, 0x49, 0x17, 0xCA, 0x9B, 0xB6, 0x9D, 0xEF, 0x87, 0x24, 0x43, 0x48, 0xFE, 0x6E, 0xA5, 0x70, 0x94, 0x2D, 0xC2, 0x1F, 0xBD, 0x6E,
+ 0x19, 0xF0, 0xC4, 0x3C, 0xBE, 0x33, 0xF6, 0x57, 0x0C, 0x84, 0xA9, 0xFE, 0xAC, 0x34, 0xD0, 0x2F, 0x1F, 0x72, 0x14, 0xA8, 0x5D, 0x5B, 0x9F, 0x80, 0xCB, 0xC6, 0xDD, 0xDE, 0xE0, 0x87, 0xBA, 0x47, 0x4E, 0x55, 0x93, 0x87, 0x65, 0x6A, 0x5C, 0x21,
+ 0xA0, 0x59, 0xA8, 0x0F, 0x33, 0x30, 0x47, 0xD6, 0xC5, 0x46, 0x82, 0x2C, 0xC2, 0xDD, 0x9E, 0x3C, 0x2C, 0xFD, 0xD3, 0xEF, 0xC5, 0x13, 0xE0, 0xFC, 0x93, 0x48, 0x79, 0xF9, 0x06, 0xE7, 0x98, 0x02, 0xC3, 0x02, 0x38, 0x18, 0x59, 0xDB, 0x63, 0xB1,
+ 0xDD, 0xEA, 0x8A, 0x62, 0x53, 0x24, 0x33, 0xCF, 0x1D, 0x0C, 0x3A, 0xDD, 0xF3, 0x17, 0x2C, 0xE2, 0x71, 0x89, 0xD2, 0x6C, 0x64, 0x2C, 0x02, 0x94, 0xE4, 0xEB, 0x26, 0x91, 0x6B, 0x10, 0x75, 0x37, 0x42, 0x8A, 0x54, 0xEB, 0x80, 0x7A, 0x44, 0xF9,
+ 0xEA, 0xA8, 0x28, 0xE6, 0xE0, 0x9B, 0x2E, 0xCE, 0x72, 0x8B, 0x3E, 0x73, 0xBA, 0xA6, 0xA9, 0xF5, 0xA2, 0xBD, 0x68, 0x87, 0xC0, 0xED, 0x99, 0xFF, 0xC7, 0x89, 0x5D, 0xAB, 0xEE, 0x18, 0xF6, 0x7E, 0x7E, 0x74, 0xE1, 0x4B, 0xF3, 0x87, 0xE0, 0x69,
+ 0x93, 0xBD, 0x57, 0x6C, 0xF9, 0x49, 0xF6, 0xB1, 0xE1, 0xF9, 0x65, 0xB6, 0x10, 0x10, 0x56, 0xDC, 0x20, 0x32, 0x13, 0x97, 0xD0, 0x76, 0x60, 0x10, 0x16, 0xBD, 0x4A, 0xDE, 0x54, 0xF1, 0x7B, 0x51, 0x0F, 0xB5, 0x12, 0xED, 0x3C, 0x5C, 0x23, 0x0B,
+ 0xED, 0x52, 0xBE, 0x86, 0x79, 0xB9, 0x00, 0x1B, 0x24, 0x4F, 0x72, 0xEB, 0x9F, 0x00, 0xFF, 0xB7, 0x27, 0x28, 0xF1, 0x55, 0x31, 0xDD, 0xDF, 0x34, 0x09, 0xFC, 0x5D, 0xBE, 0x43, 0x51, 0x34, 0xA7, 0x69, 0x12, 0x83, 0x6E, 0xA2, 0xAD, 0x99, 0xDD,
+ 0xAB, 0x62, 0x2B, 0x13, 0xE3, 0x7A, 0x94, 0xE3, 0x55, 0x44, 0x09, 0x08, 0xD4, 0x93, 0x0B, 0x59, 0x06, 0xDE, 0x75, 0x35, 0x4C, 0x40, 0xD3, 0xA1, 0x91, 0xC8, 0x05, 0x38, 0x70, 0x84, 0x1A, 0x10, 0x9E, 0x64, 0x9C, 0x94, 0x73, 0x29, 0xC7, 0x3B,
+ 0x0F, 0x65, 0xD2, 0x67, 0xCC, 0xF1, 0x5E, 0x5E, 0x20, 0x5D, 0xE1, 0x8E, 0x9C, 0x8B, 0x32, 0x73, 0xA4, 0x1B, 0x9A, 0x02, 0x54, 0x09, 0x22, 0x2A, 0x42, 0x17, 0xDA, 0x13, 0xA2, 0x4C, 0x78, 0xCD, 0x36, 0x9D, 0xAE, 0xE9, 0x9C, 0x4F, 0xF7, 0xA1,
+ 0xA3, 0xF7, 0x21, 0x06, 0x6B, 0x46, 0x31, 0x2A, 0x4D, 0x5D, 0x61, 0x18, 0xD2, 0xC9, 0x90, 0x8F, 0x5A, 0xC4, 0xF7, 0xCE, 0x0E, 0xB3, 0xFB, 0x82, 0x7A, 0xE7, 0xD4, 0x8F, 0x6F, 0x9F, 0x6A, 0x0C, 0x8C, 0xC8, 0x1D, 0xC0, 0x8D, 0x05, 0x86, 0x3A,
+ 0xB9, 0x2E, 0xA8, 0x36, 0x97, 0x61, 0x96, 0x5F, 0x7A, 0x5B, 0x9C, 0xF8, 0x57, 0x4C, 0xAB, 0xF5, 0x8B, 0x7D, 0x96, 0xDF, 0x5F, 0x23, 0xBC, 0x9F, 0xA8, 0xCB, 0xE8, 0x6A, 0x39, 0xB1, 0xAE, 0xBB, 0x7F, 0x4A, 0x20, 0x53, 0xCE, 0xCA, 0x5C, 0xDD,
+ 0xC1, 0xDB, 0xA8, 0x06, 0x47, 0x4C, 0xAA, 0x99, 0xAD, 0x15, 0x2A, 0xF6, 0xD8, 0xC5, 0xBC, 0x3A, 0x8B, 0xA2, 0x78, 0xA8, 0xF8, 0xCF, 0x82, 0x34, 0xBA, 0xAF, 0x02, 0x8B, 0xED, 0x70, 0xC8, 0x4A, 0x09, 0xE1, 0x19, 0x33, 0xB7, 0xB2, 0x8F, 0xAF,
+ 0xA3, 0x0A, 0xAD, 0x7C, 0xEB, 0x6E, 0xC4, 0xBD, 0x9B, 0x8E, 0xFE, 0x3A, 0xA9, 0x5E, 0xFD, 0x4C, 0x01, 0xD0, 0xBB, 0x16, 0x44, 0xBD, 0x26, 0x3D, 0xB4, 0x20, 0x02, 0xAF, 0xC0, 0xF4, 0xF4, 0xBD, 0x69, 0xF7, 0x49, 0x79, 0x4F, 0x77, 0xD1, 0x31,
+ 0xE9, 0x4E, 0xC6, 0xF3, 0xF9, 0x40, 0x5B, 0xA2, 0x9C, 0x65, 0x6D, 0xB3, 0x56, 0xA5, 0xD0, 0xA2, 0x42, 0x12, 0x46, 0x9E, 0x25, 0x39, 0x6D, 0x93, 0xDD, 0x86, 0x7C, 0xAC, 0x18, 0x1B, 0xBB, 0x88, 0x36, 0xF8, 0xA4, 0x11, 0x20, 0xB2, 0xCE, 0x9F,
+ 0xBF, 0x04, 0xB6, 0x9A, 0x41, 0xEE, 0xE8, 0xF4, 0xFB, 0x3B, 0xA9, 0xDF, 0x08, 0x81, 0x72, 0x11, 0x15, 0x8B, 0x7D, 0x34, 0x3E, 0xA4, 0x93, 0x0C, 0x99, 0xB7, 0xE2, 0xBE, 0x80, 0x6E, 0x7F, 0xFA, 0x28, 0x9E, 0xF3, 0x74, 0x03, 0x4A, 0xC1, 0xB6,
+ 0xD7, 0xCF, 0x80, 0xEE, 0x48, 0x36, 0x80, 0x31, 0x4D, 0x9C, 0x4E, 0x81, 0x43, 0x88, 0xD4, 0x07, 0xF7, 0x75, 0x43, 0x46, 0xFC, 0x4B, 0x94, 0xA8, 0xBE, 0xBB, 0x22, 0xC0, 0x70, 0xAD, 0x2A, 0x59, 0x94, 0x51, 0x54, 0x35, 0x67, 0xD9, 0xD8, 0x47,
+ 0x55, 0xC0, 0x29, 0x20, 0x32, 0xAF, 0x93, 0x37, 0x01, 0xD4, 0xFA, 0x99, 0x1C, 0xAE, 0x14, 0xB5, 0x67, 0xB8, 0x53, 0x9C, 0xAE, 0xB4, 0x28, 0xF2, 0x42, 0x14, 0x9B, 0xE6, 0x4A, 0xE5, 0xE0, 0xC0, 0x02, 0xBF, 0x78, 0x8C, 0xAB, 0x2C, 0x92, 0x92,
+ 0x4E, 0xF7, 0xBA, 0x77, 0xA3, 0x12, 0x7E, 0xC2, 0x77, 0x52, 0x14, 0x5A, 0xAC, 0xD3, 0x11, 0x3E, 0x36, 0x16, 0x23, 0xCE, 0x42, 0x72, 0xEF, 0x02, 0x34, 0xBD, 0xAC, 0xBF, 0x2B, 0x18, 0x0E, 0x1D, 0x65, 0x6B, 0x00, 0x1E, 0x6F, 0x15, 0xCA, 0x4A,
+ 0x6B, 0xE2, 0x52, 0x64, 0xE3, 0xBA, 0xEE, 0xB7, 0x4B, 0x30, 0xCB, 0x5D, 0x74, 0xBC, 0x56, 0x79, 0xDC, 0x33, 0xF3, 0x56, 0x38, 0x04, 0xD6, 0xC8, 0x83, 0x14, 0x77, 0xD2, 0x6A, 0xD4, 0xC3, 0xB0, 0x7C, 0xC1, 0xEC, 0x63, 0xAC, 0x0B, 0x27, 0xEC,
+ 0x45, 0xD5, 0xBF, 0x15, 0x9C, 0x6F, 0x4E, 0x74, 0xA6, 0x1A, 0x84, 0xE3, 0x03, 0xF7, 0x9E, 0x7C, 0x5B, 0x79, 0x2D, 0x52, 0xF3, 0xBE, 0xFA, 0x53, 0x80, 0xD5, 0x2E, 0xBB, 0x8A, 0x55, 0x07, 0x82, 0xFA, 0xB2, 0xEF, 0xE3, 0x02, 0x55, 0x3C, 0xC5,
+ 0xB0, 0x1E, 0xE5, 0xC7, 0xED, 0x3D, 0xE5, 0xEB, 0xDE, 0x95, 0x1E, 0xD6, 0x5D, 0xF0, 0xFF, 0x15, 0x1D, 0xD2, 0x18, 0xA9, 0xDD, 0x89, 0x2C, 0x7E, 0x15, 0xCD, 0x77, 0xB0, 0xA8, 0x24, 0x2D, 0xA3, 0x7C, 0xAB, 0xAB, 0xD6, 0x70, 0xD1, 0x1E, 0xAF,
+ 0xA1, 0x4D, 0x89, 0xBF, 0x48, 0xB9, 0x4F, 0x53, 0x86, 0x19, 0x5A, 0xEB, 0x92, 0x10, 0x8B, 0x1C, 0x29, 0xF2, 0x78, 0x5E, 0xA9, 0x1C, 0xB2, 0x32, 0x37, 0xB3, 0x1A, 0x49, 0x07, 0x26, 0x57, 0xD3, 0x7C, 0xB7, 0x8A, 0xDA, 0xEA, 0xE3, 0x0C, 0xAB,
+ 0x56, 0xA3, 0x51, 0x36, 0x45, 0x18, 0x39, 0xF0, 0x66, 0x98, 0xF0, 0x73, 0x11, 0xA8, 0x8A, 0x57, 0xE1, 0x71, 0xFA, 0x90, 0xCC, 0xA8, 0xCB, 0x65, 0x75, 0xC4, 0xC0, 0x1E, 0x0E, 0x63, 0xA3, 0x41, 0x45, 0x37, 0x97, 0xC6, 0x27, 0x01, 0x14, 0xA9,
+ 0x25, 0x4B, 0x83, 0x09, 0x7C, 0x35, 0x54, 0xB4, 0xF8, 0xC1, 0x9A, 0x76, 0x04, 0x60, 0x1D, 0xF1, 0x40, 0x3C, 0xB2, 0x46, 0xC3, 0xF4, 0x93, 0x02, 0x1B, 0xCC, 0xF6, 0x84, 0x5C, 0x59, 0xE2, 0xF3, 0x39, 0xDF, 0x13, 0x3B, 0x05, 0x88, 0x61, 0x4D,
+ 0xE6, 0xED, 0x8C, 0x05, 0xF1, 0xE5, 0x0A, 0x0E, 0x09, 0xD1, 0x5D, 0x75, 0x41, 0xCE, 0x2E, 0x78, 0x15, 0xB2, 0xCE, 0x78, 0xAC, 0x21, 0x43, 0x73, 0x33, 0x9F, 0x9B, 0x21, 0x34, 0xB8, 0xBD, 0x5B, 0xE3, 0xD0, 0x6C, 0x6B, 0x6D, 0x45, 0x76, 0x77,
+ 0x76, 0x51, 0x9D, 0x93, 0x52, 0x3F, 0xC4, 0xD7, 0x2C, 0x42, 0x01, 0x44, 0x77, 0x77, 0x23, 0x8C, 0xA4, 0x53, 0xE1, 0xE6, 0x0B, 0xE5, 0xA4, 0x71, 0xAA, 0x43, 0xBB, 0xED, 0x32, 0xFB, 0xB0, 0x96, 0x4B, 0x37, 0xE6, 0x90, 0xDB, 0xBB, 0xBF, 0x43,
+ 0xF9, 0x45, 0xCB, 0x11, 0x9D, 0xBB, 0x30, 0x45, 0x60, 0x10, 0x96, 0x5A, 0xC2, 0x63, 0x09, 0x82, 0xD8, 0x40, 0x41, 0x93, 0xF8, 0x3B, 0x11, 0x73, 0x24, 0xF2, 0x53, 0x26, 0xCF, 0x16, 0x4B, 0x05, 0x4D, 0x9F, 0x30, 0xDE, 0xF2, 0x90, 0xAF, 0x9B,
+ 0x57, 0x64, 0xED, 0xF9, 0xC0, 0x85, 0xF7, 0xEF, 0x8A, 0xBB, 0xE2, 0x99, 0x4E, 0x6D, 0x60, 0xA4, 0xD0, 0xA8, 0xD9, 0x30, 0x40, 0x6F, 0xB2, 0x6E, 0x52, 0xFE, 0x5B, 0xB7, 0x94, 0x62, 0x27, 0xBD, 0x68, 0xE4, 0x7E, 0x56, 0x6B, 0x8E, 0xF5, 0xDF,
+ 0xDA, 0x35, 0xE6, 0xA9, 0xBC, 0xF3, 0xE1, 0xDB, 0x0E, 0x30, 0x19, 0xB1, 0xE4, 0x9C, 0xA4, 0x2A, 0xB5, 0xE9, 0x57, 0x1C, 0xE4, 0xD8, 0xE1, 0xE3, 0x92, 0x3F, 0x3E, 0x36, 0xB2, 0x3A, 0x5B, 0x56, 0xD9, 0xCD, 0x51, 0x32, 0x31, 0x71, 0x15, 0x65,
+ 0x19, 0xEB, 0xEC, 0xB6, 0xB6, 0x06, 0x38, 0x0B, 0x4E, 0xAC, 0x89, 0x4D, 0x08, 0x5B, 0xA6, 0x92, 0xA5, 0xEE, 0xF1, 0x2B, 0x56, 0xCE, 0x16, 0x1B, 0x8B, 0x75, 0x69, 0x8E, 0x88, 0x2F, 0xE8, 0xE1, 0x57, 0x64, 0xB2, 0x49, 0xDE, 0x72, 0x44, 0x25,
+ 0x20, 0xE9, 0xDB, 0x8C, 0x7C, 0x2C, 0x02, 0xD8, 0xF0, 0x09, 0xED, 0x8D, 0x7C, 0x3C, 0x87, 0xDD, 0xBC, 0x5D, 0x66, 0x3D, 0x7E, 0xEC, 0x87, 0x18, 0xFF, 0xD0, 0x25, 0x2D, 0xAC, 0x9A, 0x94, 0xDA, 0xE3, 0xD9, 0xB1, 0x8C, 0x4F, 0x79, 0x06, 0x03,
+ 0xAA, 0x4B, 0x32, 0x52, 0xD6, 0xFB, 0xFF, 0x76, 0x4E, 0x09, 0x81, 0x51, 0x4C, 0x44, 0x65, 0x05, 0xD8, 0x40, 0x64, 0xE3, 0x1C, 0x8C, 0xFA, 0x36, 0x15, 0xE1, 0xEA, 0x6F, 0xF1, 0xEB, 0xB4, 0x08, 0xA2, 0x55, 0xEB, 0x73, 0x7B, 0x02, 0xBD, 0x80,
+ 0x68, 0x3B, 0xA9, 0xCC, 0xEE, 0x99, 0xDB, 0xA2, 0xC9, 0xBB, 0x22, 0x4B, 0x89, 0x83, 0xA0, 0xAF, 0xD2, 0x8E, 0xA2, 0xC4, 0xA5, 0xC2, 0xF2, 0x6E, 0x60, 0x6D, 0x05, 0xF4, 0x7C, 0x5F, 0x2D, 0xB5, 0x79, 0x23, 0x1E, 0x67, 0x87, 0xB0, 0x2A, 0xE3,
+ 0xA7, 0x6E, 0xFC, 0x96, 0x1A, 0x89, 0x0C, 0xFE, 0xAC, 0x26, 0xF6, 0x81, 0x94, 0x94, 0x94, 0x0D, 0x16, 0x15, 0xC9, 0xF1, 0x52, 0xED, 0xB8, 0x82, 0xFE, 0xBC, 0xC0, 0x26, 0x67, 0x9E, 0x01, 0xF0, 0x85, 0x26, 0x2A, 0x8D, 0xC3, 0x8C, 0xB2, 0x2E,
+ 0xAD, 0x20, 0x82, 0xA0, 0x60, 0xE7, 0xC5, 0x71, 0xEC, 0xF8, 0x84, 0xFF, 0xFD, 0x24, 0xD4, 0x92, 0xD0, 0xD1, 0x6C, 0x92, 0xDA, 0xF6, 0xB2, 0xC3, 0x07, 0xED, 0x6F, 0x84, 0x61, 0x0F, 0x0F, 0x53, 0xBC, 0x38, 0xFF, 0xA6, 0xEF, 0x7B, 0xB2, 0x5D,
+ 0x2A, 0xD2, 0x03, 0xF2, 0x60, 0xFE, 0x75, 0x27, 0x7A, 0x6B, 0xDC, 0x76, 0xE6, 0x14, 0x2E, 0x37, 0x93, 0xB6, 0x4D, 0x17, 0x09, 0x4B, 0xC1, 0xE4, 0x6C, 0x3C, 0x5E, 0xEE, 0xB3, 0xE1, 0xE7, 0x61, 0x14, 0xB2, 0xC7, 0xFE, 0x3E, 0x7C, 0xC8, 0x60,
+ 0x72, 0x36, 0x3A, 0xF5, 0x57, 0x7A, 0x3F, 0xCA, 0x6B, 0x61, 0x47, 0xED, 0xD1, 0x52, 0x40, 0xDA, 0x9D, 0x00, 0x96, 0x07, 0x35, 0x88, 0x35, 0x59, 0xCE, 0x61, 0x9A, 0xAD, 0x13, 0x0A, 0x04, 0x20, 0x9B, 0xD7, 0xC0, 0xC0, 0x13, 0x08, 0xC2, 0x1F,
+ 0x68, 0xB8, 0x78, 0x9C, 0xA3, 0xFA, 0x49, 0x6B, 0x4C, 0x15, 0x1E, 0x9C, 0xB4, 0x9A, 0x11, 0x3A, 0x7F, 0x21, 0x58, 0x1B, 0x11, 0x35, 0xAC, 0xD2, 0xCA, 0x0F, 0x71, 0xD4, 0xB9, 0xBD, 0xA7, 0x6E, 0x44, 0x1C, 0x43, 0x6C, 0xEF, 0xF2, 0x71, 0xFD,
+ 0x25, 0xFA, 0x97, 0x49, 0x7C, 0x14, 0x5B, 0xE9, 0xBD, 0x24, 0x1A, 0x2C, 0x6E, 0xC0, 0xC4, 0x53, 0x84, 0xB1, 0x78, 0x0A, 0xE4, 0x2C, 0xE3, 0x2B, 0x98, 0xD2, 0x0F, 0xF3, 0xAD, 0x4C, 0xEA, 0x37, 0x8F, 0x83, 0x5E, 0xC4, 0x79, 0xD4, 0x6F, 0x5E,
+ 0x12, 0x70, 0x9D, 0x70, 0xF6, 0xCA, 0xD8, 0x92, 0xA0, 0xFB, 0x7D, 0x85, 0x33, 0x04, 0x17, 0xE3, 0x01, 0xF3, 0xE1, 0x19, 0x7F, 0x28, 0x4A, 0x95, 0x04, 0xCD, 0x36, 0x55, 0x1A, 0x2B, 0x63, 0x23, 0x1D, 0x08, 0x07, 0x40, 0x7B, 0xB0, 0x21, 0x8F,
+ 0xA4, 0xE2, 0x89, 0xE8, 0x3A, 0xFC, 0x6C, 0xCF, 0x3B, 0xD3, 0x7B, 0x9D, 0x48, 0x39, 0x49, 0xAA, 0xE7, 0x8D, 0x81, 0x51, 0xF7, 0x2B, 0xD3, 0xB6, 0xF1, 0x37, 0xEB, 0x0C, 0xD1, 0x84, 0xCF, 0x38, 0x85, 0x62, 0x84, 0xC7, 0xA5, 0xB8, 0x23, 0x97,
+ 0xA6, 0x9C, 0xA7, 0xF0, 0x34, 0x66, 0x9C, 0xE6, 0x4C, 0x35, 0x4A, 0xC1, 0x69, 0x85, 0x57, 0x4D, 0x5C, 0xE2, 0xAB, 0xE3, 0xB2, 0xF8, 0x1B, 0x6E, 0x22, 0x76, 0x1A, 0x6F, 0x64, 0xA5, 0xD2, 0x23, 0x73, 0x94, 0x13, 0xB8, 0x6A, 0x03, 0x5D, 0x87,
+ 0x41, 0xF1, 0x74, 0x6D, 0xE1, 0x72, 0x8D, 0xA7, 0x63, 0x99, 0x1B, 0xF5, 0x9A, 0x57, 0x0F, 0x96, 0x2A, 0x70, 0x86, 0xD2, 0x94, 0x3C, 0xA9, 0x8C, 0x8E, 0xF4, 0x75, 0xAF, 0x4F, 0xFD, 0xFA, 0xC0, 0xAC, 0x42, 0xB8, 0x07, 0xCE, 0x5C, 0xD7, 0x5D,
+ 0x3B, 0x45, 0x53, 0x04, 0xD0, 0x11, 0x97, 0x95, 0xB5, 0x6F, 0x15, 0x77, 0x48, 0x07, 0x03, 0x1D, 0x09, 0x38, 0xCB, 0x1D, 0x64, 0xF1, 0x96, 0xEF, 0xC5, 0xF4, 0xAE, 0x76, 0xE7, 0x0D, 0x0F, 0x84, 0x64, 0x6F, 0x17, 0xE9, 0x06, 0xA9, 0x3C, 0xB2,
+ 0x19, 0x8F, 0x7F, 0x30, 0x20, 0x2E, 0x94, 0xE1, 0xA4, 0xF6, 0x35, 0x2E, 0xB1, 0x6E, 0x26, 0x96, 0xF3, 0x0F, 0xE0, 0x33, 0x93, 0x7B, 0x77, 0x33, 0x98, 0x64, 0x25, 0x18, 0x24, 0xF9, 0x34, 0xBE, 0x25, 0x01, 0xD8, 0x18, 0xAA, 0x9F, 0x04, 0x30,
+ 0xB2, 0xCA, 0x0F, 0x82, 0x22, 0xEE, 0x52, 0xE3, 0x81, 0x9F, 0xDF, 0xA9, 0xF1, 0x7E, 0x51, 0x82, 0xDA, 0x80, 0xD5, 0x1A, 0x85, 0x7D, 0xFC, 0xA1, 0x96, 0x47, 0x1F, 0xB8, 0xA9, 0xF2, 0xB3, 0x46, 0x7F, 0xC7, 0xB4, 0x2D, 0x32, 0x13, 0xCF, 0xE8,
+ 0x5E, 0x59, 0x63, 0xA4, 0x7E, 0x88, 0xB6, 0xD1, 0xB7, 0x82, 0x87, 0x0E, 0x5A, 0x62, 0xC8, 0xE5, 0x1E, 0x3F, 0xF0, 0x5A, 0x44, 0x28, 0x4C, 0xD4, 0x3C, 0xD9, 0x56, 0x87, 0xA3, 0xB7, 0x76, 0xE9, 0x4B, 0xAB, 0x4A, 0x7D, 0x0B, 0xD8, 0xB2, 0xB7,
+ 0x12, 0x02, 0x27, 0x5A, 0xD6, 0x3E, 0x93, 0xF3, 0xB0, 0x71, 0x3B, 0x7F, 0xEC, 0x90, 0xAB, 0x2B, 0xAE, 0xC0, 0xCA, 0x36, 0xF9, 0x27, 0x68, 0x3F, 0x25, 0xA2, 0xE7, 0xC6, 0xC8, 0xDF, 0x98, 0x21, 0x88, 0xB1, 0x8A, 0x9E, 0x65, 0x34, 0x0E, 0x9B,
+ 0x62, 0x60, 0x0E, 0xB5, 0xCA, 0xF9, 0x06, 0xD2, 0xA5, 0x51, 0x11, 0x91, 0x78, 0xCC, 0x65, 0xA0, 0x75, 0x62, 0xF8, 0xE8, 0x94, 0x46, 0x4A, 0x62, 0x3E, 0xA2, 0x59, 0x78, 0x33, 0xAD, 0x63, 0xF7, 0x0A, 0xCF, 0x02, 0x4B, 0x7A, 0x00, 0x95, 0xEF,
+ 0x87, 0x16, 0x14, 0x73, 0x30, 0xF9, 0x02, 0x2B, 0x72, 0xA2, 0xD0, 0x7F, 0xD8, 0xE9, 0x7D, 0xD7, 0xA4, 0x74, 0x68, 0x14, 0xAF, 0x89, 0x4F, 0x95, 0x2E, 0xA1, 0x34, 0x57, 0xC1, 0xC3, 0x2A, 0x7D, 0x2E, 0x70, 0xA4, 0x90, 0x92, 0xDF, 0x50, 0xF9,
+ 0x57, 0x03, 0x66, 0x23, 0xD1, 0x26, 0x07, 0x98, 0x9E, 0xFF, 0x78, 0xA6, 0x80, 0x23, 0x5B, 0x19, 0x3D, 0x56, 0x17, 0xF9, 0x87, 0x67, 0xCF, 0xBD, 0x79, 0x5A, 0x95, 0xB4, 0xAC, 0xB0, 0xE4, 0xD3, 0xAF, 0x51, 0x96, 0xA2, 0x5F, 0x43, 0x60, 0x98,
+ 0xC3, 0x2A, 0x62, 0x0B, 0x94, 0x5D, 0xAD, 0x0B, 0x23, 0x2D, 0xE5, 0x59, 0xD0, 0x2C, 0xB0, 0xD4, 0xC4, 0x20, 0x04, 0x43, 0x1F, 0x66, 0x80, 0x1E, 0xC1, 0x69, 0x4C, 0xFB, 0x1F, 0x9B, 0x48, 0x31, 0x12, 0xFA, 0xEB, 0xEC, 0x41, 0x3D, 0x1E, 0xCC,
+ 0x72, 0xEC, 0x87, 0x92, 0x6D, 0x32, 0x8E, 0x0B, 0x87, 0xF1, 0xDF, 0xC1, 0xBB, 0x72, 0xF4, 0xA9, 0x14, 0xF6, 0x4C, 0xD4, 0x8A, 0x4A, 0xC9, 0xC5, 0x1E, 0x1F, 0x33, 0x0E, 0x74, 0xE4, 0x41, 0x8D, 0x02, 0xD0, 0x13, 0x4E, 0xDF, 0x8E, 0xD5, 0x39,
+ 0xA1, 0x5B, 0x7D, 0x92, 0xDD, 0x77, 0xCB, 0xB9, 0x07, 0x37, 0x37, 0xA0, 0xDA, 0xB9, 0x49, 0x41, 0xC7, 0x97, 0xD9, 0xB8, 0x9C, 0x2E, 0x92, 0x6A, 0x49, 0x0E, 0x62, 0x59, 0x79, 0x4E, 0x3B, 0x22, 0xFA, 0x49, 0x8A, 0x5C, 0xE9, 0x59, 0xBB, 0xCD,
+ 0xEB, 0xFA, 0x7D, 0xD6, 0x0C, 0xE8, 0x7D, 0x25, 0xF6, 0xB9, 0x27, 0xD5, 0xED, 0x62, 0x0A, 0xF8, 0xBE, 0x80, 0xC3, 0x5D, 0xFA, 0xDD, 0x2B, 0xC3, 0xEA, 0x25, 0x6F, 0x75, 0x91, 0xDE, 0x93, 0x83, 0x7C, 0xAC, 0x23, 0x19, 0xF1, 0xF9, 0x95, 0xF9,
+ 0xFD, 0x5D, 0x19, 0x91, 0xA7, 0xEF, 0xCF, 0x0D, 0xAC, 0xDC, 0x0A, 0x38, 0x80, 0x6E, 0x1F, 0xD3, 0x26, 0x36, 0xE8, 0x75, 0x4C, 0x49, 0x53, 0x28, 0xD1, 0x5E, 0x5D, 0xE2, 0x6D, 0x9F, 0x0E, 0xE5, 0x62, 0x03, 0x29, 0xC8, 0xCB, 0x97, 0x8E, 0x1A,
+ 0x3E, 0x79, 0x27, 0x5A, 0x6F, 0xD5, 0xC5, 0xA7, 0x48, 0x3D, 0xDB, 0x75, 0x12, 0xB8, 0xFF, 0xEC, 0x3F, 0xBC, 0x80, 0x86, 0xCE, 0xCA, 0x52, 0xD8, 0x41, 0xC6, 0xD2, 0x58, 0xE7, 0xBC, 0x2D, 0xEA, 0x0F, 0xEA, 0x7E, 0x32, 0xBB, 0xA1, 0xAC, 0x07,
+ 0xDB, 0x69, 0x32, 0x06, 0x2B, 0x2B, 0x5E, 0xC2, 0xF1, 0x17, 0xDB, 0xB8, 0xAA, 0xFE, 0x12, 0xC0, 0x7C, 0x08, 0x58, 0x59, 0xFA, 0x41, 0xA5, 0x42, 0x82, 0xEB, 0xAF, 0x26, 0x0F, 0xA7, 0x2F, 0x27, 0xD0, 0xD2, 0x2A, 0x2D, 0xEA, 0x0A, 0xA6, 0x79,
+ 0x23, 0x18, 0x9E, 0x67, 0xD6, 0x46, 0x2A, 0x36, 0x2C, 0x3A, 0x15, 0x60, 0x05, 0xD1, 0x24, 0x1F, 0x70, 0x8B, 0xA3, 0x2A, 0x5C, 0x9F, 0xD0, 0xF3, 0x8D, 0x0B, 0x4A, 0xB4, 0xB4, 0xFC, 0x0E, 0xE5, 0x45, 0x2B, 0x36, 0xB0, 0x10, 0x0A, 0x42, 0xB6,
+ 0xA8, 0xBC, 0xD6, 0x32, 0x74, 0xC0, 0x96, 0xF7, 0x44, 0xD8, 0x6C, 0x97, 0x75, 0x98, 0x0B, 0x3F, 0xBD, 0x9F, 0x84, 0xC9, 0x4E, 0xE9, 0x74, 0x26, 0x3A, 0x2F, 0x44, 0xC3, 0x8D, 0x49, 0xC8, 0xE7, 0xE7, 0x9C, 0xB8, 0xF3, 0xD3, 0xE4, 0x42, 0x65,
+ 0x0D, 0xBC, 0xB3, 0x82, 0x1C, 0xE2, 0x04, 0x79, 0xB6, 0x21, 0xF3, 0x35, 0x1D, 0x6D, 0xA7, 0x0B, 0x40, 0x33, 0xC9, 0x16, 0x81, 0xAF, 0x96, 0xD2, 0x80, 0xA4, 0xED, 0x37, 0x5C, 0x24, 0x80, 0xF8, 0x88, 0x29, 0x39, 0x29, 0x31, 0xB6, 0xAE, 0xCB,
+ 0xFA, 0x27, 0x2A, 0x0D, 0x2C, 0xF6, 0x5D, 0x93, 0x7E, 0x16, 0xAD, 0xCF, 0x26, 0xD0, 0x0F, 0xAB, 0xBF, 0xC6, 0x62, 0xAC, 0x5E, 0x92, 0xB7, 0x45, 0xFD, 0xF4, 0xEB, 0xA1, 0xA3, 0xC5, 0x10, 0xFC, 0x3F, 0x32, 0x39, 0x82, 0x64, 0x2D, 0xC9, 0x1D,
+ 0x34, 0x0F, 0x7A, 0xA3, 0xD9, 0x81, 0x88, 0x4F, 0x65, 0x1B, 0xC2, 0x5A, 0x6E, 0x87, 0xD1, 0xA8, 0x8A, 0x56, 0x95, 0x93, 0x94, 0x67, 0xF3, 0x13, 0x0D, 0x67, 0x42, 0xA8, 0x9B, 0xE1, 0x1E, 0xF5, 0xB2, 0x64, 0x80, 0x17, 0xC5, 0xA6, 0xA3, 0x59,
+ 0x29, 0xC5, 0x54, 0xC5, 0x13, 0xDF, 0xD9, 0x0C, 0xC9, 0xB9, 0x56, 0x03, 0x8F, 0xDB, 0xD1, 0x5B, 0x91, 0x4C, 0xD9, 0x58, 0xC5, 0xD3, 0xFF, 0x8C, 0x7C, 0x23, 0x66, 0xBD, 0x2A, 0xD2, 0xC8, 0x27, 0xB9, 0x22, 0xA0, 0xD8, 0x70, 0xEA, 0xC5, 0xA4,
+ 0xEA, 0x93, 0x3C, 0x1C, 0x40, 0xE8, 0xA9, 0x44, 0x9E, 0x37, 0xB8, 0x5A, 0x0B, 0x91, 0x3E, 0x55, 0x37, 0x24, 0x19, 0x5C, 0xD0, 0x8D, 0xF4, 0x02, 0x0E, 0xAB, 0x6E, 0x5F, 0x9C, 0x2A, 0x9A, 0x89, 0x7F, 0x5F, 0xDD, 0x4B, 0x9B, 0xA2, 0x87, 0x04,
+ 0x53, 0x70, 0x59, 0xF2, 0x30, 0xD9, 0x39, 0x69, 0x6E, 0xBC, 0x26, 0x80, 0x32, 0x0C, 0xA3, 0x28, 0xDD, 0x16, 0xAE, 0x27, 0x23, 0xCE, 0x38, 0x61, 0x69, 0x1F, 0x5F, 0x50, 0xBB, 0x46, 0x8C, 0x79, 0xFC, 0xFD, 0x1B, 0x25, 0x4A, 0xD4, 0xCF, 0xFE,
+ 0x01, 0xBC, 0x63, 0xF7, 0x64, 0x7D, 0x38, 0x7F, 0xB7, 0x2E, 0x16, 0xF4, 0x00, 0x55, 0x7E, 0xC7, 0xD6, 0xBA, 0xEF, 0xF1, 0x24, 0x63, 0x74, 0xE2, 0x12, 0x6E, 0xC9, 0x70, 0xBC, 0x1F, 0x72, 0xA2, 0x00, 0x74, 0x0A, 0xDA, 0x7B, 0x43, 0x77, 0xB9,
+ 0xC9, 0x81, 0xB0, 0x8E, 0x3C, 0x33, 0x12, 0x3D, 0x7C, 0x5D, 0x01, 0x5D, 0x5D, 0xF3, 0x6C, 0x41, 0xF1, 0x83, 0xBD, 0xDE, 0x9B, 0x54, 0x0F, 0x7A, 0x7A, 0x0F, 0x67, 0x3B, 0x78, 0x39, 0xD8, 0xF7, 0x4B, 0x23, 0x41, 0x4C, 0x3B, 0x35, 0x87, 0x48,
+ 0xAD, 0x89, 0x3B, 0xB9, 0xD8, 0xAD, 0xA4, 0x42, 0xA7, 0x37, 0x6F, 0x3B, 0xE5, 0x00, 0x63, 0xB8, 0xA1, 0x7E, 0x02, 0x44, 0xCD, 0xB7, 0xFD, 0xD7, 0xE1, 0x29, 0x75, 0xE0, 0x27, 0x1A, 0x7F, 0x12, 0xC4, 0x2F, 0x3A, 0x0D, 0xF1, 0x91, 0x53, 0xC0,
+ 0x26, 0xA9, 0x41, 0x14, 0x25, 0xB8, 0x88, 0x60, 0x2C, 0x07, 0x63, 0xD9, 0x37, 0xAE, 0x53, 0xA7, 0x60, 0xFA, 0x46, 0x7C, 0xD2, 0x1D, 0x56, 0x4B, 0xE5, 0xEE, 0x9C, 0xF3, 0x61, 0x48, 0xD6, 0x36, 0x3A, 0x38, 0x2F, 0x9C, 0xB2, 0xE3, 0xC1, 0x07,
+ 0x3A, 0x1A, 0x87, 0xFF, 0xE7, 0x6E, 0xBD, 0xD3, 0x5F, 0xD0, 0x92, 0x8A, 0xBA, 0x63, 0x67, 0x77, 0x36, 0x1C, 0x34, 0xAA, 0x14, 0x1E, 0xC6, 0x22, 0xD1, 0xFE, 0x90, 0xB7, 0x13, 0xA4, 0xEB, 0xCF, 0x13, 0xBE, 0x6F, 0x28, 0xF4, 0x40, 0xCF, 0x96,
+ 0xF1, 0x27, 0x7B, 0xB2, 0x8A, 0xE7, 0x92, 0x16, 0xC2, 0xC2, 0x9D, 0x83, 0xFD, 0x57, 0xA4, 0xFE, 0x33, 0x80, 0x83, 0xD0, 0x26, 0x7B, 0x27, 0xF9, 0x9B, 0xB9, 0x4B, 0x1D, 0x60, 0x08, 0xF3, 0xB9, 0x96, 0x1E, 0x95, 0xD0, 0x9C, 0x65, 0x68, 0xC0,
+ 0x0F, 0xA0, 0x92, 0xBF, 0x2A, 0x22, 0x9C, 0x46, 0x72, 0x6F, 0x73, 0x2F, 0x3B, 0xE2, 0x08, 0xF0, 0xE5, 0xCD, 0xA4, 0xB0, 0x1D, 0x61, 0x12, 0x73, 0xE7, 0xA6, 0x25, 0x41, 0x42, 0x15, 0x2B, 0x9B, 0xA9, 0x9D, 0x42, 0x8A, 0x25, 0x22, 0x98, 0x22,
+ 0x6E, 0xFD, 0xBD, 0xB7, 0x98, 0x9D, 0x38, 0x64, 0x01, 0x27, 0x60, 0x51, 0x58, 0x7E, 0x79, 0x8A, 0x8D, 0xA1, 0x24, 0x82, 0x95, 0x0E, 0x8E, 0xFE, 0xCD, 0xA1, 0x91, 0xE7, 0x45, 0xFE, 0x57, 0x15, 0x94, 0xE7, 0x2C, 0x69, 0xD1, 0x84, 0x76, 0xBC,
+ 0x11, 0x46, 0x0D, 0x92, 0xCF, 0x74, 0x38, 0x83, 0x24, 0x4C, 0x15, 0xBC, 0xB5, 0xA6, 0xAD, 0x9E, 0x69, 0x44, 0x20, 0x32, 0x9F, 0xDC, 0x7D, 0xAA, 0xE9, 0xC2, 0x40, 0x0E, 0x9F, 0xD0, 0xAB, 0x0B, 0xB6, 0xF6, 0x7F, 0xC1, 0x36, 0x9D, 0x87, 0x78,
+ 0xE0, 0x28, 0xA3, 0x9D, 0x7D, 0xFE, 0x31, 0x85, 0x7A, 0x46, 0xA7, 0xC6, 0x34, 0x92, 0x40, 0xCA, 0x3A, 0x0A, 0x0C, 0x03, 0x28, 0x40, 0x8C, 0x89, 0x85, 0xE4, 0x6C, 0x31, 0xAA, 0x15, 0x32, 0x00, 0x91, 0xAE, 0x37, 0xE0, 0x44, 0x20, 0x09, 0x9B,
+ 0xA4, 0xD6, 0xEB, 0x88, 0xB9, 0x49, 0xB5, 0x86, 0x3F, 0x87, 0x3C, 0xCA, 0xEF, 0x4B, 0xCC, 0x27, 0x45, 0x30, 0x8F, 0xA9, 0x30, 0x07, 0x71, 0x15, 0x62, 0x18, 0xA5, 0x62, 0x95, 0x0C, 0x36, 0x7A, 0x21, 0xDF, 0xB7, 0xD2, 0xEB, 0x7A, 0xB1, 0x7E,
+ 0x3C, 0xE3, 0x8C, 0x36, 0xDB, 0x2C, 0x19, 0x19, 0x40, 0x15, 0x4D, 0xA6, 0xE2, 0x2F, 0xA3, 0xD6, 0xE9, 0x0A, 0x52, 0x57, 0xC6, 0xB1, 0x41, 0xE1, 0xF1, 0x94, 0xBA, 0x53, 0x53, 0x50, 0x58, 0x18, 0x1B, 0x44, 0x87, 0xD7, 0x63, 0x03, 0x4D, 0x69,
+ 0xF5, 0x8A, 0xDB, 0xBB, 0x87, 0xD4, 0xE7, 0xB5, 0x7D, 0x24, 0xEC, 0xC3, 0xC8, 0xC1, 0x14, 0x8A, 0x19, 0x2D, 0x1C, 0xF6, 0x41, 0x44, 0xF7, 0x95, 0x25, 0x36, 0x23, 0x2F, 0xC6, 0x25, 0xB0, 0x2C, 0x9F, 0x4F, 0xDD, 0x21, 0x6E, 0x3C, 0x0A, 0x60,
+ 0xBD, 0xD0, 0x09, 0x74, 0x4E, 0xB3, 0x7B, 0xAA, 0xA6, 0x1B, 0xED, 0xAD, 0x58, 0x88, 0x4C, 0x65, 0xFE, 0x30, 0xED, 0xEB, 0xDA, 0x90, 0xE6, 0x0A, 0x99, 0xC1, 0xF8, 0x43, 0xCC, 0x8F, 0xC5, 0xCA, 0xC2, 0x11, 0x62, 0xA6, 0xEC, 0x82, 0x9E, 0x56,
+ 0xB2, 0xBE, 0x31, 0xE9, 0x78, 0xB5, 0x4A, 0x83, 0xC2, 0xB7, 0xA5, 0x3D, 0x9C, 0xF3, 0x07, 0x16, 0xBD, 0x19, 0xC0, 0xB4, 0x6B, 0x48, 0xF2, 0x02, 0xAF, 0x6C, 0x12, 0x1E, 0xB1, 0x78, 0x45, 0xE1, 0x6D, 0x7D, 0x66, 0xC7, 0x06, 0x36, 0x4E, 0xD8,
+ 0x72, 0x98, 0xC8, 0xEC, 0x26, 0x57, 0x86, 0x24, 0x80, 0xAF, 0x92, 0x11, 0x99, 0xE4, 0x15, 0x7A, 0x80, 0x56, 0x0B, 0xA4, 0x59, 0x22, 0x71, 0x12, 0x7D, 0xD4, 0x17, 0x24, 0xE0, 0xF7, 0x30, 0xAD, 0xC3, 0x2B, 0xD3, 0x46, 0xC9, 0xDC, 0xB8, 0x04,
+ 0xA5, 0xE0, 0x2F, 0xC9, 0xE4, 0xEB, 0x53, 0x3A, 0xC8, 0x25, 0xEB, 0x5F, 0x00, 0xD0, 0xB1, 0xDA, 0xD9, 0x90, 0xE3, 0x70, 0x12, 0x4C, 0xE6, 0x1E, 0xFA, 0xB0, 0x66, 0xC9, 0x19, 0x58, 0xB8, 0x6B, 0xF7, 0x41, 0x07, 0x3B, 0x31, 0x2D, 0x72, 0xEE,
+ 0x82, 0x83, 0x15, 0xF1, 0xBC, 0x59, 0x83, 0xB1, 0x46, 0x82, 0x09, 0xF4, 0x88, 0x65, 0x2F, 0x60, 0x01, 0x51, 0xF1, 0x8D, 0x23, 0x19, 0x41, 0xF7, 0xAA, 0xD5, 0x87, 0x74, 0xFC, 0x0E, 0x16, 0x08, 0xC9, 0x89, 0x61, 0x96, 0xA8, 0xF0, 0x37, 0x82,
+ 0x73, 0x46, 0x14, 0x2B, 0xDE, 0x51, 0xCB, 0xBB, 0xC9, 0x09, 0x7A, 0xCE, 0xC7, 0x81, 0xCE, 0xFF, 0x2E, 0x02, 0xD5, 0xD0, 0x96, 0x11, 0xD8, 0x71, 0xEB, 0xBE, 0x40, 0x36, 0xD1, 0x6F, 0x5C, 0xFE, 0xE1, 0x1E, 0x8C, 0x92, 0xAE, 0x9C, 0xFE, 0xA0,
+ 0x3C, 0x4C, 0x26, 0xCB, 0xF1, 0xC6, 0xD4, 0x6C, 0x71, 0xEE, 0xFE, 0x80, 0x2E, 0x54, 0xA7, 0x3F, 0xF9, 0x7E, 0xB0, 0xA6, 0xE5, 0x8D, 0xE1, 0x35, 0x98, 0xB3, 0x5B, 0x1F, 0xB9, 0x4C, 0x35, 0x2C, 0xB7, 0x68, 0xBF, 0x46, 0xDC, 0xE5, 0xD6, 0xA7,
+ 0x08, 0xBF, 0xF5, 0x1B, 0x19, 0x76, 0x56, 0x95, 0xB4, 0x32, 0x5A, 0xB0, 0xBC, 0x1E, 0x15, 0x30, 0xC5, 0xC2, 0xD6, 0xA1, 0x30, 0xA5, 0xE6, 0x6E, 0xE3, 0xC5, 0x04, 0x1D, 0xE9, 0x7F, 0x42, 0x78, 0x7A, 0xA5, 0x1B, 0x21, 0x04, 0x4D, 0x63, 0x09,
+ 0x13, 0x1A, 0xA9, 0x34, 0x62, 0x46, 0xE4, 0x8B, 0x20, 0x29, 0x3F, 0x9C, 0xBD, 0x12, 0x96, 0x6C, 0x09, 0xF2, 0x7B, 0x47, 0x1B, 0x0E, 0x45, 0xE4, 0xAC, 0x70, 0xFA, 0xC9, 0x54, 0x10, 0x79, 0xFC, 0xB5, 0x21, 0x9B, 0x01, 0xEC, 0x64, 0x04, 0x4C,
+ 0x65, 0x78, 0x33, 0x1B, 0x77, 0x70, 0x56, 0xC2, 0x3A, 0x2C, 0x86, 0xA7, 0x85, 0xCA, 0x97, 0x2B, 0xA7, 0xCF, 0x49, 0x5D, 0x0A, 0x04, 0xBB, 0xE6, 0x4F, 0x3B, 0x7C, 0x78, 0x77, 0xEF, 0xB4, 0x67, 0xD4, 0x97, 0x37, 0xE9, 0x7E, 0x4C, 0xF0, 0x11,
+ 0xD4, 0x25, 0x2C, 0x90, 0x8B, 0x36, 0xF5, 0x22, 0x78, 0x15, 0xEE, 0x17, 0xA3, 0xC7, 0x0D, 0x64, 0x7A, 0x1A, 0x37, 0xE1, 0x2F, 0x14, 0x38, 0x1A, 0xD4, 0xE5, 0x99, 0x7D, 0x62, 0x67, 0x21, 0xB2, 0x28, 0x63, 0xC1, 0x71, 0x72, 0x12, 0x58, 0x2D,
+ 0xA3, 0xEA, 0xE6, 0x23, 0x53, 0x43, 0x60, 0x7B, 0x42, 0x0E, 0x56, 0x61, 0x86, 0x0D, 0x18, 0x2C, 0x40, 0xF7, 0x16, 0x4C, 0xF8, 0xB5, 0x9C, 0x3E, 0x8C, 0x08, 0xA9, 0x67, 0x74, 0xE4, 0xC9, 0x5B, 0xEE, 0x1B, 0x7E, 0xB2, 0x4E, 0xD0, 0x55, 0x71,
+ 0x55, 0xB4, 0x8F, 0xB4, 0xCB, 0xA3, 0x9F, 0xE0, 0xD9, 0xCB, 0x4F, 0x8B, 0x14, 0x54, 0xA7, 0x8F, 0x10, 0x4F, 0xBB, 0xA9, 0x0B, 0x49, 0x3B, 0x94, 0x8B, 0xB7, 0x16, 0xA5, 0xEB, 0x60, 0x8E, 0x31, 0xCF, 0x98, 0xD5, 0x33, 0x14, 0x4D, 0xE4, 0xD1,
+ 0x54, 0xC3, 0xAB, 0xE6, 0x4D, 0x0C, 0x38, 0x20, 0x3D, 0xC8, 0xEC, 0xAD, 0xBD, 0x13, 0xE0, 0x92, 0xBE, 0x7B, 0xF2, 0x2E, 0xD6, 0x49, 0xE5, 0xD0, 0xA9, 0x76, 0x20, 0xDE, 0xDF, 0xFC, 0x89, 0x38, 0xB6, 0x98, 0x47, 0x16, 0xFA, 0xBB, 0xB4, 0x5A,
+ 0x44, 0xAE, 0x8D, 0x27, 0x3E, 0x71, 0xE1, 0x2F, 0xEE, 0xF4, 0x7E, 0x50, 0x24, 0x04, 0x18, 0xB0, 0x85, 0xED, 0xAF, 0x52, 0xD7, 0x05, 0xC1, 0x35, 0x8C, 0xD6, 0x34, 0x0C, 0x37, 0xFB, 0x22, 0x3A, 0x6F, 0x72, 0xE8, 0xCA, 0x01, 0xF0, 0x2F, 0x17,
+ 0x03, 0xB0, 0x5E, 0xE6, 0x1A, 0x77, 0xB7, 0x9B, 0xAF, 0x8B, 0x77, 0xDE, 0xD9, 0xAC, 0xDB, 0x8B, 0xF7, 0x10, 0x41, 0x0C, 0x6A, 0x8A, 0xDD, 0xF4, 0xE4, 0xE5, 0xDB, 0x08, 0x78, 0xAF, 0x5C, 0xA8, 0x28, 0xAB, 0x58, 0x16, 0xDB, 0x25, 0xA9, 0x8A,
+ 0x91, 0xEF, 0x56, 0xB4, 0xDC, 0xDC, 0x4E, 0xF3, 0x46, 0x9C, 0xD3, 0x0E, 0x0D, 0xD4, 0xFA, 0x30, 0xBC, 0x71, 0xC4, 0x08, 0x54, 0xBA, 0x18, 0x04, 0x8C, 0xAA, 0xE0, 0x87, 0x5C, 0x87, 0xD4, 0x50, 0x67, 0xF2, 0xAE, 0x72, 0x13, 0x9E, 0x59, 0x3A,
+ 0x6F, 0x15, 0x2C, 0xDD, 0xCD, 0xFC, 0x33, 0x16, 0x18, 0x5A, 0xFA, 0x2B, 0x6A, 0x8B, 0xB1, 0x1D, 0x84, 0x4C, 0x6A, 0xE1, 0x5F, 0x91, 0x14, 0xD8, 0x74, 0x36, 0x6E, 0xF4, 0xD9, 0x11, 0xCD, 0x48, 0x95, 0x8E, 0x7E, 0xCF, 0x65, 0x4C, 0x87, 0x61,
+ 0xBA, 0xEC, 0x5D, 0xF8, 0x6E, 0x95, 0xD8, 0xEB, 0x59, 0xEE, 0x4A, 0x52, 0x82, 0xC2, 0x6C, 0xC9, 0xBD, 0xDC, 0x53, 0x9A, 0x2E, 0x74, 0xF2, 0x78, 0xE2, 0x63, 0xF7, 0x91, 0x23, 0xC2, 0x21, 0x56, 0xE6, 0x40, 0x9F, 0xE9, 0xB3, 0x46, 0x28, 0x96,
+ 0xAC, 0x1D, 0x45, 0x51, 0xC2, 0x0D, 0x77, 0x12, 0x50, 0xF4, 0x90, 0x3D, 0x7D, 0xD1, 0xB0, 0x9F, 0x81, 0x9B, 0xBB, 0x88, 0xFA, 0x8F, 0xC5, 0xE2, 0xCD, 0xF2, 0x76, 0xFE, 0x30, 0xEF, 0x11, 0xDA, 0x73, 0x10, 0xB4, 0x13, 0xDF, 0x4D, 0xEB, 0xD5,
+ 0x03, 0xEC, 0x21, 0x6E, 0x70, 0x6C, 0x4D, 0x7A, 0x2E, 0x39, 0x39, 0x83, 0x06, 0x6C, 0x7C, 0x80, 0x74, 0x71, 0x9F, 0xA3, 0xF7, 0x5E, 0x6D, 0xE3, 0x1C, 0x52, 0x2E, 0xA6, 0x64, 0x32, 0xC6, 0xDD, 0xB0, 0x5B, 0xE1, 0xBE, 0xED, 0x01, 0x6F, 0x1C,
+ 0x7A, 0xCA, 0x24, 0xE0, 0x8B, 0x9A, 0x21, 0x7A, 0x20, 0xC0, 0x34, 0xB7, 0xA6, 0x0A, 0x48, 0x6E, 0x02, 0x26, 0xE7, 0x55, 0x44, 0x5F, 0x7B, 0x77, 0x36, 0x8C, 0xA0, 0x57, 0x26, 0xE5, 0x7D, 0x00, 0x84, 0x95, 0x8E, 0x60, 0x23, 0xA1, 0xAC, 0xD7,
+ 0x18, 0x3B, 0x6C, 0x22, 0x85, 0x59, 0xF4, 0xE6, 0xAE, 0x10, 0x02, 0x29, 0x96, 0x8F, 0xD0, 0x6C, 0x92, 0x50, 0x63, 0x70, 0x20, 0x2F, 0xDE, 0x08, 0x2F, 0x8D, 0xCD, 0x83, 0xC0, 0xCE, 0xFA, 0x2C, 0x1E, 0x03, 0x29, 0xCC, 0x7C, 0x65, 0x1B, 0xE9,
+ 0xED, 0xE9, 0xF9, 0x6A, 0x4F, 0x41, 0x97, 0x5E, 0x14, 0x7B, 0x94, 0x97, 0x62, 0x7B, 0xF4, 0x1C, 0xFC, 0x97, 0x4C, 0x8A, 0x71, 0x12, 0xA3, 0x8E, 0xAF, 0xD9, 0x4A, 0xDD, 0xB5, 0x71, 0x40, 0x42, 0xA3, 0x98, 0xFC, 0x25, 0x7A, 0xEC, 0xFD, 0x75,
+ 0xAC, 0x2C, 0xC0, 0x8C, 0x2D, 0x6C, 0xCA, 0x48, 0xF5, 0x23, 0xB0, 0xD9, 0x67, 0xC5, 0x29, 0x57, 0xF0, 0xB9, 0xC5, 0xBC, 0xBA, 0x88, 0xDE, 0x11, 0xC5, 0x41, 0x85, 0xD7, 0x3F, 0x33, 0xD5, 0x89, 0x25, 0x34, 0x07, 0xD6, 0x0B, 0x6C, 0x79, 0x3F,
+ 0x87, 0xFE, 0xA1, 0x5C, 0xC4, 0x74, 0xDA, 0xBD, 0xA7, 0xC6, 0xB0, 0xD6, 0x13, 0x1A, 0xE1, 0xB9, 0x9C, 0xD8, 0x33, 0x83, 0x1C, 0xBB, 0x84, 0xBE, 0xA5, 0x81, 0xC0, 0x33, 0xD1, 0x7B, 0xFA, 0xB0, 0xC3, 0x75, 0x01, 0x8E, 0x4E, 0xFC, 0xEF, 0xEC,
+ 0x11, 0x5D, 0x8C, 0x81, 0xD5, 0xC8, 0x95, 0x82, 0x0F, 0xD9, 0xC5, 0xE8, 0x9E, 0x85, 0x69, 0xAF, 0xDD, 0x1C, 0x1A, 0xF7, 0x3E, 0x3B, 0xFD, 0x02, 0x97, 0x2E, 0x80, 0x08, 0x91, 0xB1, 0x00, 0xBC, 0x78, 0x3A, 0x06, 0x4C, 0x6F, 0x4A, 0x77, 0x83,
+ 0x0D, 0x2A, 0x42, 0xB2, 0xB0, 0xD9, 0x81, 0x5A, 0x22, 0x42, 0xC5, 0x54, 0xAE, 0x9A, 0xFF, 0xD2, 0xEF, 0x62, 0x47, 0xDA, 0x96, 0x97, 0x1D, 0xA2, 0xDA, 0xD7, 0xE8, 0x1B, 0x23, 0x5D, 0xB1, 0x2B, 0xA4, 0x82, 0x8C, 0x68, 0x4C, 0x24, 0x04, 0xE0,
+ 0xAC, 0x8E, 0x39, 0x09, 0x9B, 0xEB, 0xF4, 0x80, 0x0C, 0x95, 0xFD, 0x84, 0xCF, 0xFF, 0x18, 0xD3, 0x16, 0x23, 0x0F, 0xBC, 0xCA, 0x36, 0xC4, 0xC8, 0xDC, 0x54, 0x52, 0xCD, 0x36, 0xDA, 0x23, 0x92, 0xDC, 0x0E, 0x47, 0x7A, 0xB8, 0xFD, 0xEA, 0x75,
+ 0x5F, 0xFE, 0xB0, 0xBF, 0x3B, 0x8A, 0xDC, 0x0C, 0x4E, 0x69, 0xE2, 0x22, 0x51, 0x0B, 0xC1, 0xC8, 0x85, 0x1C, 0x5E, 0xD3, 0x78, 0xCF, 0xEB, 0x08, 0xA9, 0x07, 0x30, 0x32, 0x2B, 0x09, 0x8A, 0x7B, 0x16, 0x3B, 0xB8, 0x4A, 0x64, 0xE9, 0xEE, 0xDB,
+ 0x6A, 0x0B, 0x5F, 0x96, 0x89, 0xE5, 0x0E, 0x83, 0xB1, 0xE2, 0xB0, 0xAD, 0xAD, 0x2D, 0xFF, 0x29, 0xBB, 0xCE, 0x80, 0x4E, 0xC8, 0xE5, 0x70, 0xC6, 0x2C, 0xDF, 0x43, 0x06, 0x02, 0x58, 0x31, 0x39, 0x8B, 0xA3, 0x00, 0xD1, 0xF8, 0x65, 0x6A, 0x56,
+ 0x8E, 0xD2, 0x33, 0x51, 0xBA, 0x2F, 0x88, 0xEC, 0x4C, 0xA2, 0x39, 0x50, 0x3F, 0xD7, 0x44, 0xAB, 0x60, 0xD3, 0x0F, 0x25, 0x5D, 0x49, 0xC7, 0x2C, 0x11, 0xAE, 0xAD, 0xE6, 0x34, 0xA4, 0x00, 0xF3, 0x40, 0x7E, 0x57, 0x7A, 0xDC, 0x5C, 0x5B, 0xCA,
+ 0x34, 0xEC, 0xD0, 0x20, 0x88, 0x42, 0x26, 0x0B, 0xB2, 0x0B, 0x16, 0xFF, 0x85, 0x3C, 0x03, 0x37, 0xD3, 0xFF, 0x39, 0xD6, 0x3C, 0xA0, 0xB6, 0xA3, 0x68, 0xF1, 0x0F, 0x31, 0x6A, 0x2C, 0x96, 0xBB, 0x64, 0x2E, 0x23, 0x9E, 0x37, 0xBB, 0xAF, 0x01,
+ 0x8C, 0x6D, 0x16, 0xC6, 0x35, 0x78, 0xC7, 0xC7, 0xC9, 0xF1, 0x5B, 0x7D, 0x8C, 0x32, 0x32, 0x76, 0x0B, 0x15, 0xFE, 0xB8, 0x53, 0xED, 0x8A, 0x1A, 0x15, 0x8F, 0x36, 0x09, 0x66, 0xBE, 0x71, 0x03, 0x21, 0x5D, 0x59, 0xF4, 0x99, 0xAD, 0x9B, 0xA6,
+ 0xD9, 0xB6, 0x17, 0x83, 0x0B, 0x4D, 0x3B, 0x92, 0x85, 0xE8, 0x07, 0xA7, 0xFA, 0x51, 0x62, 0xD4, 0x8A, 0x8B, 0x92, 0x9D, 0xC0, 0x74, 0xDE, 0x6C, 0xD0, 0xEE, 0xD5, 0xA4, 0x81, 0xB9, 0xDA, 0xF9, 0x03, 0x9E, 0xC2, 0x02, 0x95, 0x6C, 0xDA, 0x20,
+ 0xE8, 0xF0, 0xEC, 0x58, 0x05, 0x63, 0x5A, 0xD0, 0xD3, 0x4F, 0x77, 0x37, 0x51, 0x35, 0xE2, 0xA0, 0x4C, 0x3E, 0x31, 0xB1, 0x49, 0x5E, 0x2B, 0xB6, 0x52, 0x9B, 0x63, 0x60, 0x6C, 0x18, 0xCF, 0xCC, 0xA1, 0xBD, 0x0C, 0x96, 0x5A, 0xB4, 0x9D, 0xE9,
+ 0x81, 0x1C, 0x32, 0x91, 0xAE, 0x9A, 0x00, 0x07, 0x1A, 0x4A, 0x75, 0x3F, 0x94, 0x3B, 0xA9, 0xD6, 0xF2, 0xD2, 0x56, 0x85, 0xBB, 0xB3, 0x9E, 0x40, 0xDA, 0xC0, 0xC7, 0x63, 0x34, 0xBD, 0x95, 0x6C, 0x22, 0x98, 0x1B, 0x12, 0xDA, 0x53, 0xA6, 0xE2,
+ 0x6A, 0x74, 0xE5, 0xE2, 0xC8, 0x68, 0x86, 0x21, 0x11, 0xD5, 0x39, 0x59, 0x2A, 0xA2, 0xF9, 0xAA, 0x57, 0x71, 0x0F, 0x14, 0x26, 0x65, 0x8F, 0x53, 0x2F, 0xA5, 0x5E, 0xFD, 0x75, 0x54, 0xCD, 0x65, 0xB8, 0xEA, 0x13, 0x78, 0x3B, 0x4E, 0x60, 0xA2,
+ 0x36, 0xF6, 0x77, 0xA1, 0xCD, 0x46, 0x72, 0x99, 0x56, 0x93, 0xEF, 0x6E, 0xB6, 0x2D, 0xC0, 0x2F, 0xBC, 0x92, 0xBE, 0x36, 0xE3, 0x6B, 0xAB, 0x5E, 0xBC, 0xDB, 0x1B, 0x40, 0xD6, 0x4E, 0x0D, 0x5F, 0x72, 0x56, 0xC9, 0xAE, 0xB8, 0x92, 0x9A, 0x8A,
+ 0x1A, 0x69, 0x4E, 0xDC, 0x8C, 0xFC, 0x7F, 0x94, 0x23, 0x80, 0xDC, 0xEF, 0xBF, 0x0C, 0x72, 0x87, 0x3C, 0x8F, 0x99, 0x93, 0xA1, 0xD4, 0x19, 0xB7, 0x60, 0x83, 0x10, 0xE1, 0xF5, 0x24, 0x8F, 0xEA, 0x32, 0x73, 0x78, 0xE9, 0xDB, 0xE8, 0x0B, 0xDE,
+ 0x4B, 0xAC, 0xFE, 0x3A, 0x98, 0xA8, 0x10, 0xA8, 0xD3, 0xCD, 0xBD, 0xBF, 0x31, 0x6F, 0xC7, 0x8A, 0x78, 0x51, 0x22, 0x38, 0x75, 0xE7, 0x7C, 0xCA, 0x36, 0x98, 0x56, 0xD1, 0x50, 0x36, 0xEF, 0x5A, 0xAA, 0xE2, 0x9E, 0x0E, 0x59, 0x27, 0xC6, 0x1F,
+ 0xB4, 0x89, 0x56, 0x3F, 0x27, 0xEA, 0x4F, 0x1D, 0xAE, 0xC4, 0xA6, 0x97, 0x8C, 0xD7, 0xDA, 0xD0, 0x2E, 0x31, 0x8D, 0xCB, 0x64, 0x44, 0x90, 0xBC, 0x2C, 0xC5, 0x2E, 0x9E, 0xF6, 0x1F, 0x31, 0x33, 0x43, 0x1C, 0x8C, 0x67, 0x16, 0xC0, 0x95, 0x2C,
+ 0xF0, 0x47, 0x67, 0x4E, 0xBE, 0xC0, 0xBA, 0x58, 0x83, 0x45, 0x2F, 0xC4, 0x75, 0x11, 0xE9, 0x59, 0x08, 0xBD, 0x78, 0xEA, 0x76, 0x53, 0x13, 0x43, 0x8E, 0x60, 0xD7, 0x9A, 0xF5, 0x0E, 0x1B, 0x40, 0x30, 0xA3, 0x9C, 0x57, 0x3A, 0x28, 0x86, 0xB7,
+ 0x01, 0xE8, 0x2A, 0x57, 0xB7, 0xA6, 0xA9, 0xD5, 0x01, 0xA8, 0x1A, 0xF9, 0xC5, 0x72, 0x11, 0xF2, 0x03, 0xC0, 0xF1, 0x4B, 0xE9, 0x1E, 0x0A, 0x05, 0xD3, 0x10, 0xBB, 0x62, 0x4B, 0x2B, 0x7D, 0x78, 0x8D, 0xE1, 0x1D, 0xD0, 0x11, 0x2E, 0x13, 0x04,
+ 0x01, 0xEB, 0x87, 0x0B, 0x6B, 0x09, 0x4E, 0x06, 0x65, 0x14, 0xA5, 0x97, 0x77, 0xD8, 0xEC, 0x76, 0x37, 0x6B, 0xF2, 0x88, 0x5E, 0xDF, 0xCE, 0xA4, 0xF7, 0xD6, 0xF7, 0xB8, 0x22, 0x45, 0xBB, 0xDE, 0xD9, 0x9A, 0xD2, 0xA1, 0x9A, 0x7B, 0x8F, 0x49,
+ 0x83, 0x0D, 0xCC, 0x46, 0xEC, 0x95, 0xB5, 0xC2, 0x6A, 0x00, 0x62, 0x1A, 0x74, 0x55, 0xF3, 0x4C, 0x8E, 0x5B, 0xF1, 0x39, 0xF2, 0x84, 0x3A, 0x54, 0xE0, 0x35, 0xFD, 0xF8, 0x48, 0x68, 0x04, 0x83, 0x72, 0xEF, 0x90, 0x43, 0x9C, 0xB4, 0x14, 0x8D,
+ 0x88, 0x53, 0xE3, 0x5F, 0xB7, 0x30, 0xE5, 0xE1, 0x46, 0xC8, 0x78, 0x97, 0xA0, 0x73, 0xCE, 0x1B, 0xAD, 0x24, 0x28, 0x6B, 0x7E, 0x0C, 0xAD, 0xD6, 0xE3, 0x0C, 0x57, 0x3F, 0x27, 0x82, 0x13, 0x38, 0x45, 0xAD, 0x3B, 0x5A, 0x83, 0xAF, 0x5A, 0xA8,
+ 0x41, 0x67, 0x26, 0xC5, 0xCF, 0x26, 0x49, 0x4C, 0xCA, 0x62, 0x01, 0x89, 0x90, 0xF4, 0xA8, 0x85, 0x6A, 0x6F, 0xCF, 0xF7, 0xB4, 0x05, 0x12, 0xE0, 0xAC, 0xAB, 0x19, 0x35, 0x30, 0x13, 0x75, 0x93, 0x9F, 0x84, 0x12, 0x0C, 0xEC, 0x5C, 0x36, 0x41,
+ 0x81, 0xEB, 0x30, 0xB2, 0x4C, 0xF1, 0xED, 0x2E, 0x4F, 0xE2, 0x95, 0x3A, 0x33, 0xB8, 0x7B, 0xA6, 0xD6, 0x37, 0xFF, 0x46, 0x22, 0xA5, 0xD0, 0x15, 0x3F, 0x86, 0x63, 0x80, 0xC7, 0xEB, 0x42, 0x94, 0x94, 0xC3, 0xF9, 0xFA, 0xCA, 0x29, 0xF5, 0xE2,
+ 0x31, 0x2F, 0x3F, 0x9A, 0x68, 0x91, 0x74, 0xE5, 0xB0, 0x55, 0x4D, 0x4D, 0x41, 0x98, 0x9D, 0xF0, 0xCE, 0xDE, 0x39, 0x16, 0x65, 0x98, 0x0A, 0xDA, 0xC9, 0xB3, 0x0D, 0xAA, 0x4B, 0x38, 0x81, 0xD6, 0xC8, 0xF4, 0xD8, 0x98, 0x1A, 0x30, 0x2A, 0xC3,
+ 0x95, 0x63, 0x01, 0x5F, 0x8D, 0x28, 0x96, 0xB5, 0x81, 0x93, 0xBB, 0x2A, 0x25, 0xB8, 0xFA, 0x08, 0xEE, 0xEE, 0x78, 0x45, 0xB3, 0xB7, 0x25, 0x6C, 0x5A, 0xCE, 0x47, 0x55, 0xA7, 0x81, 0x5D, 0x95, 0x65, 0x96, 0xE8, 0xEA, 0x0D, 0x1B, 0xFA, 0x1A,
+ 0x4C, 0xEC, 0xD8, 0x11, 0x89, 0xEE, 0x57, 0xF6, 0x34, 0xBE, 0xB8, 0x58, 0x45, 0x19, 0x8E, 0x3E, 0x0D, 0x65, 0x7D, 0x10, 0x6F, 0xE9, 0xC4, 0x58, 0x8B, 0x72, 0xDA, 0xA1, 0xB4, 0x7F, 0x9A, 0x84, 0x46, 0xF8, 0x71, 0x34, 0xFB, 0x4B, 0xA7, 0x15,
+ 0x9C, 0xEF, 0xA2, 0xDD, 0x04, 0x6C, 0x28, 0x5F, 0x97, 0x69, 0x36, 0x8D, 0x39, 0x6B, 0xF3, 0x23, 0x64, 0x11, 0xAC, 0x02, 0x24, 0x79, 0xF1, 0x80, 0xA9, 0xA9, 0x7A, 0xC3, 0x12, 0xB9, 0xB2, 0xE1, 0x9E, 0xF9, 0x45, 0xFE, 0xB0, 0xD8, 0xD7, 0x52,
+ 0x59, 0xE6, 0x1D, 0xEF, 0x7F, 0x2A, 0xA9, 0x0F, 0x96, 0x75, 0x79, 0xBE, 0x30, 0xD1, 0x11, 0xBB, 0x77, 0xCF, 0x12, 0xE3, 0xCC, 0x6A, 0x88, 0x30, 0xD9, 0x71, 0x4F, 0x96, 0x38, 0xF9, 0x6F, 0x11, 0x16, 0xF9, 0xD0, 0x25, 0x56, 0x5E, 0x60, 0x35,
+ 0x5F, 0xD8, 0x79, 0x57, 0x1B, 0xEB, 0xEA, 0xF6, 0x79, 0x77, 0x33, 0x34, 0x13, 0x1D, 0xD0, 0x7A, 0xD5, 0xC0, 0x59, 0x5C, 0x57, 0x2B, 0x0F, 0x58, 0x49, 0xFF, 0x47, 0xDF, 0xA6, 0x56, 0x5B, 0xC4, 0xA7, 0x1B, 0xEB, 0x73, 0x5F, 0xA8, 0x45, 0x07,
+ 0xA4, 0xD2, 0xEB, 0x73, 0xEA, 0x67, 0x85, 0x25, 0x45, 0x94, 0x17, 0x8A, 0x72, 0x52, 0x91, 0x0A, 0xC9, 0xF8, 0xCC, 0xA9, 0x6C, 0x88, 0x88, 0xB2, 0xAD, 0xC9, 0x38, 0x09, 0x7C, 0x4F, 0xC5, 0x8A, 0xDE, 0xAA, 0x6F, 0xD2, 0xC7, 0xD5, 0x99, 0x21,
+ 0x59, 0xD1, 0xDC, 0x91, 0x2F, 0x03, 0xC2, 0x83, 0xF3, 0xDC, 0x5D, 0x72, 0x07, 0xD5, 0x99, 0xB3, 0x39, 0x59, 0x01, 0x35, 0x65, 0x46, 0xE8, 0x4B, 0xB8, 0x57, 0x97, 0x30, 0x8C, 0x56, 0x6F, 0xC9, 0x40, 0x48, 0x94, 0x07, 0xC7, 0x2F, 0x63, 0x0F,
+ 0xAE, 0x53, 0x7D, 0xBF, 0x5C, 0x2B, 0x0F, 0x0D, 0x81, 0x77, 0xCA, 0x6D, 0x75, 0x33, 0xD1, 0x8E, 0x65, 0x4D, 0xBA, 0xD4, 0xBC, 0xB1, 0x34, 0x2B, 0x5F, 0x7A, 0xDC, 0x0B, 0x6D, 0x9B, 0x49, 0xE8, 0x93, 0x40, 0x53, 0xB8, 0xA3, 0xB1, 0x30, 0x9B,
+ 0x5D, 0xE6, 0x4F, 0x17, 0xF9, 0xF9, 0x4A, 0x25, 0xCD, 0x4B, 0x78, 0xC1, 0xAA, 0xD7, 0x26, 0xE3, 0xA4, 0x40, 0x26, 0x52, 0x2D, 0x46, 0xB4, 0x92, 0xAF, 0x82, 0xC1, 0x28, 0xD2, 0xC9, 0xB7, 0x39, 0x26, 0xF9, 0xCE, 0xD7, 0x47, 0xBD, 0x5E, 0xC0,
+ 0x67, 0xC4, 0x5E, 0xFA, 0x0A, 0xF2, 0xEE, 0x92, 0x7E, 0x12, 0x0F, 0x5C, 0x79, 0x22, 0x46, 0x49, 0x7D, 0xD1, 0xF1, 0x83, 0xC6, 0xA3, 0x75, 0x6D, 0xF5, 0x4E, 0x92, 0x9F, 0x06, 0xC7, 0xA7, 0x2D, 0xB6, 0xAB, 0x38, 0xA5, 0x09, 0xE3, 0x8C, 0xD2,
+ 0x0C, 0x32, 0xB4, 0x3D, 0x3A, 0x48, 0xAE, 0x9F, 0xE5, 0x9D, 0x62, 0xF6, 0x12, 0x57, 0xA4, 0x27, 0x43, 0xF4, 0x92, 0x9E, 0x8C, 0x67, 0xA3, 0x58, 0x7A, 0xE2, 0x13, 0x4F, 0x21, 0x72, 0xF0, 0xD1, 0x82, 0xC3, 0xC2, 0xB3, 0x2E, 0xBE, 0x93, 0xD0,
+ 0xC7, 0x1E, 0xEB, 0x2C, 0xEE, 0x98, 0xE8, 0xDA, 0x35, 0x17, 0xDA, 0xBC, 0xC5, 0xF7, 0x1F, 0x88, 0x53, 0xD4, 0x0D, 0xCA, 0x28, 0xEB, 0x41, 0xFE, 0xD7, 0xB6, 0x07, 0xC9, 0x57, 0x9F, 0xED, 0xA6, 0x78, 0x58, 0x6E, 0x22, 0xA1, 0x45, 0x99, 0x90,
+ 0xC8, 0xE9, 0x85, 0xC8, 0xEC, 0x1E, 0x9F, 0x21, 0x94, 0x41, 0x4D, 0xB3, 0x59, 0x5F, 0xCA, 0xC2, 0xB3, 0x4E, 0x1E, 0xA4, 0x3C, 0x5D, 0xF8, 0x2B, 0x0C, 0xD1, 0xB4, 0x54, 0x38, 0x65, 0x1A, 0x14, 0x6C, 0xA8, 0x90, 0x08, 0x56, 0xAF, 0x9B, 0x79,
+ 0x42, 0x10, 0x4C, 0x26, 0xED, 0x64, 0xB9, 0x0B, 0x82, 0x49, 0x47, 0x0D, 0x2C, 0x55, 0x7C, 0xC2, 0xFE, 0xC9, 0x8B, 0xFC, 0x52, 0xAC, 0xDB, 0x80, 0xFC, 0xB8, 0x9C, 0x51, 0x1F, 0x95, 0x31, 0x1D, 0x36, 0x6B, 0xD2, 0xE2, 0x13, 0xDE, 0x8F, 0x13,
+ 0x29, 0x1F, 0xB5, 0x55, 0x40, 0xAD, 0x89, 0x4A, 0x2B, 0x3C, 0x49, 0xCB, 0xDF, 0x1A, 0xC4, 0xF2, 0xD2, 0xFC, 0xA2, 0x88, 0x00, 0x9E, 0xEB, 0x36, 0xFE, 0x03, 0xF8, 0x17, 0xDD, 0x5C, 0x4F, 0x9A, 0x45, 0x15, 0xE3, 0x7F, 0x7B, 0x7C, 0x6B, 0xF0,
+ 0x0F, 0xEB, 0x40, 0x38, 0x46, 0x8E, 0xA3, 0xA4, 0x62, 0x78, 0x6A, 0xFB, 0x64, 0xBC, 0x96, 0x4B, 0xBA, 0xEB, 0x3E, 0x03, 0x85, 0x65, 0x51, 0x48, 0x54, 0x26, 0x0A, 0x5A, 0x9B, 0xAF, 0x76, 0xBE, 0xEA, 0x04, 0x6B, 0x90, 0x9B, 0x2F, 0xFB, 0xE4,
+ 0x37, 0xB1, 0x22, 0xB2, 0x72, 0x0F, 0x14, 0x95, 0xDD, 0x84, 0x6F, 0x33, 0x90, 0x19, 0x51, 0x8E, 0x1E, 0x70, 0x9D, 0x17, 0x5D, 0x11, 0x3E, 0xE4, 0xDF, 0x05, 0xB7, 0x41, 0xBA, 0x8D, 0x7F, 0x12, 0x4D, 0xF8, 0x80, 0x3A, 0x9C, 0x71, 0x89, 0x45,
+ 0xF4, 0xB4, 0x48, 0x6E, 0xBB, 0x94, 0xC9, 0x81, 0xE8, 0xE6, 0x4D, 0x1A, 0x78, 0x49, 0xC7, 0xEC, 0x81, 0x57, 0x0E, 0x1D, 0x1A, 0xEE, 0xF6, 0xAD, 0xEB, 0x36, 0xC8, 0x28, 0x29, 0xE9, 0x16, 0x90, 0x71, 0x6F, 0x4D, 0x0E, 0x1B, 0xAA, 0xE8, 0xE6,
+ 0xC4, 0xCB, 0x0D, 0xB6, 0x9C, 0xA4, 0xE0, 0xDA, 0x43, 0xCA, 0xFB, 0x4E, 0xEC, 0xEF, 0xCF, 0x62, 0xCF, 0x35, 0xDC, 0xB1, 0x35, 0x81, 0x5D, 0x14, 0x35, 0xA8, 0xE3, 0xC2, 0xC4, 0x8C, 0xC2, 0x95, 0xD7, 0x9B, 0xF5, 0x3B, 0x59, 0xD1, 0x05, 0x2A,
+ 0x21, 0x10, 0x01, 0xBB, 0xE1, 0xA2, 0xBC, 0xB2, 0x58, 0xD7, 0xCD, 0x2F, 0x04, 0xD0, 0xB4, 0xEA, 0xCC, 0xD2, 0xC5, 0xF4, 0x92, 0xB3, 0x92, 0x0F, 0x44, 0xDE, 0xE4, 0xC8, 0xEC, 0xA1, 0xA9, 0x71, 0x06, 0x66, 0x58, 0x39, 0x1C, 0x50, 0xCE, 0xE3,
+ 0xF4, 0xEA, 0x6D, 0x54, 0x00, 0x30, 0x6E, 0x53, 0x4E, 0xF0, 0xD6, 0x9E, 0x97, 0x70, 0x1B, 0x29, 0x1F, 0xF0, 0x84, 0xB8, 0x79, 0xF9, 0xAB, 0x03, 0x2C, 0x31, 0xA3, 0x58, 0x81, 0xF9, 0xD5, 0x62, 0xF9, 0xAE, 0x9E, 0x3A, 0x27, 0x1E, 0x28, 0x48,
+ 0xB2, 0x75, 0x8B, 0xBB, 0xC7, 0x94, 0x00, 0x07, 0x89, 0x42, 0xB6, 0x8C, 0x1F, 0x8A, 0xD5, 0x87, 0x82, 0x7C, 0x8E, 0xEA, 0x32, 0x9A, 0xDC, 0xE3, 0xA1, 0x98, 0x95, 0x93, 0x33, 0x1B, 0x63, 0x26, 0x46, 0x70, 0x37, 0x58, 0x7B, 0x55, 0x6F, 0x3B,
+ 0xCA, 0xB5, 0x90, 0x0A, 0xF4, 0x08, 0x9C, 0xFA, 0x5B, 0x90, 0x11, 0x0E, 0xF9, 0x83, 0xD4, 0x9E, 0x57, 0x69, 0xB7, 0x5A, 0xF7, 0xB4, 0xF4, 0x17, 0xCF, 0x40, 0x3A, 0xBE, 0x1F, 0xC6, 0xBC, 0x01, 0xFB, 0x1A, 0x33, 0xB1, 0x2B, 0x0A, 0x45, 0x70,
+ 0x84, 0x35, 0xB0, 0xCB, 0xBA, 0x1F, 0x18, 0x44, 0x3C, 0x6F, 0xB2, 0x24, 0x7A, 0x72, 0xA9, 0x01, 0xBF, 0x9B, 0x79, 0x64, 0x69, 0x6F, 0x66, 0xF6, 0xEA, 0x8E, 0x9B, 0x72, 0x81, 0x95, 0x4C, 0xFD, 0x97, 0x8A, 0x8A, 0xB3, 0x4A, 0x46, 0x17, 0x75,
+ 0x76, 0x5D, 0x19, 0x66, 0x04, 0x6F, 0x6D, 0x03, 0x19, 0x59, 0x68, 0xF4, 0xB9, 0x9D, 0x62, 0xFA, 0xFD, 0x34, 0x9D, 0xA1, 0x0E, 0x9C, 0x7A, 0x17, 0xA1, 0xC6, 0x5D, 0xC4, 0xC0, 0x44, 0xF4, 0x4C, 0x87, 0xC3, 0x5B, 0xE3, 0xE7, 0x38, 0x6E, 0x24,
+ 0x5A, 0x86, 0x1C, 0xC5, 0xFB, 0x07, 0xA0, 0x93, 0xF3, 0x55, 0x7D, 0x7F, 0x61, 0x47, 0x85, 0x61, 0x0C, 0xFF, 0xEB, 0x56, 0xAC, 0x13, 0x2A, 0xBD, 0x40, 0x38, 0xB4, 0xAD, 0x3F, 0x30, 0x81, 0x78, 0x4D, 0x8A, 0x97, 0x6A, 0xCD, 0x65, 0xF2, 0x33,
+ 0x49, 0x2A, 0x5D, 0xB5, 0xB7, 0x30, 0x1B, 0xD5, 0x69, 0x82, 0x30, 0xB7, 0xE2, 0x55, 0x07, 0xC7, 0x6D, 0xB1, 0xAD, 0xC9, 0xE0, 0x70, 0x5F, 0x55, 0x7C, 0x97, 0x2A, 0xE3, 0x9B, 0x32, 0x15, 0xDD, 0x9A, 0x1C, 0x6A, 0xEA, 0xBD, 0x9B, 0xAC, 0x6C,
+ 0x6E, 0x10, 0xB6, 0x64, 0x70, 0x0D, 0xD5, 0x4D, 0x3B, 0xCB, 0x99, 0x75, 0x08, 0x42, 0x0B, 0x19, 0x60, 0x41, 0x00, 0xF5, 0x29, 0x43, 0x54, 0x82, 0x6F, 0x84, 0xDF, 0x03, 0x60, 0xF5, 0x42, 0x02, 0x97, 0x7A, 0xF9, 0x47, 0x50, 0x96, 0x41, 0x69,
+ 0xF6, 0xBD, 0x84, 0x0C, 0x5A, 0x79, 0xD5, 0x52, 0x87, 0x6F, 0xB0, 0xA3, 0xAA, 0x9B, 0x99, 0x31, 0xAF, 0x1F, 0x42, 0xA5, 0xD8, 0xCA, 0x86, 0x83, 0x57, 0x02, 0x68, 0xA8, 0x33, 0xD7, 0x26, 0x1C, 0x52, 0xC9, 0x14, 0xBC, 0x72, 0x60, 0x50, 0x0B,
+ 0xF9, 0xBB, 0x38, 0xD1, 0xF8, 0x4E, 0x5B, 0xCE, 0x02, 0xF8, 0x3F, 0x94, 0x90, 0xB4, 0xE2, 0x8F, 0x55, 0xB6, 0xFD, 0x96, 0x6D, 0xE9, 0xD7, 0x12, 0x19, 0x96, 0x99, 0xBB, 0x30, 0xA4, 0xE0, 0x5F, 0x2C, 0xD1, 0x81, 0x28, 0x6F, 0x85, 0x1E, 0x63,
+ 0x0A, 0xAB, 0x74, 0x36, 0x99, 0x57, 0x96, 0x18, 0x02, 0x87, 0x66, 0x2A, 0x00, 0x5F, 0x12, 0x79, 0xA0, 0x50, 0x9B, 0x31, 0xE0, 0xA7, 0x54, 0xC3, 0xB1, 0xEC, 0x2B, 0x90, 0xD4, 0x17, 0xC2, 0xC4, 0xA2, 0xE1, 0xA6, 0xDD, 0xD9, 0x7A, 0x1C, 0x6E,
+ 0x70, 0x4D, 0xE3, 0xE9, 0x78, 0xF6, 0xC9, 0xA8, 0x45, 0xF3, 0xB8, 0x6D, 0x4B, 0xF2, 0xC8, 0x86, 0xF8, 0xD8, 0xE0, 0xB9, 0x78, 0x10, 0xE9, 0xD3, 0x13, 0xB6, 0xEA, 0x00, 0xDE, 0xC2, 0xF5, 0x72, 0x05, 0x7E, 0xBB, 0xB8, 0x96, 0x8E, 0x48, 0x11,
+ 0xF8, 0x0A, 0x7C, 0xE5, 0xC0, 0x0F, 0x74, 0x60, 0x3D, 0x34, 0xB4, 0x80, 0x09, 0x2B, 0x7B, 0xA6, 0xEE, 0x39, 0x6A, 0x96, 0x4F, 0xC6, 0x09, 0xDF, 0x3C, 0x26, 0x4C, 0x28, 0x12, 0x88, 0x5E, 0xD3, 0x9B, 0x18, 0x9D, 0x67, 0xBD, 0x49, 0x38, 0x55,
+ 0xF9, 0x92, 0x53, 0x47, 0x0B, 0x6D, 0x89, 0xDE, 0x9E, 0x60, 0x27, 0x75, 0x9C, 0x78, 0x00, 0x61, 0x3D, 0x45, 0x8D, 0x3B, 0x16, 0x2C, 0x5B, 0x08, 0x83, 0x10, 0xAB, 0xC5, 0x58, 0x96, 0xED, 0x5E, 0xC2, 0x0D, 0xD0, 0x6F, 0x51, 0x0F, 0xAB, 0xDD,
+ 0x05, 0xC9, 0x9A, 0x70, 0xB6, 0xF8, 0xDB, 0x4A, 0x64, 0x55, 0x61, 0xCC, 0x13, 0xF1, 0xEF, 0x60, 0xA2, 0x86, 0x99, 0xF5, 0xA2, 0x9F, 0xD5, 0x6A, 0xBD, 0x2E, 0xDC, 0xA5, 0x00, 0x23, 0x2E, 0x79, 0x89, 0xA6, 0x6F, 0xCE, 0xE1, 0xA2, 0xDF, 0x69,
+ 0x82, 0xB9, 0x7D, 0x13, 0x06, 0xC9, 0x3E, 0x54, 0xA8, 0x90, 0xC6, 0x38, 0xFC, 0x0A, 0x39, 0x95, 0xB3, 0xF5, 0xE5, 0xC0, 0x1F, 0x00, 0x13, 0xEE, 0xDE, 0x96, 0x86, 0x0E, 0xF0, 0x18, 0x1B, 0x88, 0x90, 0x35, 0x5D, 0x8D, 0xD1, 0x07, 0x8B, 0x16,
+ 0xCD, 0x01, 0xCF, 0x7A, 0x83, 0xE9, 0x95, 0xCA, 0xBF, 0x31, 0xCB, 0xA4, 0x51, 0x49, 0x11, 0x4F, 0x93, 0xE8, 0x1F, 0x1E, 0x6C, 0x46, 0x07, 0x39, 0x59, 0x78, 0x11, 0xF5, 0xAB, 0xDC, 0xEA, 0xEE, 0xB6, 0x40, 0x46, 0x4D, 0x4B, 0xA6, 0xE3, 0xB2,
+ 0xCB, 0xBF, 0x66, 0x89, 0x2A, 0x13, 0xEA, 0xEE, 0x80, 0x17, 0xD1, 0x88, 0xE4, 0x58, 0x51, 0x9E, 0xD9, 0x66, 0x4D, 0x7A, 0x32, 0x56, 0xF3, 0x14, 0xBF, 0x27, 0x5A, 0xDB, 0x4E, 0x76, 0x9F, 0xC4, 0xE6, 0xC9, 0xA8, 0xE3, 0xCF, 0x6D, 0xDC, 0x04,
+ 0x72, 0x1A, 0x3C, 0xF3, 0x4F, 0xF0, 0xAF, 0xA7, 0x89, 0xA9, 0x8A, 0x7D, 0x4C, 0xBE, 0x9C, 0xA0, 0x10, 0xEF, 0x2D, 0xEC, 0x45, 0xF4, 0x37, 0x6B, 0x20, 0x2B, 0x4B, 0x83, 0xFD, 0x2A, 0x7D, 0x3A, 0x08, 0xA2, 0xC6, 0xF1, 0xB8, 0xED, 0xFA, 0xAF,
+ 0xAC, 0x78, 0x85, 0x9B, 0x42, 0x30, 0x64, 0xC0, 0x2E, 0xBA, 0x16, 0xA5, 0x4E, 0x72, 0xE2, 0x8C, 0x49, 0x4B, 0x9B, 0xDA, 0x3E, 0x47, 0x67, 0x74, 0x9C, 0xF5, 0xA7, 0x86, 0xA5, 0x8D, 0x05, 0xB9, 0x76, 0xFA, 0x2F, 0x71, 0xCE, 0x2D, 0x93, 0x15,
+ 0x68, 0xD1, 0x7B, 0x40, 0xAC, 0x74, 0x75, 0x9B, 0xC9, 0x71, 0xA0, 0xA1, 0xCB, 0x52, 0xFF, 0xEE, 0x18, 0x75, 0xB7, 0x1D, 0x07, 0x23, 0x35, 0xC5, 0xD1, 0xDE, 0xEB, 0xA1, 0xB4, 0xF8, 0x8B, 0x78, 0xE3, 0x3D, 0xA0, 0x5C, 0xBD, 0xD9, 0x2F, 0x5A,
+ 0xD7, 0x2E, 0xA6, 0x70, 0x13, 0x60, 0x01, 0x73, 0x38, 0xAB, 0x1C, 0xBB, 0x86, 0xBF, 0x0B, 0x4A, 0xAD, 0x74, 0xF8, 0xFB, 0xA0, 0xAA, 0xFA, 0x23, 0x04, 0xB6, 0x0E, 0x77, 0x0F, 0x6C, 0x57, 0xAD, 0xCF, 0xE6, 0x60, 0xB1, 0x94, 0x7A, 0x8A, 0x26,
+ 0xEF, 0x95, 0xB3, 0x5F, 0xCD, 0xEC, 0xF7, 0x19, 0xBD, 0x10, 0xE5, 0xBF, 0xEB, 0x7D, 0x3D, 0x4A, 0x31, 0x23, 0xE7, 0x7B, 0xA0, 0x9C, 0x17, 0x0B, 0xCF, 0x33, 0xD4, 0xEB, 0x45, 0x69, 0x0F, 0x42, 0x0F, 0xA1, 0x6B, 0xEC, 0xEB, 0xDF, 0xBC, 0x6A,
+ 0xDA, 0x55, 0xFD, 0xCA, 0x9C, 0xFB, 0xBF, 0x02, 0x31, 0x6F, 0x8D, 0x81, 0x02, 0x67, 0x11, 0x91, 0xF7, 0xB9, 0x84, 0x58, 0x36, 0x68, 0x27, 0x61, 0x81, 0x49, 0x0E, 0x27, 0x2A, 0x94, 0x3A, 0x97, 0x55, 0x03, 0xB4, 0x3A, 0xF1, 0xC7, 0xE0, 0x6D,
+ 0x33, 0xF2, 0x92, 0x07, 0x10, 0xB3, 0x23, 0x6F, 0x64, 0xB2, 0x56, 0xB3, 0x42, 0xB9, 0x69, 0x84, 0x47, 0x3F, 0x4E, 0x82, 0xC9, 0x3A, 0xAA, 0xB5, 0xC6, 0xB7, 0xA3, 0x31, 0x9A, 0x42, 0x74, 0x0F, 0xB0, 0xD8, 0x6F, 0x12, 0xB0, 0x69, 0x5A, 0xE2,
+ 0x8A, 0x39, 0xB2, 0x70, 0xA0, 0x93, 0xAC, 0x42, 0x5E, 0x31, 0xDC, 0xAE, 0xE5, 0xE7, 0xAE, 0x0F, 0xB7, 0xC6, 0x9B, 0xC1, 0x6F, 0x83, 0xA0, 0x64, 0x1B, 0x15, 0x18, 0x4A, 0xAD, 0x9B, 0x34, 0x4F, 0x4A, 0x9D, 0x16, 0xBA, 0x2D, 0x5D, 0x61, 0x3F,
+ 0xDD, 0x68, 0xB8, 0xD1, 0x6C, 0x3C, 0xA0, 0xCA, 0x98, 0x9A, 0xA1, 0x22, 0xF1, 0x43, 0x4C, 0xCB, 0x4F, 0x77, 0xD0, 0x88, 0x0A, 0xDA, 0xA5, 0xEF, 0x86, 0x55, 0x76, 0x5A, 0x3C, 0xC6, 0x36, 0x4E, 0x79, 0xF9, 0x65, 0x2A, 0xDB, 0xD1, 0x4D, 0x80,
+ 0x20, 0x29, 0x3E, 0x09, 0xA9, 0x77, 0xB0, 0xAC, 0xE6, 0x10, 0xE6, 0x05, 0xC8, 0xD2, 0x53, 0x46, 0x4E, 0xDF, 0xE1, 0xA9, 0x71, 0x1D, 0xD5, 0x24, 0x73, 0x94, 0xA2, 0x04, 0xA0, 0xBD, 0x72, 0x46, 0xEA, 0xF9, 0x12, 0x5B, 0xA7, 0x4E, 0x20, 0x6D,
+ 0x99, 0xA6, 0xE3, 0x6D, 0xA8, 0x02, 0xBB, 0x95, 0x79, 0xE8, 0x67, 0x61, 0x5C, 0xB6, 0xE8, 0x0D, 0x9F, 0x35, 0x5D, 0xBD, 0x7E, 0xEA, 0x20, 0xC0, 0xD7, 0xEB, 0x0F, 0x94, 0xFD, 0x7A, 0x80, 0xCB, 0x0C, 0x34, 0x91, 0xE4, 0xFC, 0x5C, 0x32, 0x86,
+ 0xB4, 0x85, 0x4D, 0x8F, 0xEE, 0x51, 0x68, 0x0D, 0x89, 0x64, 0x0E, 0x6F, 0x21, 0xD4, 0xED, 0x2A, 0xD2, 0x86, 0xC0, 0x12, 0xD6, 0x68, 0xF1, 0xAE, 0x4A, 0x73, 0xFD, 0x7B, 0xDA, 0x4C, 0x61, 0xCF, 0x50, 0xDB, 0x18, 0x17, 0xC4, 0xA8, 0x12, 0x65,
+ 0x04, 0x79, 0x6F, 0xF1, 0xC2, 0xEC, 0xCB, 0xF7, 0x0F, 0x5C, 0xC3, 0x90, 0xF9, 0x3D, 0x74, 0x3E, 0x7A, 0x38, 0x1D, 0x34, 0xE5, 0xDE, 0xB6, 0xFD, 0xC3, 0x01, 0x88, 0xD1, 0x07, 0xDD, 0xF5, 0x60, 0xC3, 0x77, 0x58, 0x50, 0x32, 0x46, 0x5C, 0x6D,
+ 0xD0, 0x9F, 0x24, 0xF0, 0x5C, 0x8A, 0xB2, 0x7D, 0xC8, 0x43, 0x77, 0x94, 0x90, 0x88, 0x05, 0xA3, 0x16, 0x12, 0x73, 0xFF, 0xB9, 0xC0, 0x63, 0x39, 0xDB, 0x35, 0x3F, 0x85, 0x8F, 0x80, 0xD7, 0x6F, 0x7E, 0x8B, 0x27, 0xA6, 0x25, 0xA9, 0xE4, 0xD0,
+ 0xC1, 0xB3, 0x7B, 0xF3, 0x45, 0x89, 0xDA, 0xCC, 0x0D, 0x50, 0x09, 0x19, 0x67, 0xC5, 0x28, 0x75, 0x22, 0xBA, 0xF3, 0xD4, 0x62, 0x6D, 0xC3, 0xB9, 0xB7, 0xE5, 0x97, 0x4E, 0x25, 0xAE, 0x3C, 0x3B, 0xE9, 0xEB, 0x28, 0x28, 0xD1, 0xC6, 0x1D, 0x90,
+ 0xB2, 0x26, 0x29, 0x36, 0x8F, 0x6F, 0xD2, 0x24, 0x74, 0xDA, 0x2B, 0xFE, 0x10, 0x04, 0x86, 0x3A, 0x4F, 0xB3, 0x61, 0x70, 0x29, 0xB1, 0x49, 0x59, 0xE6, 0xD6, 0x1F, 0x99, 0x5F, 0xA8, 0xD8, 0xA5, 0x6B, 0x33, 0x6C, 0xA4, 0x1C, 0xA9, 0x39, 0x59,
+ 0x42, 0x3B, 0xBE, 0x38, 0x35, 0x55, 0x78, 0x73, 0x61, 0xF1, 0xBC, 0x19, 0xBF, 0x57, 0x72, 0xC7, 0x6B, 0x13, 0xDB, 0x89, 0x56, 0xB9, 0x37, 0x39, 0x9F, 0x51, 0x00, 0xF6, 0xC1, 0xB1, 0xD6, 0x4E, 0x12, 0x5C, 0x46, 0xB3, 0xB2, 0xCE, 0x80, 0xA0,
+ 0xBD, 0x8B, 0x73, 0xC9, 0xF7, 0x8F, 0x55, 0x63, 0xC6, 0xA7, 0x3B, 0xC1, 0x83, 0xAF, 0xE0, 0x11, 0x56, 0xFC, 0xB3, 0x16, 0x48, 0xAF, 0x4B, 0x56, 0x9E, 0x2A, 0xE7, 0x50, 0x7F, 0x0C, 0x38, 0xBD, 0xE9, 0x04, 0xCB, 0x0E, 0x8D, 0xCC, 0x83, 0x14,
+ 0xBC, 0x24, 0x30, 0x31, 0x62, 0xC5, 0xEA, 0x17, 0x84, 0x08, 0xD8, 0xE9, 0xD5, 0xB7, 0x6E, 0xE9, 0xB5, 0x90, 0x25, 0x19, 0x39, 0x33, 0x3A, 0xA8, 0xE0, 0x28, 0xC8, 0x5D, 0xB3, 0x58, 0x4C, 0x8F, 0x75, 0xC3, 0x5E, 0x20, 0x1B, 0x16, 0x55, 0xE2,
+ 0xA4, 0xE3, 0xBF, 0x94, 0x19, 0xFC, 0x06, 0xF7, 0xE9, 0x82, 0xF2, 0xAF, 0x3A, 0xCA, 0xAD, 0xB6, 0xC4, 0x54, 0x2C, 0x6F, 0x1A, 0x27, 0x3D, 0x1A, 0xDD, 0x0D, 0x1B, 0x96, 0xB0, 0x3F, 0x2D, 0xB3, 0xB5, 0xD5, 0x5E, 0x78, 0x37, 0xB1, 0x6F, 0xA1,
+ 0x61, 0x6F, 0x20, 0xF3, 0xB3, 0x52, 0x12, 0x9D, 0x28, 0xD2, 0x88, 0x4B, 0x73, 0x45, 0xD9, 0x3C, 0xAF, 0x37, 0x9F, 0x41, 0x98, 0x58, 0x19, 0x76, 0x24, 0x1A, 0xF1, 0x57, 0xFC, 0x07, 0x50, 0x34, 0xB3, 0xA6, 0x94, 0x61, 0xDF, 0xAA, 0xE6, 0xE1,
+ 0x40, 0xED, 0x99, 0x0A, 0xB5, 0x0A, 0x4E, 0xF0, 0x80, 0xDC, 0x07, 0xA2, 0x30, 0x8B, 0xD4, 0x90, 0x0B, 0x15, 0x53, 0x88, 0xA1, 0xE6, 0xAA, 0xF6, 0x61, 0x4B, 0x40, 0x8E, 0xAC, 0x6E, 0x5B, 0xF9, 0x70, 0x69, 0x90, 0x2B, 0xA4, 0x27, 0xC9, 0x85,
+ 0xE8, 0xFC, 0xBB, 0xFA, 0xFD, 0x4F, 0xFC, 0xEA, 0x02, 0x0B, 0x56, 0xB5, 0xD2, 0x12, 0xD2, 0xE4, 0x62, 0x12, 0x1D, 0xC0, 0x2C, 0x2D, 0x35, 0x8E, 0x88, 0xE9, 0x9D, 0x18, 0x7A, 0x94, 0x94, 0xFC, 0x7A, 0x84, 0xF8, 0xFC, 0xF9, 0x2E, 0xB0, 0x62,
+ 0x84, 0xCB, 0xD4, 0x77, 0xF3, 0x7B, 0x36, 0x62, 0x0D, 0xF3, 0xCF, 0xA3, 0xAE, 0x28, 0xC1, 0xC3, 0xD2, 0xF0, 0xBC, 0xB1, 0x83, 0xB6, 0x21, 0x19, 0xDB, 0x23, 0xE8, 0x93, 0x62, 0x57, 0xB0, 0xA7, 0x4D, 0x24, 0xBC, 0xFD, 0x12, 0x35, 0xED, 0x7D,
+ 0x70, 0x46, 0x51, 0xD7, 0x8C, 0x70, 0xB3, 0x40, 0x29, 0xDE, 0x53, 0x68, 0x4B, 0x98, 0xA2, 0xE0, 0x31, 0x7C, 0x81, 0x4B, 0xCD, 0xCF, 0x61, 0xFF, 0x2B, 0x2A, 0x5A, 0xF6, 0x52, 0x00, 0xA1, 0xA1, 0xA0, 0x55, 0x29, 0x9E, 0x52, 0x3F, 0xF8, 0x26,
+ 0xE8, 0xC0, 0x11, 0x47, 0x7E, 0x73, 0x1B, 0x5E, 0x91, 0xDF, 0xF2, 0x71, 0xD5, 0xBA, 0x28, 0x70, 0x06, 0xCB, 0x72, 0x99, 0xB5, 0xBF, 0xA0, 0x8D, 0xB7, 0x51, 0x57, 0x78, 0xC4, 0x5A, 0xAA, 0x50, 0xD4, 0x59, 0x35, 0x7D, 0x7E, 0xBD, 0xFF, 0x2A,
+ 0x8D, 0x2B, 0xBB, 0xBB, 0x25, 0xD3, 0xCC, 0x76, 0xE3, 0x01, 0xEB, 0x2E, 0x20, 0xFC, 0x92, 0x5F, 0x53, 0x95, 0xD3, 0xF7, 0x6A, 0x14, 0x04, 0x67, 0x00, 0xB2, 0x48, 0xA2, 0x2F, 0xD6, 0x65, 0x22, 0xC4, 0x08, 0x67, 0x2D, 0xC2, 0x63, 0x66, 0x13,
+ 0xC0, 0xD4, 0xA6, 0x71, 0x53, 0x0B, 0x7C, 0x1E, 0x9C, 0xB9, 0x30, 0x9A, 0xDA, 0x45, 0x59, 0x95, 0x93, 0xC4, 0x05, 0x62, 0xB1, 0x51, 0xDC, 0x21, 0x72, 0xE2, 0xDA, 0x93, 0x2C, 0x98, 0x85, 0xF8, 0x75, 0xEE, 0x53, 0x80, 0x45, 0x73, 0x76, 0xE0,
+ 0x70, 0x21, 0x4F, 0x7F, 0x8F, 0xB1, 0x70, 0xEB, 0x3C, 0x52, 0xC2, 0xEA, 0x71, 0xC1, 0x04, 0xF3, 0xBD, 0x40, 0x16, 0x8D, 0xEA, 0xED, 0x0C, 0xC1, 0xDB, 0x72, 0x73, 0x78, 0x13, 0x44, 0x75, 0xC3, 0xED, 0x29, 0x9C, 0x77, 0xAF, 0xB9, 0x68, 0x87,
+ 0x9F, 0x94, 0x78, 0x2D, 0x03, 0xAE, 0x79, 0xB7, 0x7F, 0xE3, 0x36, 0x70, 0x42, 0xCE, 0x3D, 0x88, 0xD3, 0x66, 0xC8, 0xE8, 0xCF, 0x39, 0xF2, 0x35, 0xD7, 0xFA, 0xFB, 0x22, 0x01, 0x74, 0xD4, 0x42, 0xCC, 0x6F, 0x88, 0x9D, 0x51, 0x80, 0x2E, 0xAA,
+ 0xB7, 0x21, 0xDC, 0x3A, 0x31, 0x1C, 0xFC, 0x1F, 0x36, 0x94, 0xD8, 0x57, 0x68, 0x7D, 0x2D, 0xCF, 0x4F, 0xD2, 0x6A, 0xB0, 0x1E, 0x17, 0x1B, 0x1E, 0xC3, 0xF7, 0x37, 0x91, 0x21, 0xF6, 0x3B, 0xA2, 0xC5, 0x61, 0xE4, 0x84, 0x43, 0x6D, 0x81, 0xCA,
+ 0x85, 0xB4, 0xB4, 0x7D, 0xD9, 0xE8, 0x4D, 0x73, 0xBE, 0x18, 0xA8, 0xC5, 0xE1, 0xEC, 0x8E, 0x9A, 0xEB, 0x80, 0xD0, 0x5B, 0x1F, 0x62, 0x40, 0xE7, 0xC7, 0xEC, 0xBA, 0xE0, 0x09, 0x60, 0x16, 0x9C, 0x3B, 0x72, 0x43, 0xB3, 0x91, 0x10, 0xCA, 0xDB,
+ 0x65, 0x3E, 0xAA, 0x61, 0xF3, 0x28, 0x77, 0x71, 0x50, 0xCD, 0xCB, 0x09, 0xE2, 0x31, 0x75, 0x0A, 0xF5, 0xCD, 0x7B, 0xA4, 0xF9, 0xC9, 0x67, 0xB5, 0x62, 0xA1, 0x78, 0x43, 0x3F, 0xF0, 0xAE, 0xC6, 0xE0, 0x0E, 0xC8, 0x3A, 0x4D, 0x91, 0x31, 0x2C,
+ 0x38, 0xB6, 0x8A, 0xD3, 0xEC, 0xF1, 0x1E, 0xBD, 0x1F, 0x11, 0x87, 0x29, 0x26, 0xA8, 0x54, 0x9B, 0xA7, 0xCD, 0xD0, 0xB4, 0x4D, 0x41, 0xF6, 0xC1, 0xE3, 0xAE, 0x4B, 0x19, 0x13, 0x96, 0xC3, 0x5C, 0x9E, 0xF6, 0x2D, 0x5B, 0x57, 0x4D, 0x18, 0xD2,
+ 0xAB, 0x76, 0x40, 0x1E, 0x63, 0x88, 0xAF, 0x09, 0xA8, 0x30, 0x1A, 0xBC, 0x88, 0xE8, 0xEB, 0x33, 0xB6, 0xC3, 0xAD, 0xE5, 0x95, 0xA3, 0xBD, 0xEF, 0xFB, 0xB1, 0xC6, 0xDC, 0x46, 0xEA, 0x0E, 0xD8, 0x28, 0x6D, 0x42, 0x73, 0xFA, 0x90, 0xFF, 0x91,
+ 0x7F, 0x8E, 0x56, 0x75, 0xDD, 0xA9, 0xD4, 0x36, 0x34, 0xF2, 0x97, 0xF3, 0xAE, 0x1F, 0x03, 0x47, 0x9A, 0x3D, 0xC7, 0xA6, 0x04, 0xD5, 0x00, 0x00, 0xB0, 0xDC, 0xED, 0x6A, 0xBB, 0x7F, 0xE4, 0x89, 0xBA, 0x1F, 0xEA, 0x11, 0x2C, 0xA9, 0xBD, 0x7A,
+ 0x9E, 0xEA, 0x3E, 0x25, 0xB0, 0x52, 0xD5, 0x21, 0x2A, 0x74, 0xC0, 0x71, 0x17, 0xFE, 0xB8, 0x72, 0xE1, 0x0F, 0x08, 0x4C, 0xC1, 0x58, 0x01, 0x87, 0x3E, 0xC2, 0x51, 0x8F, 0xC4, 0x3D, 0x3F, 0xF4, 0x67, 0xDB, 0x99, 0x15, 0xBA, 0x52, 0x4D, 0x90,
+ 0x3E, 0xEA, 0xAA, 0xAC, 0xDD, 0x49, 0x8B, 0x76, 0x68, 0x90, 0x0F, 0x84, 0x50, 0x60, 0xC7, 0x14, 0xFA, 0xEE, 0xA5, 0xF6, 0xCF, 0x45, 0xAD, 0x7E, 0x4B, 0xC0, 0x2F, 0x82, 0xC3, 0x51, 0x7A, 0x6E, 0xDE, 0xCF, 0x3B, 0x64, 0xF4, 0x10, 0xA5, 0x75,
+ 0x41, 0x78, 0xA4, 0x34, 0xF6, 0x2E, 0xCE, 0xA2, 0x39, 0x42, 0xE4, 0x16, 0xC4, 0xFB, 0x17, 0xAE, 0x2A, 0xFC, 0x47, 0x6B, 0xB9, 0xE5, 0x05, 0x5C, 0x5E, 0x53, 0x36, 0xCF, 0xAB, 0x07, 0x09, 0x4B, 0x32, 0x1E, 0xFE, 0x03, 0xA5, 0xE5, 0x7E, 0x37,
+ 0x2C, 0xD1, 0x46, 0x68, 0x1D, 0x6D, 0x0D, 0x9A, 0xF3, 0xDA, 0x26, 0x33, 0x90, 0x29, 0xBD, 0x45, 0x21, 0xC9, 0xEF, 0xFA, 0x50, 0x04, 0x78, 0x1D, 0xD9, 0x66, 0x32, 0xAA, 0xCC, 0xF1, 0xBC, 0x54, 0x71, 0x71, 0xEC, 0x0C, 0x8D, 0xDD, 0x2C, 0xC9,
+ 0xD5, 0x1B, 0xE9, 0xEE, 0xDF, 0xA6, 0x18, 0x0B, 0xC2, 0x2E, 0x9C, 0xD4, 0x1A, 0xDB, 0xEC, 0x74, 0x20, 0xF4, 0x9E, 0xB6, 0xA3, 0x9D, 0x24, 0x77, 0xB5, 0x32, 0xC2, 0x76, 0x63, 0x62, 0x0F, 0xA3, 0xBD, 0xB7, 0xDC, 0xE7, 0x3C, 0xEB, 0x30, 0xF9,
+ 0x3C, 0x60, 0x04, 0x51, 0xFB, 0xD5, 0x07, 0x8D, 0x16, 0x55, 0xFC, 0xEF, 0x18, 0x07, 0x90, 0x66, 0xA2, 0x58, 0x77, 0x1F, 0xD0, 0xBC, 0xF8, 0x93, 0xA3, 0x0D, 0x00, 0x1B, 0x05, 0x04, 0x72, 0xEB, 0x55, 0x93, 0xD5, 0x2F, 0xC1, 0xC7, 0x5C, 0xB2,
+ 0x45, 0x49, 0x6D, 0x77, 0x48, 0x89, 0x41, 0x4D, 0x8D, 0x40, 0x6E, 0x52, 0xFD, 0xC3, 0xCB, 0x5E, 0x2F, 0x17, 0x86, 0xB5, 0x22, 0xBA, 0xE4, 0xC5, 0x86, 0x9C, 0x2D, 0x75, 0x4C, 0x25, 0xF6, 0xE7, 0x41, 0x43, 0xB1, 0x71, 0x51, 0x76, 0xCA, 0xC4,
+ 0x39, 0x78, 0x63, 0x7A, 0x5B, 0x4B, 0xB2, 0xFF, 0xCF, 0xE8, 0xA9, 0x55, 0x1A, 0xD3, 0x04, 0xD9, 0xF5, 0x32, 0xC7, 0x58, 0x97, 0x14, 0xFD, 0x79, 0x4A, 0x47, 0xB2, 0x24, 0xD1, 0xC9, 0xEA, 0x7D, 0x51, 0x3A, 0x1D, 0x28, 0x5F, 0x3A, 0x95, 0x3A,
+ 0x44, 0xBB, 0xCC, 0x8F, 0xAF, 0xE2, 0xD4, 0xA1, 0x4E, 0x75, 0x6B, 0x5C, 0xCC, 0xF1, 0x27, 0x7B, 0x66, 0x37, 0x11, 0x85, 0x53, 0x0A, 0xEE, 0x3F, 0x46, 0x13, 0xCE, 0xB2, 0x48, 0xBC, 0x30, 0xFA, 0x74, 0xD1, 0x3C, 0x2C, 0x46, 0x12, 0x74, 0xBB,
+ 0x21, 0x16, 0xD3, 0x3F, 0xD1, 0x07, 0x86, 0xCD, 0x68, 0x84, 0xDA, 0x6B, 0xE9, 0xF2, 0x0D, 0xA8, 0x5C, 0x42, 0x63, 0xBA, 0x2F, 0x00, 0x4D, 0x83, 0x66, 0x2D, 0xC6, 0x53, 0xA5, 0x07, 0x2A, 0x98, 0xD9, 0x1C, 0xF9, 0x7B, 0x46, 0x34, 0xA7, 0x35,
+ 0xC4, 0xD6, 0x67, 0xCF, 0xC2, 0x1C, 0xF4, 0xEF, 0xC4, 0x1D, 0xBB, 0xDD, 0x98, 0xFB, 0x77, 0x59, 0xE5, 0xCE, 0x7F, 0xC3, 0xCC, 0x92, 0x10, 0xEC, 0xF9, 0xEE, 0x6F, 0xD4, 0x2A, 0x95, 0x81, 0xE1, 0x95, 0xA7, 0x17, 0x12, 0x7F, 0x22, 0x64, 0xB2,
+ 0x9D, 0x17, 0xC7, 0x0C, 0xAE, 0xC3, 0x51, 0x4D, 0x1F, 0x47, 0x15, 0xE6, 0xC6, 0xF4, 0x4F, 0x7A, 0xEF, 0x81, 0x30, 0x15, 0x46, 0x38, 0x88, 0x9E, 0x81, 0xA9, 0x62, 0x2A, 0x6D, 0x5B, 0x7F, 0x58, 0x08, 0x10, 0x21, 0xCA, 0xD9, 0x0A, 0x25, 0xCE,
+ 0xC4, 0x54, 0xD7, 0x75, 0x31, 0x7D, 0xC7, 0x32, 0xFB, 0x22, 0x74, 0x6B, 0x28, 0x51, 0xF5, 0xED, 0x74, 0x77, 0x31, 0xFE, 0x8A, 0x73, 0x9C, 0x89, 0x23, 0x79, 0x3F, 0x30, 0xC6, 0xCA, 0x3A, 0x17, 0xDE, 0x2F, 0xD6, 0xDE, 0x0A, 0x6F, 0xCC, 0xB6,
+ 0x4A, 0xCC, 0x49, 0x01, 0x29, 0x54, 0xDD, 0x28, 0xB4, 0x27, 0x51, 0xD2, 0xDA, 0x22, 0xCE, 0xCB, 0x83, 0x0F, 0x20, 0x5C, 0x71, 0x09, 0x35, 0x64, 0x6B, 0x71, 0x00, 0xB9, 0xC2, 0xD1, 0x22, 0x33, 0x6C, 0xA1, 0x8B, 0x86, 0x6A, 0x72, 0x77, 0xF0,
+ 0x64, 0x0F, 0x36, 0x9F, 0x6C, 0x4E, 0xA9, 0xD5, 0xB8, 0xDE, 0xF1, 0xE2, 0x64, 0xC5, 0x8E, 0x7B, 0x6A, 0x03, 0x83, 0xCB, 0xE6, 0x38, 0x50, 0x16, 0x34, 0x83, 0x8F, 0x53, 0x22, 0x3E, 0xF6, 0xA1, 0xFD, 0xF4, 0x5B, 0x57, 0xB6, 0x55, 0x9E, 0x11,
+ 0xB5, 0xE2, 0xA8, 0xD5, 0xD4, 0xA5, 0xEB, 0x87, 0xC8, 0x37, 0xB0, 0x54, 0x7F, 0x55, 0xDD, 0x2F, 0x92, 0xC3, 0xFE, 0x1B, 0xDA, 0x3E, 0x19, 0x20, 0x6D, 0x67, 0x26, 0xD0, 0x69, 0x7D, 0x0E, 0xB4, 0xA1, 0xF0, 0x57, 0xF3, 0xE4, 0xFA, 0xAA, 0xC4,
+ 0x01, 0x7C, 0xDA, 0xAF, 0x27, 0xFF, 0x67, 0x15, 0x46, 0xA2, 0x22, 0x51, 0x5B, 0xC6, 0x5E, 0x71, 0xDC, 0xC7, 0xBE, 0xBC, 0xB2, 0xBD, 0x54, 0xCE, 0x8F, 0xD8, 0x45, 0x7A, 0x06, 0x12, 0x67, 0x0B, 0x61, 0x34, 0xE3, 0xCF, 0x28, 0x74, 0x7D, 0x70,
+ 0xA9, 0xDC, 0xC0, 0x93, 0x28, 0x8F, 0x91, 0x94, 0x1C, 0xE5, 0x80, 0xF0, 0x93, 0xCD, 0xB9, 0x10, 0x67, 0xD5, 0x75, 0x96, 0xA8, 0x86, 0xAD, 0x52, 0x1C, 0xDC, 0xF9, 0xB7, 0x2E, 0x3F, 0x3F, 0xCC, 0xEF, 0x90, 0x69, 0xFB, 0xA5, 0x69, 0x44, 0x7F,
+ 0x55, 0x61, 0x15, 0xD0, 0x68, 0xE0, 0x2E, 0x63, 0xA9, 0x6D, 0xF7, 0xB9, 0xCC, 0xB5, 0xC2, 0xB4, 0x82, 0x54, 0xBB, 0x81, 0x2D, 0x88, 0x29, 0x56, 0xE0, 0xA2, 0xDB, 0xB4, 0xAF, 0x74, 0x89, 0x31, 0x27, 0xD6, 0x9A, 0x35, 0x77, 0x40, 0x60, 0x03,
+ 0xFA, 0xD3, 0x25, 0x82, 0x8B, 0x22, 0x40, 0xDE, 0xE9, 0x8B, 0x7B, 0xDB, 0x63, 0xEB, 0x32, 0x3F, 0x07, 0x9C, 0x1A, 0x4C, 0x59, 0x39, 0xED, 0x56, 0xE4, 0x7E, 0x9E, 0xD3, 0x18, 0xB4, 0xA9, 0xC2, 0xD2, 0xAA, 0x66, 0x6A, 0xCA, 0xA0, 0xAB, 0x4B,
+ 0xA2, 0xA1, 0x62, 0xB1, 0xE6, 0x3E, 0x6A, 0x6A, 0x73, 0x3F, 0x23, 0x8C, 0x81, 0xB2, 0xA3, 0x12, 0xCD, 0x3D, 0x12, 0x04, 0x12, 0xDA, 0xD2, 0x16, 0x72, 0xF5, 0xFD, 0xED, 0x62, 0xDE, 0x6D, 0xD0, 0x19, 0x3B, 0x16, 0x35, 0xDC, 0x3A, 0xDA, 0x18,
+ 0x58, 0xC5, 0x7A, 0xF6, 0x1F, 0xA2, 0xA8, 0xB3, 0x44, 0x8B, 0x50, 0x51, 0x1E, 0x01, 0x05, 0xCA, 0xDC, 0x40, 0x8C, 0x5C, 0xE5, 0xD5, 0xD5, 0xB7, 0x64, 0x00, 0xF8, 0x7D, 0xC1, 0xA5, 0xB2, 0xF4, 0x1F, 0x20, 0x8A, 0x9F, 0x78, 0xDE, 0x8B, 0x29,
+ 0xA2, 0x1C, 0xD5, 0xFC, 0x21, 0x8D, 0xD5, 0xC8, 0x23, 0xDF, 0xE5, 0xF3, 0x71, 0x68, 0xDD, 0x77, 0xB9, 0xA0, 0xE8, 0xE7, 0x0B, 0x0D, 0xFC, 0x3B, 0x72, 0x0F, 0x12, 0xF5, 0x92, 0x38, 0x4F, 0xFA, 0x04, 0x86, 0x67, 0x74, 0x4A, 0x87, 0xAE, 0x50,
+ 0x08, 0x89, 0x3D, 0xAB, 0xCE, 0x95, 0x98, 0x25, 0xDE, 0x23, 0x13, 0x78, 0x91, 0xEB, 0x2D, 0xCA, 0x54, 0x2B, 0xF9, 0x46, 0x3C, 0xC4, 0x6E, 0x36, 0x2D, 0x27, 0xB3, 0x86, 0xA3, 0x62, 0x97, 0x32, 0x1D, 0xD1, 0x3C, 0x89, 0x5D, 0x4A, 0x94, 0x2B,
+ 0x93, 0x46, 0x4B, 0x59, 0x8D, 0xB3, 0x22, 0xCB, 0x04, 0x0E, 0x67, 0xBA, 0x3C, 0xC6, 0xEA, 0x8F, 0xBA, 0x32, 0xB8, 0xB4, 0xD3, 0x10, 0xF6, 0x44, 0xAC, 0x7B, 0x28, 0xF0, 0x56, 0x29, 0xB5, 0x78, 0x41, 0x89, 0x69, 0xF3, 0x1F, 0x80, 0xEF, 0xBA,
+ 0x63, 0x92, 0xF6, 0x4F, 0xF2, 0xED, 0xDD, 0xC2, 0x64, 0xCE, 0xCC, 0x1D, 0x2D, 0x62, 0x45, 0xDE, 0x95, 0xFA, 0xF2, 0x5A, 0x3A, 0x84, 0xDB, 0x91, 0x0D, 0x6E, 0x0D, 0x2E, 0x32, 0x2E, 0x03, 0x92, 0x66, 0x3E, 0xB4, 0xFB, 0x59, 0xCA, 0xB2, 0x3A,
+ 0x56, 0x1B, 0xB8, 0xED, 0x32, 0x31, 0xE6, 0x0A, 0x93, 0x96, 0xB5, 0xF2, 0x8C, 0xCE, 0x09, 0x47, 0x8B, 0xF1, 0x21, 0x66, 0xC2, 0x96, 0x2A, 0xBE, 0x1E, 0x96, 0x99, 0xA0, 0x3B, 0x3B, 0x2E, 0x49, 0x40, 0x6D, 0x29, 0x1B, 0x98, 0x14, 0x11, 0x51,
+ 0xFF, 0xD1, 0x9E, 0xD9, 0x01, 0x4B, 0x52, 0x59, 0x80, 0xD6, 0x10, 0xEF, 0x07, 0x06, 0xCB, 0xA6, 0x1C, 0xE2, 0xEE, 0x2F, 0xEC, 0x71, 0x7E, 0x61, 0xC3, 0x03, 0xD8, 0xBD, 0x91, 0xE4, 0xE5, 0x8D, 0x71, 0x82, 0xC2, 0x56, 0x14, 0x1B, 0xDA, 0x51,
+ 0x6C, 0xB4, 0x12, 0x42, 0xD2, 0x40, 0xF4, 0x8C, 0x64, 0x9C, 0xC8, 0x79, 0x6E, 0x2B, 0x8B, 0x79, 0xA1, 0xF2, 0x33, 0x21, 0xEC, 0x73, 0xCE, 0x72, 0x15, 0xBF, 0xA5, 0x01, 0xD1, 0x52, 0x46, 0x8E, 0xA5, 0x93, 0x53, 0x2D, 0xDC, 0xF9, 0x46, 0x94,
+ 0xC6, 0x5A, 0x19, 0x69, 0x30, 0x86, 0xFD, 0x4E, 0xD7, 0x16, 0x4B, 0x3C, 0xDE, 0x87, 0x3E, 0x43, 0xAB, 0x05, 0xF2, 0xC4, 0xC9, 0x2A, 0x34, 0xAB, 0xCC, 0x3D, 0xC4, 0x9D, 0x95, 0x50, 0xA9, 0x6E, 0x56, 0x56, 0x4B, 0xD8, 0x40, 0xE5, 0xEB, 0x0D,
+ 0x58, 0x1F, 0xC3, 0x52, 0x47, 0x0C, 0x8C, 0x6D, 0x9A, 0xE8, 0x17, 0xD7, 0xAB, 0xF1, 0x18, 0xA1, 0x27, 0x61, 0x2E, 0x8E, 0x68, 0x50, 0x9D, 0xEA, 0x93, 0x72, 0x4E, 0xEB, 0x52, 0xC3, 0xC1, 0xD1, 0x9D, 0xEB, 0x24, 0x7D, 0x1F, 0x9E, 0xEF, 0xD2,
+ 0xF3, 0x75, 0x6F, 0xF5, 0xDA, 0x64, 0x97, 0xD5, 0x91, 0x73, 0x94, 0x65, 0xC8, 0xB4, 0x1E, 0xB9, 0x31, 0x8A, 0xB0, 0xF4, 0x89, 0xA1, 0xA7, 0x73, 0xE9, 0x34, 0x25, 0x58, 0x8C, 0xC0, 0x63, 0x22, 0x37, 0xC1, 0xE0, 0xEB, 0x6B, 0xBD, 0x1D, 0xA3,
+ 0x33, 0x13, 0x64, 0xA4, 0x13, 0xA3, 0x23, 0x31, 0xAF, 0x55, 0x68, 0x6E, 0xB2, 0x80, 0x91, 0x49, 0x68, 0x6D, 0xEA, 0x5B, 0x55, 0xFF, 0xDE, 0xFF, 0x2A, 0x50, 0x2F, 0x19, 0x86, 0xB5, 0xFC, 0xD6, 0xDD, 0x41, 0x67, 0xE5, 0xB5, 0xE6, 0x97, 0xAC,
+ 0x63, 0xFB, 0x69, 0x99, 0xCC, 0x9C, 0xA8, 0x36, 0xC0, 0xC2, 0x2D, 0x1C, 0x33, 0xD9, 0xE2, 0xA5, 0xB0, 0x81, 0x15, 0x56, 0xE2, 0x02, 0x22, 0x2A, 0x66, 0x60, 0x82, 0xEF, 0x92, 0x55, 0xDD, 0x6E, 0x7B, 0xD3, 0x38, 0x91, 0xB0, 0xA6, 0x12, 0x4C,
+ 0xAE, 0x73, 0x6B, 0xD7, 0x45, 0x5F, 0xD3, 0x55, 0xF7, 0x5B, 0x50, 0x12, 0x75, 0xDA, 0x3A, 0x7B, 0x43, 0x28, 0x11, 0x1E, 0xEA, 0xE5, 0x6B, 0x28, 0x37, 0x1D, 0x13, 0x14, 0x62, 0x65, 0xAB, 0x12, 0xDA, 0x1F, 0x60, 0xF2, 0xDC, 0x2A, 0x12, 0xF1,
+ 0x14, 0x31, 0x8F, 0x7C, 0x62, 0x2C, 0xCD, 0x8A, 0xE6, 0x5A, 0x92, 0x5F, 0x45, 0x5C, 0x73, 0x81, 0xAD, 0xF3, 0xEE, 0x13, 0x9B, 0x37, 0x90, 0x47, 0x1C, 0x97, 0x1B, 0x7B, 0x83, 0xF8, 0x10, 0x2E, 0x10, 0x0B, 0x46, 0x98, 0x5E, 0x7A, 0xCB, 0x6C,
+ 0x25, 0x84, 0xE3, 0xE6, 0x40, 0x04, 0x25, 0x23, 0xF7, 0x33, 0x74, 0xF8, 0x8D, 0x16, 0xDC, 0x28, 0x68, 0x85, 0x67, 0x7B, 0x10, 0xA2, 0x24, 0x24, 0x14, 0x93, 0xC4, 0x59, 0xFC, 0xB0, 0xEC, 0x16, 0x22, 0x4F, 0xD7, 0xBE, 0xF9, 0xB5, 0xFA, 0x0F,
+ 0xD9, 0x95, 0xE2, 0xD3, 0xCC, 0xCC, 0xB7, 0x65, 0xE0, 0x3E, 0x03, 0xB8, 0x22, 0x26, 0x53, 0x01, 0x9C, 0xDC, 0x96, 0xCF, 0xBF, 0x29, 0xA3, 0xA8, 0x8C, 0x75, 0x47, 0x32, 0xBE, 0xDC, 0x7B, 0x6B, 0x78, 0xFB, 0xD9, 0x45, 0x95, 0x30, 0x36, 0x86,
+ 0xBE, 0xB6, 0xE6, 0xBA, 0x3C, 0xE1, 0x20, 0x1C, 0x05, 0x04, 0x84, 0x27, 0xC2, 0x81, 0x6F, 0xFF, 0xC8, 0x34, 0xBD, 0xE7, 0xB6, 0xC1, 0xDA, 0x5F, 0xCC, 0x48, 0x60, 0x88, 0xD2, 0x17, 0xFF, 0x77, 0x0E, 0x40, 0x30, 0xAA, 0x1F, 0x68, 0x1D, 0x1E,
+ 0xB6, 0x15, 0xCC, 0x5A, 0x19, 0x2A, 0x91, 0x8E, 0xB4, 0x77, 0xD0, 0xE7, 0xCB, 0xC7, 0xEE, 0xF2, 0x1A, 0x25, 0xC7, 0xCB, 0x10, 0x47, 0xA4, 0xEE, 0x24, 0xC6, 0x1B, 0x11, 0xC1, 0xEE, 0x73, 0x07, 0xDF, 0x59, 0xA9, 0x50, 0xBA, 0xF1, 0xCF, 0xE7,
+ 0x02, 0x26, 0xDC, 0xD2, 0x7A, 0x98, 0xA1, 0x51, 0x3C, 0x18, 0x02, 0xFF, 0x6B, 0xAD, 0x30, 0x5D, 0x41, 0x29, 0xE3, 0xA0, 0xA8, 0x16, 0x5B, 0x6F, 0x43, 0xBE, 0xA1, 0x89, 0x81, 0x20, 0xEC, 0x98, 0x59, 0xF4, 0xCC, 0xB0, 0x53, 0xC8, 0x31, 0x8B,
+ 0xDB, 0xFA, 0x8E, 0x21, 0x10, 0x6F, 0x59, 0x60, 0xD3, 0xAD, 0xDB, 0x12, 0x4D, 0x9C, 0x02, 0xDD, 0x92, 0x44, 0x0C, 0x7F, 0x9E, 0x8B, 0x16, 0xA4, 0x6B, 0x5D, 0xC5, 0xC3, 0x65, 0xCF, 0x61, 0x2C, 0x58, 0x8C, 0xFB, 0x46, 0x4C, 0x7F, 0x62, 0xEC,
+ 0xDA, 0x1B, 0x91, 0x58, 0x1A, 0x59, 0x15, 0x44, 0xF7, 0x1A, 0xCD, 0xF2, 0x48, 0x85, 0x4D, 0x0C, 0xA3, 0xDD, 0x3F, 0x7F, 0x90, 0x98, 0xE4, 0x5A, 0x92, 0xAD, 0xB5, 0x10, 0x3E, 0x7C, 0x1F, 0x38, 0x1A, 0x8C, 0xA1, 0x92, 0x14, 0xE8, 0x7D, 0x94,
+ 0xBE, 0x0D, 0x5A, 0xFF, 0x46, 0x62, 0x96, 0x32, 0xD9, 0xC2, 0x6A, 0xD3, 0xDA, 0x93, 0x2B, 0xA4, 0xE1, 0x41, 0x5F, 0xD1, 0x81, 0x17, 0xD9, 0xEC, 0x4B, 0xCF, 0xC3, 0xDD, 0xCF, 0xF7, 0xC1, 0x3A, 0xBB, 0x36, 0xF2, 0xBB, 0x24, 0xA2, 0xA0, 0xD8,
+ 0xD9, 0x89, 0xEC, 0x4D, 0x94, 0x4D, 0x2A, 0x41, 0x42, 0x4D, 0x63, 0x15, 0x1D, 0x0E, 0x2E, 0x65, 0x9B, 0x40, 0xE5, 0xAD, 0x6B, 0x16, 0x2A, 0x36, 0x00, 0xF1, 0x1B, 0x15, 0x76, 0x2B, 0xB0, 0x4D, 0x1B, 0x94, 0x15, 0x43, 0x0B, 0xFA, 0xCE, 0x7B,
+ 0x8C, 0x45, 0xA9, 0x13, 0x2B, 0xC5, 0x18, 0x70, 0x4F, 0x1C, 0xB0, 0x3F, 0xAE, 0xE9, 0xEB, 0x8F, 0x3A, 0x63, 0x48, 0x76, 0xC6, 0xCB, 0x0F, 0xA9, 0x16, 0x79, 0xB1, 0x33, 0xAB, 0x69, 0xBE, 0x1A, 0xAA, 0x3B, 0x6F, 0x9B, 0x67, 0x2E, 0x20, 0xE8,
+ 0xAF, 0x93, 0xB6, 0x8F, 0xAA, 0x93, 0xF8, 0x10, 0xBD, 0x4C, 0x9A, 0x36, 0x25, 0xE3, 0xA9, 0x3D, 0x69, 0xF5, 0x92, 0x52, 0x33, 0x5D, 0x55, 0xC2, 0x35, 0x67, 0x52, 0x01, 0x83, 0xCA, 0x02, 0x6B, 0xA3, 0x7E, 0xF3, 0xB6, 0x39, 0xA5, 0x7A, 0x55,
+ 0x27, 0xB8, 0xB2, 0xF6, 0x01, 0x35, 0x62, 0x68, 0xEA, 0x80, 0x83, 0x26, 0xFC, 0x6E, 0xD8, 0xBD, 0x53, 0xB4, 0xAE, 0x4C, 0x0A, 0xAD, 0x3C, 0x9A, 0x5D, 0x20, 0xAD, 0x55, 0x3D, 0x2E, 0xCE, 0xDA, 0x69, 0x1F, 0xE6, 0x11, 0x73, 0xDE, 0x9F, 0x5A,
+ 0x5F, 0x88, 0xC2, 0x41, 0x56, 0x3A, 0x26, 0xB6, 0xC7, 0xB4, 0xC3, 0xB8, 0x0E, 0xA3, 0x2A, 0x20, 0x7D, 0xDE, 0xB4, 0x3B, 0x09, 0x15, 0x34, 0xA6, 0x2E, 0x1B, 0x79, 0x77, 0xFB, 0xCB, 0x71, 0xD6, 0xAB, 0x33, 0x8F, 0x4D, 0xC3, 0x9C, 0xBB, 0x60,
+ 0xBF, 0xB3, 0x8E, 0xF5, 0xBA, 0x10, 0x21, 0x30, 0x1B, 0x7E, 0x94, 0xFE, 0x89, 0x77, 0xCA, 0xDB, 0xFB, 0x5D, 0x07, 0x58, 0x1F, 0x52, 0xA6, 0x06, 0x1A, 0x0A, 0x2B, 0x63, 0x91, 0xDA, 0x91, 0xED, 0x56, 0x8F, 0x33, 0xA2, 0xCB, 0xCF, 0xE1, 0x33,
+ 0x45, 0x24, 0x1E, 0xF4, 0xF7, 0xB4, 0x67, 0x71, 0xDA, 0xDC, 0xC6, 0x2F, 0x29, 0x93, 0xEE, 0xD4, 0xA2, 0xED, 0xAE, 0xA6, 0xD5, 0x01, 0xFE, 0xDE, 0x5A, 0xDF, 0x20, 0xD9, 0xF5, 0x81, 0xB1, 0xD9, 0x98, 0x22, 0x3E, 0x04, 0x51, 0x36, 0xB9, 0x2B,
+ 0x2F, 0xD8, 0x01, 0xDA, 0x08, 0xAB, 0x3A, 0xB3, 0xA7, 0xCD, 0xE5, 0x96, 0xC4, 0x15, 0x83, 0x58, 0xB6, 0xE9, 0xE9, 0x41, 0x4C, 0x3D, 0xAA, 0x35, 0xB8, 0x2F, 0x11, 0x73, 0x3A, 0xFB, 0x7E, 0xBE, 0xEA, 0xD2, 0x46, 0x41, 0xB6, 0x13, 0xD3, 0x26,
+ 0x86, 0x81, 0xD8, 0x80, 0xBE, 0x7C, 0xB9, 0x9A, 0x41, 0xE1, 0xB7, 0x26, 0xF2, 0x39, 0x34, 0x3D, 0x71, 0xEE, 0x6C, 0x92, 0x72, 0x68, 0x97, 0x83, 0x03, 0x1B, 0x88, 0xC2, 0x9D, 0x33, 0x7F, 0xAB, 0xC5, 0xAE, 0xCE, 0xC7, 0x4F, 0x49, 0x28, 0x18,
+ 0xA0, 0xA0, 0xA6, 0x62, 0x98, 0xB0, 0x6B, 0xE3, 0xAF, 0x0F, 0x83, 0x13, 0xFE, 0x6C, 0xFF, 0x72, 0xBE, 0x89, 0x86, 0xD6, 0xD8, 0x25, 0xC6, 0x11, 0x57, 0xAE, 0x9A, 0x2E, 0x1E, 0x44, 0x13, 0x3F, 0x02, 0x60, 0x0E, 0x1D, 0xB0, 0x16, 0x0A, 0x4B,
+ 0x1B, 0xC0, 0xF2, 0x76, 0xA2, 0xB7, 0xF3, 0x36, 0xCC, 0xD2, 0xCF, 0x31, 0x64, 0x90, 0x9C, 0x85, 0xBA, 0x71, 0x83, 0xF5, 0xE0, 0x2D, 0x2A, 0xEC, 0x74, 0xBB, 0x0A, 0xD5, 0x74, 0xD6, 0x33, 0xE9, 0x50, 0x73, 0x73, 0x49, 0x27, 0xFF, 0xCA, 0x62,
+ 0x2C, 0xE9, 0x13, 0x37, 0x7C, 0x11, 0x5C, 0x6D, 0x7F, 0x06, 0xA4, 0x09, 0xBC, 0x57, 0xC7, 0x1E, 0xE0, 0x62, 0x49, 0x4F, 0x46, 0x78, 0x8C, 0x8D, 0x07, 0x8F, 0xEE, 0xDD, 0x59, 0xD7, 0xE1, 0x52, 0x07, 0xDA, 0x1C, 0x8E, 0x95, 0xA0, 0xC6, 0x7E,
+ 0x20, 0x41, 0xCA, 0xCA, 0x5B, 0x82, 0x75, 0x4C, 0x55, 0x48, 0xC3, 0xDF, 0x6B, 0x8B, 0x1E, 0x55, 0xE5, 0xB5, 0x33, 0xCC, 0xAA, 0x45, 0x2A, 0x3B, 0xFE, 0x67, 0x48, 0x7F, 0xB0, 0x14, 0x2D, 0xCA, 0x37, 0x22, 0xD5, 0x94, 0xEA, 0xCD, 0x29, 0xA7,
+ 0x3E, 0x78, 0x4E, 0x1B, 0xEA, 0xBF, 0x99, 0xF3, 0x4A, 0x69, 0xCB, 0xD1, 0x99, 0x5D, 0x18, 0x9D, 0x3E, 0x33, 0xE8, 0x1D, 0xFA, 0xB0, 0x54, 0x16, 0x0A, 0x2E, 0x11, 0x5A, 0x9F, 0x47, 0xD0, 0xA3, 0xEF, 0xE0, 0xFE, 0xDA, 0xCD, 0x50, 0xD2, 0x50,
+ 0xD4, 0x98, 0x4F, 0xF6, 0x00, 0x06, 0x2B, 0x44, 0x34, 0x27, 0xB1, 0xCE, 0x6B, 0x66, 0x09, 0x8E, 0x5E, 0x9A, 0xBD, 0x28, 0x1B, 0x9C, 0xDD, 0xE6, 0x5C, 0x2A, 0x50, 0xE5, 0x17, 0xAC, 0x0B, 0xBF, 0x1A, 0x38, 0xD0, 0x8D, 0x80, 0x2C, 0x23, 0xB5,
+ 0x69, 0x3D, 0x5E, 0xB7, 0xB9, 0xC7, 0xF5, 0x52, 0xE1, 0x44, 0x3F, 0x6E, 0x5D, 0x6E, 0xA5, 0xE4, 0x55, 0xFF, 0xAC, 0x59, 0xC9, 0x15, 0xD9, 0x68, 0x5F, 0x39, 0x15, 0x27, 0xF6, 0xD4, 0x20, 0x09, 0xEF, 0x78, 0x35, 0xB6, 0x56, 0x19, 0x20, 0x26,
+ 0xA9, 0x93, 0xE9, 0x9B, 0x1A, 0x70, 0x05, 0x70, 0xE9, 0xD7, 0x80, 0x6A, 0x7A, 0x4B, 0x1D, 0xE5, 0x44, 0x8C, 0x87, 0x76, 0x6B, 0x59, 0x52, 0x6F, 0x57, 0xD4, 0x52, 0x00, 0x89, 0x3A, 0x11, 0x03, 0x85, 0x2F, 0x75, 0xDD, 0xCD, 0xE3, 0x81, 0xE4,
+ 0x01, 0xDF, 0xE7, 0xD2, 0x9E, 0x84, 0x1B, 0x98, 0x01, 0x16, 0x11, 0xAD, 0xB0, 0x32, 0xCC, 0x3F, 0xAA, 0xB9, 0x7D, 0x6B, 0x67, 0xA2, 0xED, 0xC2, 0x90, 0xF3, 0x34, 0xA7, 0x89, 0x4F, 0x82, 0x3E, 0x41, 0x80, 0x65, 0x07, 0x9C, 0xC0, 0x87, 0x91,
+ 0x9F, 0x96, 0xB5, 0x19, 0x28, 0x0A, 0xE9, 0xEC, 0x86, 0x72, 0xB2, 0x85, 0x6A, 0x4C, 0x99, 0x7E, 0x4D, 0xE3, 0x02, 0xBE, 0xE2, 0x87, 0x6F, 0x58, 0xCB, 0x66, 0x49, 0x96, 0xD4, 0xFF, 0x7F, 0x1B, 0x2E, 0x06, 0xA1, 0xAA, 0xC7, 0xD3, 0xE6, 0x47,
+ 0x48, 0xA9, 0xAD, 0xE3, 0xF3, 0x08, 0x33, 0xC3, 0x21, 0x7F, 0x62, 0x53, 0xB2, 0x35, 0x21, 0xFF, 0x26, 0x09, 0xBC, 0xF0, 0x74, 0x32, 0xE2, 0x02, 0xDC, 0xB8, 0x91, 0x11, 0xA4, 0x7D, 0x05, 0xBC, 0x55, 0x2C, 0xC1, 0xC7, 0xD8, 0x1C, 0xD6, 0x8A,
+ 0x53, 0xBB, 0x62, 0x64, 0xC4, 0xCC, 0x9D, 0xAB, 0x71, 0x3A, 0x07, 0x8F, 0x08, 0x22, 0x09, 0xBC, 0x8A, 0x6B, 0x9E, 0x9D, 0x8C, 0x4E, 0x3D, 0xCC, 0x9E, 0xE6, 0x2D, 0x45, 0xD7, 0xE3, 0x5C, 0x24, 0x56, 0xA2, 0xEE, 0x54, 0xD2, 0x94, 0x1F, 0x0C,
+ 0x00, 0x41, 0x57, 0x6E, 0x49, 0x1A, 0x46, 0x87, 0x78, 0xEE, 0xC3, 0xA3, 0x3D, 0x2A, 0x8C, 0x4C, 0x6A, 0x74, 0x59, 0xDD, 0x0F, 0xD5, 0x87, 0x33, 0x0C, 0x31, 0xB5, 0xC7, 0x37, 0x55, 0x94, 0x02, 0x5F, 0xD4, 0xBA, 0xC4, 0x9E, 0x95, 0x8A, 0xBC,
+ 0x84, 0x65, 0x2D, 0xEC, 0x14, 0x73, 0x45, 0x30, 0x6D, 0x42, 0x40, 0x48, 0x64, 0x6E, 0xC2, 0xC9, 0x61, 0x8A, 0xB0, 0xBC, 0xC5, 0x01, 0xB4, 0xF0, 0x75, 0x44, 0x0F, 0x60, 0xB6, 0xDB, 0x8C, 0xD2, 0x64, 0x74, 0xD9, 0x65, 0xE8, 0x39, 0xBE, 0xCE,
+ 0xB3, 0xA3, 0x42, 0x6C, 0xD9, 0x9E, 0xA1, 0x19, 0xD9, 0x26, 0xBC, 0xE1, 0x59, 0x47, 0x41, 0xA7, 0xD9, 0x53, 0x8A, 0x94, 0x13, 0x64, 0x40, 0x73, 0x87, 0x5A, 0x44, 0xDA, 0x2B, 0xEF, 0x96, 0x7F, 0x5A, 0x08, 0x55, 0xD0, 0x84, 0x7C, 0x3B, 0xB0,
+ 0xA0, 0xB5, 0x50, 0x14, 0x93, 0xCD, 0x86, 0xB5, 0x9A, 0x01, 0x62, 0xE7, 0xD6, 0xAE, 0xA2, 0xA3, 0xB7, 0xDF, 0x93, 0x6B, 0x1C, 0x62, 0xFD, 0xDF, 0xC2, 0xD3, 0x0D, 0xED, 0xBF, 0x48, 0x81, 0x09, 0x9B, 0xFC, 0xAD, 0x2F, 0x32, 0x10, 0x3C, 0x8E,
+ 0x90, 0x96, 0x10, 0x3D, 0x72, 0x93, 0x2D, 0xD2, 0x1A, 0x2B, 0x25, 0xEE, 0x9C, 0x1B, 0x69, 0x5A, 0xA3, 0x8A, 0x40, 0xA8, 0xA9, 0x89, 0xF3, 0x7E, 0x4C, 0xCA, 0x81, 0xFF, 0x76, 0x38, 0xAA, 0xF5, 0x86, 0xA7, 0xBF, 0x57, 0x8C, 0x34, 0x76, 0x01,
+ 0x81, 0xFA, 0x42, 0x55, 0x25, 0x46, 0xAD, 0x6B, 0xB2, 0x15, 0x37, 0x66, 0x33, 0x6B, 0xD6, 0x56, 0xE1, 0x19, 0xE9, 0xC6, 0xAC, 0x8E, 0xA3, 0x08, 0xAD, 0x61, 0x9C, 0x9F, 0x47, 0xC5, 0x22, 0xC6, 0x31, 0x77, 0xC5, 0xBF, 0x03, 0xCE, 0x19, 0x98,
+ 0x84, 0x03, 0x5F, 0xD7, 0x1A, 0x8C, 0xFA, 0xE9, 0x08, 0xC4, 0x51, 0x76, 0xE3, 0xA9, 0x12, 0x13, 0xF6, 0x6B, 0x72, 0xDD, 0x55, 0xA3, 0x68, 0x60, 0x87, 0x5B, 0x91, 0x75, 0x86, 0x69, 0x4C, 0x51, 0xB8, 0x92, 0x3E, 0xCF, 0x55, 0xA2, 0x03, 0x15,
+ 0xCD, 0xCB, 0x6A, 0x95, 0x23, 0xF6, 0xA4, 0xB7, 0x63, 0x84, 0x5A, 0x4A, 0xA2, 0xF8, 0x27, 0xA8, 0x63, 0xDD, 0x9C, 0x8C, 0xE2, 0xBD, 0x65, 0x8B, 0x21, 0xC7, 0xBC, 0xC9, 0x14, 0x8D, 0xC2, 0x13, 0x44, 0xA4, 0x04, 0x2F, 0xED, 0x58, 0x25, 0xBE,
+ 0xDD, 0x3F, 0xCE, 0x38, 0x8C, 0x1C, 0x3B, 0xA4, 0x5A, 0x2F, 0x6A, 0xE2, 0x4A, 0x7A, 0x4A, 0x72, 0x07, 0x8C, 0xDD, 0x84, 0xF4, 0x57, 0xF3, 0x64, 0xE5, 0x31, 0x39, 0xCC, 0xE5, 0x10, 0x05, 0xA8, 0x15, 0x6D, 0xFC, 0xF1, 0xE1, 0xC9, 0x8A, 0xC9,
+ 0x5A, 0x24, 0x07, 0x5C, 0x8A, 0x9A, 0x2A, 0x96, 0x87, 0x28, 0x2E, 0xBA, 0xD9, 0xB9, 0x93, 0xD0, 0x7A, 0x1D, 0x96, 0x06, 0x91, 0x94, 0x3A, 0xBE, 0x5A, 0x0A, 0xAE, 0xDB, 0xAA, 0x21, 0x5E, 0xFC, 0x8E, 0xE5, 0x72, 0xF5, 0x28, 0xFB, 0x5B, 0x7A,
+ 0xCB, 0x9E, 0x4F, 0xAC, 0xAB, 0xD7, 0xCB, 0x76, 0xE2, 0xAF, 0x62, 0xFE, 0x99, 0x60, 0x1F, 0xA1, 0x34, 0x24, 0xE8, 0x3A, 0x98, 0x99, 0x76, 0x6B, 0x95, 0xD0, 0xD0, 0xAE, 0x6B, 0x28, 0x33, 0x18, 0xF9, 0xE8, 0x58, 0x1E, 0x89, 0x46, 0xBB, 0x16,
+ 0x37, 0xD4, 0x03, 0xCA, 0xE0, 0x08, 0x46, 0xDA, 0xCE, 0x99, 0xB0, 0x31, 0xB4, 0xF1, 0xDB, 0x21, 0xF9, 0x6C, 0xEE, 0x1E, 0xF2, 0x38, 0xA5, 0x61, 0x92, 0xD7, 0x08, 0xAC, 0x84, 0xF9, 0x24, 0x3F, 0x62, 0x40, 0x5D, 0x91, 0x31, 0x9B, 0xF3, 0x9D,
+ 0xC3, 0x1A, 0x34, 0xE2, 0x11, 0x91, 0xC1, 0x95, 0x7F, 0x7F, 0xB7, 0xEA, 0xFD, 0xFB, 0x38, 0x46, 0x12, 0x02, 0x84, 0x62, 0x57, 0x12, 0xD5, 0x09, 0x59, 0x41, 0x64, 0x16, 0x0E, 0xA6, 0x71, 0x59, 0x9C, 0x4F, 0xAE, 0xCC, 0xED, 0x95, 0x7B, 0x9E,
+ 0x54, 0x9D, 0x68, 0xA3, 0xDD, 0xCA, 0x44, 0x6A, 0xC6, 0xEC, 0x23, 0x73, 0xD2, 0xC1, 0xBA, 0x2F, 0x22, 0x93, 0xFB, 0xDC, 0xC8, 0x11, 0x07, 0x54, 0x52, 0x94, 0x6A, 0x2E, 0xE0, 0x5A, 0xF8, 0x2E, 0x31, 0xB7, 0x72, 0x32, 0x56, 0x60, 0x5B, 0xBB,
+ 0x26, 0xCF, 0x7F, 0x10, 0x94, 0x27, 0x75, 0x5B, 0xA2, 0xC2, 0xC9, 0x64, 0xC2, 0x48, 0x28, 0x49, 0xAC, 0xF6, 0x72, 0xBE, 0x92, 0xD4, 0x97, 0x1E, 0xC8, 0x44, 0xD9, 0x6E, 0x0A, 0x6A, 0xEF, 0xEA, 0xC6, 0x3B, 0xE7, 0x1B, 0x01, 0x19, 0x29, 0x0E,
+ 0x79, 0x55, 0x00, 0x66, 0x1E, 0x1B, 0xF0, 0xD4, 0x05, 0x12, 0x7E, 0xE2, 0x76, 0xFC, 0xA4, 0xE0, 0xBA, 0x94, 0xBB, 0x9D, 0x03, 0xF6, 0x15, 0xC6, 0x54, 0x53, 0x7E, 0x4C, 0xEF, 0x59, 0x0E, 0xA2, 0x69, 0x20, 0xA8, 0x73, 0x79, 0xA1, 0xE0, 0x4F,
+ 0xD5, 0x6A, 0x9F, 0xAB, 0xE8, 0x2E, 0x61, 0x9F, 0xEC, 0xA6, 0x6D, 0xE2, 0x42, 0x1E, 0xB4, 0xB6, 0xF5, 0x72, 0xAA, 0x3A, 0xB7, 0x86, 0xD2, 0xC1, 0x25, 0x85, 0x56, 0xE2, 0x2D, 0x0A, 0x99, 0xDC, 0x2A, 0x66, 0x00, 0x78, 0x77, 0x7C, 0x17, 0x68,
+ 0x46, 0xFE, 0x74, 0x13, 0xAD, 0xBF, 0x87, 0xDF, 0x07, 0x3E, 0xF5, 0xD5, 0xFC, 0x34, 0x8B, 0x1D, 0x1C, 0xC5, 0x93, 0x2A, 0x78, 0x53, 0x7D, 0x81, 0x89, 0x98, 0xE7, 0x49, 0x38, 0x07, 0x07, 0x2B, 0x85, 0x2C, 0x28, 0x47, 0x84, 0x48, 0xDD, 0x6A,
+ 0x68, 0xCA, 0x68, 0xDF, 0x8C, 0x62, 0x79, 0xCF, 0x4D, 0x9C, 0xAD, 0xC3, 0x24, 0x23, 0xD3, 0x20, 0x47, 0x8A, 0x00, 0x64, 0x7A, 0x90, 0x46, 0xC2, 0x59, 0x3A, 0x97, 0xC7, 0x35, 0x1F, 0x3E, 0x9A, 0xAE, 0xF0, 0x03, 0x6D, 0xF7, 0xDA, 0xDE, 0xE9,
+ 0x97, 0x30, 0xCA, 0xCE, 0xB8, 0x1A, 0x47, 0xBA, 0xC3, 0x25, 0x67, 0x16, 0xF9, 0x13, 0xAA, 0x20, 0xBF, 0x5D, 0x07, 0x81, 0x94, 0xDA, 0x55, 0xB4, 0xE6, 0xB6, 0x7F, 0x77, 0xE7, 0xF6, 0x76, 0x58, 0xA0, 0xFE, 0x59, 0xC3, 0xB8, 0xC5, 0x1B, 0x3D,
+ 0x15, 0x13, 0x15, 0x50, 0xD5, 0x9D, 0x00, 0x81, 0x98, 0xFE, 0x9C, 0x58, 0x1B, 0x85, 0x45, 0xF8, 0xF0, 0x18, 0x22, 0xC6, 0x80, 0x35, 0xEE, 0x45, 0xE1, 0xC1, 0x09, 0xA6, 0x02, 0xF2, 0x82, 0xB0, 0x6B, 0x3C, 0x1D, 0x73, 0x82, 0xAC, 0xB8, 0x65,
+ 0x67, 0x21, 0x00, 0xDC, 0xAB, 0xD8, 0xA7, 0x71, 0x5F, 0xBE, 0xB9, 0xEB, 0xC8, 0x68, 0x03, 0x1B, 0x62, 0x9C, 0x02, 0x56, 0x36, 0xE2, 0x83, 0x73, 0x88, 0x48, 0x19, 0x18, 0xC7, 0x5F, 0x44, 0x98, 0xB9, 0xEB, 0x30, 0xEE, 0x82, 0x48, 0x40, 0x53,
+ 0xD2, 0x38, 0x75, 0xC2, 0xED, 0xE3, 0x58, 0x08, 0xFD, 0xCB, 0x67, 0x38, 0x0C, 0x5E, 0x1E, 0xF8, 0xF0, 0xBC, 0xCB, 0x68, 0xBB, 0xEA, 0xB4, 0x28, 0xDF, 0xDC, 0x63, 0xC8, 0x43, 0xA9, 0x29, 0x05, 0x94, 0xFE, 0xE3, 0x3D, 0xE4, 0x88, 0x8E, 0x42,
+ 0x77, 0x72, 0xAE, 0x0E, 0xA9, 0xB4, 0x2C, 0x97, 0xCE, 0xFF, 0xF9, 0x01, 0x16, 0x13, 0x40, 0x7D, 0xC9, 0xD2, 0x6F, 0xE8, 0x72, 0xF7, 0x6F, 0x51, 0x07, 0xAC, 0x7A, 0x35, 0xC3, 0x4F, 0x17, 0x36, 0x28, 0x7E, 0xBB, 0xA9, 0x3F, 0x42, 0x7F, 0x17,
+ 0x6C, 0xA3, 0x69, 0x0E, 0x46, 0x41, 0xB0, 0xD7, 0x0E, 0x24, 0x35, 0xAF, 0xE5, 0x12, 0x0F, 0x3D, 0x89, 0xD6, 0x66, 0x6F, 0xA9, 0x56, 0x79, 0x05, 0x3A, 0x9F, 0xA9, 0x0E, 0x54, 0xC6, 0x48, 0xA1, 0x8E, 0x17, 0xE8, 0xEF, 0x89, 0x5A, 0x84, 0xF2,
+ 0xC9, 0x49, 0xF0, 0x20, 0xFE, 0x19, 0x49, 0xBC, 0x19, 0xBB, 0x0D, 0x87, 0x31, 0xAA, 0xFD, 0x3A, 0x6C, 0xD4, 0x65, 0x33, 0x22, 0xB6, 0xA8, 0x57, 0x48, 0xD3, 0xE2, 0x9E, 0xE8, 0x16, 0xE9, 0x46, 0xF0, 0xC7, 0x14, 0x88, 0x61, 0x86, 0x6C, 0x92,
+ 0xA0, 0x95, 0x4A, 0x8E, 0x93, 0xDD, 0x44, 0x83, 0xC2, 0x7C, 0x20, 0x82, 0xA3, 0x62, 0xD1, 0x95, 0xF4, 0xB4, 0xA5, 0x8B, 0xCC, 0x14, 0x25, 0xA7, 0x76, 0x94, 0x5D, 0xBD, 0x07, 0xF6, 0x30, 0x2E, 0x21, 0xDF, 0xC4, 0x3A, 0x30, 0xD0, 0x6D, 0x45,
+ 0xA2, 0x03, 0x08, 0xC0, 0x97, 0xB0, 0xAE, 0x4D, 0xA1, 0xD8, 0x2E, 0x7B, 0x06, 0x43, 0x3D, 0x5E, 0x4C, 0x9E, 0x6C, 0xBD, 0xA3, 0x12, 0x3A, 0x33, 0x33, 0x2E, 0x99, 0x59, 0x02, 0xA4, 0xB9, 0x2F, 0x64, 0x67, 0xF8, 0x10, 0xE0, 0x9F, 0x00, 0x00,
+ 0x2A, 0xAD, 0x34, 0x57, 0x60, 0x4C, 0xF1, 0x68, 0xF0, 0x3B, 0xE9, 0xA0, 0x8C, 0x9A, 0x34, 0xF9, 0x56, 0x09, 0x8B, 0xC8, 0xD5, 0x85, 0xC2, 0xB7, 0xEF, 0x33, 0x2B, 0x41, 0xB7, 0x14, 0x14, 0xC4, 0x46, 0x32, 0x0B, 0xBF, 0x6C, 0x30, 0x28, 0xBF,
+ 0xB4, 0x1E, 0x37, 0xE5, 0x9C, 0xCF, 0xFD, 0xC0, 0x09, 0xDB, 0x96, 0xB0, 0xB0, 0xF1, 0x60, 0x40, 0xD2, 0xB1, 0x59, 0xF0, 0x25, 0x2D, 0xF0, 0x93, 0x1E, 0x33, 0x9B, 0x73, 0x7D, 0x87, 0x8D, 0x67, 0x72, 0x78, 0xF1, 0x57, 0xDC, 0xB4, 0xBD, 0x17,
+ 0xF5, 0xE7, 0x06, 0x16, 0xA6, 0x78, 0xD2, 0x27, 0x62, 0x3C, 0x38, 0x8C, 0xED, 0x69, 0xA5, 0x1D, 0x4E, 0x81, 0x03, 0x34, 0x2A, 0xC8, 0x76, 0x95, 0x0C, 0xAB, 0x7B, 0x94, 0x27, 0x18, 0x97, 0x47, 0x4B, 0x33, 0x80, 0x1C, 0x3A
#else
#error "Undefined device"
#endif
diff --git a/app/common/example/se_manager_se_firmware_upgrade/readme.md b/app/common/example/se_manager_se_firmware_upgrade/readme.md
index f1aef6a61e..a4c15cacdd 100644
--- a/app/common/example/se_manager_se_firmware_upgrade/readme.md
+++ b/app/common/example/se_manager_se_firmware_upgrade/readme.md
@@ -1,33 +1,29 @@
# SE Manager SE Firmware Upgrade
-
This example uses the SE Manager API to upgrade the SE firmware on the supported Series 2 device.
+The SE upgrade firmware image must be stored to the device's internal flash in `.seu` format. The latest SE firmware image (`.seu` and `.hex`) and release notes can be found in the Windows folder below.
-The SE upgrade firmware image must be stored to the device’s internal flash in `.seu` format. The latest SE firmware image (`.sec` and `.hex`) can be found in the Windows folders below (`v3.1` or above).
-
+For GSDK v3.2 and lower:
-*C:\SiliconLabs\SimplicityStudio\v5\developer\sdks\gecko\_sdk\_suite\v3.1\util\se\_release\public*
+_C:\SiliconLabs\SimplicityStudio\v5\developer\sdks\GSDK VERSION\util\se_release\public_
+For GSDK v4.0 and higher:
-The SE firmware image (`.sec`) can be converted to a C source file with the SEGGER free utility [Bin2C.exe](https://www.segger.com/free-utilities/bin2c/). Copy the SE firmware image data array (discard the last `NULL-0x00` character) in the converted C file to `se_firmware_image[]` array in `app_se_firmware_image.c`.
+_C:\Users\PC USER NAME\SimplicityStudio\SDKs\gecko_sdk\util\se_release\public_
+The SE firmware image (`.seu`) can be converted to a C source file by SEGGER free utility [Bin2C.exe](https://www.segger.com/free-utilities/bin2c/). Copy the SE firmware image data array (discard the last `NULL-0x00` character) in converted C file to `se_firmware_image[]` array in `app_se_firmware_image.c`.
The SE firmware image validation will fail if the image version is equal to or less than the current SE firmware version.
-
The example redirects standard I/O to the virtual serial port (VCOM) of the kit. By default, the serial port setting is 115200 bps and 8-N-1 configuration.
-
The example has been instrumented with code to count the number of clock cycles spent in different operations. The results are printed on the VCOM serial port console. This feature can be disabled by defining `SE_MANAGER_PRINT=0` (default is 1) in the IDE setting (`Preprocessor->Defined symbols`).
-
## SE Manager API
-
The following SE Manager APIs are used in this example:
-
* `sl_se_init`
* `sl_se_deinit`
* `sl_se_init_command_context`
@@ -39,34 +35,25 @@ The following SE Manager APIs are used in this example:
* `sl_se_read_executed_command` (VSE only)
* `sl_se_ack_command` (VSE only)
-
## Getting Started
-
-1. Upgrade the kit’s firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
-2. Upgrade the device’s SE firmware to the latest version (see `Secure Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
-3. Open any terminal program and connect to the kit’s VCOM port (if using `Device Console` in Simplicity Studio 5, `Line terminator:` must be set to `None`).
-4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide, check `Platform()` checkbox to browse the platform examples).
-5. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in the Simplicity Studio 5 User's Guide).
+1. Upgrade the kit's firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in Simplicity Studio 5 Users Guide).
+2. Upgrade the device's SE firmware to the latest version (see `Secure Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in Simplicity Studio 5 Users Guide).
+3. Open any terminal program and connect to the kit's VCOM port (if using `Device Console` in Simplicity Studio 5, `Line terminator:` must be set to `None`).
+4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in Simplicity Studio 5 Users Guide).
+5. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in Simplicity Studio 5 Users Guide).
6. Run the example and follow the instructions shown on the console.
-
## Additional Information
-
1. The current version for HSE or VSE firmware upgrade can be found in the `app_se_firmware_image.c`.
2. For a device with VSE, a reset will be issued when running specified SE Manager APIs.
-3. EFR32xG23 and EFR32xG24 devices require SE firmware `v2.0.1` or above to run this example.
+3. EFR32xG23 and EFR32xG24 devices require SE firmware v2.0.1 or above to run this example.
4. The device should disconnect from the debugger when upgrading the HSE or VSE firmware.
5. The default optimization level is `Optimize for debugging (-Og)` on Simplicity IDE and `None` on IAR Embedded Workbench.
-
## Resources
-
[SE Manager API](https://docs.silabs.com/gecko-platform/latest/service/api/group-sl-se-manager)
-
[AN1222: Production Programming of Series 2 Devices](https://www.silabs.com/documents/public/application-notes/an1222-efr32xg2x-production-programming.pdf)
-
-
diff --git a/app/common/example/se_manager_secure_debug/readme.md b/app/common/example/se_manager_secure_debug/readme.md
index 3551f2834d..2c151633b4 100644
--- a/app/common/example/se_manager_secure_debug/readme.md
+++ b/app/common/example/se_manager_secure_debug/readme.md
@@ -71,7 +71,7 @@ The following SE Manager APIs are used in this example:
1. Upgrade the kit’s firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
2. Upgrade the device’s SE firmware to the latest version (see `Secure Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
3. Open any terminal program and connect to the kit’s VCOM port (if using `Device Console` in Simplicity Studio 5, `Line terminator:` must be set to `None`).
-4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide, check `Platform()` checkbox to browse the platform examples).
+4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide).
5. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in the Simplicity Studio 5 User's Guide).
6. Run the example and follow the instructions shown on the console.
diff --git a/app/common/example/se_manager_secure_identity/app_se_manager_secure_identity.c b/app/common/example/se_manager_secure_identity/app_se_manager_secure_identity.c
index d0c1204416..18f7105682 100644
--- a/app/common/example/se_manager_secure_identity/app_se_manager_secure_identity.c
+++ b/app/common/example/se_manager_secure_identity/app_se_manager_secure_identity.c
@@ -53,9 +53,6 @@ static uint8_t pub_device_key_buf[SL_SE_CERT_KEY_SIZE];
/// Signature buffer
static uint8_t signature_buf[SL_SE_CERT_SIGN_SIZE];
-/// Number of bytes actually used in the token.
-static size_t token_len;
-
// -----------------------------------------------------------------------------
// Public Function Definitions
// -----------------------------------------------------------------------------
@@ -99,14 +96,6 @@ uint8_t * get_pub_device_key_buf_ptr(void)
return(pub_device_key_buf);
}
-/***************************************************************************//**
- * Get token length.
- ******************************************************************************/
-size_t get_token_len(void)
-{
- return(token_len);
-}
-
/***************************************************************************//**
* Initialize the SE Manager.
******************************************************************************/
diff --git a/app/common/example/se_manager_secure_identity/app_se_manager_secure_identity.h b/app/common/example/se_manager_secure_identity/app_se_manager_secure_identity.h
index 5abaf9c384..7f2ebbe115 100644
--- a/app/common/example/se_manager_secure_identity/app_se_manager_secure_identity.h
+++ b/app/common/example/se_manager_secure_identity/app_se_manager_secure_identity.h
@@ -72,13 +72,6 @@ uint8_t * get_cert_buf_ptr(void);
******************************************************************************/
uint8_t * get_pub_device_key_buf_ptr(void);
-/***************************************************************************//**
- * Get token length.
- *
- * @returns Returns length of the token.
- ******************************************************************************/
-size_t get_token_len(void);
-
/***************************************************************************//**
* Initialize the SE Manager.
*
diff --git a/app/common/example/se_manager_secure_identity/readme.md b/app/common/example/se_manager_secure_identity/readme.md
index 6304e05ba7..f147a4a590 100644
--- a/app/common/example/se_manager_secure_identity/readme.md
+++ b/app/common/example/se_manager_secure_identity/readme.md
@@ -43,7 +43,7 @@ The following SE Manager APIs are used in this example:
1. Upgrade the kit’s firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
2. Upgrade the device’s SE firmware to the latest version (see `Secure Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
3. Open any terminal program and connect to the kit’s VCOM port.
-4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide, check `Platform()` checkbox to browse the platform examples).
+4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide).
5. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in the Simplicity Studio 5 User's Guide).
6. Run the example and the console should display the process steps of this example.
diff --git a/app/common/example/se_manager_signature/readme.md b/app/common/example/se_manager_signature/readme.md
index 0fd8ec4232..aac58b5fef 100644
--- a/app/common/example/se_manager_signature/readme.md
+++ b/app/common/example/se_manager_signature/readme.md
@@ -97,7 +97,7 @@ The following SE Manager APIs are used in this example:
1. Upgrade the kit’s firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
2. Upgrade the device’s SE firmware to the latest version (see `Secure Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
3. Open any terminal program and connect to the kit’s VCOM port (if using `Device Console` in Simplicity Studio 5, `Line terminator:` must be set to `None`).
-4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide, check `Platform()` checkbox to browse the platform examples).
+4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide).
5. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in the Simplicity Studio 5 User's Guide).
6. Run the example and follow the instructions shown on the console.
diff --git a/app/common/example/se_manager_stream_cipher/readme.md b/app/common/example/se_manager_stream_cipher/readme.md
index 7fd8d0a5d5..a30fb407d1 100644
--- a/app/common/example/se_manager_stream_cipher/readme.md
+++ b/app/common/example/se_manager_stream_cipher/readme.md
@@ -52,7 +52,7 @@ The following SE Manager APIs are used in this example:
1. Upgrade the kit’s firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
2. Upgrade the device’s SE firmware to the latest version (see `Secure Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
3. Open any terminal program and connect to the kit’s VCOM port.
-4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide, check `Platform()` checkbox to browse the platform examples).
+4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide).
5. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in the Simplicity Studio 5 User's Guide).
6. Run the example and the console should display the process steps of this example.
diff --git a/app/common/example/se_manager_symmetric_key_handling/readme.md b/app/common/example/se_manager_symmetric_key_handling/readme.md
index 3b9f513a7b..accfdccd9e 100644
--- a/app/common/example/se_manager_symmetric_key_handling/readme.md
+++ b/app/common/example/se_manager_symmetric_key_handling/readme.md
@@ -61,7 +61,7 @@ The following SE Manager APIs are used in this example:
1. Upgrade the kit’s firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
2. Upgrade the device’s SE firmware to the latest version (see `Secure Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
3. Open any terminal program and connect to the kit’s VCOM port (if using `Device Console` in Simplicity Studio 5, `Line terminator:` must be set to `None`).
-4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide, check `Platform()` checkbox to browse the platform examples).
+4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide).
5. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in the Simplicity Studio 5 User's Guide).
6. Run the example and follow the instructions shown on the console.
diff --git a/app/common/example/se_manager_tamper/readme.md b/app/common/example/se_manager_tamper/readme.md
index af56826e1c..759d3b140a 100644
--- a/app/common/example/se_manager_tamper/readme.md
+++ b/app/common/example/se_manager_tamper/readme.md
@@ -1,44 +1,29 @@
# SE Manager Tamper
-
This example uses the SE Manager API to demonstrate the tamper feature on the supported Series 2 Secure Vault High device.
-
-For demonstration purposes, a private command key is stored in the device’s memory to sign the access certificate for tamper disable. The device’s public command key in the SE OTP must match with the public key of this private command key to disable tamper signals.
-
+For demonstration purposes, a private command key is stored in the device's memory to sign the access certificate for tamper disable. The device's public command key in the SE OTP must match with the public key of this private command key to disable tamper responses.
The default private command key (`cmd-unsafe-privkey.pem`) in PEM format can be found in the Windows folder below.
-
-*C:\SiliconLabs\SimplicityStudio\v5\developer\adapter\_packs\secmgr\scripts\offline*
-
+_C:\SiliconLabs\SimplicityStudio\v5\developer\adapter_packs\secmgr\scripts\offline_
The public key of `cmd-unsafe-privkey.pem` in text format is:
-
`X - B1BC6F6FA56640ED522B2EE0F5B3CF7E5D48F60BE8148F0DC08440F0A4E1DCA4`
-
`Y - 7C04119ED6A1BE31B7707E5F9D001A659A051003E95E1B936F05C37EA793AD63`
+If the device does not have public command key in the SE OTP, the program will prompt the user to program the public key above to the device.
-If the device does not have a public command key in the SE OTP, the program will prompt the user to program the public key above to the device.
-
-
-The user can change the private command key (`private_command_key[]`) in `app_se_manager_tamper_disable.c` to match with the device’s public command key in the SE OTP for tamper disable.
-
+The user can change the private command key (`private_command_key[]`) in `app_se_manager_tamper_disable.c` to match with the device's public command key in the SE OTP for tamper disable.
The example redirects standard I/O to the virtual serial port (VCOM) of the kit. By default, the serial port setting is 115200 bps and 8-N-1 configuration.
-
The example has been instrumented with code to count the number of clock cycles spent in different operations. The results are printed on the VCOM serial port console. This feature can be disabled by defining `SE_MANAGER_PRINT=0` (default is 1) in the IDE setting (`Preprocessor->Defined symbols`).
-
## Tamper Responses
-
-
-
| Level | Responses | Description |
| --- | --- | --- |
| 0 | Ignore | No action is taken |
@@ -47,11 +32,7 @@ The example has been instrumented with code to count the number of clock cycles
| 4 | Reset | The device is reset |
| 7 | Erase OTP | Erases the OTP configuration of the device (make the device and all wrapped secrets unrecoverable) |
-
-## Tamper Signals
-
-
-
+## Tamper Sources (EFR32xG21B Device)
| Number | Name | Default level | User level in this example |
| --- | --- | --- | --- |
@@ -63,7 +44,7 @@ The example has been instrumented with code to count the number of clock cycles
| 5 | SE Hardfault | 4 | 4 |
| 6 | Reserved | — | — |
| 7 | Software Assertion | 4 | 4 |
-| 8 | Reserved | — | — |
+| 8 | SE CodeAuth | 4 | 4 |
| 9 | UserCodeAuth | 0 | 0 |
| 10 | MailboxAuth | 0 | 1 |
| 11 | DCIAuth | 0 | 0 |
@@ -71,14 +52,14 @@ The example has been instrumented with code to count the number of clock cycles
| 13 | Reserved | — | — |
| 14 | Self-test | 4 | 4 |
| 15 | TRNG Monitor | 0 | 1 |
-| 16 | PRS0 | 0 | 1 (Push button PB0) |
-| 17 | PRS1 | 0 | 1 (None) |
-| 18 | PRS2 | 0 | 2 (Push button PB0) |
-| 19 | PRS3 | 0 | 2 (None) |
-| 20 | PRS4 | 0 | 4 (Push button PB1) |
-| 21 | PRS5 | 0 | 4 (Software) |
-| 22 | PRS6 | 0 | 7 (None) |
-| 23 | PRS7 | 0 | 7 (None) |
+| 16 | PRS0 | 0 | 1 (PRS source: Push button PB0) |
+| 17 | PRS1 | 0 | 1 (PRS source: None) |
+| 18 | PRS2 | 0 | 2 (PRS source: Push button PB0) |
+| 19 | PRS3 | 0 | 2 (PRS source: None) |
+| 20 | PRS4 | 0 | 4 (PRS source: Push button PB1) |
+| 21 | PRS5 | 0 | 4 (PRS source: Software) |
+| 22 | PRS6 | 0 | 7 (PRS source: None) |
+| 23 | PRS7 | 0 | 7 (PRS source: None) |
| 24 | DECOUPLE BOD | 4 | 4 |
| 25 | TempSensor | 0 | 2 |
| 26 | VGlitch Falling | 0 | 2 |
@@ -88,32 +69,63 @@ The example has been instrumented with code to count the number of clock cycles
| 30 | Digital glitch | 0 | 2 |
| 31 | SE ICACHE | 4 | 4 |
+## Tamper Sources (Other Series 2 Secure Vault High Devices)
-The disable tamper command simply reverts all masked tamper sources (`TAMPER_DISABLE_MASK` in `app_se_manager_tamper_disable.h`) to the hardcoded configuration (default levels in table above).
-
-
-The default value of `TAMPER_DISABLE_MASK` is `0x00fa0000` so PRS7, PRS6, PRS5, PRS4, PRS3, and PRS1 are restored to the default level 0 (Ignore) after running the disable tamper command.
-
+| Number | Name | Default level | User level in this example |
+| --- | --- | --- | --- |
+| 0 | Reserved | — | — |
+| 1 | Filter Counter | 0 | 1 |
+| 2 | SE Watchdog | 4 | 4 |
+| 3 | Reserved | — | — |
+| 4 | SE RAM ECC 2 | 4 | 4 |
+| 5 | SE Hardfault | 4 | 4 |
+| 6 | Reserved | — | — |
+| 7 | Software Assertion | 4 | 4 |
+| 8 | SE CodeAuth | 4 | 4 |
+| 9 | UserCodeAuth | 0 | 0 |
+| 10 | MailboxAuth | 0 | 1 |
+| 11 | DCIAuth | 0 | 0 |
+| 12 | OTP Read | 4 | 4 |
+| 13 | Reserved | — | — |
+| 14 | Self-test | 4 | 4 |
+| 15 | TRNG Monitor | 0 | 1 |
+| 16 | SecureLock | 4 | 4 |
+| 17 | DGlitch | 0 | 2 |
+| 18 | VGlitch | 0 | 2 |
+| 19 | SE ICACHE | 4 | 4 |
+| 20 | SE RAM ECC 1 | 0 | 1 |
+| 21 | BOD | 4 | 4 |
+| 22 | TempSensor | 0 | 2 |
+| 23 | DPLL Fall | 0 | 2 |
+| 24 | DPLL Rise | 0 | 2 |
+| 25 | PRS0 | 0 | 1 (PRS source: None) |
+| 26 | PRS1 | 0 | 1 (PRS source: Push button PB0) |
+| 27 | PRS2 | 0 | 2 (PRS source: Push button PB0) |
+| 28 | PRS3 | 0 | 2 (PRS source: None) |
+| 29 | PRS4 | 0 | 4 (PRS source: Push button PB1) |
+| 30 | PRS5 | 0 | 4 (PRS source: Software) |
+| 31 | PRS6 | 0 | 7 (PRS source: None) |
+
+The disable tamper command reverts all masked tamper sources (`TAMPER_DISABLE_MASK` in `app_se_manager_tamper_disable.h`) to the hardcoded configuration (default levels in tables above).
+
+For EFR32xG21B devices, the default value of `TAMPER_DISABLE_MASK` is `0x00fa0000`. It restores PRS7, PRS6, PRS5, PRS4, PRS3, and PRS1 to the default level 0 (Ignore) after running the disable tamper command.
+
+For other Series 2 Secure Vault High devices, the default value of `TAMPER_DISABLE_MASK` is `0xf2000000`. It restores PRS6, PRS5, PRS4, PRS3, and PRS0 to the default level 0 (Ignore) after running the disable tamper command.
## Tamper Settings
-
-
-
| Setting | User value in this example |
| --- | --- |
| Filter - trigger threshold | 4 |
| Filter - reset period | ~33 seconds |
-| Flags | Digital Glitch Detector Always On: Disabled |
+| Flag | Digital Glitch Detector Always On: Disabled |
+| Flag (not available on EFR32xG21B devices) | Keep Tamper Alive During Sleep: Disabled |
| Reset threshold | 5 |
-
## SE Manager API
-
The following SE Manager APIs are used in this example:
-
* `sl_se_init`
* `sl_se_deinit`
* `sl_se_init_command_context`
@@ -134,32 +146,25 @@ The following SE Manager APIs are used in this example:
* `sl_se_disable_tamper`
* `sl_se_roll_challenge`
-
## Getting Started
-
-1. Upgrade the kit’s firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
-2. Upgrade the device’s SE firmware to the latest version (see `Secure Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
-3. Open any terminal program and connect to the kit’s VCOM port (if using `Device Console` in Simplicity Studio 5, `Line terminator:` must be set to `None`).
-4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide, check `Platform()` checkbox to browse the platform examples).
-5. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in the Simplicity Studio 5 User's Guide).
+1. Upgrade the kit's firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in Simplicity Studio 5 Users Guide).
+2. Upgrade the device's SE firmware to the latest version (see `Secure Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in Simplicity Studio 5 Users Guide).
+3. Open any terminal program and connect to the kit's VCOM port (if using `Device Console` in Simplicity Studio 5, `Line terminator:` must be set to `None`).
+4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide).
+5. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in Simplicity Studio 5 Users Guide).
6. Run the example and follow the instructions shown on the console.
-
## Additional Information
-
1. The hard-coded private command key is an insecure method so the user should find a way to import the signed access certificate for tamper disable.
-2. The device should disconnect from the debugger when running this example.
-3. **Warning:** Loading the tamper configuration and a public command key into the SE are a **ONE-TIME-ONLY** process. Both of these assignment operations are irrevocable and persist for the life of the device.
-4. The default optimization level is `Optimize for debugging (-Og)` on Simplicity IDE and `None` on IAR Embedded Workbench.
-
+2. This example does not enable the secure boot when provisioning the tamper configuration in `app_se_manager_tamper.c`.
+3. The device should disconnect from the debugger when running this example.
+4. **Warning:** Loading the tamper configuration and a public command key into the SE are a **ONE-TIME-ONLY** process. Both of these assignment operations are irrevocable and persist for the life of the device.
+5. The default optimization level is `Optimize for debugging (-Og)` on Simplicity IDE and `None` on IAR Embedded Workbench.
## Resources
-
-[SE Manager API](https://docs.silabs.com/gecko-platform/latest/service/api/group-sl-se-manager)
+[SE Manager API](https://docs.silabs.com/gecko-platform/latest/service/api/group-sl-se-manager)
[AN1247: Anti-Tamper Protection Configuration and Use](https://www.silabs.com/documents/public/application-notes/an1247-efr32-secure-vault-tamper.pdf)
-
-
diff --git a/app/common/example/se_manager_user_data/readme.md b/app/common/example/se_manager_user_data/readme.md
index ce7c5c51bf..138a180af6 100644
--- a/app/common/example/se_manager_user_data/readme.md
+++ b/app/common/example/se_manager_user_data/readme.md
@@ -30,7 +30,7 @@ The following SE Manager APIs are used in this example:
1. Upgrade the kit’s firmware to the latest version (see `Adapter Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
2. Upgrade the device’s SE firmware to the latest version (see `Secure Firmware` under [General Device Information](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-about-the-launcher/welcome-and-device-tabs#general-device-information) in the Simplicity Studio 5 User's Guide).
3. Open any terminal program and connect to the kit’s VCOM port.
-4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide, check `Platform()` checkbox to browse the platform examples).
+4. Create this platform example project in the Simplicity IDE (see [Examples](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/start-a-project#examples) in the Simplicity Studio 5 User's Guide).
5. Build the example and download it to the kit (see [Simple Build](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/building#simple-build) and [Flash Programmer](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-building-and-flashing/flashing#flash-programmer) in the Simplicity Studio 5 User's Guide).
6. Run the example and the console should display the process steps of this example.
diff --git a/app/common/example/se_manager_user_data/se_manager_user_data.slcp b/app/common/example/se_manager_user_data/se_manager_user_data.slcp
index 0542a8a4cb..1e1485ac5a 100644
--- a/app/common/example/se_manager_user_data/se_manager_user_data.slcp
+++ b/app/common/example/se_manager_user_data/se_manager_user_data.slcp
@@ -40,6 +40,8 @@ component:
- id: printf
- id: iostream_retarget_stdio
- id: iostream_recommended_stream
+requires:
+ - name: device_sdid_200
configuration:
- name: SL_STATUS_STRING_ENABLE_BLUETOOTH
value: 0
diff --git a/app/common/example/tensorflow_model_profiler/tensorflow_model_profiler.slcp b/app/common/example/tensorflow_model_profiler/tensorflow_model_profiler.slcp
index 550f591dd3..3769b5e773 100644
--- a/app/common/example/tensorflow_model_profiler/tensorflow_model_profiler.slcp
+++ b/app/common/example/tensorflow_model_profiler/tensorflow_model_profiler.slcp
@@ -14,6 +14,8 @@ filter:
value: ["32-bit MCU"]
- name: "Project Difficulty"
value: ["Advanced"]
+ - name: "Capability"
+ value: ["Machine Learning"]
include:
- path: .
file_list:
diff --git a/app/common/example/voice_control_light/config/recognize_commands_config.h b/app/common/example/voice_control_light/config/recognize_commands_config.h
index bdd1a2700a..ac9fc00516 100644
--- a/app/common/example/voice_control_light/config/recognize_commands_config.h
+++ b/app/common/example/voice_control_light/config/recognize_commands_config.h
@@ -48,7 +48,7 @@
// Sets a time window to wait after a detected keyword before triggering
// a new detection.
// Default: 1000
-#define SUPPRESION_TIME_MS 750
+#define SUPPRESION_TIME_MS 1000
// <<< end of configuration section >>>
diff --git a/app/common/example/voice_control_light/keyword_detection_model.png b/app/common/example/voice_control_light/keyword_detection_model.png
deleted file mode 100644
index c056f61809..0000000000
--- a/app/common/example/voice_control_light/keyword_detection_model.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c5ce813c86697af4108a31d2f83b8d7156cf79e45b2b898929636be638c64430
-size 71475
diff --git a/app/common/example/voice_control_light/readme.md b/app/common/example/voice_control_light/readme.md
index 1f37b21a72..695d007ae5 100644
--- a/app/common/example/voice_control_light/readme.md
+++ b/app/common/example/voice_control_light/readme.md
@@ -1,5 +1,7 @@
# Voice Control Light
-This application uses TensorFlow Lite for Microcontrollers to detect the spoken words "on" and "off" from audio data recorded on the microphone. The detected keywords are used to control an LED on the board.
+This application uses TensorFlow Lite for Microcontrollers to detect the spoken
+words "on" and "off" from audio data recorded on the microphone. The detected
+keywords are used to control an LED on the board.
Audio is sampled continuously from the microphone at a rate of 8kHz. The
frequency components are then extracted by calculating the FFT on short segments
@@ -11,16 +13,22 @@ toggle accordingly and the keyword detection result is printed on VCOM.
The application is based on TensorFlow's example application, **[micro speech](https://github.com/tensorflow/tensorflow/tree/v2.3.1/tensorflow/lite/micro/examples/micro_speech)**.
-## Model
+## Model
+The application uses one of two different available models
+(```keyword_spotting_on_off.tflite``` or ```keyword_spotting_on_off_v2.tflite```)
+as the default model, depending on whether the application is generated for a
+development board featuring an MVP hardware accelerator or not. When an MVP
+hardware accelerator is featured on the board, inference will run at a faster
+speed such that a larger model can be chosen, yielding more accurate keyword
+detections.
+
The neural network model has been trained to identify the two keywords "on" and
"off" from preprocessed audio data. When neither words are recognized, the model
-will classify the input as either "unknown" or "background".
-
-The model takes an array of filterbanks as input and outputs a vector with each
-value corresponding to the probability that the input belongs to each of the
-categories ("on", "off", "unknown", "background"). The architecture of the model
-is visualized below using [Netron](https://github.com/lutzroeder/netron).
-
-![Voice Control Light Model Architecture](keyword_detection_model.png "Voice Control Light Model Architecture")
+will classify the input as either "unknown" or "background". The model takes an
+array of filterbanks as input and outputs a vector with each value corresponding
+to the probability that the input belongs to each of the
+categories.
-The source for the model can be found here: https://siliconlabs.github.io/mltk/docs/python_api/models.html#keyword-spotting-on-off
+Details about the model architectures and scripts for generating the models can
+be found in the [Silicon Labs machine learning applications](https://github.com/SiliconLabs/machine_learning_applications/tree/main/) repository, under
+```voice/keyword_spotting/model```.
\ No newline at end of file
diff --git a/app/common/example/voice_control_light/recognize_commands.cc b/app/common/example/voice_control_light/recognize_commands.cc
index 8458ad94b1..0b15370a61 100644
--- a/app/common/example/voice_control_light/recognize_commands.cc
+++ b/app/common/example/voice_control_light/recognize_commands.cc
@@ -24,7 +24,7 @@
// 1 - off
// 2 - unknown
// 3 - background
-const char* kCategoryLabels[kCategoryCount] = {
+const char* kCategoryLabels[kMaxCategoryCount] = {
"on",
"off",
"unknown",
@@ -51,89 +51,25 @@ TfLiteStatus RecognizeCommands::ProcessLatestResults(
const TfLiteTensor* latest_results, const int32_t current_time_ms,
uint8_t* found_command_index, uint8_t* score, bool* is_new_command)
{
- if ((latest_results->dims->size != 2)
- || (latest_results->dims->data[0] != 1)
- || (latest_results->dims->data[1] != kCategoryCount)) {
- TF_LITE_REPORT_ERROR(
- error_reporter_,
- "The results for recognition should contain %d elements, but there are "
- "%d in an %d-dimensional shape",
- kCategoryCount, latest_results->dims->data[1],
- latest_results->dims->size);
- return kTfLiteError;
- }
-
- if (latest_results->type != kTfLiteInt8) {
- TF_LITE_REPORT_ERROR(
- error_reporter_,
- "The results for recognition should be int8_t elements, but are %d",
- latest_results->type);
- return kTfLiteError;
- }
- if ((!previous_results_.empty())
- && (current_time_ms < previous_results_.front().time_)) {
- TF_LITE_REPORT_ERROR(
- error_reporter_,
- "Results must be fed in increasing time order, but received a "
- "timestamp of %d that was earlier than the previous one of %d",
- current_time_ms, previous_results_.front().time_);
- return kTfLiteError;
- }
-
- // Add the latest results to the head of the queue.
- previous_results_.push_back({current_time_ms, latest_results->data.int8});
-
- // Prune any earlier results that are too old for the averaging window.
- const int64_t time_limit = current_time_ms - average_window_duration_ms_;
- while ((!previous_results_.empty())
- && previous_results_.front().time_ < time_limit) {
- previous_results_.pop_front();
- }
+uint8_t category_count = latest_results->dims->data[1];
+int8_t current_top_index = 0;
+int32_t current_top_score = 0;
+uint8_t converted_scores[kMaxCategoryCount];
- // If there are too few results, assume the result will be unreliable and
- // bail.
- const int32_t how_many_results = previous_results_.size();
- if ((how_many_results < minimum_count_)) {
- *found_command_index = previous_top_label_index_;
- *score = 0;
- *is_new_command = false;
- /* Don't report non-error
- TF_LITE_REPORT_ERROR(
- error_reporter_,
- "The smoothing window contains less than %d inference result(s), a "
- "reliable keyword detection can not be made.",
- minimum_count_);
- */
- return kTfLiteOk;
- }
-
- // Calculate the average score across all the results in the window.
- int32_t average_scores[kCategoryCount];
- for (int offset = 0; offset < previous_results_.size(); ++offset) {
- // Iterates the amount of times to achieve average_window_duration
- PreviousResultsQueue::Result previous_result =
- previous_results_.from_front(offset);
- const int8_t* scores = previous_result.scores;
- for (int i = 0; i < kCategoryCount; ++i) {
- if (offset == 0) {
- average_scores[i] = scores[i] + 128;
- } else {
- average_scores[i] += scores[i] + 128;
- }
+// Convert the model output to uint8
+if (latest_results->type == kTfLiteInt8) {
+ for(int i = 0; i < category_count; ++i) {
+ converted_scores[i] = (uint8_t)(latest_results->data.int8[i] + 128);
}
+ } else {
+ TF_LITE_REPORT_ERROR(error_reporter_, "Unsupported output tensor data type, must be int8 or float32");
+ return kTfLiteError;
}
- for (int i = 0; i < kCategoryCount; ++i) {
- average_scores[i] /= how_many_results;
- }
-
- // Find the current highest scoring category.
- int8_t current_top_index = 0;
- int32_t current_top_score = 0;
- for (int i = 0; i < kCategoryCount; ++i) {
- if (average_scores[i] > current_top_score) {
- current_top_score = average_scores[i];
+ for (int i = 0; i < category_count; i++) {
+ if (converted_scores[i] > current_top_score) {
+ current_top_score = converted_scores[i];
current_top_index = i;
}
}
diff --git a/app/common/example/voice_control_light/recognize_commands.h b/app/common/example/voice_control_light/recognize_commands.h
index c80f1e1c15..60cfe4e4a9 100644
--- a/app/common/example/voice_control_light/recognize_commands.h
+++ b/app/common/example/voice_control_light/recognize_commands.h
@@ -23,8 +23,8 @@
#include "tensorflow/lite/c/common.h"
#include "tensorflow/lite/micro/micro_error_reporter.h"
-constexpr int kCategoryCount = 4;
-extern const char* kCategoryLabels[kCategoryCount];
+constexpr int kMaxCategoryCount = 4;
+extern const char* kCategoryLabels[kMaxCategoryCount];
// Partial implementation of std::dequeue, just providing the functionality
// that's needed to keep a record of previous neural network results over a
@@ -44,12 +44,12 @@ class PreviousResultsQueue {
Result() : time_(0), scores() {
}
Result(int32_t time, int8_t * input_scores) : time_(time) {
- for (int i = 0; i < kCategoryCount; ++i) {
+ for (int i = 0; i < kMaxCategoryCount; ++i) {
scores[i] = input_scores[i];
}
}
int32_t time_;
- int8_t scores[kCategoryCount];
+ int8_t scores[kMaxCategoryCount];
};
int size()
diff --git a/app/common/example/audio_classifier/config/tflite/audio_classifier.tflite b/app/common/example/voice_control_light/tflite_models/tflite/keyword_spotting_on_off.tflite
similarity index 100%
rename from app/common/example/audio_classifier/config/tflite/audio_classifier.tflite
rename to app/common/example/voice_control_light/tflite_models/tflite/keyword_spotting_on_off.tflite
diff --git a/app/common/example/voice_control_light/tflite_models/tflite/keyword_spotting_on_off_v2.tflite b/app/common/example/voice_control_light/tflite_models/tflite/keyword_spotting_on_off_v2.tflite
new file mode 100644
index 0000000000..8f926c576b
Binary files /dev/null and b/app/common/example/voice_control_light/tflite_models/tflite/keyword_spotting_on_off_v2.tflite differ
diff --git a/app/common/example/voice_control_light/voice_control_light.cc b/app/common/example/voice_control_light/voice_control_light.cc
index 356360c986..fabbde4fd3 100644
--- a/app/common/example/voice_control_light/voice_control_light.cc
+++ b/app/common/example/voice_control_light/voice_control_light.cc
@@ -104,7 +104,7 @@ static sl_status_t process_output(){
if (process_status != kTfLiteOk) {
return SL_STATUS_FAIL;
- }
+ }
if (is_new_command) {
// Print heard command
diff --git a/app/common/example/voice_control_light/voice_control_light.slcp b/app/common/example/voice_control_light/voice_control_light.slcp
index bf7afee65b..39d45a95f1 100644
--- a/app/common/example/voice_control_light/voice_control_light.slcp
+++ b/app/common/example/voice_control_light/voice_control_light.slcp
@@ -32,7 +32,7 @@ component:
- id: device_init
- id: tensorflow_lite_micro
- id: ml_audio_feature_generation
- - id: printf
+ - id: printf
- id: iostream_recommended_stream
- id: iostream_retarget_stdio
- id: simple_led
@@ -41,11 +41,16 @@ component:
- id: micriumos_kernel
- id: power_manager
- id: sleeptimer
-config_file:
+config_file:
- path: config/recognize_commands_config.h
- - path: "config/tflite/keyword_spotting_on_off.tflite"
+ - path: "tflite_models/tflite/keyword_spotting_on_off.tflite"
file_id: flatbuffer_file_id
directory: "tflite"
+ unless: [tensorflow_lite_micro_accelerated_kernels]
+ - path: "tflite_models/tflite/keyword_spotting_on_off_v2.tflite"
+ file_id: flatbuffer_file_id
+ directory: "tflite"
+ condition: [tensorflow_lite_micro_accelerated_kernels]
define:
- name: DEBUG_EFM
- name: TF_LITE_STATIC_MEMORY
@@ -62,10 +67,8 @@ configuration:
condition: [iostream_uart]
- name: SL_ML_AUDIO_FEATURE_GENERATION_AUDIO_BUFFER_SIZE
value: "4096"
- - name: SL_ML_AUDIO_FEATURE_GENERATION_AUDIO_GAIN
- value: "2"
- - name: SL_TFLITE_MICRO_ARENA_SIZE
- value: "7000"
+ - name: SL_TFLITE_MICRO_ARENA_SIZE
+ value: "50000"
- name: SL_HEAP_SIZE
value: "0x2000"
toolchain_settings:
@@ -73,8 +76,6 @@ toolchain_settings:
value: "-Wno-unused-parameter"
- option: gcc_compiler_option
value: "-Wno-missing-field-initializers"
-other_file:
- - path: keyword_detection_model.png
readme:
- path: readme.md
ui_hints:
diff --git a/app/common/platform_production_demos.xml b/app/common/platform_production_demos.xml
index 768c59a316..e10919535e 100644
--- a/app/common/platform_production_demos.xml
+++ b/app/common/platform_production_demos.xml
@@ -1,1455 +1,1466 @@
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
+
+
+ This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
+
+
+ This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
- This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
-
-
-
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates use of the Memory Liquid Crystal Display (LCD) module in a baremetal application, using Silicon Labs Graphics Library (glib).
+
+
+
+
+
+
+
diff --git a/app/common/platform_production_templates.xml b/app/common/platform_production_templates.xml
index 824ddbd701..171df6f5a5 100644
--- a/app/common/platform_production_templates.xml
+++ b/app/common/platform_production_templates.xml
@@ -3,11 +3,12 @@
+
-
+
@@ -17,11 +18,12 @@
+
-
-
-
+
+
+
@@ -31,11 +33,12 @@
+
-
-
-
+
+
+
@@ -45,11 +48,12 @@
+
-
-
-
+
+
+
@@ -59,11 +63,12 @@
+
-
-
-
+
+
+
@@ -73,11 +78,12 @@
+
-
+
-
+
@@ -87,11 +93,12 @@
+
-
+
-
+
@@ -101,11 +108,12 @@
+
-
+
-
+
@@ -115,11 +123,12 @@
+
-
+
@@ -129,11 +138,12 @@
+
-
-
-
+
+
+
@@ -143,51 +153,57 @@
+
-
-
-
+
+
+
+
+
-
-
-
+
+
+
-
+
+
-
-
-
+
+
+
+
+
-
+
@@ -197,11 +213,12 @@
+
-
-
-
+
+
+
@@ -211,11 +228,12 @@
+
-
+
-
+
@@ -225,11 +243,12 @@
+
-
+
-
+
@@ -239,11 +258,12 @@
+
-
+
-
+
@@ -253,11 +273,12 @@
+
-
+
-
+
@@ -267,11 +288,12 @@
+
-
-
-
+
+
+
@@ -281,11 +303,12 @@
+
-
-
-
+
+
+
@@ -295,11 +318,12 @@
+
-
-
-
+
+
+
@@ -309,11 +333,12 @@
+
-
-
-
+
+
+
@@ -323,11 +348,12 @@
+
-
-
-
+
+
+
@@ -337,11 +363,12 @@
+
-
-
-
+
+
+
@@ -351,11 +378,12 @@
+
-
-
-
+
+
+
@@ -365,11 +393,12 @@
+
-
-
-
+
+
+
@@ -379,11 +408,12 @@
+
-
-
-
+
+
+
@@ -393,11 +423,12 @@
+
-
-
-
+
+
+
@@ -407,11 +438,12 @@
+
-
+
-
+
@@ -421,11 +453,12 @@
+
-
-
-
+
+
+
@@ -435,11 +468,12 @@
+
-
-
-
+
+
+
@@ -449,11 +483,12 @@
+
-
-
-
+
+
+
@@ -463,11 +498,12 @@
+
-
-
-
+
+
+
@@ -477,11 +513,12 @@
+
-
-
-
+
+
+
@@ -491,11 +528,12 @@
+
-
-
-
+
+
+
@@ -505,11 +543,12 @@
+
-
-
-
+
+
+
@@ -519,11 +558,12 @@
+
-
-
-
+
+
+
@@ -533,11 +573,12 @@
+
-
-
-
+
+
+
@@ -547,11 +588,12 @@
+
-
-
-
+
+
+
@@ -561,11 +603,12 @@
+
-
-
-
+
+
+
@@ -575,11 +618,12 @@
+
-
-
-
+
+
+
@@ -589,11 +633,12 @@
+
-
-
-
+
+
+
@@ -603,11 +648,12 @@
+
-
-
-
+
+
+
@@ -617,11 +663,12 @@
+
-
-
-
+
+
+
@@ -631,11 +678,12 @@
+
-
+
-
+
@@ -645,11 +693,12 @@
+
-
+
-
+
@@ -659,11 +708,12 @@
+
-
+
-
+
@@ -673,11 +723,12 @@
+
-
+
-
+
@@ -687,11 +738,12 @@
+
-
+
-
+
@@ -701,11 +753,12 @@
+
-
+
-
+
@@ -715,11 +768,12 @@
+
-
+
@@ -729,11 +783,12 @@
+
-
+
-
+
@@ -743,11 +798,12 @@
+
-
+
-
+
@@ -757,11 +813,12 @@
+
-
+
-
+
@@ -771,11 +828,12 @@
+
-
+
-
+
@@ -785,11 +843,12 @@
+
-
+
-
+
@@ -799,11 +858,12 @@
+
-
+
-
+
@@ -813,11 +873,12 @@
+
-
+
-
+
@@ -827,11 +888,12 @@
+
-
+
-
+
@@ -841,11 +903,12 @@
+
-
+
-
+
@@ -855,11 +918,12 @@
+
-
-
-
+
+
+
@@ -869,11 +933,12 @@
+
-
-
-
+
+
+
@@ -883,11 +948,12 @@
+
-
-
-
+
+
+
@@ -897,11 +963,12 @@
+
-
-
-
+
+
+
@@ -911,11 +978,12 @@
+
-
-
-
+
+
+
@@ -925,11 +993,12 @@
+
-
+
-
+
@@ -939,11 +1008,12 @@
+
-
+
-
+
@@ -953,11 +1023,12 @@
+
-
+
-
+
@@ -967,11 +1038,12 @@
+
-
+
-
+
@@ -981,11 +1053,12 @@
+
-
-
-
+
+
+
@@ -995,11 +1068,12 @@
+
-
-
-
+
+
+
@@ -1009,11 +1083,12 @@
+
-
-
-
+
+
+
@@ -1023,11 +1098,12 @@
+
-
-
-
+
+
+
@@ -1037,11 +1113,12 @@
+
-
-
-
+
+
+
@@ -1051,25 +1128,27 @@
+
-
+
-
+
-
+
+
-
+
-
+
@@ -1079,11 +1158,12 @@
+
-
+
@@ -1093,11 +1173,12 @@
+
-
+
@@ -1107,11 +1188,12 @@
+
-
+
@@ -1121,11 +1203,12 @@
+
-
+
@@ -1135,11 +1218,12 @@
+
-
+
@@ -1149,11 +1233,12 @@
+
-
+
@@ -1163,11 +1248,12 @@
+
-
+
@@ -1177,11 +1263,12 @@
+
-
+
@@ -1191,11 +1278,12 @@
+
-
+
@@ -1205,11 +1293,12 @@
+
-
+
@@ -1219,11 +1308,12 @@
+
-
+
@@ -1233,11 +1323,12 @@
+
-
+
diff --git a/app/flex/component/connect/sl_connect_sdk_ota_broadcast_bootloader_test/sl_connect_sdk_ota_broadcast_bootloader_test.c b/app/flex/component/connect/sl_connect_sdk_ota_broadcast_bootloader_test/sl_connect_sdk_ota_broadcast_bootloader_test.c
index a99dc2be3c..ed029fc613 100644
--- a/app/flex/component/connect/sl_connect_sdk_ota_broadcast_bootloader_test/sl_connect_sdk_ota_broadcast_bootloader_test.c
+++ b/app/flex/component/connect/sl_connect_sdk_ota_broadcast_bootloader_test/sl_connect_sdk_ota_broadcast_bootloader_test.c
@@ -179,6 +179,8 @@ bool emberAfPluginOtaBootloaderClientNewIncomingImageCallback(EmberNodeId server
EmberNodeId *alternateServerId,
uint8_t imageTag)
{
+ (void)alternateServerId;
+ (void)serverId;
// The client shall accept images with matching tag
bool accept = (imageTag == ota_bootloader_test_image_tag);
@@ -200,6 +202,7 @@ void emberAfPluginOtaBootloaderClientIncomingImageSegmentCallback(EmberNodeId se
uint8_t imageTag,
uint8_t *imageSegment)
{
+ (void)serverId;
app_log_info("(client): incoming segment, start: %d, end: %d, tag: 0x%x\n",
startIndex, endIndex, imageTag);
@@ -253,6 +256,7 @@ bool emberAfPluginOtaBootloaderClientIncomingRequestBootloadCallback(EmberNodeId
uint32_t bootloadDelayMs,
uint8_t *applicationStatus)
{
+ (void)serverId;
// The client shall bootload an image with matching tag.
if (applicationStatus == NULL) {
diff --git a/app/flex/component/connect/sl_connect_sdk_ota_unicast_bootloader_test/sl_connect_sdk_ota_unicast_bootloader_test.c b/app/flex/component/connect/sl_connect_sdk_ota_unicast_bootloader_test/sl_connect_sdk_ota_unicast_bootloader_test.c
index 255ddb66ed..cfccea4a0b 100644
--- a/app/flex/component/connect/sl_connect_sdk_ota_unicast_bootloader_test/sl_connect_sdk_ota_unicast_bootloader_test.c
+++ b/app/flex/component/connect/sl_connect_sdk_ota_unicast_bootloader_test/sl_connect_sdk_ota_unicast_bootloader_test.c
@@ -57,10 +57,12 @@ EmberEventControl emAfPluginOtaUnicastBootloaderTestEventControl;
// -----------------------------------------------------------------------------
/// Node ID of the target
static EmberNodeId target;
+#if defined(SL_CATALOG_CONNECT_OTA_UNICAST_BOOTLOADER_CLIENT_PRESENT)
/// Enable resuming an image after the timeout period.
static bool ota_resume_enable = true;
/// the image index to start/resume the download
static uint32_t unicast_download_start_index = 0;
+#endif
// -----------------------------------------------------------------------------
// Public Function Definitions
diff --git a/app/flex/documentation/release-highlights.txt b/app/flex/documentation/release-highlights.txt
index eae31ee6e7..c0ecdf9d72 100644
--- a/app/flex/documentation/release-highlights.txt
+++ b/app/flex/documentation/release-highlights.txt
@@ -1,7 +1,3 @@
-Flex SDK 3.4.0.0
-- EFR32xG24 GA with Antenna Diversity support
-- FGM230S proprietary module GA
-- Secure Vault integration to Connect stack
-- BGM220 Range Test + DMP pre-compiled demo with EFR Connect Mobile Application
-
+Flex SDK 3.4.1.0
+- RAIL Library: Targeted quality improvements and bug fixes
diff --git a/app/flex/documentation/slFlex_docContent.xml b/app/flex/documentation/slFlex_docContent.xml
index 541b3ca46a..e5f02373d1 100644
--- a/app/flex/documentation/slFlex_docContent.xml
+++ b/app/flex/documentation/slFlex_docContent.xml
@@ -1,339 +1,339 @@
-
-
+
+
+ Includes detailed information on using the Silicon Labs Gecko Bootloader with Connect. It supplements the general Gecko Bootloader implementation information provided in UG489: Silicon Labs Gecko Bootloader User's Guide.
- Includes detailed information on using the Silicon Labs Gecko Bootloader with Connect. It supplements the general Gecko Bootloader implementation information provided in UG489: Silicon Labs Gecko Bootloader User's Guide.
-
+
+ Describes using the Flex SDK for Wireless M-Bus development on EFR32 Wireless Geckos. Includes features and limitations as well as examples.
- Describes using the Flex SDK for Wireless M-Bus development on EFR32 Wireless Geckos. Includes features and limitations as well as examples.
-
+
+ Outlines how to account for the variation in output characteristics across custom boards and applications for the Silicon Labs EFR32 family of chips.
- Outlines how to account for the variation in output characteristics across custom boards and applications for the Silicon Labs EFR32 family of chips.
-
+
+ Explains how NVM3 can be used as non-volatile data storage in various protocol implementations.
- Explains how NVM3 can be used as non-volatile data storage in various protocol implementations.
-
+
+ Describes tokens and shows how to use them for non-volatile data storage in EmberZNet PRO and Silicon Labs Flex applications.
- Describes tokens and shows how to use them for non-volatile data storage in EmberZNet PRO and Silicon Labs Flex applications.
-
+
+ Describes how to lock and unlock the debug access of EFR32 Gecko Series 2 devices. Many aspects of the debug access, including the secure debug unlock are described. The Debug Challenge Interface (DCI) and Secure Engine (SE) Mailbox Interface for locking and unlocking debug access are also included.
- Describes how to lock and unlock the debug access of EFR32 Gecko Series 2 devices. Many aspects of the debug access, including the secure debug unlock are described. The Debug Challenge Interface (DCI) and Secure Engine (SE) Mailbox Interface for locking and unlocking debug access are also included.
-
+
+ Contains detailed information on configuring and using the Secure Boot with hardware Root of Trust and Secure Loader on Series 2 devices, including how to provision the signing key. This is a companion document to UG489: Silicon Labs Gecko Bootloader User's Guide.
- Contains detailed information on configuring and using the Secure Boot with hardware Root of Trust and Secure Loader on Series 2 devices, including how to provision the signing key. This is a companion document to UG489: Silicon Labs Gecko Bootloader User's Guide.
-
+
+ Details on programming, provisioning, and configuring Series 2 devices in production environments. Covers Secure Engine Subsystem of Series 2 devices, which runs easily upgradeable Secure Engine (SE) or Virtual Secure Engine (VSE) firmware.
- Details on programming, provisioning, and configuring Series 2 devices in production environments. Covers Secure Engine Subsystem of Series 2 devices, which runs easily upgradeable Secure Engine (SE) or Virtual Secure Engine (VSE) firmware.
-
+
+ Describes the distinguishing features of different EFR32 families that are most relevant to porting proprietary wireless applications between them. Provides insight that is also helpful when selecting an initial target platform for proprietary wireless solutions.
- Describes the distinguishing features of different EFR32 families that are most relevant to porting proprietary wireless applications between them. Provides insight that is also helpful when selecting an initial target platform for proprietary wireless solutions.
-
+
+ How to program, provision, and configure the anti-tamper module on EFR32 Series 2 devices with Secure Vault.
- How to program, provision, and configure the anti-tamper module on EFR32 Series 2 devices with Secure Vault.
-
+
+ Illustrates reducing power consumption in a Connect v3.x application using the sensor example.
- Illustrates reducing power consumption in a Connect v3.x application using the sensor example.
-
+
+ Describes the radio configurator GUI for RAIL framework applications in Simplicity Studio 5. With it, you can create standard or custom radio configurations on which to run your RAIL-based applications. The role of each GUI item is explained.
- Describes the radio configurator GUI for RAIL framework applications in Simplicity Studio 5. With it, you can create standard or custom radio configurations on which to run your RAIL-based applications. The role of each GUI item is explained.
-
+
+ How to authenticate an EFR32 Series 2 device with Secure Vault, using secure device certificates and signatures.
- How to authenticate an EFR32 Series 2 device with Secure Vault, using secure device certificates and signatures.
-
+
+ How to securely "wrap" keys in EFR32 Series 2 devices with Secure Vault, so they can be stored in non-volatile storage.
- How to securely "wrap" keys in EFR32 Series 2 devices with Secure Vault, so they can be stored in non-volatile storage.
-
+
+ Describes how to provision and configure Series 2 devices through the DCI and SWD.
- Describes how to provision and configure Series 2 devices through the DCI and SWD.
-
+
+ Describes how to integrate crypto functionality into applications using PSA Crypto compared to Mbed TLS.
- Describes how to integrate crypto functionality into applications using PSA Crypto compared to Mbed TLS.
-
+
+ Gecko Bootloader v2.x, introduced in GSDK 4.0, contains a number of changes compared to Gecko Bootloader v1.x. This document describes the differences between the versions, including how to configure the new Gecko Bootloader in Simplicity Studio 5.
- Gecko Bootloader v2.x, introduced in GSDK 4.0, contains a number of changes compared to Gecko Bootloader v1.x. This document describes the differences between the versions, including how to configure the new Gecko Bootloader in Simplicity Studio 5.
-
+
+ Describes how to initialize a piece of custom hardware (a 'device') based on the EFR32MG and EFR32FG families so that it interfaces correctly with a network stack. The same procedures can be used to restore devices whose settings have been corrupted or erased.
- Describes how to initialize a piece of custom hardware (a 'device') based on the EFR32MG and EFR32FG families so that it interfaces correctly with a network stack. The same procedures can be used to restore devices whose settings have been corrupted or erased.
-
+
+ Describes using RAILTest to evaluate radio functionality, as well as peripherals, deep sleep states, etc. With it you can fully evaluate the receiving and transmitting performance and test RF functionality of development kit hardware or custom hardware.
- Describes using RAILTest to evaluate radio functionality, as well as peripherals, deep sleep states, etc. With it you can fully evaluate the receiving and transmitting performance and test RF functionality of development kit hardware or custom hardware.
-
+
+ Provides an overview and hyperlinks to all packaged documentation.
- Provides an overview and hyperlinks to all packaged documentation.
-
+
+ Provides basic information on configuring, building, and installing applications using Silicon Labs Connect and RAIL, the two development paths in the Silicon Labs Proprietary Flex SDK v3.x.
- Provides basic information on configuring, building, and installing applications using Silicon Labs Connect and RAIL, the two development paths in the Silicon Labs Proprietary Flex SDK v3.x.
-
+
+ Contains a comprehensive list of APIs used to interface to the Silicon Labs Connect stack.
- Contains a comprehensive list of APIs used to interface to the Silicon Labs Connect stack.
-
+
+ Contains a comprehensive list of APIs used to interface to the Silicon Labs RAIL library.
- Contains a comprehensive list of APIs used to interface to the Silicon Labs RAIL library.
-
+
+ Lists compatibility requirements and sources for all software components in the development environment. Discusses the latest changes to the SiliconLabs Flex SDK, including added/deleted/deprecated features/API. Reviews fixed and known issues.
- Lists compatibility requirements and sources for all software components in the development environment. Discusses the latest changes to the SiliconLabs Flex SDK, including added/deleted/deprecated features/API. Reviews fixed and known issues.
-
+
+ A detailed overview of the changes, additions, and fixes in the Gecko Platform components. The Gecko Platform includes EMLIB, EMDRV, RAIL Library, NVM3, and the component-based infrastructure.
- A detailed overview of the changes, additions, and fixes in the Gecko Platform components. The Gecko Platform includes EMLIB, EMDRV, RAIL Library, NVM3, and the component-based infrastructure.
-
+
+ Introduces some fundamental concepts of wireless networking. These concepts are referred to in other Fundamentals documents. If you are new to wireless networking, you should read this document first.
- Introduces some fundamental concepts of wireless networking. These concepts are referred to in other Fundamentals documents. If you are new to wireless networking, you should read this document first.
-
+
+ Introduces the security concepts that must be considered when implementing an Internet of Things (IoT) system. Using the ioXt Alliance's eight security principles as a structure, it clearly delineates the solutions Silicon Labs provides to support endpoint security and what you must do outside of the Silicon Labs framework.
- Introduces the security concepts that must be considered when implementing an Internet of Things (IoT) system. Using the ioXt Alliance's eight security principles as a structure, it clearly delineates the solutions Silicon Labs provides to support endpoint security and what you must do outside of the Silicon Labs framework.
-
+
+ Introduces bootloading for Silicon Labs networking devices. Discusses the Gecko Bootloader as well as legacy Ember and Bluetooth bootloaders, and describes the file formats used by each.
- Introduces bootloading for Silicon Labs networking devices. Discusses the Gecko Bootloader as well as legacy Ember and Bluetooth bootloaders, and describes the file formats used by each.
-
+
+ Introduces non-volatile data storage using flash and the three different storage implementations offered for Silicon Labs microcontrollers and SoCs: Simulated EEPROM, PS Store, and NVM3.
- Introduces non-volatile data storage using flash and the three different storage implementations offered for Silicon Labs microcontrollers and SoCs: Simulated EEPROM, PS Store, and NVM3.
-
+
+ Describes the features and functions of the Silicon Labs Connect stack, including its device types, network topologies, and its 'building block' development methodology using plugins.
- Describes the features and functions of the Silicon Labs Connect stack, including its device types, network topologies, and its 'building block' development methodology using plugins.
-
+
+ Describes the features and functions of Silicon Labs RAIL (Radio Abstraction Interface Layer). RAIL provides an intuitive, easily-customizable radio interface layer that is designed to support proprietary or standards-based wireless protocols.
- Describes the features and functions of Silicon Labs RAIL (Radio Abstraction Interface Layer). RAIL provides an intuitive, easily-customizable radio interface layer that is designed to support proprietary or standards-based wireless protocols.
-
+
+ Describes the four multiprotocol modes, discusses considerations when selecting protocols for multiprotocol implementations, and reviews the Radio Scheduler, a required component of a dynamic multiprotocol solution.
- Describes the four multiprotocol modes, discusses considerations when selecting protocols for multiprotocol implementations, and reviews the Radio Scheduler, a required component of a dynamic multiprotocol solution.
-
+
+ Describes how and when to use Simplicity Commander's Command-Line Interface.
- Describes how and when to use Simplicity Commander's Command-Line Interface.
-
+
+ Describes how to implement a dynamic multiprotocol solution.
- Describes how to implement a dynamic multiprotocol solution.
-
+
+ Describes the functionality available in the RAILtest application.
- Describes the functionality available in the RAILtest application.
-
+
+ Introduces the Connect User's Guide for the Flex SDK v3.x.
- Introduces the Connect User's Guide for the Flex SDK v3.x.
-
+
+ Introduces the IEEE 802.15.4 standard on which Connect v3.x is based.
- Introduces the IEEE 802.15.4 standard on which Connect v3.x is based.
-
+
+ Describes the architecture of the Silicon Labs Connect stack v3.x an how it implements IEEE 802.15.4.
- Describes the architecture of the Silicon Labs Connect stack v3.x an how it implements IEEE 802.15.4.
-
+
+ Describes how to use components, callbacks, and events on top of the Gecko Platform application framework to configure features and application behavior.
- Describes how to use components, callbacks, and events on top of the Gecko Platform application framework to configure features and application behavior.
-
+
+ Describes the process to implement a Connect-based application on top of one of the supported Real Time Operating Systems (RTOS).
- Describes the process to implement a Connect-based application on top of one of the supported Real Time Operating Systems (RTOS).
-
+
+ Explains standalone (serial) and application (OTA) bootloader options available for use within Connect v3.x -based applications
- Explains standalone (serial) and application (OTA) bootloader options available for use within Connect v3.x -based applications
-
+
+ Describes the features available in Connect v3.x to reduce power consumption. Using those features is described in AN1252: Building Low Power Networks with the Silicon Labs Connect Stack v3.x.
- Describes the features available in Connect v3.x to reduce power consumption. Using those features is described in AN1252: Building Low Power Networks with the Silicon Labs Connect Stack v3.x.
-
+
+ Introduces the long-range radio profile, escribes its development, and examines underlying details that enable it to realize extended range. Instructions for using example applications are included.
- Introduces the long-range radio profile, escribes its development, and examines underlying details that enable it to realize extended range. Instructions for using example applications are included.
-
+
+ Provides an easy way to evaluate the link budget of the Wireless Gecko EFR32 devices using Silicon Labs RAIL (RAIL) by performing a range test between two nodes using Range Test, a standalone test application. The range test demo implements Packet Error Rate (PER) measurement.
- Provides an easy way to evaluate the link budget of the Wireless Gecko EFR32 devices using Silicon Labs RAIL (RAIL) by performing a range test between two nodes using Range Test, a standalone test application. The range test demo implements Packet Error Rate (PER) measurement.
-
+
+ Describes the high-level implementation of the Silicon Labs Gecko Bootloader for EFR32 SoCs and NCPs, and provides information on how to get started using the Gecko Bootloader with Silicon Labs wireless protocol stacks in GSDK 4.0 and higher.
- Describes the high-level implementation of the Silicon Labs Gecko Bootloader for EFR32 SoCs and NCPs, and provides information on how to get started using the Gecko Bootloader with Silicon Labs wireless protocol stacks in GSDK 4.0 and higher.
diff --git a/app/flex/esf.properties b/app/flex/esf.properties
index 3e1136bd7d..635483dc02 100644
--- a/app/flex/esf.properties
+++ b/app/flex/esf.properties
@@ -3,8 +3,8 @@ id=com.silabs.stack.flex
label=Flex SDK
description=Flex Software Development Kit
-version=3.4.0.0
-prop.subLabel=Flex\\ 3.4.0.0
+version=3.4.1.0
+prop.subLabel=Flex\\ 3.4.1.0
# General properties are prepended with "prop."
prop.file.templatesFile=flex_production_templates.xml flex_demos_only_templates.xml flex_internal_templates.xml
diff --git a/app/flex/example/connect/connect_soc_direct_mode_device/hw_filter_tags.yaml b/app/flex/example/connect/connect_soc_direct_mode_device/hw_filter_tags.yaml
index 086219161d..8334bd52cf 100644
--- a/app/flex/example/connect/connect_soc_direct_mode_device/hw_filter_tags.yaml
+++ b/app/flex/example/connect/connect_soc_direct_mode_device/hw_filter_tags.yaml
@@ -4,7 +4,7 @@ tag:
- hardware:
device:
memory:
- flash: 208
+ flash: 207
ram: 25
board:
rf_bands:
diff --git a/app/flex/example/connect/connect_soc_ecdh_key_exchange/hw_filter_tags.yaml b/app/flex/example/connect/connect_soc_ecdh_key_exchange/hw_filter_tags.yaml
index 738983fa71..15c32af76c 100644
--- a/app/flex/example/connect/connect_soc_ecdh_key_exchange/hw_filter_tags.yaml
+++ b/app/flex/example/connect/connect_soc_ecdh_key_exchange/hw_filter_tags.yaml
@@ -4,8 +4,8 @@ tag:
- hardware:
device:
memory:
- flash: 226
- ram: 24
+ flash: 225
+ ram: 29
board:
rf_bands:
- any
diff --git a/app/flex/example/connect/connect_soc_mac_mode_device/hw_filter_tags.yaml b/app/flex/example/connect/connect_soc_mac_mode_device/hw_filter_tags.yaml
index f8bfe9d4d5..bf189ffac2 100644
--- a/app/flex/example/connect/connect_soc_mac_mode_device/hw_filter_tags.yaml
+++ b/app/flex/example/connect/connect_soc_mac_mode_device/hw_filter_tags.yaml
@@ -4,7 +4,7 @@ tag:
- hardware:
device:
memory:
- flash: 213
+ flash: 212
ram: 25
board:
rf_bands:
diff --git a/app/flex/example/connect/light_switch/connect_soc_switch/app_process.c b/app/flex/example/connect/light_switch/connect_soc_switch/app_process.c
index 624ef767b1..28acc829c7 100644
--- a/app/flex/example/connect/light_switch/connect_soc_switch/app_process.c
+++ b/app/flex/example/connect/light_switch/connect_soc_switch/app_process.c
@@ -106,7 +106,7 @@ psa_key_id_t security_key_id = 0;
// Static Variables
// -----------------------------------------------------------------------------
/// Destination of the currently processed sink node
-static EmberNodeId light_node_id = EMBER_NULL_NODE_ID;
+static EmberNodeId light_node_id = EMBER_COORDINATOR_ADDRESS;
/// Store the Connect's status
static EmberStatus stack_status;
@@ -381,6 +381,6 @@ static void toggle_light()
tx_options);
if (status == EMBER_SUCCESS) {
- app_log_info("TX: Data to 0x%04X: \n", light_node_id);
+ app_log_info("TX: Data to 0x%04X:\n", light_node_id);
}
}
diff --git a/app/flex/example/connect/light_switch/connect_soc_switch/hw_filter_tags.yaml b/app/flex/example/connect/light_switch/connect_soc_switch/hw_filter_tags.yaml
index 663bf0cac9..e849a43b80 100644
--- a/app/flex/example/connect/light_switch/connect_soc_switch/hw_filter_tags.yaml
+++ b/app/flex/example/connect/light_switch/connect_soc_switch/hw_filter_tags.yaml
@@ -4,7 +4,7 @@ tag:
- hardware:
device:
memory:
- flash: 211
+ flash: 210
ram: 26
board:
rf_bands:
diff --git a/app/flex/example/connect/sensor_sink/connect_soc_sensor/hw_filter_tags.yaml b/app/flex/example/connect/sensor_sink/connect_soc_sensor/hw_filter_tags.yaml
index ccaa7d31d4..2d43448587 100644
--- a/app/flex/example/connect/sensor_sink/connect_soc_sensor/hw_filter_tags.yaml
+++ b/app/flex/example/connect/sensor_sink/connect_soc_sensor/hw_filter_tags.yaml
@@ -4,7 +4,7 @@ tag:
- hardware:
device:
memory:
- flash: 219
+ flash: 218
ram: 26
board:
rf_bands:
diff --git a/app/flex/example/connect/sensor_sink/connect_soc_sink/hw_filter_tags.yaml b/app/flex/example/connect/sensor_sink/connect_soc_sink/hw_filter_tags.yaml
index 286f4ba708..44a3db9a61 100644
--- a/app/flex/example/connect/sensor_sink/connect_soc_sink/hw_filter_tags.yaml
+++ b/app/flex/example/connect/sensor_sink/connect_soc_sink/hw_filter_tags.yaml
@@ -4,7 +4,7 @@ tag:
- hardware:
device:
memory:
- flash: 213
+ flash: 212
ram: 25
board:
rf_bands:
diff --git a/app/flex/example/rail/rail_soc_railtest/rail_soc_railtest.slcp b/app/flex/example/rail/rail_soc_railtest/rail_soc_railtest.slcp
index b7da797f2e..6d484f1ed5 100644
--- a/app/flex/example/rail/rail_soc_railtest/rail_soc_railtest.slcp
+++ b/app/flex/example/rail/rail_soc_railtest/rail_soc_railtest.slcp
@@ -311,8 +311,6 @@ configuration:
toolchain_settings:
- option: optimize
value: debug
- - option: gcc_compiler_option
- value: --no-builtin
ui_hints:
highlight:
diff --git a/app/flex/example/rail/rail_soc_simple_trx_auto_ack/hw_filter_tags.yaml b/app/flex/example/rail/rail_soc_simple_trx_auto_ack/hw_filter_tags.yaml
index 7357ae6109..d1bc72b198 100644
--- a/app/flex/example/rail/rail_soc_simple_trx_auto_ack/hw_filter_tags.yaml
+++ b/app/flex/example/rail/rail_soc_simple_trx_auto_ack/hw_filter_tags.yaml
@@ -4,7 +4,7 @@ tag:
- hardware:
device:
memory:
- flash: 102
+ flash: 101
ram: 9
board:
rf_bands:
diff --git a/app/flex/flex_demos_only_demos.xml b/app/flex/flex_demos_only_demos.xml
index c62b274e84..6d503f36e5 100644
--- a/app/flex/flex_demos_only_demos.xml
+++ b/app/flex/flex_demos_only_demos.xml
@@ -1,23 +1,23 @@
-
-
-
-
-
-
-
Range Test BLE and IEEE802.15.4 with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This application demonstrates over the air range of the Silicon Labs boards. 5 predefined PHYs can be used for this: BLE: 125kbps, BLE: 500kbps, BLE: 1Mbps, BLE: 2Mbps, IEEE80215.4: 250kbps. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length defined by the PHY and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given predefined PHY and inspects the packets received. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. Radio related events can be logged on UART on demand. CLI can be used to set and get configuration of the app, and to start and stop it. To get started with CLI please send 'help' with a terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test BLE and IEEE802.15.4 with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This application demonstrates over the air range of the Silicon Labs boards. 5 predefined PHYs can be used for this: BLE: 125kbps, BLE: 500kbps, BLE: 1Mbps, BLE: 2Mbps, IEEE80215.4: 250kbps. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length defined by the PHY and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given predefined PHY and inspects the packets received. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. Radio related events can be logged on UART on demand. CLI can be used to set and get configuration of the app, and to start and stop it. To get started with CLI please send 'help' with a terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
diff --git a/app/flex/flex_production_demos.xml b/app/flex/flex_production_demos.xml
index 104fc618da..5ba24e9528 100644
--- a/app/flex/flex_production_demos.xml
+++ b/app/flex/flex_production_demos.xml
@@ -1,484 +1,484 @@
-
-
-
-
-
-
-
This is a customizable Range Test Sample Application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This is a customizable Range Test Sample Application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This is a customizable Range Test Sample Application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This is a customizable Range Test Sample Application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This is a customizable Range Test Sample Application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This is a customizable Range Test Sample Application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This is a customizable Range Test Sample Application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This is a customizable Range Test Sample Application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This is a customizable Range Test Sample Application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This is a customizable Range Test Sample Application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This is a customizable Range Test Sample Application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
The purpose of the application is to demonstrate a simple wireless communication between two or more boards. In combination with the Light sample application it creates a basic switch functionality, where the light can be toggled in the Light node. After power up, the node is in SCAN state. It means the broadcast messages of the light modules can be captured. After pushing PB1 button, the closest Light module will be connected. This is called the LINK state. If the Light module has done the same procedure, light can be toggled from all the boards with pushing BP0 button
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test BLE and IEEE802.15.4 with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This application demonstrates over the air range of the Silicon Labs boards. 5 predefined PHYs can be used for this: BLE: 125kbps, BLE: 500kbps, BLE: 1Mbps, BLE: 2Mbps, IEEE80215.4: 250kbps. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length defined by the PHY and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given predefined PHY and inspects the packets received. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. Radio related events can be logged on UART on demand. CLI can be used to set and get configuration of the app, and to start and stop it. To get started with CLI please send 'help' with a terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test BLE and IEEE802.15.4 with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This application demonstrates over the air range of the Silicon Labs boards. 5 predefined PHYs can be used for this: BLE: 125kbps, BLE: 500kbps, BLE: 1Mbps, BLE: 2Mbps, IEEE80215.4: 250kbps. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length defined by the PHY and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given predefined PHY and inspects the packets received. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. Radio related events can be logged on UART on demand. CLI can be used to set and get configuration of the app, and to start and stop it. To get started with CLI please send 'help' with a terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test BLE and IEEE802.15.4 with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This application demonstrates over the air range of the Silicon Labs boards. 5 predefined PHYs can be used for this: BLE: 125kbps, BLE: 500kbps, BLE: 1Mbps, BLE: 2Mbps, IEEE80215.4: 250kbps. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length defined by the PHY and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given predefined PHY and inspects the packets received. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. Radio related events can be logged on UART on demand. CLI can be used to set and get configuration of the app, and to start and stop it. To get started with CLI please send 'help' with a terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test BLE and IEEE802.15.4 with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This application demonstrates over the air range of the Silicon Labs boards. 5 predefined PHYs can be used for this: BLE: 125kbps, BLE: 500kbps, BLE: 1Mbps, BLE: 2Mbps, IEEE80215.4: 250kbps. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length defined by the PHY and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given predefined PHY and inspects the packets received. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. Radio related events can be logged on UART on demand. CLI can be used to set and get configuration of the app, and to start and stop it. To get started with CLI please send 'help' with a terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test BLE and IEEE802.15.4 with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This application demonstrates over the air range of the Silicon Labs boards. 5 predefined PHYs can be used for this: BLE: 125kbps, BLE: 500kbps, BLE: 1Mbps, BLE: 2Mbps, IEEE80215.4: 250kbps. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length defined by the PHY and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given predefined PHY and inspects the packets received. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. Radio related events can be logged on UART on demand. CLI can be used to set and get configuration of the app, and to start and stop it. To get started with CLI please send 'help' with a terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test BLE and IEEE802.15.4 with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This application demonstrates over the air range of the Silicon Labs boards. 5 predefined PHYs can be used for this: BLE: 125kbps, BLE: 500kbps, BLE: 1Mbps, BLE: 2Mbps, IEEE80215.4: 250kbps. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length defined by the PHY and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given predefined PHY and inspects the packets received. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. Radio related events can be logged on UART on demand. CLI can be used to set and get configuration of the app, and to start and stop it. To get started with CLI please send 'help' with a terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test BLE and IEEE802.15.4 with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This application demonstrates over the air range of the Silicon Labs boards. 5 predefined PHYs can be used for this: BLE: 125kbps, BLE: 500kbps, BLE: 1Mbps, BLE: 2Mbps, IEEE80215.4: 250kbps. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length defined by the PHY and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given predefined PHY and inspects the packets received. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. Radio related events can be logged on UART on demand. CLI can be used to set and get configuration of the app, and to start and stop it. To get started with CLI please send 'help' with a terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test BLE and IEEE802.15.4 with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This application demonstrates over the air range of the Silicon Labs boards. 5 predefined PHYs can be used for this: BLE: 125kbps, BLE: 500kbps, BLE: 1Mbps, BLE: 2Mbps, IEEE80215.4: 250kbps. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length defined by the PHY and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given predefined PHY and inspects the packets received. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. Radio related events can be logged on UART on demand. CLI can be used to set and get configuration of the app, and to start and stop it. To get started with CLI please send 'help' with a terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test BLE and IEEE802.15.4 with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This application demonstrates over the air range of the Silicon Labs boards. 5 predefined PHYs can be used for this: BLE: 125kbps, BLE: 500kbps, BLE: 1Mbps, BLE: 2Mbps, IEEE80215.4: 250kbps. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length defined by the PHY and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given predefined PHY and inspects the packets received. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. Radio related events can be logged on UART on demand. CLI can be used to set and get configuration of the app, and to start and stop it. To get started with CLI please send 'help' with a terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This is a customizable application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This is a customizable application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This is a customizable application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This is a customizable application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This is a customizable application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This is a customizable application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This is a customizable application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This is a customizable application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This is a customizable application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This is a customizable application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This is a customizable application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This is a customizable application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This is a customizable application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This is a customizable application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This is a customizable application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This is a customizable application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This is a customizable application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This is a customizable application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This is a customizable application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This is a customizable application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This is a customizable application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This is a customizable application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This is a customizable application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This is a customizable application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This is a customizable application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This is a customizable application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Range Test with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL. This is a customizable application that demonstrates over the air range of the EFR32. This sample app can act as a Transmitter and a Receiver. The role can be selected in the LCD menu. Flashing this app into two separate boards makes it possible to test the features and specification of the radio. The sample also provides an example how the RAIL API can be used. A menu is displayed in the LCD, which allows the user to see the most important information about the settings and also change some of them. The left button navigates in the menu and the right button selects or changes options. The bottom line always shows what the buttons do in the particular context. In Tx Mode, the user can send packets. Packet length (7..64 bytes) and the number of packets to transmit (from 500 up to continuous) can be set. Output power can be set in the LCD menu, in 0.5dBm steps (power setpoint), between -15..+20dBm. Actual minimum and maximum power may vary in different frequencies as well as the power that is actually set by RAIL. The LCD menu informs the user about the setpoint and the actual power. In the LCD menu, the Power item displays the setpoint first, then actual value. In Rx Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with the expected device ID, will be processed. Packet Error Rate, Bit Error Rate and RSSI of the packets is displayed to inform about the quality of the transmission. For both modes, the channel on which the Tx/Rx radio will operate and the device IDs of the transmitters and receiver radio, can be set. Radio related events can be logged on UART on demand. CLI can be used for setting and starting/stoping the application as well, to start with CLI interface send 'help' over terminal. Wireless Gecko mobile app can also be used to control this application over Bluetooth. Currently MicriumOS and FreeRTOS is supported by this sample app. NOTE: Due to the higher current consumption of the continuous radio usage (especially in Rx Mode), it is not recommended to power the boards from a coin cell. Instead, an USB power bank can be used if portability is needed.
+
+
+
+
+
+
+
diff --git a/app/flex/flex_production_templates.xml b/app/flex/flex_production_templates.xml
index 39c9cdc9b7..d205552a8c 100644
--- a/app/flex/flex_production_templates.xml
+++ b/app/flex/flex_production_templates.xml
@@ -5,7 +5,7 @@
-
+
@@ -19,7 +19,7 @@
-
+
@@ -33,7 +33,7 @@
-
+
@@ -47,7 +47,7 @@
-
+
@@ -61,7 +61,7 @@
-
+
@@ -89,7 +89,7 @@
-
+
@@ -117,7 +117,7 @@
-
+
@@ -145,7 +145,7 @@
-
+
@@ -187,7 +187,7 @@
-
+
@@ -215,7 +215,7 @@
-
+
@@ -229,7 +229,7 @@
-
+
@@ -257,7 +257,7 @@
-
+
@@ -271,7 +271,7 @@
-
+
@@ -285,7 +285,7 @@
-
+
@@ -299,7 +299,7 @@
-
+
@@ -355,7 +355,7 @@
-
+
@@ -383,7 +383,7 @@
-
+
diff --git a/app/host/multiprotocol/zigbeed/multiprotocol-container/Dockerfile b/app/host/multiprotocol/zigbeed/multiprotocol-container/Dockerfile
index d73e6f0557..06ade760ed 100644
--- a/app/host/multiprotocol/zigbeed/multiprotocol-container/Dockerfile
+++ b/app/host/multiprotocol/zigbeed/multiprotocol-container/Dockerfile
@@ -3,14 +3,51 @@ ARG BASE_CONTAINER=${SYSTEM_ARCH}/otbr_cpc
FROM ${BASE_CONTAINER}
ARG SYSTEM_ARCH=arm32v7a # trick to make the build environment have the variable defined
-RUN DEBIAN_FRONTEND=noninteractive apt update && apt install -y socat tmux procps libreadline8 systemd init lsb-release libmbedtls-dev
+# EMZIGBEE-10110: Disable the "apt install" as we want to avoid fetching packages from the Internet
+# for short term. Instead, we are not fetching packages from Nexus and install them locally.
+# For long term, we would need to redesign the container build process.
+#RUN DEBIAN_FRONTEND=noninteractive apt update && apt install -y socat tmux procps libreadline8 systemd init lsb-release libmbedtls-dev
# Install some non-essential software
-RUN DEBIAN_FRONTEND=noninteractive apt update && apt install -y nano gdb
+#RUN DEBIAN_FRONTEND=noninteractive apt update && apt install -y nano gdb
# Install BlueZ
-RUN DEBIAN_FRONTEND=noninteractive apt update && apt install -y bluetooth bluez bluez-tools rfkill libbluetooth-dev
+#RUN DEBIAN_FRONTEND=noninteractive apt update && apt install -y bluetooth bluez bluez-tools rfkill libbluetooth-dev
+
+# Copy and Install packages locally
+RUN mkdir mp_deb_arm32v7
+RUN mkdir mp_deb_arm64v8
+COPY mp_deb_arm32v7/* mp_deb_arm32v7/
+COPY mp_deb_arm64v8/* mp_deb_arm64v8/
+
+# Some packages need to be installed in a certain order and run
+# dpkg again at the end to make sure all dependencies are met.
+RUN if [ "$SYSTEM_ARCH" = "arm32v7" ]; then \
+ mv *.deb mp_deb_arm32v7; \
+ dpkg -i mp_deb_arm32v7/linux-libc*.deb; \
+ dpkg -i mp_deb_arm32v7/rpcsvc-proto*.deb; \
+ dpkg -i mp_deb_arm32v7/perl-modules*.deb; \
+ dpkg -i mp_deb_arm32v7/lib*.deb; \
+ dpkg -i mp_deb_arm32v7/systemd_*.deb; \
+ dpkg -i mp_deb_arm32v7/*.deb; \
+ dpkg -i mp_deb_arm32v7/*.deb; \
+ elif [ "$SYSTEM_ARCH" = "arm64v8" ]; then \
+ mv *.deb mp_deb_arm64v8; \
+ dpkg -i mp_deb_arm64v8/linux-libc*.deb; \
+ dpkg -i mp_deb_arm64v8/rpcsvc-proto*.deb; \
+ dpkg -i mp_deb_arm64v8/perl-modules*.deb; \
+ dpkg -i mp_deb_arm64v8/lib*.deb; \
+ dpkg -i mp_deb_arm64v8/systemd_*.deb; \
+ dpkg -i mp_deb_arm64v8/*.deb; \
+ dpkg -i mp_deb_arm64v8/*.deb; \
+ fi
+# This will resolve the unconfigured packages
+RUN apt-get install -f -y
+
RUN systemctl disable bluetooth.service
+# Remove packages after install
+RUN rm -fr mp_deb_arm32v7
+RUN rm -fr mp_deb_arm64v8
# Remove "tail -f /var/log/syslog" from shell script
RUN sed -i '$ d' /app/etc/docker/docker_entrypoint.sh
diff --git a/app/host/multiprotocol/zigbeed/multiprotocol-container/run.sh b/app/host/multiprotocol/zigbeed/multiprotocol-container/run.sh
index 1d5a29e6ec..5f3ffca6cd 100644
--- a/app/host/multiprotocol/zigbeed/multiprotocol-container/run.sh
+++ b/app/host/multiprotocol/zigbeed/multiprotocol-container/run.sh
@@ -82,8 +82,20 @@ while [[ $# -gt 0 ]]; do
exit
;;
-Z|--zigbee-host)
+ echo "Starting zigbeed..."
docker exec -it multiprotocol systemctl start zigbeed
sleep 5
+ echo "Checking zigbeed status..."
+ while
+ docker exec -it multiprotocol systemctl status zigbeed | grep 'RCP version'
+ [[ $? -ne 0 ]]
+ do
+ sleep 3
+ echo "Failed to start zigbeed, restarting..."
+ echo "(If errors persist, run 'journalctl -fex' inside container for logs.)"
+ docker exec -it multiprotocol systemctl restart zigbeed
+ done
+ echo "Starting Z3Gateway..."
docker exec -it multiprotocol /usr/local/bin/Z3Gateway -p ttyZigbeeNCP
exit
;;
diff --git a/app/mcu_example/app_mcu.properties b/app/mcu_example/app_mcu.properties
index 2732e694ef..7d08e4e3c4 100644
--- a/app/mcu_example/app_mcu.properties
+++ b/app/mcu_example/app_mcu.properties
@@ -3,9 +3,9 @@ id=com.silabs.sdk.mcu
label=32-bit MCU SDK
description=Silicon Labs 32-bit MCU SDK for EFM32 and EZR32
-version=6.3.0.0
+version=6.3.1.0
supportedParts=mcu.arm.efm32.* mcu.arm.ezr32.* .*wgm16.*
-prop.subLabel=MCU\\ 6.3.0.0
+prop.subLabel=MCU\\ 6.3.1.0
# General properties are prepended with "prop."
prop.file.templatesFile=mcu_production_templates.xml
diff --git a/app/mcu_example/documentation/release-highlights.txt b/app/mcu_example/documentation/release-highlights.txt
index 23a95b39ed..e1363d0142 100644
--- a/app/mcu_example/documentation/release-highlights.txt
+++ b/app/mcu_example/documentation/release-highlights.txt
@@ -1,3 +1,3 @@
-32-Bit MCU SDK 6.3.0.0
-- Added support for BRD2204C board.
+32-Bit MCU SDK 6.3.1.0
+- Underlying platform changes only
diff --git a/app/mcu_example/mcu_production_demos.xml b/app/mcu_example/mcu_production_demos.xml
index 1e544b4a71..e1b433c4a3 100644
--- a/app/mcu_example/mcu_production_demos.xml
+++ b/app/mcu_example/mcu_production_demos.xml
@@ -1,71 +1,58 @@
-
-
-
-
-
-
-
This example project demonstrates a wide range of features of the EFM32TG11 MCU and the SLSTK3301A Starter Kit.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example project demonstrates a wide range of features of the EFM32GG11 MCU and the SLSTK3701A Starter Kit.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This example shows how to use the Micrium OS CANopen stack. It uses the EFM32GG11B starter kit's two CAN peripherals in external loopback mode. It requires CAN expansion board ISO-CAN-EXP REV 1.0 or REV 2.0. This example will, upon the user pressing either push buttons (BTN0, BTN1), update one entry in the CANopen object dictionary of node 1 on the 'can0' bus with a predefined value for each button. Upon changing the value, a PDO message will be triggered, which will be caught by node 2 on the 'can1' bus. Node 2 will in turn update its object dictionary with the received value. The value of the object of both nodes is continuously displayed on the LCD.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
MicriumOS Network example.
This example shows how to use the Micrium OS network stack with the ETH peripheral on the EFM32GG11B starter kit. This example will initialize the RMII interface to the external PHY and setup a 100 Mbit connection.
-
-
-
-
-
-
-
-
-
- Example usage of microphones and MicriumOS HTTP server
-This example shows how to sample data from the microphone and also how to stream that data on a web server using uC/HTTPs.
-The audio is sampled from on-kit microphones by using LDMA. The sampled audio waveform is displayed on LCD. Sampling and encoding is performed in the main os task. Configuration can be found in common_declarations.h and config.h. For info on encoding, see IETFs and xiphs rfc6716, rfc7845 and rfc3533.
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Hall effect demo code for the Si72xx-WD-Kit using a Silicon Labs SLSTK3400A-EFM32HG Starter Kit.
You must have the Hall Effect Evaluation kit, Si72xx-WD-Kit, to make use of this demo. The Si72xx-WD-Kit includes two Si7210 sensors mounted on an expansion board (Si72xx-EXP) plus each of the six base part types mounted on small postage-stamp-sized (PS) boards. You must use the Silicon Labs SLSTK3400A-EFM32HG Starter Kit which is included in the Si72xx-WD-Kit.
+
+
+
+
+
+
+
diff --git a/app/mcu_example/micriumos_webmic/micriumos_webmic.slcp b/app/mcu_example/micriumos_webmic/micriumos_webmic.slcp
index 7c25a32761..6d9c469197 100644
--- a/app/mcu_example/micriumos_webmic/micriumos_webmic.slcp
+++ b/app/mcu_example/micriumos_webmic/micriumos_webmic.slcp
@@ -129,5 +129,4 @@ readme:
ui_hints:
highlight: readme.md
tag:
- - hardware:component:eth
- - prebuilt_demo
\ No newline at end of file
+ - hardware:component:eth
\ No newline at end of file
diff --git a/app/wisun/component/app_cli/sl_wisun_app_cli.c b/app/wisun/component/app_cli/sl_wisun_app_cli.c
index e4101a8ac5..a529a3211e 100644
--- a/app/wisun/component/app_cli/sl_wisun_app_cli.c
+++ b/app/wisun/component/app_cli/sl_wisun_app_cli.c
@@ -384,7 +384,7 @@ const app_cli_entry_t app_settings_entries[] =
.get_handler = _app_cli_get_phy
},
{
- .key = "connection_state",
+ .key = "join_state",
.domain = WISUN_CLI_DOMAIN_ID,
.value_size = APP_CLI_VALUE_SIZE_UINT8,
.input = APP_CLI_INPUT_FLAG_DEFAULT,
@@ -435,6 +435,19 @@ const app_cli_entry_t app_settings_entries[] =
.get_handler = app_settings_get_ip_address,
.description = NULL
},
+ {
+ .key = "ip_address_primary_parent",
+ .domain = WISUN_CLI_DOMAIN_ID,
+ .value_size = APP_CLI_VALUE_SIZE_NONE,
+ .input = APP_CLI_INPUT_FLAG_DEFAULT,
+ .output = APP_CLI_OUTPUT_FLAG_DEFAULT,
+ .value = NULL,
+ .input_enum_list = NULL,
+ .output_enum_list = NULL,
+ .set_handler = NULL,
+ .get_handler = app_settings_get_ip_address,
+ .description = NULL
+ },
#if defined(SL_CATALOG_WISUN_MODE_SWITCH_PRESENT)
{
.key = "mode_switch_tx_counter",
@@ -578,7 +591,7 @@ void app_disconnect(sl_cli_command_arg_t *arguments)
ret = sl_wisun_get_join_state(&join_state);
if (ret != SL_STATUS_OK) {
- printf("[Failed: Getting joint state failed]\r\n");
+ printf("[Failed: Getting join state failed]\r\n");
app_wisun_cli_mutex_unlock();
return;
}
@@ -822,7 +835,7 @@ static sl_status_t _app_cli_get_phy(char *value_str,
sprintf(value_str, "%d", phy.operating_class);
// operating mode
} else if (strstr(entry->key, "operating_mode")) {
- sprintf(value_str, "0x%02x", phy.operating_mode);
+ sprintf(value_str, "0x%x", phy.operating_mode);
}
return SL_STATUS_OK;
diff --git a/app/wisun/component/iperf/config/sl_iperf_config.h b/app/wisun/component/iperf/config/sl_iperf_config.h
index 6dec8793c2..c1e19bdf88 100644
--- a/app/wisun/component/iperf/config/sl_iperf_config.h
+++ b/app/wisun/component/iperf/config/sl_iperf_config.h
@@ -53,7 +53,7 @@
// Server receiver buffer size
// Default value 1450 (UDPv6 size without fragmentation)
-#define SL_IPERF_BUFFER_SIZE 1450U
+#define SL_IPERF_BUFFER_SIZE 1234U
// Set json formated log indent in space count
// Default value: 2
diff --git a/app/wisun/component/iperf/sl_iperf_cli.c b/app/wisun/component/iperf/sl_iperf_cli.c
index a435dfbe9b..a8ddcfd42b 100644
--- a/app/wisun/component/iperf/sl_iperf_cli.c
+++ b/app/wisun/component/iperf/sl_iperf_cli.c
@@ -414,6 +414,17 @@ static void _get_domain_key(const char *str_src,
char **domain_dst,
char **key_dst);
+/**************************************************************************//**
+ * @brief Check argument value of uint16 and uint32
+ * @details Helper function
+ * @param[in] arg_type Argument type
+ * @param[in] val Value
+ * @return true Valid value
+ * @return false Non-valid value
+ *****************************************************************************/
+static inline bool _check_arg_uint_val(const sl_iperf_cli_arg_type_t arg_type,
+ const int64_t val);
+
// -----------------------------------------------------------------------------
// Static Variables
// -----------------------------------------------------------------------------
@@ -555,7 +566,7 @@ static sl_iperf_test_t _last_test = { 0U };
/**************************************************************************//**
* @brief iPerf CLI set parameter
* @details CLI function
- * @param arguments Arguments
+ * @param[in] arguments Arguments
*****************************************************************************/
void sl_iperf_cli_set(sl_cli_command_arg_t *arguments)
{
@@ -565,7 +576,7 @@ void sl_iperf_cli_set(sl_cli_command_arg_t *arguments)
char *domain = NULL;
char *key = NULL;
sl_iperf_cli_property_t * prop = NULL;
- uint32_t ui32_val = 0U;
+ int64_t i_val = 0LL;
arg_cnt = (uint8_t) sl_cli_get_argument_count(arguments);
@@ -597,7 +608,7 @@ void sl_iperf_cli_set(sl_cli_command_arg_t *arguments)
if (key != NULL) {
prop = _get_property(domain, key);
if (prop == NULL) {
- printf("[Not valid iPerf doman and key]\n");
+ printf("[Not valid iPerf domain and key]\n");
return;
}
}
@@ -652,17 +663,20 @@ void sl_iperf_cli_set(sl_cli_command_arg_t *arguments)
case SL_IPERF_CLI_ARG_TYPE_STRING:
prop->setter((void *) arg1_str);
break;
- case SL_IPERF_CLI_ARG_TYPE_UINT32:
- ui32_val = atol(arg1_str);
- prop->setter((void *) &ui32_val);
- break;
case SL_IPERF_CLI_ARG_TYPE_UINT16:
- ui32_val = atoi(arg1_str);
- prop->setter((void *) &ui32_val);
+ case SL_IPERF_CLI_ARG_TYPE_UINT32:
+ i_val = atoll(arg1_str);
+ if (_check_arg_uint_val(prop->type, i_val)) {
+ prop->setter((void *) &i_val);
+ } else {
+ printf("[Not valid iPerf command argument value]\n");
+ }
break;
default:
+ printf("[Not valid iPerf command argument type]\n");
break;
}
+
_print_property_val(prop);
return;
}
@@ -673,7 +687,7 @@ void sl_iperf_cli_set(sl_cli_command_arg_t *arguments)
/**************************************************************************//**
* @brief iPerf CLI get parameter
* @details CLI function
- * @param arguments Arguments
+ * @param[in] arguments Arguments
*****************************************************************************/
void sl_iperf_cli_get(sl_cli_command_arg_t *arguments)
{
@@ -714,7 +728,7 @@ void sl_iperf_cli_get(sl_cli_command_arg_t *arguments)
if (key != NULL) {
prop = _get_property(domain, key);
if (prop == NULL) {
- printf("[Not valid iPerf doman and key]\n");
+ printf("[Not valid iPerf domain and key]\n");
return;
}
}
@@ -856,7 +870,12 @@ static inline const char *_opt_packet_number_getter(void)
// buffer length
static inline void _opt_buffer_length_setter(void *val)
{
- _options.buf_len = *(uint16_t*)val;
+ uint16_t value = *(uint16_t*)val;
+ if (!value || value > SL_IPERF_BUFFER_SIZE) {
+ printf("[Not valid buffer size]\n");
+ return;
+ }
+ _options.buf_len = value;
}
static inline const char *_opt_buffer_length_getter(void)
@@ -867,7 +886,13 @@ static inline const char *_opt_buffer_length_getter(void)
// duration
static inline void _opt_duration_setter(void *val)
{
- _options.duration_ms = *(uint16_t*)val * SL_IPERF_TIME_S_TO_MS_ML;
+ uint32_t val32 = 0UL;
+ val32 = *(uint32_t*) val * SL_IPERF_TIME_S_TO_MS_ML;
+ if (val32 > UINT16_MAX) {
+ printf("[Duration Time value is overflowed]\n");
+ } else {
+ _options.duration_ms = (uint16_t) val32;
+ }
}
static inline const char *_opt_duration_getter(void)
@@ -878,7 +903,13 @@ static inline const char *_opt_duration_getter(void)
// interval
static inline void _opt_interval_setter(void *val)
{
- _options.interval_ms = *(uint16_t*)val * SL_IPERF_TIME_S_TO_MS_ML;
+ uint32_t val32 = 0UL;
+ val32 = *(uint32_t*) val * SL_IPERF_TIME_S_TO_MS_ML;
+ if (val32 > UINT16_MAX) {
+ printf("[Interval Time value is overflowed]\n");
+ } else {
+ _options.interval_ms = (uint16_t) val32;
+ }
}
static inline const char *_opt_interval_getter(void)
@@ -1063,3 +1094,14 @@ static void _get_domain_key(const char *str_src,
domain_key_buff[SL_IPERF_CLI_MAX_STR_ARG_LEN - 1] = '\0';
}
+
+static inline bool _check_arg_uint_val(const sl_iperf_cli_arg_type_t arg_type,
+ const int64_t val)
+{
+ if (val < 0LL ||
+ (arg_type == SL_IPERF_CLI_ARG_TYPE_UINT32 && val > UINT32_MAX) ||
+ (arg_type == SL_IPERF_CLI_ARG_TYPE_UINT16 && val > UINT16_MAX)) {
+ return false;
+ }
+ return true;
+}
\ No newline at end of file
diff --git a/app/wisun/component/iperf/sl_iperf_udp_clnt.c b/app/wisun/component/iperf/sl_iperf_udp_clnt.c
index f5a5a44e1b..3c4cf9ccbc 100644
--- a/app/wisun/component/iperf/sl_iperf_udp_clnt.c
+++ b/app/wisun/component/iperf/sl_iperf_udp_clnt.c
@@ -47,6 +47,9 @@
// Macros and Typedefs
// -----------------------------------------------------------------------------
+/// Client FinACK Receive Timeout
+#define SL_IPERF_FINACK_RECV_TIMEOUT_MS 10000UL
+
/// Client TX parameters
typedef struct client_tx_params {
/// Packet count
@@ -202,7 +205,7 @@ void sl_iperf_test_udp_client(sl_iperf_test_t * test)
params.packet_size,
&test->conn.srv_addr);
}
- sl_iperf_delay_ms(100U);
+ sl_iperf_delay_ms(SL_IPERF_FINACK_RECV_TIMEOUT_MS / SL_IPERF_SERVER_UDP_TX_FINACK_COUNT);
}
if (!finack_received) {
@@ -276,14 +279,11 @@ static void _udp_client_calc_tx(sl_iperf_test_t * const test,
}
// trim buff size if it's necessary
- if (!test->opt.buf_len) {
+ if (!test->opt.buf_len || test->opt.buf_len > test->conn.buff_size) {
test->opt.buf_len = test->conn.buff_size;
}
tx_info->packet_size = test->opt.buf_len;
- if (!tx_info->packet_size) {
- return;
- }
// If packet number is explicitly set
if (test->opt.packet_nbr) {
diff --git a/app/wisun/component/iperf/sl_iperf_util.c b/app/wisun/component/iperf/sl_iperf_util.c
index 41bbd31f59..431eef098c 100644
--- a/app/wisun/component/iperf/sl_iperf_util.c
+++ b/app/wisun/component/iperf/sl_iperf_util.c
@@ -221,8 +221,8 @@ void sl_iperf_print_test_log_json(sl_iperf_test_t * const test)
sl_iperf_log_print(test->log, "%*s\"duration_ms\": %u,\n", __indent(3U), test->opt.duration_ms);
sl_iperf_log_print(test->log, "%*s\"win_size\": %u,\n", __indent(3U), test->opt.win_size);
sl_iperf_log_print(test->log, "%*s\"persistent\": %s,\n", __indent(3U), _bool_to_json(test->opt.persistent));
- sl_iperf_log_print(test->log, "%*s\"interval_ms\": %u\n", __indent(3U), test->opt.interval_ms);
- sl_iperf_log_print(test->log, "%*s\"bw_format\": \"%s\",\n", __indent(3U), test->opt.bw_format);
+ sl_iperf_log_print(test->log, "%*s\"interval_ms\": %u,\n", __indent(3U), test->opt.interval_ms);
+ sl_iperf_log_print(test->log, "%*s\"bw_format\": \"%s\"\n", __indent(3U), sl_iperf_opt_bw_format_to_str(test->opt.bw_format));
sl_iperf_log_print(test->log, "%*s},\n", __indent(2U));
sl_iperf_log_print(test->log, "%*s\"statistic\": {\n", __indent(2U));
sl_iperf_log_print(test->log, "%*s\"nbr_calls\": %lu,\n", __indent(3U), test->statistic.nbr_calls);
@@ -248,7 +248,7 @@ void sl_iperf_print_test_log_json(sl_iperf_test_t * const test)
sl_iperf_log_print(test->log, "%*s\"bandwidth\": %lu,\n", __indent(3U), test->statistic.bandwidth);
sl_iperf_log_print(test->log, "%*s\"finack_tot_len\": %lu,\n", __indent(3U), test->statistic.finack_tot_len);
sl_iperf_log_print(test->log, "%*s\"finack_duration_ms\": %lu,\n", __indent(3U), test->statistic.finack_duration_ms);
- sl_iperf_log_print(test->log, "%*s\"finack_pkt\": %lu,\n", __indent(3U), test->statistic.finack_pkt);
+ sl_iperf_log_print(test->log, "%*s\"finack_pkt\": %lu\n", __indent(3U), test->statistic.finack_pkt);
sl_iperf_log_print(test->log, "%*s}\n", __indent(2U));
sl_iperf_log_print(test->log, "%*s}\n", __indent(1U));
sl_iperf_log_print(test->log, "}\n");
@@ -616,7 +616,14 @@ void sl_iperf_test_calculate_average_bandwidth(sl_iperf_test_t * const test)
_data_converter(test->statistic.bytes,
SL_IPERF_DATA_KBYTE_TO_BYTE_ML,
¶ms.fval_data);
-
+ if (time_duration_ms) {
+ // calculate bandwidth for statistic in bits/sec
+ test->statistic.bandwidth = (uint32_t)(((uint64_t)test->statistic.bytes * SL_IPERF_DATA_BYTE_TO_BIT_ML *
+ SL_IPERF_TIME_S_TO_MS_ML) / time_duration_ms);
+ } else {
+ test->statistic.bandwidth = 0UL;
+ }
+
sl_iperf_calc_time_from_ms(¶ms.end_time, time_duration_ms);
params.pkt_cnt = test->statistic.tot_packets;
params.lost_pkt_curr = test->statistic.udp_lost_pkt;
diff --git a/app/wisun/component/ping/sl_wisun_ping_cli.c b/app/wisun/component/ping/sl_wisun_ping_cli.c
index dfb9d2832f..5f9a361eb4 100644
--- a/app/wisun/component/ping/sl_wisun_ping_cli.c
+++ b/app/wisun/component/ping/sl_wisun_ping_cli.c
@@ -73,7 +73,7 @@ void app_ping(sl_cli_command_arg_t *arguments)
SL_WISUN_PING_PACKET_COUNT,
SL_WISUN_PING_PACKET_SIZE,
NULL, NULL)) {
- printf("[Failed: ping was not succesful]\n");
+ printf("[Failed: ping was not successful]\n");
}
app_wisun_cli_mutex_unlock();
diff --git a/app/wisun/documentation/release-highlights.txt b/app/wisun/documentation/release-highlights.txt
index 0dbbb68b64..ac2b929547 100644
--- a/app/wisun/documentation/release-highlights.txt
+++ b/app/wisun/documentation/release-highlights.txt
@@ -1,6 +1,2 @@
-Wi-SUN SDK 1.3.0.0
-- FAN 1.0 certified Router & Border Router
-- Perf throughput test tool
-- Wi-SUN Configurator
-- CLI for certification
-- ARIB T108 support
+Wi-SUN SDK 1.3.1.0
+- Targeted quality improvements and bug fixes
diff --git a/app/wisun/documentation/slWi-SUN_docContent.xml b/app/wisun/documentation/slWi-SUN_docContent.xml
index e859b1b57a..0894bb114e 100644
--- a/app/wisun/documentation/slWi-SUN_docContent.xml
+++ b/app/wisun/documentation/slWi-SUN_docContent.xml
@@ -1,131 +1,131 @@
-
-
+
+
+ Explains how NVM3 can be used as non-volatile data storage in various protocol implementations.
- Explains how NVM3 can be used as non-volatile data storage in various protocol implementations.
-
+
+ Describes how to integrate crypto functionality into applications using PSA Crypto compared to Mbed TLS.
- Describes how to integrate crypto functionality into applications using PSA Crypto compared to Mbed TLS.
-
+
+ Gecko Bootloader v2.x, introduced in GSDK 4.0, contains a number of changes compared to Gecko Bootloader v1.x. This document describes the differences between the versions, including how to configure the new Gecko Bootloader in Simplicity Studio 5.
- Gecko Bootloader v2.x, introduced in GSDK 4.0, contains a number of changes compared to Gecko Bootloader v1.x. This document describes the differences between the versions, including how to configure the new Gecko Bootloader in Simplicity Studio 5.
-
+
+ Describes the test environment and methods for testing Wi-SUN network performance. The results are intended to provide guidance on design practices and principles as well as expected field performance results.
- Describes the test environment and methods for testing Wi-SUN network performance. The results are intended to provide guidance on design practices and principles as well as expected field performance results.
-
+
+ Describes how to use the Silicon Labs Wi-SUN Linux border router or the EFR32 standalone border router demonstration. Covers the associated configuration and debugging tools.
- Describes how to use the Silicon Labs Wi-SUN Linux border router or the EFR32 standalone border router demonstration. Covers the associated configuration and debugging tools.
-
+
+ Describes how to use the Wi-SUN Network Performance Measurement Application from either the LCD output or the CLI, and includes suggestions for improving ping latency in a Wi-SUN network.
- Describes how to use the Wi-SUN Network Performance Measurement Application from either the LCD output or the CLI, and includes suggestions for improving ping latency in a Wi-SUN network.
-
+
+ Provides an overview and hyperlinks to all packaged documentation.
- Provides an overview and hyperlinks to all packaged documentation.
-
+
+ Describes how to get started with Wi-SUN development using the Silicon Labs Wi-SUN software development kit (SDK) and Simplicity Studio 5 with a compatible wireless starter kit (WSTK).
- Describes how to get started with Wi-SUN development using the Silicon Labs Wi-SUN software development kit (SDK) and Simplicity Studio 5 with a compatible wireless starter kit (WSTK).
-
+
+ Contains a comprehensive list of APIs used to interface to the Silicon Labs Wi-SUN stack.
- Contains a comprehensive list of APIs used to interface to the Silicon Labs Wi-SUN stack.
-
+
+ Reference for those developing applications using the Silicon Labs Wi-SUN SDK. The guide covers guidelines to develop an application on top of Silicon Labs Wi-SUN stack . The purpose of this document is to fill in the gaps between the Silicon Labs Wi-SUN Field Area Network (FAN) API reference, Gecko Platform references, and documentation for the target EFR32xG part.
- Reference for those developing applications using the Silicon Labs Wi-SUN SDK. The guide covers guidelines to develop an application on top of Silicon Labs Wi-SUN stack . The purpose of this document is to fill in the gaps between the Silicon Labs Wi-SUN Field Area Network (FAN) API reference, Gecko Platform references, and documentation for the target EFR32xG part.
-
+
+ Lists compatibility requirements and sources for all software components in the development environment. Discusses the latest changes to the SiliconLabs Wi-SUN SDK, including added/deleted/deprecated features/API. Reviews fixed and known issues.
- Lists compatibility requirements and sources for all software components in the development environment. Discusses the latest changes to the SiliconLabs Wi-SUN SDK, including added/deleted/deprecated features/API. Reviews fixed and known issues.
-
+
+ A detailed overview of the changes, additions, and fixes in the Gecko Platform components. The Gecko Platform includes EMLIB, EMDRV, RAIL Library, NVM3, and the component-based infrastructure.
- A detailed overview of the changes, additions, and fixes in the Gecko Platform components. The Gecko Platform includes EMLIB, EMDRV, RAIL Library, NVM3, and the component-based infrastructure.
-
+
+ Introduces the security concepts that must be considered when implementing an Internet of Things (IoT) system. Using the ioXt Alliance's eight security principles as a structure, it clearly delineates the solutions Silicon Labs provides to support endpoint security and what you must do outside of the Silicon Labs framework.
- Introduces the security concepts that must be considered when implementing an Internet of Things (IoT) system. Using the ioXt Alliance's eight security principles as a structure, it clearly delineates the solutions Silicon Labs provides to support endpoint security and what you must do outside of the Silicon Labs framework.
-
+
+ Introduces bootloading for Silicon Labs networking devices. Discusses the Gecko Bootloader as well as legacy Ember and Bluetooth bootloaders, and describes the file formats used by each.
- Introduces bootloading for Silicon Labs networking devices. Discusses the Gecko Bootloader as well as legacy Ember and Bluetooth bootloaders, and describes the file formats used by each.
-
+
+ Introduces non-volatile data storage using flash and the three different storage implementations offered for Silicon Labs microcontrollers and SoCs: Simulated EEPROM, PS Store, and NVM3.
- Introduces non-volatile data storage using flash and the three different storage implementations offered for Silicon Labs microcontrollers and SoCs: Simulated EEPROM, PS Store, and NVM3.
-
+
+ Describes how and when to use Simplicity Commander's Command-Line Interface.
- Describes how and when to use Simplicity Commander's Command-Line Interface.
-
+
+ Describes the high-level implementation of the Silicon Labs Gecko Bootloader for EFR32 SoCs and NCPs, and provides information on how to get started using the Gecko Bootloader with Silicon Labs wireless protocol stacks in GSDK 4.0 and higher.
- Describes the high-level implementation of the Silicon Labs Gecko Bootloader for EFR32 SoCs and NCPs, and provides information on how to get started using the Gecko Bootloader with Silicon Labs wireless protocol stacks in GSDK 4.0 and higher.
diff --git a/app/wisun/esf.properties b/app/wisun/esf.properties
index e714ae2ae1..fa6fb8e171 100644
--- a/app/wisun/esf.properties
+++ b/app/wisun/esf.properties
@@ -3,8 +3,8 @@ id=com.silabs.stack.wisun
label=Wi-SUN
description=Silicon Labs Wi-SUN SDK
-version=1.3.0.0
-prop.subLabel=Wi-SUN\\ 1.3.0.0
+version=1.3.1.0
+prop.subLabel=Wi-SUN\\ 1.3.1.0
# General properties are prepended with "prop."
prop.file.templatesFile=wisun_production_templates.xml wisun_br_demos_templates.xml
diff --git a/app/wisun/example/wisun_soc_network_measurement/hw_filter_tags.yaml b/app/wisun/example/wisun_soc_network_measurement/hw_filter_tags.yaml
index e7482c45d1..b575bed139 100644
--- a/app/wisun/example/wisun_soc_network_measurement/hw_filter_tags.yaml
+++ b/app/wisun/example/wisun_soc_network_measurement/hw_filter_tags.yaml
@@ -4,7 +4,7 @@ tag:
- hardware:
device:
memory:
- flash: 736
+ flash: 737
ram: 183
board:
rf_bands:
diff --git a/app/wisun/wisun_br_demos_demos.xml b/app/wisun/wisun_br_demos_demos.xml
index e6eb1b067a..e9f6aa0bc7 100644
--- a/app/wisun/wisun_br_demos_demos.xml
+++ b/app/wisun/wisun_br_demos_demos.xml
@@ -1,203 +1,203 @@
-
-
-
-
-
-
-
The Wi-SUN RCP (Radio CoProcessor) application provides a radio interface to a Linux host. It is meant to be paired with wsbrd (Wi-SUN Network implementation for Linux) to run as a Linux border router device.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
The Wi-SUN RCP (Radio CoProcessor) application provides a radio interface to a Linux host. It is meant to be paired with wsbrd (Wi-SUN Network implementation for Linux) to run as a Linux border router device.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
The Wi-SUN RCP (Radio CoProcessor) application provides a radio interface to a Linux host. It is meant to be paired with wsbrd (Wi-SUN Network implementation for Linux) to run as a Linux border router device.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
The Wi-SUN RCP (Radio CoProcessor) application provides a radio interface to a Linux host. It is meant to be paired with wsbrd (Wi-SUN Network implementation for Linux) to run as a Linux border router device.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
The Wi-SUN RCP (Radio CoProcessor) application provides a radio interface to a Linux host. It is meant to be paired with wsbrd (Wi-SUN Network implementation for Linux) to run as a Linux border router device.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
The Wi-SUN RCP (Radio CoProcessor) application provides a radio interface to a Linux host. It is meant to be paired with wsbrd (Wi-SUN Network implementation for Linux) to run as a Linux border router device.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
The Wi-SUN RCP (Radio CoProcessor) application provides a radio interface to a Linux host. It is meant to be paired with wsbrd (Wi-SUN Network implementation for Linux) to run as a Linux border router device.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
The Wi-SUN RCP (Radio CoProcessor) application provides a radio interface to a Linux host. It is meant to be paired with wsbrd (Wi-SUN Network implementation for Linux) to run as a Linux border router device.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
The Wi-SUN RCP (Radio CoProcessor) application provides a radio interface to a Linux host. It is meant to be paired with wsbrd (Wi-SUN Network implementation for Linux) to run as a Linux border router device.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
The Wi-SUN RCP (Radio CoProcessor) application provides a radio interface to a Linux host. It is meant to be paired with wsbrd (Wi-SUN Network implementation for Linux) to run as a Linux border router device.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This demo is an out-of-the-box Wi-SUN border router application. It provides a command-line interface to control basic configurations.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This demo is an out-of-the-box Wi-SUN border router application. It provides a command-line interface to control basic configurations.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This demo is an out-of-the-box Wi-SUN border router application. It provides a command-line interface to control basic configurations.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This demo is an out-of-the-box Wi-SUN border router application. It provides a command-line interface to control basic configurations.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This demo is an out-of-the-box Wi-SUN border router application. It provides a command-line interface to control basic configurations.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This demo is an out-of-the-box Wi-SUN border router application. It provides a command-line interface to control basic configurations.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This demo is an out-of-the-box Wi-SUN border router application. It provides a command-line interface to control basic configurations.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This demo is an out-of-the-box Wi-SUN border router application. It provides a command-line interface to control basic configurations.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This demo is an out-of-the-box Wi-SUN border router application. It provides a command-line interface to control basic configurations.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
This demo is an out-of-the-box Wi-SUN border router application. It provides a command-line interface to control basic configurations.
+
+
+
+
+
+
+
diff --git a/app/wisun/wisun_production_demos.xml b/app/wisun/wisun_production_demos.xml
index 1e6adb807e..3d46709cf1 100644
--- a/app/wisun/wisun_production_demos.xml
+++ b/app/wisun/wisun_production_demos.xml
@@ -1,103 +1,103 @@
-
-
-
-
-
-
-
The Wi-SUN CLI (Command-Line Interface) sample application allows developers to easily evaluate the Wi-SUN stack APIs. The Wi-SUN command line interface provides a serial interface to a number of the Wi-SUN stack functions. For example, it can be used to connect the Wi-SUN device to a Wi-SUN border router and exchange IP packets.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
The Wi-SUN CLI (Command-Line Interface) sample application allows developers to easily evaluate the Wi-SUN stack APIs. The Wi-SUN command line interface provides a serial interface to a number of the Wi-SUN stack functions. For example, it can be used to connect the Wi-SUN device to a Wi-SUN border router and exchange IP packets.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
The Wi-SUN CLI (Command-Line Interface) sample application allows developers to easily evaluate the Wi-SUN stack APIs. The Wi-SUN command line interface provides a serial interface to a number of the Wi-SUN stack functions. For example, it can be used to connect the Wi-SUN device to a Wi-SUN border router and exchange IP packets.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
The Wi-SUN CLI (Command-Line Interface) sample application allows developers to easily evaluate the Wi-SUN stack APIs. The Wi-SUN command line interface provides a serial interface to a number of the Wi-SUN stack functions. For example, it can be used to connect the Wi-SUN device to a Wi-SUN border router and exchange IP packets.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
The Wi-SUN CLI (Command-Line Interface) sample application allows developers to easily evaluate the Wi-SUN stack APIs. The Wi-SUN command line interface provides a serial interface to a number of the Wi-SUN stack functions. For example, it can be used to connect the Wi-SUN device to a Wi-SUN border router and exchange IP packets.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
The Wi-SUN CLI (Command-Line Interface) sample application allows developers to easily evaluate the Wi-SUN stack APIs. The Wi-SUN command line interface provides a serial interface to a number of the Wi-SUN stack functions. For example, it can be used to connect the Wi-SUN device to a Wi-SUN border router and exchange IP packets.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
The Wi-SUN CLI (Command-Line Interface) sample application allows developers to easily evaluate the Wi-SUN stack APIs. The Wi-SUN command line interface provides a serial interface to a number of the Wi-SUN stack functions. For example, it can be used to connect the Wi-SUN device to a Wi-SUN border router and exchange IP packets.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
The Wi-SUN CLI (Command-Line Interface) sample application allows developers to easily evaluate the Wi-SUN stack APIs. The Wi-SUN command line interface provides a serial interface to a number of the Wi-SUN stack functions. For example, it can be used to connect the Wi-SUN device to a Wi-SUN border router and exchange IP packets.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
The Wi-SUN CLI (Command-Line Interface) sample application allows developers to easily evaluate the Wi-SUN stack APIs. The Wi-SUN command line interface provides a serial interface to a number of the Wi-SUN stack functions. For example, it can be used to connect the Wi-SUN device to a Wi-SUN border router and exchange IP packets.
+
+
+
+
+
+
+
-
-
-
-
-
-
-
The Wi-SUN CLI (Command-Line Interface) sample application allows developers to easily evaluate the Wi-SUN stack APIs. The Wi-SUN command line interface provides a serial interface to a number of the Wi-SUN stack functions. For example, it can be used to connect the Wi-SUN device to a Wi-SUN border router and exchange IP packets.
+
+
+
+
+
+
+
diff --git a/app/wisun/wisun_production_templates.xml b/app/wisun/wisun_production_templates.xml
index a5fece82d2..7d7aefa251 100644
--- a/app/wisun/wisun_production_templates.xml
+++ b/app/wisun/wisun_production_templates.xml
@@ -22,7 +22,7 @@
-
+
diff --git a/app/zcl/ha.xml b/app/zcl/ha.xml
index 81be9063b2..dd106c61f0 100644
--- a/app/zcl/ha.xml
+++ b/app/zcl/ha.xml
@@ -114,7 +114,7 @@ limitations under the License.
min setpoint dead band
remote sensing
control sequence of operation
- system mode
+ system mode
alarm mask
thermostat running mode
diff --git a/app/zcl/types.xml b/app/zcl/types.xml
index a14758793b..f580bbe0eb 100644
--- a/app/zcl/types.xml
+++ b/app/zcl/types.xml
@@ -340,6 +340,8 @@ limitations under the License.
+
+
diff --git a/app/zcl/zcl-zap.json b/app/zcl/zcl-zap.json
index 7895922406..94907c300f 100644
--- a/app/zcl/zcl-zap.json
+++ b/app/zcl/zcl-zap.json
@@ -1,6 +1,11 @@
{
- "version": "Zigbee Silabs ZCL data",
- "xmlRoot": [".", "../../../../app/zcl/"],
+ "description": "Zigbee Silabs ZCL data",
+ "category": "zigbee",
+ "version": 1,
+ "xmlRoot": [
+ ".",
+ "../../../../app/zcl/"
+ ],
"xmlFile": [
"ami-devices.xml",
"ami.xml",
@@ -30,9 +35,15 @@
"manufacturersXml": "manufacturers.xml",
"options": {
"text": {
- "defaultResponsePolicy": ["Always", "Conditional", "Never"]
+ "defaultResponsePolicy": [
+ "Always",
+ "Conditional",
+ "Never"
+ ]
},
- "bool": ["commandDiscovery"]
+ "bool": [
+ "commandDiscovery"
+ ]
},
"defaults": {
"text": {
@@ -51,4 +62,4 @@
"STRING",
"STRUCT"
]
-}
+}
\ No newline at end of file
diff --git a/gecko_sdk.slcs b/gecko_sdk.slcs
index 92b78a165c..e849b715dc 100644
--- a/gecko_sdk.slcs
+++ b/gecko_sdk.slcs
@@ -2,7 +2,7 @@ id: "gecko_sdk"
label: "Gecko SDK Suite"
description: |-
Gecko SDK Suite for EM3xx, EFM32, EZR32 and EFR32 microcontrollers and radios.
-sdk_version: "4.1.0"
+sdk_version: "4.1.1"
specification_version: 7
component_path:
- path: "app/amazon/component"
diff --git a/hardware/board/component/brd2603a.slcc b/hardware/board/component/brd2603a.slcc
index db7d3ad2a7..5264b911e7 100644
--- a/hardware/board/component/brd2603a.slcc
+++ b/hardware/board/component/brd2603a.slcc
@@ -13,6 +13,7 @@
- name: hardware_board
- name: hardware_board_stk
- name: hardware_board_from_stk
+ - name: hardware_board_from_zgm230-dk2603a
- name: hardware_board_has_si70xx
- name: hardware_board_has_tempsensor
- name: hardware_board_has_vcom
@@ -47,11 +48,11 @@
- name: SL_BOARD_NAME
value: '"BRD2603A"'
- name: SL_BOARD_REV
- value: '"A00"'
+ value: '"A01"'
- tag:
- board:pn:BRD2603
- board:variant:A
- - board:revision:A00
+ - board:revision:A01
- board:device:zgm230sb27hgn
- hardware:has:vcom
- hardware:has:pti
diff --git a/hardware/board/component/brd2703a.slcc b/hardware/board/component/brd2703a.slcc
new file mode 100644
index 0000000000..577cfabac1
--- /dev/null
+++ b/hardware/board/component/brd2703a.slcc
@@ -0,0 +1,17 @@
+!!omap
+- id: brd2703a
+- label: BRD2703A
+- package: platform
+- description: Board support for BRD2703A.
+- category: Platform|Board|Starter Kit
+- quality: production
+- requires:
+ - name: brd2703a_revision
+- provides:
+ - name: brd2703a
+ - name: hardware_board_from_stk
+ - name: hardware_board_from_xg24-ek2703a
+- recommends:
+ - id: brd2703a_a01
+- ui_hints:
+ visibility: never
diff --git a/hardware/board/component/brd2703a_a00.slcc b/hardware/board/component/brd2703a_a00.slcc
new file mode 100644
index 0000000000..7993fd466f
--- /dev/null
+++ b/hardware/board/component/brd2703a_a00.slcc
@@ -0,0 +1,50 @@
+!!omap
+- id: brd2703a_a00
+- label: BRD2703A rev A00
+- package: platform
+- description: Board support for BRD2703A.
+- category: Platform|Board|Starter Kit
+- quality: production
+- requires:
+ - name: efr32mg24b020f1536im48
+ - name: brd2703a_config
+- provides:
+ - name: brd2703a_revision
+ - name: brd2703a_a00
+ - name: hardware_board
+ - name: hardware_board_stk
+ - name: hardware_board_has_vcom
+ - name: hardware_board_has_hfxo
+ - name: hardware_board_has_lfxo
+ - name: hardware_board_supports_rf_band_2400
+ - name: hardware_board_supports_1_rf_band
+ - name: hardware_board_default_rf_band
+ - name: hardware_board_default_rf_band_2400
+- recommends:
+ - id: iostream_eusart
+ instance:
+ - vcom
+ - id: bootloader_uart_driver
+ - id: simple_led
+ instance:
+ - led0
+ - led1
+ - id: simple_button
+ instance:
+ - btn0
+ - btn1
+- template_contribution: []
+- define:
+ - name: SL_BOARD_NAME
+ value: '"BRD2703A"'
+ - name: SL_BOARD_REV
+ value: '"A00"'
+- tag:
+ - board:pn:BRD2703
+ - board:variant:A
+ - board:revision:A00
+ - board:device:efr32mg24b020f1536im48
+ - hardware:has:vcom
+ - hardware:has:pti
+ - hardware:has:led:2
+ - hardware:has:button:2
diff --git a/hardware/board/component/brd2703a_a01.slcc b/hardware/board/component/brd2703a_a01.slcc
new file mode 100644
index 0000000000..5c81082a66
--- /dev/null
+++ b/hardware/board/component/brd2703a_a01.slcc
@@ -0,0 +1,50 @@
+!!omap
+- id: brd2703a_a01
+- label: BRD2703A rev A01
+- package: platform
+- description: Board support for BRD2703A.
+- category: Platform|Board|Starter Kit
+- quality: production
+- requires:
+ - name: efr32mg24b210f1536im48
+ - name: brd2703a_config
+- provides:
+ - name: brd2703a_revision
+ - name: brd2703a_a01
+ - name: hardware_board
+ - name: hardware_board_stk
+ - name: hardware_board_has_vcom
+ - name: hardware_board_has_hfxo
+ - name: hardware_board_has_lfxo
+ - name: hardware_board_supports_rf_band_2400
+ - name: hardware_board_supports_1_rf_band
+ - name: hardware_board_default_rf_band
+ - name: hardware_board_default_rf_band_2400
+- recommends:
+ - id: iostream_eusart
+ instance:
+ - vcom
+ - id: bootloader_uart_driver
+ - id: simple_led
+ instance:
+ - led0
+ - led1
+ - id: simple_button
+ instance:
+ - btn0
+ - btn1
+- template_contribution: []
+- define:
+ - name: SL_BOARD_NAME
+ value: '"BRD2703A"'
+ - name: SL_BOARD_REV
+ value: '"A01"'
+- tag:
+ - board:pn:BRD2703
+ - board:variant:A
+ - board:revision:A01
+ - board:device:efr32mg24b210f1536im48
+ - hardware:has:vcom
+ - hardware:has:pti
+ - hardware:has:led:2
+ - hardware:has:button:2
diff --git a/hardware/board/component/brd2703a_a02.slcc b/hardware/board/component/brd2703a_a02.slcc
new file mode 100644
index 0000000000..427a6924a9
--- /dev/null
+++ b/hardware/board/component/brd2703a_a02.slcc
@@ -0,0 +1,50 @@
+!!omap
+- id: brd2703a_a02
+- label: BRD2703A rev A02
+- package: platform
+- description: Board support for BRD2703A.
+- category: Platform|Board|Starter Kit
+- quality: production
+- requires:
+ - name: efr32mg24b210f1536im48
+ - name: brd2703a_config
+- provides:
+ - name: brd2703a_revision
+ - name: brd2703a_a02
+ - name: hardware_board
+ - name: hardware_board_stk
+ - name: hardware_board_has_vcom
+ - name: hardware_board_has_hfxo
+ - name: hardware_board_has_lfxo
+ - name: hardware_board_supports_rf_band_2400
+ - name: hardware_board_supports_1_rf_band
+ - name: hardware_board_default_rf_band
+ - name: hardware_board_default_rf_band_2400
+- recommends:
+ - id: iostream_eusart
+ instance:
+ - vcom
+ - id: bootloader_uart_driver
+ - id: simple_led
+ instance:
+ - led0
+ - led1
+ - id: simple_button
+ instance:
+ - btn0
+ - btn1
+- template_contribution: []
+- define:
+ - name: SL_BOARD_NAME
+ value: '"BRD2703A"'
+ - name: SL_BOARD_REV
+ value: '"A02"'
+- tag:
+ - board:pn:BRD2703
+ - board:variant:A
+ - board:revision:A02
+ - board:device:efr32mg24b210f1536im48
+ - hardware:has:vcom
+ - hardware:has:pti
+ - hardware:has:led:2
+ - hardware:has:button:2
diff --git a/hardware/board/component/brd4109a.slcc b/hardware/board/component/brd4109a.slcc
deleted file mode 100644
index 49fa1f705f..0000000000
--- a/hardware/board/component/brd4109a.slcc
+++ /dev/null
@@ -1,71 +0,0 @@
-!!omap
-- id: brd4109a
-- label: BRD4109A
-- package: platform
-- description: Board support for BRD4109A.
-- category: Platform|Board|Radio Board
-- quality: production
-- requires:
- - name: efr32bg27c230f768im40
- - name: brd4109a_config
- - name: hardware_board_mainboard
-- provides:
- - name: brd4109a
- - name: hardware_board
- - name: hardware_board_rb
- - name: hardware_board_from_stk
- - name: hardware_board_has_si70xx
- - name: hardware_board_has_tempsensor
- - name: hardware_board_has_vcom
- - name: hardware_board_has_spiflash
- - name: hardware_board_has_hfxo
- - name: hardware_board_has_lfxo
- - name: hardware_board_supports_rf_band_2400
- - name: hardware_board_supports_1_rf_band
- - name: hardware_board_default_rf_band
- - name: hardware_board_default_rf_band_2400
-- recommends:
- - id: brd4002a
- - id: iostream_eusart
- instance:
- - vcom
- - id: bootloader_uart_driver
- - id: i2cspm
- instance:
- - sensor
- - id: ls013b7dh03
- - id: memlcd_eusart
- - id: simple_led
- instance:
- - led0
- - led1
- - id: skrhaae010
- - id: simple_button
- instance:
- - btn0
- - btn1
- - id: mx25_flash_shutdown_eusart
- - id: bootloader_spi_controller_usart_driver
- - id: bootloader_spi_peripheral_usart_driver
-- template_contribution:
- - name: board_default_init
- value: sl_board_disable_vcom()
-- define:
- - name: SL_BOARD_NAME
- value: '"BRD4109A"'
- - name: SL_BOARD_REV
- value: '"A00"'
-- tag:
- - board:pn:BRD4109
- - board:variant:A
- - board:revision:A00
- - board:device:efr32bg27c230f768im40
- - hardware:has:vcom
- - hardware:has:pti
- - hardware:has:sensor:si7021
- - hardware:has:display:ls013b7dh03
- - hardware:has:led:2
- - hardware:has:joystick:skrhaae010
- - hardware:has:button:2
- - hardware:has:memory:spi:mx25r8035f
- - hardware:shares:button:led
diff --git a/hardware/board/component/brd4111a.slcc b/hardware/board/component/brd4111a.slcc
deleted file mode 100644
index 6ce7dce110..0000000000
--- a/hardware/board/component/brd4111a.slcc
+++ /dev/null
@@ -1,55 +0,0 @@
-!!omap
-- id: brd4111a
-- label: BRD4111A
-- package: platform
-- description: Board support for BRD4111A.
-- category: Platform|Board|Radio Board
-- quality: production
-- requires:
- - name: efr32bg27c320f768gj39
- - name: brd4111a_config
- - name: hardware_board_mainboard
-- provides:
- - name: brd4111a
- - name: hardware_board
- - name: hardware_board_rb
- - name: hardware_board_from_stk
- - name: hardware_board_has_vcom
- - name: hardware_board_has_spiflash
- - name: hardware_board_has_hfxo
- - name: hardware_board_has_lfxo
- - name: hardware_board_supports_rf_band_2400
- - name: hardware_board_supports_1_rf_band
- - name: hardware_board_default_rf_band
- - name: hardware_board_default_rf_band_2400
-- recommends:
- - id: brd4002a
- - id: iostream_eusart
- instance:
- - vcom
- - id: bootloader_uart_driver
- - id: simple_button
- instance:
- - btn0
- - btn1
- - id: mx25_flash_shutdown_eusart
- - id: bootloader_spi_controller_usart_driver
- - id: bootloader_spi_peripheral_usart_driver
-- template_contribution:
- - name: board_default_init
- value: sl_board_disable_vcom()
-- define:
- - name: SL_BOARD_NAME
- value: '"BRD4111A"'
- - name: SL_BOARD_REV
- value: '"A00"'
-- tag:
- - board:pn:BRD4111
- - board:variant:A
- - board:revision:A00
- - board:device:efr32bg27c320f768gj39
- - hardware:has:vcom
- - hardware:has:pti
- - hardware:has:led:0
- - hardware:has:button:2
- - hardware:has:memory:spi:mx25r8035f
diff --git a/hardware/board/component/brd4113a.slcc b/hardware/board/component/brd4113a.slcc
deleted file mode 100644
index d1b1c0a383..0000000000
--- a/hardware/board/component/brd4113a.slcc
+++ /dev/null
@@ -1,62 +0,0 @@
-!!omap
-- id: brd4113a
-- label: BRD4113A
-- package: platform
-- description: Board support for BRD4113A.
-- category: Platform|Board|Radio Board
-- quality: production
-- requires:
- - name: efr32bg27c230f768im32
- - name: brd4113a_config
- - name: hardware_board_mainboard
-- provides:
- - name: brd4113a
- - name: hardware_board
- - name: hardware_board_rb
- - name: hardware_board_from_stk
- - name: hardware_board_has_vcom
- - name: hardware_board_has_spiflash
- - name: hardware_board_has_hfxo
- - name: hardware_board_has_lfxo
- - name: hardware_board_supports_rf_band_2400
- - name: hardware_board_supports_1_rf_band
- - name: hardware_board_default_rf_band
- - name: hardware_board_default_rf_band_2400
-- recommends:
- - id: brd4002a
- - id: iostream_eusart
- instance:
- - vcom
- - id: bootloader_uart_driver
- - id: simple_led
- instance:
- - led0
- - led1
- - id: skrhaae010
- - id: simple_button
- instance:
- - btn0
- - btn1
- - id: mx25_flash_shutdown_eusart
- - id: bootloader_spi_controller_usart_driver
- - id: bootloader_spi_peripheral_usart_driver
-- template_contribution:
- - name: board_default_init
- value: sl_board_disable_vcom()
-- define:
- - name: SL_BOARD_NAME
- value: '"BRD4113A"'
- - name: SL_BOARD_REV
- value: '"A00"'
-- tag:
- - board:pn:BRD4113
- - board:variant:A
- - board:revision:A00
- - board:device:efr32bg27c230f768im32
- - hardware:has:vcom
- - hardware:has:pti
- - hardware:has:led:2
- - hardware:has:joystick:skrhaae010
- - hardware:has:button:2
- - hardware:has:memory:spi:mx25r8035f
- - hardware:shares:button:led
diff --git a/hardware/board/component/brd4166c.slcc b/hardware/board/component/brd4166c.slcc
new file mode 100644
index 0000000000..6a14dae42a
--- /dev/null
+++ b/hardware/board/component/brd4166c.slcc
@@ -0,0 +1,61 @@
+!!omap
+- id: brd4166c
+- label: BRD4166C
+- package: platform
+- description: Board support for BRD4166C.
+- category: Platform|Board|Thunderboard
+- quality: production
+- requires:
+ - name: efr32mg12p332f1024gl125
+ - name: brd4166c_config
+- provides:
+ - name: brd4166c
+ - name: hardware_board
+ - name: hardware_board_tb
+ - name: hardware_board_from_tb
+ - name: hardware_board_has_si70xx
+ - name: hardware_board_has_tempsensor
+ - name: hardware_board_has_vcom
+ - name: hardware_board_has_spiflash
+ - name: hardware_board_has_hfxo
+ - name: hardware_board_has_lfxo
+ - name: hardware_board_supports_rf_band_2400
+ - name: hardware_board_supports_1_rf_band
+ - name: hardware_board_default_rf_band
+ - name: hardware_board_default_rf_band_2400
+- recommends:
+ - id: iostream_usart
+ instance:
+ - vcom
+ - id: bootloader_uart_driver
+ - id: i2cspm
+ instance:
+ - sensor
+ - id: simple_led
+ instance:
+ - led0
+ - led1
+ - id: simple_button
+ instance:
+ - btn0
+ - btn1
+ - id: mx25_flash_shutdown_usart
+ - id: bootloader_spi_controller_usart_driver
+ - id: bootloader_spi_peripheral_usart_driver
+- template_contribution: []
+- define:
+ - name: SL_BOARD_NAME
+ value: '"BRD4166C"'
+ - name: SL_BOARD_REV
+ value: '"A01"'
+- tag:
+ - board:pn:BRD4166
+ - board:variant:C
+ - board:revision:A01
+ - board:device:efr32mg12p332f1024gl125
+ - hardware:has:vcom
+ - hardware:has:pti
+ - hardware:has:sensor:si7021
+ - hardware:has:led:2
+ - hardware:has:button:2
+ - hardware:has:memory:spi:mx25r8035f
diff --git a/hardware/board/component/brd4196a_a06.slcc b/hardware/board/component/brd4196a_a06.slcc
new file mode 100644
index 0000000000..43c58efb6a
--- /dev/null
+++ b/hardware/board/component/brd4196a_a06.slcc
@@ -0,0 +1,60 @@
+!!omap
+- id: brd4196a_a06
+- label: BRD4196A rev A06
+- package: platform
+- description: Board support for BRD4196A.
+- category: Platform|Board|Radio Board
+- quality: production
+- requires:
+ - name: efr32mg21b020f1024im32
+ - name: brd4196a_config
+ - name: hardware_board_mainboard
+- provides:
+ - name: brd4196a_revision
+ - name: brd4196a_a06
+ - name: hardware_board
+ - name: hardware_board_rb
+ - name: hardware_board_has_vcom
+ - name: hardware_board_has_hfxo
+ - name: hardware_board_has_lfxo
+ - name: hardware_board_supports_rf_band_2400
+ - name: hardware_board_supports_1_rf_band
+ - name: hardware_board_default_rf_band
+ - name: hardware_board_default_rf_band_2400
+- recommends:
+ - id: brd4001a
+ - id: iostream_usart
+ instance:
+ - vcom
+ - id: bootloader_uart_driver
+ - id: ls013b7dh03
+ - id: memlcd_usart
+ - id: simple_led
+ instance:
+ - led0
+ - led1
+ - id: skrhaae010
+ - id: simple_button
+ instance:
+ - btn0
+ - btn1
+ - id: bootloader_spi_peripheral_usart_driver
+- template_contribution:
+ - name: board_default_init
+ value: sl_board_disable_vcom()
+- define:
+ - name: SL_BOARD_NAME
+ value: '"BRD4196A"'
+ - name: SL_BOARD_REV
+ value: '"A06"'
+- tag:
+ - board:pn:BRD4196
+ - board:variant:A
+ - board:revision:A06
+ - board:device:efr32mg21b020f1024im32
+ - hardware:has:vcom
+ - hardware:has:pti
+ - hardware:has:display:ls013b7dh03
+ - hardware:has:led:2
+ - hardware:has:joystick:skrhaae010
+ - hardware:has:button:2
diff --git a/hardware/board/component/brd4270b.slcc b/hardware/board/component/brd4270b.slcc
index c30e28dbc7..dcecc0cf04 100644
--- a/hardware/board/component/brd4270b.slcc
+++ b/hardware/board/component/brd4270b.slcc
@@ -14,6 +14,7 @@
- name: hardware_board
- name: hardware_board_rb
- name: hardware_board_from_stk
+ - name: hardware_board_from_fg25-pk6011a
- name: hardware_board_from_fg25-rb4270b
- name: hardware_board_has_vcom
- name: hardware_board_has_spiflash
@@ -50,11 +51,11 @@
- name: SL_BOARD_NAME
value: '"BRD4270B"'
- name: SL_BOARD_REV
- value: '"A00"'
+ value: '"A04"'
- tag:
- board:pn:BRD4270
- board:variant:B
- - board:revision:A00
+ - board:revision:A04
- board:device:efr32fg25b222f1920im56
- hardware:has:vcom
- hardware:has:pti
diff --git a/hardware/board/component/brd4271a.slcc b/hardware/board/component/brd4271a.slcc
index 9bcb65504f..26d4e94a2f 100644
--- a/hardware/board/component/brd4271a.slcc
+++ b/hardware/board/component/brd4271a.slcc
@@ -14,6 +14,7 @@
- name: hardware_board
- name: hardware_board_rb
- name: hardware_board_from_stk
+ - name: hardware_board_from_fg25-pk6012a
- name: hardware_board_from_fg25-rb4271a
- name: hardware_board_has_vcom
- name: hardware_board_has_spiflash
@@ -50,11 +51,11 @@
- name: SL_BOARD_NAME
value: '"BRD4271A"'
- name: SL_BOARD_REV
- value: '"A01"'
+ value: '"A04"'
- tag:
- board:pn:BRD4271
- board:variant:A
- - board:revision:A01
+ - board:revision:A04
- board:device:efr32fg25b222f1920im56
- hardware:has:vcom
- hardware:has:pti
diff --git a/hardware/board/component/brd4272a.slcc b/hardware/board/component/brd4272a.slcc
index 537c691563..023184ae48 100644
--- a/hardware/board/component/brd4272a.slcc
+++ b/hardware/board/component/brd4272a.slcc
@@ -14,8 +14,6 @@
- name: hardware_board
- name: hardware_board_rb
- name: hardware_board_from_stk
- - name: hardware_board_has_si70xx
- - name: hardware_board_has_tempsensor
- name: hardware_board_has_vcom
- name: hardware_board_has_spiflash
- name: hardware_board_has_hfxo
@@ -30,9 +28,6 @@
instance:
- vcom
- id: bootloader_euart_driver
- - id: i2cspm
- instance:
- - sensor
- id: ls013b7dh03
- id: memlcd_eusart
- id: simple_led
@@ -62,7 +57,6 @@
- board:device:efr32fg25b222f1920im56
- hardware:has:vcom
- hardware:has:pti
- - hardware:has:sensor:si7021
- hardware:has:display:ls013b7dh03
- hardware:has:led:2
- hardware:has:button:2
diff --git a/hardware/board/component/brd4273a.slcc b/hardware/board/component/brd4273a.slcc
index 6a3ee1340f..82d30bd8c0 100644
--- a/hardware/board/component/brd4273a.slcc
+++ b/hardware/board/component/brd4273a.slcc
@@ -51,11 +51,11 @@
- name: SL_BOARD_NAME
value: '"BRD4273A"'
- name: SL_BOARD_REV
- value: '"A03"'
+ value: '"A05"'
- tag:
- board:pn:BRD4273
- board:variant:A
- - board:revision:A03
+ - board:revision:A05
- board:device:efr32fg25b222f1920im56
- hardware:has:vcom
- hardware:has:pti
diff --git a/hardware/board/component/brd4274a.slcc b/hardware/board/component/brd4274a.slcc
new file mode 100644
index 0000000000..84efdfa66b
--- /dev/null
+++ b/hardware/board/component/brd4274a.slcc
@@ -0,0 +1,67 @@
+!!omap
+- id: brd4274a
+- label: BRD4274A
+- package: platform
+- description: Board support for BRD4274A.
+- category: Platform|Board|Radio Board
+- quality: production
+- requires:
+ - name: efr32fg25b222f1920im56
+ - name: brd4274a_config
+ - name: hardware_board_mainboard
+- provides:
+ - name: brd4274a
+ - name: hardware_board
+ - name: hardware_board_rb
+ - name: hardware_board_from_stk
+ - name: hardware_board_from_fg25-rb4274a
+ - name: hardware_board_has_vcom
+ - name: hardware_board_has_spiflash
+ - name: hardware_board_has_eff
+ - name: hardware_board_has_hfxo
+ - name: hardware_board_has_lfxo
+ - name: hardware_board_supports_rf_band_868
+ - name: hardware_board_supports_1_rf_band
+ - name: hardware_board_default_rf_band
+ - name: hardware_board_default_rf_band_868
+- recommends:
+ - id: brd4002a
+ - id: iostream_eusart
+ instance:
+ - vcom
+ - id: bootloader_euart_driver
+ - id: ls013b7dh03
+ - id: memlcd_eusart
+ - id: simple_led
+ instance:
+ - led0
+ - led1
+ - id: simple_button
+ instance:
+ - btn0
+ - btn1
+ - id: usb_device_driver_dwc_otg_fs
+ - id: mx25_flash_shutdown_eusart
+ - id: bootloader_spi_controller_eusart_driver
+ - id: bootloader_spi_peripheral_eusart_driver
+- template_contribution:
+ - name: board_default_init
+ value: sl_board_disable_vcom()
+- define:
+ - name: SL_BOARD_NAME
+ value: '"BRD4274A"'
+ - name: SL_BOARD_REV
+ value: '"A02"'
+- tag:
+ - board:pn:BRD4274
+ - board:variant:A
+ - board:revision:A02
+ - board:device:efr32fg25b222f1920im56
+ - hardware:has:vcom
+ - hardware:has:pti
+ - hardware:has:display:ls013b7dh03
+ - hardware:has:led:2
+ - hardware:has:button:2
+ - hardware:has:usb
+ - hardware:has:memory:spi:mx25r8035f
+ - hardware:has:radio:eff
diff --git a/hardware/board/component/brd4316a.slcc b/hardware/board/component/brd4316a.slcc
index 238bcaa4d0..c4feeaa097 100644
--- a/hardware/board/component/brd4316a.slcc
+++ b/hardware/board/component/brd4316a.slcc
@@ -53,11 +53,11 @@
- name: SL_BOARD_NAME
value: '"BRD4316A"'
- name: SL_BOARD_REV
- value: '"A01"'
+ value: '"A02"'
- tag:
- board:pn:BRD4316
- board:variant:A
- - board:revision:A01
+ - board:revision:A02
- board:device:mgm240pb22vna
- hardware:has:vcom
- hardware:has:pti
diff --git a/hardware/board/component/brd4317a.slcc b/hardware/board/component/brd4317a.slcc
index 3908cbee06..a1dce009ec 100644
--- a/hardware/board/component/brd4317a.slcc
+++ b/hardware/board/component/brd4317a.slcc
@@ -53,11 +53,11 @@
- name: SL_BOARD_NAME
value: '"BRD4317A"'
- name: SL_BOARD_REV
- value: '"A01"'
+ value: '"A03"'
- tag:
- board:pn:BRD4317
- board:variant:A
- - board:revision:A01
+ - board:revision:A03
- board:device:mgm240pb32vna
- hardware:has:vcom
- hardware:has:pti
diff --git a/hardware/board/component/brd4328a.slcc b/hardware/board/component/brd4328a.slcc
index 505ae368ff..7dcf6e6270 100644
--- a/hardware/board/component/brd4328a.slcc
+++ b/hardware/board/component/brd4328a.slcc
@@ -56,11 +56,11 @@
- name: SL_BOARD_NAME
value: '"BRD4328A"'
- name: SL_BOARD_REV
- value: '"A00"'
+ value: '"A01"'
- tag:
- board:pn:BRD4328
- board:variant:A
- - board:revision:A00
+ - board:revision:A01
- board:device:fgm230sb27hgn
- hardware:has:vcom
- hardware:has:pti
diff --git a/hardware/board/component/fg25-rb4270b.slcc b/hardware/board/component/fg25-rb4270b.slcc
index aef8b7aacf..c762b527cd 100644
--- a/hardware/board/component/fg25-rb4270b.slcc
+++ b/hardware/board/component/fg25-rb4270b.slcc
@@ -14,9 +14,9 @@
- name: SL_KIT_NAME
value: '"FG25-RB4270B"'
- name: SL_KIT_REV
- value: '"A00"'
+ value: '"A02"'
- tag:
- kit:opn:FG25-RB4270B
- kit:pn:RB4270
- kit:variant:B
- - kit:revision:A00
+ - kit:revision:A02
diff --git a/hardware/board/component/fg25-rb4271a.slcc b/hardware/board/component/fg25-rb4271a.slcc
index 5c1223cef0..a9474b9423 100644
--- a/hardware/board/component/fg25-rb4271a.slcc
+++ b/hardware/board/component/fg25-rb4271a.slcc
@@ -14,9 +14,9 @@
- name: SL_KIT_NAME
value: '"FG25-RB4271A"'
- name: SL_KIT_REV
- value: '"A00"'
+ value: '"A01"'
- tag:
- kit:opn:FG25-RB4271A
- kit:pn:RB4271
- kit:variant:A
- - kit:revision:A00
+ - kit:revision:A01
diff --git a/hardware/board/component/fg25-rb4273a.slcc b/hardware/board/component/fg25-rb4273a.slcc
index e4e037a656..4e2e2f5b7d 100644
--- a/hardware/board/component/fg25-rb4273a.slcc
+++ b/hardware/board/component/fg25-rb4273a.slcc
@@ -14,9 +14,9 @@
- name: SL_KIT_NAME
value: '"FG25-RB4273A"'
- name: SL_KIT_REV
- value: '"A00"'
+ value: '"A02"'
- tag:
- kit:opn:FG25-RB4273A
- kit:pn:RB4273
- kit:variant:A
- - kit:revision:A00
+ - kit:revision:A02
diff --git a/hardware/board/component/fg25-rb4274a.slcc b/hardware/board/component/fg25-rb4274a.slcc
new file mode 100644
index 0000000000..f61bece989
--- /dev/null
+++ b/hardware/board/component/fg25-rb4274a.slcc
@@ -0,0 +1,22 @@
+!!omap
+- id: fg25_rb4274a
+- label: FG25-RB4274A
+- package: platform
+- description: Kit BSP support for the EFR32FG25+EFF01 863-870 MHz +30 dBm Radio Board.
+- category: Platform|Board|Kit|Radio Board
+- quality: production
+- requires:
+ - name: hardware_board_from_fg25-rb4274a
+- provides:
+ - name: hardware_kit
+ - name: hardware_kit_rb
+- define:
+ - name: SL_KIT_NAME
+ value: '"FG25-RB4274A"'
+ - name: SL_KIT_REV
+ value: '"A01"'
+- tag:
+ - kit:opn:FG25-RB4274A
+ - kit:pn:RB4274
+ - kit:variant:A
+ - kit:revision:A01
diff --git a/hardware/board/component/sltb010a.slcc b/hardware/board/component/sltb010a.slcc
index 61ce847c49..a0dc63af42 100644
--- a/hardware/board/component/sltb010a.slcc
+++ b/hardware/board/component/sltb010a.slcc
@@ -14,9 +14,9 @@
- name: SL_KIT_NAME
value: '"SLTB010A"'
- name: SL_KIT_REV
- value: '"A03"'
+ value: '"A04"'
- tag:
- kit:opn:SLTB010A
- kit:pn:TB010
- kit:variant:A
- - kit:revision:A03
+ - kit:revision:A04
diff --git a/hardware/board/component/xg24-ek2703a.slcc b/hardware/board/component/xg24-ek2703a.slcc
new file mode 100644
index 0000000000..164a5b898a
--- /dev/null
+++ b/hardware/board/component/xg24-ek2703a.slcc
@@ -0,0 +1,22 @@
+!!omap
+- id: xg24_ek2703a
+- label: XG24-EK2703A
+- package: platform
+- description: Kit BSP support for the xG24 Explorer Kit.
+- category: Platform|Board|Kit|Explorer Kit
+- quality: production
+- requires:
+ - name: hardware_board_from_xg24-ek2703a
+- provides:
+ - name: hardware_kit
+ - name: hardware_kit_ek
+- define:
+ - name: SL_KIT_NAME
+ value: '"XG24-EK2703A"'
+ - name: SL_KIT_REV
+ value: '"A00"'
+- tag:
+ - kit:opn:xG24-EK2703A
+ - kit:pn:EK2703
+ - kit:variant:A
+ - kit:revision:A00
diff --git a/hardware/board/component/xgm240-rb4316a.slcc b/hardware/board/component/xgm240-rb4316a.slcc
index 80f4823809..c5fb646886 100644
--- a/hardware/board/component/xgm240-rb4316a.slcc
+++ b/hardware/board/component/xgm240-rb4316a.slcc
@@ -14,9 +14,9 @@
- name: SL_KIT_NAME
value: '"XGM240-RB4316A"'
- name: SL_KIT_REV
- value: '"A01"'
+ value: '"A03"'
- tag:
- kit:opn:xGM240-RB4316A
- kit:pn:RB4316
- kit:variant:A
- - kit:revision:A01
+ - kit:revision:A03
diff --git a/hardware/board/component/xgm240-rb4317a.slcc b/hardware/board/component/xgm240-rb4317a.slcc
index 0f52ca016b..81f9263537 100644
--- a/hardware/board/component/xgm240-rb4317a.slcc
+++ b/hardware/board/component/xgm240-rb4317a.slcc
@@ -14,9 +14,9 @@
- name: SL_KIT_NAME
value: '"XGM240-RB4317A"'
- name: SL_KIT_REV
- value: '"A01"'
+ value: '"A03"'
- tag:
- kit:opn:xGM240-RB4317A
- kit:pn:RB4317
- kit:variant:A
- - kit:revision:A01
+ - kit:revision:A03
diff --git a/hardware/board/component/zgm230-dk2603a.slcc b/hardware/board/component/zgm230-dk2603a.slcc
new file mode 100644
index 0000000000..cf24144d81
--- /dev/null
+++ b/hardware/board/component/zgm230-dk2603a.slcc
@@ -0,0 +1,22 @@
+!!omap
+- id: zgm230_dk2603a
+- label: ZGM230-DK2603A
+- package: platform
+- description: Kit BSP support for the Z-Wave 800 Dev Kit.
+- category: Platform|Board|Kit|Development Kit
+- quality: production
+- requires:
+ - name: hardware_board_from_zgm230-dk2603a
+- provides:
+ - name: hardware_kit
+ - name: hardware_kit_dk
+- define:
+ - name: SL_KIT_NAME
+ value: '"ZGM230-DK2603A"'
+ - name: SL_KIT_REV
+ value: '"A01"'
+- tag:
+ - kit:opn:ZGM230-DK2603A
+ - kit:pn:DK2603
+ - kit:variant:A
+ - kit:revision:A01
diff --git a/hardware/board/config/brd2207a/sl_simple_rgb_pwm_led_inst0_config.h b/hardware/board/config/brd2207a/sl_simple_rgb_pwm_led_inst0_config.h
deleted file mode 100644
index 226c7cda9e..0000000000
--- a/hardware/board/config/brd2207a/sl_simple_rgb_pwm_led_inst0_config.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/***************************************************************************//**
- * @file
- * @brief Simple RGB PWM Led Driver Configuration
- *******************************************************************************
- * # License
- * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
- *******************************************************************************
- *
- * The licensor of this software is Silicon Laboratories Inc. Your use of this
- * software is governed by the terms of Silicon Labs Master Software License
- * Agreement (MSLA) available at
- * www.silabs.com/about-us/legal/master-software-license-agreement. This
- * software is distributed to you in Source Code format and is governed by the
- * sections of the MSLA applicable to Source Code.
- *
- ******************************************************************************/
-
-#ifndef SL_SIMPLE_RGB_PWM_LED_INST0_CONFIG_H
-#define SL_SIMPLE_RGB_PWM_LED_INST0_CONFIG_H
-
-// <<< Use Configuration Wizard in Context Menu >>>
-
-// Simple RGB PWM LED Configuration
-// PWM frequency [Hz]
-// Sets the frequency of the PWM signal
-// 0 = Don't care
-// Default: 10000
-#define SL_SIMPLE_RGB_PWM_LED_INST0_FREQUENCY 10000
-
-// PWM resolution <2-65536>
-// Specifies the PWM (dimming) resolution. I.e. if you want a
-// dimming resolution that takes the input values from 0 to 99,
-// set this value to 100
-// Default: 256
-#define SL_SIMPLE_RGB_PWM_LED_INST0_RESOLUTION 256
-
-// Red LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_INST0_RED_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-
-// Green LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_INST0_GREEN_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-
-// Blue LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_INST0_BLUE_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-// end led configuration
-
-// <<< end of configuration section >>>
-
-// <<< sl:start pin_tool >>>
-
-// SL_SIMPLE_RGB_PWM_LED_INST0
-// $[TIMER_SL_SIMPLE_RGB_PWM_LED_INST0]
-#define SL_SIMPLE_RGB_PWM_LED_INST0_PERIPHERAL TIMER2
-#define SL_SIMPLE_RGB_PWM_LED_INST0_PERIPHERAL_NO 2
-
-#define SL_SIMPLE_RGB_PWM_LED_INST0_RED_CHANNEL 0
-// TIMER2 CC0 on PA12
-#define SL_SIMPLE_RGB_PWM_LED_INST0_RED_PORT gpioPortA
-#define SL_SIMPLE_RGB_PWM_LED_INST0_RED_PIN 12
-#define SL_SIMPLE_RGB_PWM_LED_INST0_RED_LOC 1
-
-#define SL_SIMPLE_RGB_PWM_LED_INST0_GREEN_CHANNEL 2
-// TIMER2 CC2 on PA14
-#define SL_SIMPLE_RGB_PWM_LED_INST0_GREEN_PORT gpioPortA
-#define SL_SIMPLE_RGB_PWM_LED_INST0_GREEN_PIN 14
-#define SL_SIMPLE_RGB_PWM_LED_INST0_GREEN_LOC 1
-
-#define SL_SIMPLE_RGB_PWM_LED_INST0_BLUE_CHANNEL 1
-// TIMER2 CC1 on PA13
-#define SL_SIMPLE_RGB_PWM_LED_INST0_BLUE_PORT gpioPortA
-#define SL_SIMPLE_RGB_PWM_LED_INST0_BLUE_PIN 13
-#define SL_SIMPLE_RGB_PWM_LED_INST0_BLUE_LOC 1
-
-// [TIMER_SL_SIMPLE_RGB_PWM_LED_INST0]$
-
-// <<< sl:end pin_tool >>>
-
-#endif // SL_SIMPLE_RGB_PWM_LED_INST0_CONFIG_H
diff --git a/hardware/board/config/brd2207a/sl_simple_rgb_pwm_led_inst1_config.h b/hardware/board/config/brd2207a/sl_simple_rgb_pwm_led_inst1_config.h
deleted file mode 100644
index 698767386a..0000000000
--- a/hardware/board/config/brd2207a/sl_simple_rgb_pwm_led_inst1_config.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/***************************************************************************//**
- * @file
- * @brief Simple RGB PWM Led Driver Configuration
- *******************************************************************************
- * # License
- * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
- *******************************************************************************
- *
- * The licensor of this software is Silicon Laboratories Inc. Your use of this
- * software is governed by the terms of Silicon Labs Master Software License
- * Agreement (MSLA) available at
- * www.silabs.com/about-us/legal/master-software-license-agreement. This
- * software is distributed to you in Source Code format and is governed by the
- * sections of the MSLA applicable to Source Code.
- *
- ******************************************************************************/
-
-#ifndef SL_SIMPLE_RGB_PWM_LED_INST1_CONFIG_H
-#define SL_SIMPLE_RGB_PWM_LED_INST1_CONFIG_H
-
-// <<< Use Configuration Wizard in Context Menu >>>
-
-// Simple RGB PWM LED Configuration
-// PWM frequency [Hz]
-// Sets the frequency of the PWM signal
-// 0 = Don't care
-// Default: 10000
-#define SL_SIMPLE_RGB_PWM_LED_INST1_FREQUENCY 10000
-
-// PWM resolution <2-65536>
-// Specifies the PWM (dimming) resolution. I.e. if you want a
-// dimming resolution that takes the input values from 0 to 99,
-// set this value to 100
-// Default: 256
-#define SL_SIMPLE_RGB_PWM_LED_INST1_RESOLUTION 256
-
-// Red LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_INST1_RED_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-
-// Green LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_INST1_GREEN_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-
-// Blue LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_INST1_BLUE_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-// end led configuration
-
-// <<< end of configuration section >>>
-
-// <<< sl:start pin_tool >>>
-
-// SL_SIMPLE_RGB_PWM_LED_INST1
-// $[TIMER_SL_SIMPLE_RGB_PWM_LED_INST1]
-#define SL_SIMPLE_RGB_PWM_LED_INST1_PERIPHERAL TIMER1
-#define SL_SIMPLE_RGB_PWM_LED_INST1_PERIPHERAL_NO 1
-
-#define SL_SIMPLE_RGB_PWM_LED_INST1_RED_CHANNEL 0
-// TIMER1 CC0 on PD6
-#define SL_SIMPLE_RGB_PWM_LED_INST1_RED_PORT gpioPortD
-#define SL_SIMPLE_RGB_PWM_LED_INST1_RED_PIN 6
-#define SL_SIMPLE_RGB_PWM_LED_INST1_RED_LOC 4
-
-#define SL_SIMPLE_RGB_PWM_LED_INST1_GREEN_CHANNEL 3
-// TIMER1 CC3 on PF12
-#define SL_SIMPLE_RGB_PWM_LED_INST1_GREEN_PORT gpioPortF
-#define SL_SIMPLE_RGB_PWM_LED_INST1_GREEN_PIN 12
-#define SL_SIMPLE_RGB_PWM_LED_INST1_GREEN_LOC 5
-
-#define SL_SIMPLE_RGB_PWM_LED_INST1_BLUE_CHANNEL 2
-// TIMER1 CC2 on PE12
-#define SL_SIMPLE_RGB_PWM_LED_INST1_BLUE_PORT gpioPortE
-#define SL_SIMPLE_RGB_PWM_LED_INST1_BLUE_PIN 12
-#define SL_SIMPLE_RGB_PWM_LED_INST1_BLUE_LOC 1
-
-// [TIMER_SL_SIMPLE_RGB_PWM_LED_INST1]$
-
-// <<< sl:end pin_tool >>>
-
-#endif // SL_SIMPLE_RGB_PWM_LED_INST1_CONFIG_H
diff --git a/hardware/board/config/brd2207a/sl_simple_rgb_pwm_led_rgb_led0_config.h b/hardware/board/config/brd2207a/sl_simple_rgb_pwm_led_rgb_led0_config.h
new file mode 100644
index 0000000000..e693862df1
--- /dev/null
+++ b/hardware/board/config/brd2207a/sl_simple_rgb_pwm_led_rgb_led0_config.h
@@ -0,0 +1,87 @@
+/***************************************************************************//**
+ * @file
+ * @brief Simple RGB PWM Led Driver Configuration
+ *******************************************************************************
+ * # License
+ * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * The licensor of this software is Silicon Laboratories Inc. Your use of this
+ * software is governed by the terms of Silicon Labs Master Software License
+ * Agreement (MSLA) available at
+ * www.silabs.com/about-us/legal/master-software-license-agreement. This
+ * software is distributed to you in Source Code format and is governed by the
+ * sections of the MSLA applicable to Source Code.
+ *
+ ******************************************************************************/
+
+#ifndef SL_SIMPLE_RGB_PWM_LED_RGB_LED0_CONFIG_H
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_CONFIG_H
+
+// <<< Use Configuration Wizard in Context Menu >>>
+
+// Simple RGB PWM LED Configuration
+// PWM frequency [Hz]
+// Sets the frequency of the PWM signal
+// 0 = Don't care
+// Default: 10000
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_FREQUENCY 10000
+
+// PWM resolution <2-65536>
+// Specifies the PWM (dimming) resolution. I.e. if you want a
+// dimming resolution that takes the input values from 0 to 99,
+// set this value to 100
+// Default: 256
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_RESOLUTION 256
+
+// Red LED Polarity
+// Active low
+// Active high
+// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_RED_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+
+// Green LED Polarity
+// Active low
+// Active high
+// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_GREEN_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+
+// Blue LED Polarity
+// Active low
+// Active high
+// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_BLUE_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+// end led configuration
+
+// <<< end of configuration section >>>
+
+// <<< sl:start pin_tool >>>
+
+// SL_SIMPLE_RGB_PWM_LED_RGB_LED0
+// $[TIMER_SL_SIMPLE_RGB_PWM_LED_RGB_LED0]
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_PERIPHERAL TIMER2
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_PERIPHERAL_NO 2
+
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_RED_CHANNEL 0
+// TIMER2 CC0 on PA12
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_RED_PORT gpioPortA
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_RED_PIN 12
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_RED_LOC 1
+
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_GREEN_CHANNEL 2
+// TIMER2 CC2 on PA14
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_GREEN_PORT gpioPortA
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_GREEN_PIN 14
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_GREEN_LOC 1
+
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_BLUE_CHANNEL 1
+// TIMER2 CC1 on PA13
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_BLUE_PORT gpioPortA
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_BLUE_PIN 13
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_BLUE_LOC 1
+
+// [TIMER_SL_SIMPLE_RGB_PWM_LED_RGB_LED0]$
+
+// <<< sl:end pin_tool >>>
+
+#endif // SL_SIMPLE_RGB_PWM_LED_RGB_LED0_CONFIG_H
diff --git a/hardware/board/config/brd2207a/sl_simple_rgb_pwm_led_rgb_led1_config.h b/hardware/board/config/brd2207a/sl_simple_rgb_pwm_led_rgb_led1_config.h
new file mode 100644
index 0000000000..47ef6ac63f
--- /dev/null
+++ b/hardware/board/config/brd2207a/sl_simple_rgb_pwm_led_rgb_led1_config.h
@@ -0,0 +1,87 @@
+/***************************************************************************//**
+ * @file
+ * @brief Simple RGB PWM Led Driver Configuration
+ *******************************************************************************
+ * # License
+ * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * The licensor of this software is Silicon Laboratories Inc. Your use of this
+ * software is governed by the terms of Silicon Labs Master Software License
+ * Agreement (MSLA) available at
+ * www.silabs.com/about-us/legal/master-software-license-agreement. This
+ * software is distributed to you in Source Code format and is governed by the
+ * sections of the MSLA applicable to Source Code.
+ *
+ ******************************************************************************/
+
+#ifndef SL_SIMPLE_RGB_PWM_LED_RGB_LED1_CONFIG_H
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED1_CONFIG_H
+
+// <<< Use Configuration Wizard in Context Menu >>>
+
+// Simple RGB PWM LED Configuration
+// PWM frequency [Hz]
+// Sets the frequency of the PWM signal
+// 0 = Don't care
+// Default: 10000
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED1_FREQUENCY 10000
+
+// PWM resolution <2-65536>
+// Specifies the PWM (dimming) resolution. I.e. if you want a
+// dimming resolution that takes the input values from 0 to 99,
+// set this value to 100
+// Default: 256
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED1_RESOLUTION 256
+
+// Red LED Polarity
+// Active low
+// Active high
+// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED1_RED_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+
+// Green LED Polarity
+// Active low
+// Active high
+// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED1_GREEN_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+
+// Blue LED Polarity
+// Active low
+// Active high
+// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED1_BLUE_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+// end led configuration
+
+// <<< end of configuration section >>>
+
+// <<< sl:start pin_tool >>>
+
+// SL_SIMPLE_RGB_PWM_LED_RGB_LED1
+// $[TIMER_SL_SIMPLE_RGB_PWM_LED_RGB_LED1]
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED1_PERIPHERAL TIMER1
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED1_PERIPHERAL_NO 1
+
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED1_RED_CHANNEL 0
+// TIMER1 CC0 on PD6
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED1_RED_PORT gpioPortD
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED1_RED_PIN 6
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED1_RED_LOC 4
+
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED1_GREEN_CHANNEL 3
+// TIMER1 CC3 on PF12
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED1_GREEN_PORT gpioPortF
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED1_GREEN_PIN 12
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED1_GREEN_LOC 5
+
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED1_BLUE_CHANNEL 2
+// TIMER1 CC2 on PE12
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED1_BLUE_PORT gpioPortE
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED1_BLUE_PIN 12
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED1_BLUE_LOC 1
+
+// [TIMER_SL_SIMPLE_RGB_PWM_LED_RGB_LED1]$
+
+// <<< sl:end pin_tool >>>
+
+#endif // SL_SIMPLE_RGB_PWM_LED_RGB_LED1_CONFIG_H
diff --git a/hardware/board/config/brd2601a/sl_simple_rgb_pwm_led_inst0_config.h b/hardware/board/config/brd2601a/sl_simple_rgb_pwm_led_inst0_config.h
deleted file mode 100644
index 86f935c369..0000000000
--- a/hardware/board/config/brd2601a/sl_simple_rgb_pwm_led_inst0_config.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/***************************************************************************//**
- * @file
- * @brief Simple RGB PWM Led Driver Configuration
- *******************************************************************************
- * # License
- * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
- *******************************************************************************
- *
- * The licensor of this software is Silicon Laboratories Inc. Your use of this
- * software is governed by the terms of Silicon Labs Master Software License
- * Agreement (MSLA) available at
- * www.silabs.com/about-us/legal/master-software-license-agreement. This
- * software is distributed to you in Source Code format and is governed by the
- * sections of the MSLA applicable to Source Code.
- *
- ******************************************************************************/
-
-#ifndef SL_SIMPLE_RGB_PWM_LED_INST0_CONFIG_H
-#define SL_SIMPLE_RGB_PWM_LED_INST0_CONFIG_H
-
-// <<< Use Configuration Wizard in Context Menu >>>
-
-// Simple RGB PWM LED Configuration
-// PWM frequency [Hz]
-// Sets the frequency of the PWM signal
-// 0 = Don't care
-// Default: 10000
-#define SL_SIMPLE_RGB_PWM_LED_INST0_FREQUENCY 10000
-
-// PWM resolution <2-65536>
-// Specifies the PWM (dimming) resolution. I.e. if you want a
-// dimming resolution that takes the input values from 0 to 99,
-// set this value to 100
-// Default: 256
-#define SL_SIMPLE_RGB_PWM_LED_INST0_RESOLUTION 256
-
-// Red LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_INST0_RED_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-
-// Green LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_INST0_GREEN_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-
-// Blue LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_INST0_BLUE_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-// end led configuration
-
-// <<< end of configuration section >>>
-
-// <<< sl:start pin_tool >>>
-
-// SL_SIMPLE_RGB_PWM_LED_INST0
-// $[TIMER_SL_SIMPLE_RGB_PWM_LED_INST0]
-#define SL_SIMPLE_RGB_PWM_LED_INST0_PERIPHERAL TIMER0
-#define SL_SIMPLE_RGB_PWM_LED_INST0_PERIPHERAL_NO 0
-
-#define SL_SIMPLE_RGB_PWM_LED_INST0_RED_CHANNEL 0
-// TIMER0 CC0 on PD02
-#define SL_SIMPLE_RGB_PWM_LED_INST0_RED_PORT gpioPortD
-#define SL_SIMPLE_RGB_PWM_LED_INST0_RED_PIN 2
-
-#define SL_SIMPLE_RGB_PWM_LED_INST0_GREEN_CHANNEL 1
-// TIMER0 CC1 on PA04
-#define SL_SIMPLE_RGB_PWM_LED_INST0_GREEN_PORT gpioPortA
-#define SL_SIMPLE_RGB_PWM_LED_INST0_GREEN_PIN 4
-
-#define SL_SIMPLE_RGB_PWM_LED_INST0_BLUE_CHANNEL 2
-// TIMER0 CC2 on PB00
-#define SL_SIMPLE_RGB_PWM_LED_INST0_BLUE_PORT gpioPortB
-#define SL_SIMPLE_RGB_PWM_LED_INST0_BLUE_PIN 0
-
-// [TIMER_SL_SIMPLE_RGB_PWM_LED_INST0]$
-
-// <<< sl:end pin_tool >>>
-
-#endif // SL_SIMPLE_RGB_PWM_LED_INST0_CONFIG_H
diff --git a/hardware/board/config/brd2601a/sl_simple_rgb_pwm_led_rgb_led0_config.h b/hardware/board/config/brd2601a/sl_simple_rgb_pwm_led_rgb_led0_config.h
new file mode 100644
index 0000000000..c4ad32ebd8
--- /dev/null
+++ b/hardware/board/config/brd2601a/sl_simple_rgb_pwm_led_rgb_led0_config.h
@@ -0,0 +1,84 @@
+/***************************************************************************//**
+ * @file
+ * @brief Simple RGB PWM Led Driver Configuration
+ *******************************************************************************
+ * # License
+ * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * The licensor of this software is Silicon Laboratories Inc. Your use of this
+ * software is governed by the terms of Silicon Labs Master Software License
+ * Agreement (MSLA) available at
+ * www.silabs.com/about-us/legal/master-software-license-agreement. This
+ * software is distributed to you in Source Code format and is governed by the
+ * sections of the MSLA applicable to Source Code.
+ *
+ ******************************************************************************/
+
+#ifndef SL_SIMPLE_RGB_PWM_LED_RGB_LED0_CONFIG_H
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_CONFIG_H
+
+// <<< Use Configuration Wizard in Context Menu >>>
+
+// Simple RGB PWM LED Configuration
+// PWM frequency [Hz]
+// Sets the frequency of the PWM signal
+// 0 = Don't care
+// Default: 10000
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_FREQUENCY 10000
+
+// PWM resolution <2-65536>
+// Specifies the PWM (dimming) resolution. I.e. if you want a
+// dimming resolution that takes the input values from 0 to 99,
+// set this value to 100
+// Default: 256
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_RESOLUTION 256
+
+// Red LED Polarity
+// Active low
+// Active high
+// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_RED_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+
+// Green LED Polarity
+// Active low
+// Active high
+// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_GREEN_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+
+// Blue LED Polarity
+// Active low
+// Active high
+// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_BLUE_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+// end led configuration
+
+// <<< end of configuration section >>>
+
+// <<< sl:start pin_tool >>>
+
+// SL_SIMPLE_RGB_PWM_LED_RGB_LED0
+// $[TIMER_SL_SIMPLE_RGB_PWM_LED_RGB_LED0]
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_PERIPHERAL TIMER0
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_PERIPHERAL_NO 0
+
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_RED_CHANNEL 0
+// TIMER0 CC0 on PD02
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_RED_PORT gpioPortD
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_RED_PIN 2
+
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_GREEN_CHANNEL 1
+// TIMER0 CC1 on PA04
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_GREEN_PORT gpioPortA
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_GREEN_PIN 4
+
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_BLUE_CHANNEL 2
+// TIMER0 CC2 on PB00
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_BLUE_PORT gpioPortB
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_BLUE_PIN 0
+
+// [TIMER_SL_SIMPLE_RGB_PWM_LED_RGB_LED0]$
+
+// <<< sl:end pin_tool >>>
+
+#endif // SL_SIMPLE_RGB_PWM_LED_RGB_LED0_CONFIG_H
diff --git a/hardware/board/config/brd2601b/sl_simple_rgb_pwm_led_inst0_config.h b/hardware/board/config/brd2601b/sl_simple_rgb_pwm_led_inst0_config.h
deleted file mode 100644
index 86f935c369..0000000000
--- a/hardware/board/config/brd2601b/sl_simple_rgb_pwm_led_inst0_config.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/***************************************************************************//**
- * @file
- * @brief Simple RGB PWM Led Driver Configuration
- *******************************************************************************
- * # License
- * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
- *******************************************************************************
- *
- * The licensor of this software is Silicon Laboratories Inc. Your use of this
- * software is governed by the terms of Silicon Labs Master Software License
- * Agreement (MSLA) available at
- * www.silabs.com/about-us/legal/master-software-license-agreement. This
- * software is distributed to you in Source Code format and is governed by the
- * sections of the MSLA applicable to Source Code.
- *
- ******************************************************************************/
-
-#ifndef SL_SIMPLE_RGB_PWM_LED_INST0_CONFIG_H
-#define SL_SIMPLE_RGB_PWM_LED_INST0_CONFIG_H
-
-// <<< Use Configuration Wizard in Context Menu >>>
-
-// Simple RGB PWM LED Configuration
-// PWM frequency [Hz]
-// Sets the frequency of the PWM signal
-// 0 = Don't care
-// Default: 10000
-#define SL_SIMPLE_RGB_PWM_LED_INST0_FREQUENCY 10000
-
-// PWM resolution <2-65536>
-// Specifies the PWM (dimming) resolution. I.e. if you want a
-// dimming resolution that takes the input values from 0 to 99,
-// set this value to 100
-// Default: 256
-#define SL_SIMPLE_RGB_PWM_LED_INST0_RESOLUTION 256
-
-// Red LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_INST0_RED_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-
-// Green LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_INST0_GREEN_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-
-// Blue LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_INST0_BLUE_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-// end led configuration
-
-// <<< end of configuration section >>>
-
-// <<< sl:start pin_tool >>>
-
-// SL_SIMPLE_RGB_PWM_LED_INST0
-// $[TIMER_SL_SIMPLE_RGB_PWM_LED_INST0]
-#define SL_SIMPLE_RGB_PWM_LED_INST0_PERIPHERAL TIMER0
-#define SL_SIMPLE_RGB_PWM_LED_INST0_PERIPHERAL_NO 0
-
-#define SL_SIMPLE_RGB_PWM_LED_INST0_RED_CHANNEL 0
-// TIMER0 CC0 on PD02
-#define SL_SIMPLE_RGB_PWM_LED_INST0_RED_PORT gpioPortD
-#define SL_SIMPLE_RGB_PWM_LED_INST0_RED_PIN 2
-
-#define SL_SIMPLE_RGB_PWM_LED_INST0_GREEN_CHANNEL 1
-// TIMER0 CC1 on PA04
-#define SL_SIMPLE_RGB_PWM_LED_INST0_GREEN_PORT gpioPortA
-#define SL_SIMPLE_RGB_PWM_LED_INST0_GREEN_PIN 4
-
-#define SL_SIMPLE_RGB_PWM_LED_INST0_BLUE_CHANNEL 2
-// TIMER0 CC2 on PB00
-#define SL_SIMPLE_RGB_PWM_LED_INST0_BLUE_PORT gpioPortB
-#define SL_SIMPLE_RGB_PWM_LED_INST0_BLUE_PIN 0
-
-// [TIMER_SL_SIMPLE_RGB_PWM_LED_INST0]$
-
-// <<< sl:end pin_tool >>>
-
-#endif // SL_SIMPLE_RGB_PWM_LED_INST0_CONFIG_H
diff --git a/hardware/board/config/brd2601b/sl_simple_rgb_pwm_led_rgb_led0_config.h b/hardware/board/config/brd2601b/sl_simple_rgb_pwm_led_rgb_led0_config.h
new file mode 100644
index 0000000000..c4ad32ebd8
--- /dev/null
+++ b/hardware/board/config/brd2601b/sl_simple_rgb_pwm_led_rgb_led0_config.h
@@ -0,0 +1,84 @@
+/***************************************************************************//**
+ * @file
+ * @brief Simple RGB PWM Led Driver Configuration
+ *******************************************************************************
+ * # License
+ * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * The licensor of this software is Silicon Laboratories Inc. Your use of this
+ * software is governed by the terms of Silicon Labs Master Software License
+ * Agreement (MSLA) available at
+ * www.silabs.com/about-us/legal/master-software-license-agreement. This
+ * software is distributed to you in Source Code format and is governed by the
+ * sections of the MSLA applicable to Source Code.
+ *
+ ******************************************************************************/
+
+#ifndef SL_SIMPLE_RGB_PWM_LED_RGB_LED0_CONFIG_H
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_CONFIG_H
+
+// <<< Use Configuration Wizard in Context Menu >>>
+
+// Simple RGB PWM LED Configuration
+// PWM frequency [Hz]
+// Sets the frequency of the PWM signal
+// 0 = Don't care
+// Default: 10000
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_FREQUENCY 10000
+
+// PWM resolution <2-65536>
+// Specifies the PWM (dimming) resolution. I.e. if you want a
+// dimming resolution that takes the input values from 0 to 99,
+// set this value to 100
+// Default: 256
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_RESOLUTION 256
+
+// Red LED Polarity
+// Active low
+// Active high
+// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_RED_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+
+// Green LED Polarity
+// Active low
+// Active high
+// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_GREEN_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+
+// Blue LED Polarity
+// Active low
+// Active high
+// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_BLUE_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+// end led configuration
+
+// <<< end of configuration section >>>
+
+// <<< sl:start pin_tool >>>
+
+// SL_SIMPLE_RGB_PWM_LED_RGB_LED0
+// $[TIMER_SL_SIMPLE_RGB_PWM_LED_RGB_LED0]
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_PERIPHERAL TIMER0
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_PERIPHERAL_NO 0
+
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_RED_CHANNEL 0
+// TIMER0 CC0 on PD02
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_RED_PORT gpioPortD
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_RED_PIN 2
+
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_GREEN_CHANNEL 1
+// TIMER0 CC1 on PA04
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_GREEN_PORT gpioPortA
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_GREEN_PIN 4
+
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_BLUE_CHANNEL 2
+// TIMER0 CC2 on PB00
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_BLUE_PORT gpioPortB
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_BLUE_PIN 0
+
+// [TIMER_SL_SIMPLE_RGB_PWM_LED_RGB_LED0]$
+
+// <<< sl:end pin_tool >>>
+
+#endif // SL_SIMPLE_RGB_PWM_LED_RGB_LED0_CONFIG_H
diff --git a/hardware/board/config/brd2603a/sl_simple_rgb_pwm_led_inst0_config.h b/hardware/board/config/brd2603a/sl_simple_rgb_pwm_led_inst0_config.h
deleted file mode 100644
index 41bf305971..0000000000
--- a/hardware/board/config/brd2603a/sl_simple_rgb_pwm_led_inst0_config.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/***************************************************************************//**
- * @file
- * @brief Simple RGB PWM Led Driver Configuration
- *******************************************************************************
- * # License
- * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
- *******************************************************************************
- *
- * The licensor of this software is Silicon Laboratories Inc. Your use of this
- * software is governed by the terms of Silicon Labs Master Software License
- * Agreement (MSLA) available at
- * www.silabs.com/about-us/legal/master-software-license-agreement. This
- * software is distributed to you in Source Code format and is governed by the
- * sections of the MSLA applicable to Source Code.
- *
- ******************************************************************************/
-
-#ifndef SL_SIMPLE_RGB_PWM_LED_INST0_CONFIG_H
-#define SL_SIMPLE_RGB_PWM_LED_INST0_CONFIG_H
-
-// <<< Use Configuration Wizard in Context Menu >>>
-
-// Simple RGB PWM LED Configuration
-// PWM frequency [Hz]
-// Sets the frequency of the PWM signal
-// 0 = Don't care
-// Default: 10000
-#define SL_SIMPLE_RGB_PWM_LED_INST0_FREQUENCY 10000
-
-// PWM resolution <2-65536>
-// Specifies the PWM (dimming) resolution. I.e. if you want a
-// dimming resolution that takes the input values from 0 to 99,
-// set this value to 100
-// Default: 256
-#define SL_SIMPLE_RGB_PWM_LED_INST0_RESOLUTION 256
-
-// Red LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_INST0_RED_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-
-// Green LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_INST0_GREEN_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-
-// Blue LED Polarity
-// Active low
-// Active high
-// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-#define SL_SIMPLE_RGB_PWM_LED_INST0_BLUE_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
-// end led configuration
-
-// <<< end of configuration section >>>
-
-// <<< sl:start pin_tool >>>
-
-// SL_SIMPLE_RGB_PWM_LED_INST0
-// $[TIMER_SL_SIMPLE_RGB_PWM_LED_INST0]
-#define SL_SIMPLE_RGB_PWM_LED_INST0_PERIPHERAL TIMER0
-#define SL_SIMPLE_RGB_PWM_LED_INST0_PERIPHERAL_NO 0
-
-#define SL_SIMPLE_RGB_PWM_LED_INST0_RED_CHANNEL 0
-// TIMER0 CC0 on PB01
-#define SL_SIMPLE_RGB_PWM_LED_INST0_RED_PORT gpioPortB
-#define SL_SIMPLE_RGB_PWM_LED_INST0_RED_PIN 1
-
-#define SL_SIMPLE_RGB_PWM_LED_INST0_GREEN_CHANNEL 1
-// TIMER0 CC1 on PA00
-#define SL_SIMPLE_RGB_PWM_LED_INST0_GREEN_PORT gpioPortA
-#define SL_SIMPLE_RGB_PWM_LED_INST0_GREEN_PIN 0
-
-#define SL_SIMPLE_RGB_PWM_LED_INST0_BLUE_CHANNEL 2
-// TIMER0 CC2 on PC04
-#define SL_SIMPLE_RGB_PWM_LED_INST0_BLUE_PORT gpioPortC
-#define SL_SIMPLE_RGB_PWM_LED_INST0_BLUE_PIN 4
-
-// [TIMER_SL_SIMPLE_RGB_PWM_LED_INST0]$
-
-// <<< sl:end pin_tool >>>
-
-#endif // SL_SIMPLE_RGB_PWM_LED_INST0_CONFIG_H
diff --git a/hardware/board/config/brd2603a/sl_simple_rgb_pwm_led_rgb_led0_config.h b/hardware/board/config/brd2603a/sl_simple_rgb_pwm_led_rgb_led0_config.h
new file mode 100644
index 0000000000..e70418ae8c
--- /dev/null
+++ b/hardware/board/config/brd2603a/sl_simple_rgb_pwm_led_rgb_led0_config.h
@@ -0,0 +1,84 @@
+/***************************************************************************//**
+ * @file
+ * @brief Simple RGB PWM Led Driver Configuration
+ *******************************************************************************
+ * # License
+ * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * The licensor of this software is Silicon Laboratories Inc. Your use of this
+ * software is governed by the terms of Silicon Labs Master Software License
+ * Agreement (MSLA) available at
+ * www.silabs.com/about-us/legal/master-software-license-agreement. This
+ * software is distributed to you in Source Code format and is governed by the
+ * sections of the MSLA applicable to Source Code.
+ *
+ ******************************************************************************/
+
+#ifndef SL_SIMPLE_RGB_PWM_LED_RGB_LED0_CONFIG_H
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_CONFIG_H
+
+// <<< Use Configuration Wizard in Context Menu >>>
+
+// Simple RGB PWM LED Configuration
+// PWM frequency [Hz]
+// Sets the frequency of the PWM signal
+// 0 = Don't care
+// Default: 10000
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_FREQUENCY 10000
+
+// PWM resolution <2-65536>
+// Specifies the PWM (dimming) resolution. I.e. if you want a
+// dimming resolution that takes the input values from 0 to 99,
+// set this value to 100
+// Default: 256
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_RESOLUTION 256
+
+// Red LED Polarity
+// Active low
+// Active high
+// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_RED_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+
+// Green LED Polarity
+// Active low
+// Active high
+// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_GREEN_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+
+// Blue LED Polarity
+// Active low
+// Active high
+// Default: SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_BLUE_POLARITY SL_SIMPLE_RGB_PWM_LED_POLARITY_ACTIVE_LOW
+// end led configuration
+
+// <<< end of configuration section >>>
+
+// <<< sl:start pin_tool >>>
+
+// SL_SIMPLE_RGB_PWM_LED_RGB_LED0
+// $[TIMER_SL_SIMPLE_RGB_PWM_LED_RGB_LED0]
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_PERIPHERAL TIMER0
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_PERIPHERAL_NO 0
+
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_RED_CHANNEL 0
+// TIMER0 CC0 on PB01
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_RED_PORT gpioPortB
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_RED_PIN 1
+
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_GREEN_CHANNEL 1
+// TIMER0 CC1 on PA00
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_GREEN_PORT gpioPortA
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_GREEN_PIN 0
+
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_BLUE_CHANNEL 2
+// TIMER0 CC2 on PC04
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_BLUE_PORT gpioPortC
+#define SL_SIMPLE_RGB_PWM_LED_RGB_LED0_BLUE_PIN 4
+
+// [TIMER_SL_SIMPLE_RGB_PWM_LED_RGB_LED0]$
+
+// <<< sl:end pin_tool >>>
+
+#endif // SL_SIMPLE_RGB_PWM_LED_RGB_LED0_CONFIG_H
diff --git a/hardware/board/config/brd2703a/btl_euart_driver_cfg.h b/hardware/board/config/brd2703a/btl_euart_driver_cfg.h
new file mode 100644
index 0000000000..35c91d95f0
--- /dev/null
+++ b/hardware/board/config/brd2703a/btl_euart_driver_cfg.h
@@ -0,0 +1,86 @@
+/***************************************************************************//**
+ * @file
+ * @brief Configuration header for bootloader euart Driver
+ *******************************************************************************
+ * # License
+ * Copyright 2021 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * The licensor of this software is Silicon Laboratories Inc. Your use of this
+ * software is governed by the terms of Silicon Labs Master Software License
+ * Agreement (MSLA) available at
+ * www.silabs.com/about-us/legal/master-software-license-agreement. This
+ * software is distributed to you in Source Code format and is governed by the
+ * sections of the MSLA applicable to Source Code.
+ *
+ ******************************************************************************/
+#ifndef BTL_EUART_DRIVER_CONFIG_H
+#define BTL_EUART_DRIVER_CONFIG_H
+
+// <<< Use Configuration Wizard in Context Menu >>>
+
+// EUART settings
+
+// Baud rate
+// Default: 115200
+#define SL_SERIAL_EUART_BAUD_RATE 115200
+
+// Hardware flow control
+// Default: 0
+#define SL_SERIAL_EUART_FLOW_CONTROL 0
+//
+
+// Receive buffer size
+// <0-2048:1>
+// Default: 512 [0-2048]
+#define SL_DRIVER_EUART_RX_BUFFER_SIZE 512
+
+// Transmit buffer size
+// <0-2048:1>
+// Default: 128 [0-2048]
+#define SL_DRIVER_EUART_TX_BUFFER_SIZE 128
+
+// Virtual COM Port
+// Default: 0
+#define SL_VCOM_ENABLE 0
+//
+
+//
+
+// <<< end of configuration section >>>
+
+// <<< sl:start pin_tool >>>
+// SL_SERIAL_EUART
+// $[EUSART_SL_SERIAL_EUART]
+#define SL_SERIAL_EUART_PERIPHERAL EUSART1
+#define SL_SERIAL_EUART_PERIPHERAL_NO 1
+
+// EUSART1 TX on PA05
+#define SL_SERIAL_EUART_TX_PORT gpioPortA
+#define SL_SERIAL_EUART_TX_PIN 5
+
+// EUSART1 RX on PA06
+#define SL_SERIAL_EUART_RX_PORT gpioPortA
+#define SL_SERIAL_EUART_RX_PIN 6
+
+// EUSART1 CTS on PA09
+#define SL_SERIAL_EUART_CTS_PORT gpioPortA
+#define SL_SERIAL_EUART_CTS_PIN 9
+
+// EUSART1 RTS on PA08
+#define SL_SERIAL_EUART_RTS_PORT gpioPortA
+#define SL_SERIAL_EUART_RTS_PIN 8
+
+// [EUSART_SL_SERIAL_EUART]$
+
+
+// SL_VCOM_ENABLE
+
+// $[GPIO_SL_VCOM_ENABLE]
+
+// [GPIO_SL_VCOM_ENABLE]$
+
+
+// <<< sl:end pin_tool >>>
+
+#endif // BTL_EUART_DRIVER_CONFIG_H
\ No newline at end of file
diff --git a/hardware/board/config/brd2703a/btl_gpio_activation_cfg.h b/hardware/board/config/brd2703a/btl_gpio_activation_cfg.h
new file mode 100644
index 0000000000..49c820d52b
--- /dev/null
+++ b/hardware/board/config/brd2703a/btl_gpio_activation_cfg.h
@@ -0,0 +1,49 @@
+/***************************************************************************//**
+ * @file
+ * @brief Configuration header for bootloader GPIO Activation
+ *******************************************************************************
+ * # License
+ * Copyright 2021 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * The licensor of this software is Silicon Laboratories Inc. Your use of this
+ * software is governed by the terms of Silicon Labs Master Software License
+ * Agreement (MSLA) available at
+ * www.silabs.com/about-us/legal/master-software-license-agreement. This
+ * software is distributed to you in Source Code format and is governed by the
+ * sections of the MSLA applicable to Source Code.
+ *
+ ******************************************************************************/
+#ifndef BTL_GPIO_ACTIVATION_CONFIG_H
+#define BTL_GPIO_ACTIVATION_CONFIG_H
+
+// <<< Use Configuration Wizard in Context Menu >>>
+
+// Properties of Bootloader Entry
+
+
+// Active state
+// Low
+// High
+// Default: LOW
+// Enter firmware upgrade mode if GPIO pin has this state
+#define SL_GPIO_ACTIVATION_POLARITY LOW
+
+//
+
+// <<< end of configuration section >>>
+
+// <<< sl:start pin_tool >>>
+
+// SL_BTL_BUTTON
+
+// $[GPIO_SL_BTL_BUTTON]
+#define SL_BTL_BUTTON_PORT gpioPortB
+#define SL_BTL_BUTTON_PIN 2
+
+// [GPIO_SL_BTL_BUTTON]$
+
+// <<< sl:end pin_tool >>>
+
+
+#endif // BTL_GPIO_ACTIVATION_CONFIG_H
diff --git a/hardware/board/config/brd2703a/btl_uart_driver_cfg.h b/hardware/board/config/brd2703a/btl_uart_driver_cfg.h
new file mode 100644
index 0000000000..50194a2714
--- /dev/null
+++ b/hardware/board/config/brd2703a/btl_uart_driver_cfg.h
@@ -0,0 +1,87 @@
+/***************************************************************************//**
+ * @file
+ * @brief Configuration header for bootloader Uart Driver
+ *******************************************************************************
+ * # License
+ * Copyright 2021 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * The licensor of this software is Silicon Laboratories Inc. Your use of this
+ * software is governed by the terms of Silicon Labs Master Software License
+ * Agreement (MSLA) available at
+ * www.silabs.com/about-us/legal/master-software-license-agreement. This
+ * software is distributed to you in Source Code format and is governed by the
+ * sections of the MSLA applicable to Source Code.
+ *
+ ******************************************************************************/
+#ifndef BTL_UART_DRIVER_CONFIG_H
+#define BTL_UART_DRIVER_CONFIG_H
+
+// <<< Use Configuration Wizard in Context Menu >>>
+
+// USART settings
+
+// Baud rate
+// Default: 115200
+#define SL_SERIAL_UART_BAUD_RATE 115200
+
+// Hardware flow control
+// Default: 0
+#define SL_SERIAL_UART_FLOW_CONTROL 0
+//
+
+// Receive buffer size
+// <0-2048:1>
+// Default: 512 [0-2048]
+#define SL_DRIVER_UART_RX_BUFFER_SIZE 512
+
+// Transmit buffer size
+// <0-2048:1>
+// Default: 128 [0-2048]
+#define SL_DRIVER_UART_TX_BUFFER_SIZE 128
+
+// Virtual COM Port
+// Default: 0
+#define SL_VCOM_ENABLE 0
+//
+
+//
+
+// <<< end of configuration section >>>
+
+// <<< sl:start pin_tool >>>
+// SL_SERIAL_UART
+// $[USART_SL_SERIAL_UART]
+#define SL_SERIAL_UART_PERIPHERAL USART0
+#define SL_SERIAL_UART_PERIPHERAL_NO 0
+
+// USART0 TX on PA05
+#define SL_SERIAL_UART_TX_PORT gpioPortA
+#define SL_SERIAL_UART_TX_PIN 5
+
+// USART0 RX on PA06
+#define SL_SERIAL_UART_RX_PORT gpioPortA
+#define SL_SERIAL_UART_RX_PIN 6
+
+// USART0 CTS on PA09
+#define SL_SERIAL_UART_CTS_PORT gpioPortA
+#define SL_SERIAL_UART_CTS_PIN 9
+
+// USART0 RTS on PA08
+#define SL_SERIAL_UART_RTS_PORT gpioPortA
+#define SL_SERIAL_UART_RTS_PIN 8
+
+// [USART_SL_SERIAL_UART]$
+
+
+
+// SL_VCOM_ENABLE
+
+// $[GPIO_SL_VCOM_ENABLE]
+
+// [GPIO_SL_VCOM_ENABLE]$
+
+
+// <<< sl:end pin_tool >>>
+
+#endif // BTL_UART_DRIVER_CONFIG_H
\ No newline at end of file
diff --git a/hardware/board/config/brd2703a/iot_flash_cfg_mikroe.h b/hardware/board/config/brd2703a/iot_flash_cfg_mikroe.h
new file mode 100644
index 0000000000..05868e3e4c
--- /dev/null
+++ b/hardware/board/config/brd2703a/iot_flash_cfg_mikroe.h
@@ -0,0 +1,136 @@
+/***************************************************************************//**
+ * @file iot_flash_cfg_inst.h
+ * @brief Common I/O flash instance configurations.
+ *******************************************************************************
+ * # License
+ * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * SPDX-License-Identifier: Zlib
+ *
+ * The licensor of this software is Silicon Laboratories Inc.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ ******************************************************************************/
+
+/*******************************************************************************
+ * SAFE GUARD
+ ******************************************************************************/
+
+#ifndef _IOT_FLASH_CFG_MIKROE_H_
+#define _IOT_FLASH_CFG_MIKROE_H_
+
+/*******************************************************************************
+ * Flash Default Configs
+ ******************************************************************************/
+
+// <<< Use Configuration Wizard in Context Menu >>>
+
+// Flash General Options
+
+// Instance number
+// Instance number used when iot_flash_open() is called.
+// Default: 0
+#define IOT_FLASH_CFG_MIKROE_INST_NUM 0
+
+// Instance type
+// <0=> Internal Flash (MSC)
+// <1=> External Flash (SPI)
+// Specify whether this instance is for internal flash (MSC)
+// or an external SPI flash. If external, then you need to setup
+// SPI configs below.
+// Default: 0
+#define IOT_FLASH_CFG_MIKROE_INST_TYPE 1
+
+//
+
+// SPI Configuration
+
+// Default SPI bitrate
+// Default: 1000000
+#define IOT_FLASH_CFG_MIKROE_SPI_BITRATE 1000000
+
+// Default SPI frame length <4-16>
+// Default: 8
+#define IOT_FLASH_CFG_MIKROE_SPI_FRAME_LENGTH 8
+
+// Default SPI master/slave mode
+// Master
+// Slave
+#define IOT_FLASH_CFG_MIKROE_SPI_TYPE spidrvMaster
+
+// Default SPI bit order
+// LSB transmitted first
+// MSB transmitted first
+#define IOT_FLASH_CFG_MIKROE_SPI_BIT_ORDER spidrvBitOrderMsbFirst
+
+// Default SPI clock mode
+// SPI mode 0: CLKPOL=0, CLKPHA=0
+// SPI mode 1: CLKPOL=0, CLKPHA=1
+// SPI mode 2: CLKPOL=1, CLKPHA=0
+// SPI mode 3: CLKPOL=1, CLKPHA=1
+#define IOT_FLASH_CFG_MIKROE_SPI_CLOCK_MODE spidrvClockMode0
+
+// Default SPI CS control scheme
+// CS controlled by the SPI driver
+// CS controlled by the application
+#define IOT_FLASH_CFG_MIKROE_SPI_CS_CONTROL spidrvCsControlApplication
+
+// Default SPI transfer scheme
+// Transfer starts immediately
+// Transfer starts when the bus is idle
+#define IOT_FLASH_CFG_MIKROE_SPI_SLAVE_START_MODE spidrvSlaveStartImmediate
+
+//
+
+// <<< end of configuration section >>>
+
+/*******************************************************************************
+ * EXTERNAL FLASH: H/W PERIPHERAL CONFIG
+ ******************************************************************************/
+
+// <<< sl:start pin_tool >>>
+// IOT_FLASH_CFG_MIKROE_SPI
+// $[USART_IOT_FLASH_CFG_MIKROE_SPI]
+#define IOT_FLASH_CFG_MIKROE_SPI_PERIPHERAL USART0
+#define IOT_FLASH_CFG_MIKROE_SPI_PERIPHERAL_NO 0
+
+// USART0 TX on PC03
+#define IOT_FLASH_CFG_MIKROE_SPI_TX_PORT gpioPortC
+#define IOT_FLASH_CFG_MIKROE_SPI_TX_PIN 3
+
+// USART0 RX on PC02
+#define IOT_FLASH_CFG_MIKROE_SPI_RX_PORT gpioPortC
+#define IOT_FLASH_CFG_MIKROE_SPI_RX_PIN 2
+
+// USART0 CLK on PC01
+#define IOT_FLASH_CFG_MIKROE_SPI_CLK_PORT gpioPortC
+#define IOT_FLASH_CFG_MIKROE_SPI_CLK_PIN 1
+
+// USART0 CS on PC00
+#define IOT_FLASH_CFG_MIKROE_SPI_CS_PORT gpioPortC
+#define IOT_FLASH_CFG_MIKROE_SPI_CS_PIN 0
+
+// [USART_IOT_FLASH_CFG_MIKROE_SPI]$
+// <<< sl:end pin_tool >>>
+
+/*******************************************************************************
+ * SAFE GUARD
+ ******************************************************************************/
+
+#endif /* _IOT_FLASH_CFG_MIKROE_H_ */
diff --git a/hardware/board/config/brd4109a_brd4001a/iot_flash_cfg_msc.h b/hardware/board/config/brd2703a/iot_flash_cfg_msc.h
similarity index 100%
rename from hardware/board/config/brd4109a_brd4001a/iot_flash_cfg_msc.h
rename to hardware/board/config/brd2703a/iot_flash_cfg_msc.h
diff --git a/hardware/board/config/brd2703a/iot_i2c_cfg_mikroe.h b/hardware/board/config/brd2703a/iot_i2c_cfg_mikroe.h
new file mode 100644
index 0000000000..536aca824d
--- /dev/null
+++ b/hardware/board/config/brd2703a/iot_i2c_cfg_mikroe.h
@@ -0,0 +1,106 @@
+/***************************************************************************//**
+ * @file IOT_I2C_CFG_MIKROE_inst.h
+ * @brief Common I/O I2C instance configuration.
+ *******************************************************************************
+ * # License
+ * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * SPDX-License-Identifier: Zlib
+ *
+ * The licensor of this software is Silicon Laboratories Inc.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ ******************************************************************************/
+
+/*******************************************************************************
+ * SAFE GUARD
+ ******************************************************************************/
+
+#ifndef _IOT_I2C_CFG_MIKROE_H_
+#define _IOT_I2C_CFG_MIKROE_H_
+
+/*******************************************************************************
+ * I2C Default Configs
+ ******************************************************************************/
+
+// <<< Use Configuration Wizard in Context Menu >>>
+
+// I2C General Options
+
+// Instance number
+// Instance number used when iot_i2c_open() is called.
+// Default: 0
+#define IOT_I2C_CFG_MIKROE_INST_NUM 0
+
+// Default timeout (in msec)
+// Default: 500
+#define IOT_I2C_CFG_MIKROE_DEFAULT_TIMEOUT 500
+
+// Default bus speed
+// <100000=> Standard mode
+// <400000=> Fast mode
+// <1000000=> Fast plus mode
+// <3400000=> High speed mode
+// Default: 400000
+#define IOT_I2C_CFG_MIKROE_DEFAULT_FREQ 400000
+
+// Accept NACK
+// If the driver receives NACK during a transfer, the transfer is halted
+// immediately but it is not considered as an error. Instead, the driver
+// returns success status (useful for test purposes).
+// Default: 0
+#define IOT_I2C_CFG_MIKROE_ACCEPT_NACK 0
+
+//
+
+// <<< end of configuration section >>>
+
+/*******************************************************************************
+ * H/W PERIPHERAL CONFIG
+ ******************************************************************************/
+
+// <<< sl:start pin_tool >>>
+
+// IOT_I2C_CFG_MIKROE_ENABLE
+// $[GPIO_IOT_I2C_CFG_MIKROE_ENABLE]
+
+// [GPIO_IOT_I2C_CFG_MIKROE_ENABLE]$
+
+// IOT_I2C_CFG_MIKROE
+// $[I2C_IOT_I2C_CFG_MIKROE]
+#define IOT_I2C_CFG_MIKROE_PERIPHERAL I2C0
+#define IOT_I2C_CFG_MIKROE_PERIPHERAL_NO 0
+
+// I2C0 SCL on PB04
+#define IOT_I2C_CFG_MIKROE_SCL_PORT gpioPortB
+#define IOT_I2C_CFG_MIKROE_SCL_PIN 4
+
+// I2C0 SDA on PB05
+#define IOT_I2C_CFG_MIKROE_SDA_PORT gpioPortB
+#define IOT_I2C_CFG_MIKROE_SDA_PIN 5
+
+// [I2C_IOT_I2C_CFG_MIKROE]$
+
+// <<< sl:end pin_tool >>>
+
+/*******************************************************************************
+ * SAFE GUARD
+ ******************************************************************************/
+
+#endif /* _IOT_I2C_CFG_MIKROE_H_ */
diff --git a/hardware/board/config/brd2703a/iot_i2c_cfg_qwiic.h b/hardware/board/config/brd2703a/iot_i2c_cfg_qwiic.h
new file mode 100644
index 0000000000..d0df25f784
--- /dev/null
+++ b/hardware/board/config/brd2703a/iot_i2c_cfg_qwiic.h
@@ -0,0 +1,106 @@
+/***************************************************************************//**
+ * @file IOT_I2C_CFG_QWIIC_inst.h
+ * @brief Common I/O I2C instance configuration.
+ *******************************************************************************
+ * # License
+ * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * SPDX-License-Identifier: Zlib
+ *
+ * The licensor of this software is Silicon Laboratories Inc.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ ******************************************************************************/
+
+/*******************************************************************************
+ * SAFE GUARD
+ ******************************************************************************/
+
+#ifndef _IOT_I2C_CFG_QWIIC_H_
+#define _IOT_I2C_CFG_QWIIC_H_
+
+/*******************************************************************************
+ * I2C Default Configs
+ ******************************************************************************/
+
+// <<< Use Configuration Wizard in Context Menu >>>
+
+// I2C General Options
+
+// Instance number
+// Instance number used when iot_i2c_open() is called.
+// Default: 0
+#define IOT_I2C_CFG_QWIIC_INST_NUM 0
+
+// Default timeout (in msec)
+// Default: 500
+#define IOT_I2C_CFG_QWIIC_DEFAULT_TIMEOUT 500
+
+// Default bus speed
+// <100000=> Standard mode
+// <400000=> Fast mode
+// <1000000=> Fast plus mode
+// <3400000=> High speed mode
+// Default: 400000
+#define IOT_I2C_CFG_QWIIC_DEFAULT_FREQ 400000
+
+// Accept NACK
+// If the driver receives NACK during a transfer, the transfer is halted
+// immediately but it is not considered as an error. Instead, the driver
+// returns success status (useful for test purposes).
+// Default: 0
+#define IOT_I2C_CFG_QWIIC_ACCEPT_NACK 0
+
+//
+
+// <<< end of configuration section >>>
+
+/*******************************************************************************
+ * H/W PERIPHERAL CONFIG
+ ******************************************************************************/
+
+// <<< sl:start pin_tool >>>
+
+// IOT_I2C_CFG_QWIIC_ENABLE
+// $[GPIO_IOT_I2C_CFG_QWIIC_ENABLE]
+
+// [GPIO_IOT_I2C_CFG_QWIIC_ENABLE]$
+
+// IOT_I2C_CFG_QWIIC
+// $[I2C_IOT_I2C_CFG_QWIIC]
+#define IOT_I2C_CFG_QWIIC_PERIPHERAL I2C1
+#define IOT_I2C_CFG_QWIIC_PERIPHERAL_NO 1
+
+// I2C1 SCL on PC04
+#define IOT_I2C_CFG_QWIIC_SCL_PORT gpioPortC
+#define IOT_I2C_CFG_QWIIC_SCL_PIN 4
+
+// I2C1 SDA on PC05
+#define IOT_I2C_CFG_QWIIC_SDA_PORT gpioPortC
+#define IOT_I2C_CFG_QWIIC_SDA_PIN 5
+
+// [I2C_IOT_I2C_CFG_QWIIC]$
+
+// <<< sl:end pin_tool >>>
+
+/*******************************************************************************
+ * SAFE GUARD
+ ******************************************************************************/
+
+#endif /* _IOT_I2C_CFG_QWIIC_H_ */
diff --git a/hardware/board/config/brd2703a/iot_pwm_cfg_led0.h b/hardware/board/config/brd2703a/iot_pwm_cfg_led0.h
new file mode 100644
index 0000000000..725cc6a0b3
--- /dev/null
+++ b/hardware/board/config/brd2703a/iot_pwm_cfg_led0.h
@@ -0,0 +1,78 @@
+/***************************************************************************//**
+ * @file iot_pwm_cfg_inst.h
+ * @brief Common I/O PWM instance configuration.
+ *******************************************************************************
+ * # License
+ * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * SPDX-License-Identifier: Zlib
+ *
+ * The licensor of this software is Silicon Laboratories Inc.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ ******************************************************************************/
+
+/*******************************************************************************
+ * SAFE GUARD
+ ******************************************************************************/
+
+#ifndef _IOT_PWM_CFG_LED0_H_
+#define _IOT_PWM_CFG_LED0_H_
+
+/*******************************************************************************
+ * PWM Default Configs
+ ******************************************************************************/
+
+// <<< Use Configuration Wizard in Context Menu >>>
+
+// PWM General Options
+
+// Instance number
+// Instance number used when iot_pwm_open() is called.
+// Default: 0
+#define IOT_PWM_CFG_LED0_INST_NUM 0
+
+//
+
+// <<< end of configuration section >>>
+
+/*******************************************************************************
+ * H/W PERIPHERAL CONFIG
+ ******************************************************************************/
+
+// <<< sl:start pin_tool >>>
+// IOT_PWM_CFG_LED0
+// $[TIMER_IOT_PWM_CFG_LED0]
+#define IOT_PWM_CFG_LED0_PERIPHERAL TIMER0
+#define IOT_PWM_CFG_LED0_PERIPHERAL_NO 0
+
+// TIMER0 CC0 on PA04
+#define IOT_PWM_CFG_LED0_CC0_PORT gpioPortA
+#define IOT_PWM_CFG_LED0_CC0_PIN 4
+
+
+
+// [TIMER_IOT_PWM_CFG_LED0]$
+// <<< sl:end pin_tool >>>
+
+/*******************************************************************************
+ * SAFE GUARD
+ ******************************************************************************/
+
+#endif /* _IOT_PWM_CFG_LED0_H_ */
diff --git a/hardware/board/config/brd2703a/iot_pwm_cfg_led1.h b/hardware/board/config/brd2703a/iot_pwm_cfg_led1.h
new file mode 100644
index 0000000000..58412a6665
--- /dev/null
+++ b/hardware/board/config/brd2703a/iot_pwm_cfg_led1.h
@@ -0,0 +1,78 @@
+/***************************************************************************//**
+ * @file iot_pwm_cfg_inst.h
+ * @brief Common I/O PWM instance configuration.
+ *******************************************************************************
+ * # License
+ * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * SPDX-License-Identifier: Zlib
+ *
+ * The licensor of this software is Silicon Laboratories Inc.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ ******************************************************************************/
+
+/*******************************************************************************
+ * SAFE GUARD
+ ******************************************************************************/
+
+#ifndef _IOT_PWM_CFG_LED1_H_
+#define _IOT_PWM_CFG_LED1_H_
+
+/*******************************************************************************
+ * PWM Default Configs
+ ******************************************************************************/
+
+// <<< Use Configuration Wizard in Context Menu >>>
+
+// PWM General Options
+
+// Instance number
+// Instance number used when iot_pwm_open() is called.
+// Default: 0
+#define IOT_PWM_CFG_LED1_INST_NUM 0
+
+//
+
+// <<< end of configuration section >>>
+
+/*******************************************************************************
+ * H/W PERIPHERAL CONFIG
+ ******************************************************************************/
+
+// <<< sl:start pin_tool >>>
+// IOT_PWM_CFG_LED1
+// $[TIMER_IOT_PWM_CFG_LED1]
+#define IOT_PWM_CFG_LED1_PERIPHERAL TIMER1
+#define IOT_PWM_CFG_LED1_PERIPHERAL_NO 1
+
+// TIMER1 CC0 on PA07
+#define IOT_PWM_CFG_LED1_CC0_PORT gpioPortA
+#define IOT_PWM_CFG_LED1_CC0_PIN 7
+
+
+
+// [TIMER_IOT_PWM_CFG_LED1]$
+// <<< sl:end pin_tool >>>
+
+/*******************************************************************************
+ * SAFE GUARD
+ ******************************************************************************/
+
+#endif /* _IOT_PWM_CFG_LED1_H_ */
diff --git a/hardware/board/config/brd2703a/iot_pwm_cfg_mikroe.h b/hardware/board/config/brd2703a/iot_pwm_cfg_mikroe.h
new file mode 100644
index 0000000000..ca91eb0acc
--- /dev/null
+++ b/hardware/board/config/brd2703a/iot_pwm_cfg_mikroe.h
@@ -0,0 +1,78 @@
+/***************************************************************************//**
+ * @file iot_pwm_cfg_inst.h
+ * @brief Common I/O PWM instance configuration.
+ *******************************************************************************
+ * # License
+ * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * SPDX-License-Identifier: Zlib
+ *
+ * The licensor of this software is Silicon Laboratories Inc.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ ******************************************************************************/
+
+/*******************************************************************************
+ * SAFE GUARD
+ ******************************************************************************/
+
+#ifndef _IOT_PWM_CFG_MIKROE_H_
+#define _IOT_PWM_CFG_MIKROE_H_
+
+/*******************************************************************************
+ * PWM Default Configs
+ ******************************************************************************/
+
+// <<< Use Configuration Wizard in Context Menu >>>
+
+// PWM General Options
+
+// Instance number
+// Instance number used when iot_pwm_open() is called.
+// Default: 0
+#define IOT_PWM_CFG_MIKROE_INST_NUM 0
+
+//
+
+// <<< end of configuration section >>>
+
+/*******************************************************************************
+ * H/W PERIPHERAL CONFIG
+ ******************************************************************************/
+
+// <<< sl:start pin_tool >>>
+// IOT_PWM_CFG_MIKROE
+// $[TIMER_IOT_PWM_CFG_MIKROE]
+#define IOT_PWM_CFG_MIKROE_PERIPHERAL TIMER4
+#define IOT_PWM_CFG_MIKROE_PERIPHERAL_NO 4
+
+// TIMER4 CC0 on PA00
+#define IOT_PWM_CFG_MIKROE_CC0_PORT gpioPortA
+#define IOT_PWM_CFG_MIKROE_CC0_PIN 0
+
+
+
+// [TIMER_IOT_PWM_CFG_MIKROE]$
+// <<< sl:end pin_tool >>>
+
+/*******************************************************************************
+ * SAFE GUARD
+ ******************************************************************************/
+
+#endif /* _IOT_PWM_CFG_MIKROE_H_ */
diff --git a/hardware/board/config/brd2703a/iot_spi_cfg_mikroe.h b/hardware/board/config/brd2703a/iot_spi_cfg_mikroe.h
new file mode 100644
index 0000000000..d6aaafbbbd
--- /dev/null
+++ b/hardware/board/config/brd2703a/iot_spi_cfg_mikroe.h
@@ -0,0 +1,128 @@
+/***************************************************************************//**
+ * @file iot_spi_cfg_inst.h
+ * @brief Common I/O SPI instance configurations.
+ *******************************************************************************
+ * # License
+ * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * SPDX-License-Identifier: Zlib
+ *
+ * The licensor of this software is Silicon Laboratories Inc.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ ******************************************************************************/
+
+/*******************************************************************************
+ * SAFE GUARD
+ ******************************************************************************/
+
+#ifndef _IOT_SPI_CFG_MIKROE_H_
+#define _IOT_SPI_CFG_MIKROE_H_
+
+/*******************************************************************************
+ * SPI Default Configs
+ ******************************************************************************/
+
+// <<< Use Configuration Wizard in Context Menu >>>
+
+// SPI General Options
+
+// Instance number
+// Instance number used when iot_spi_open() is called.
+// Default: 0
+#define IOT_SPI_CFG_MIKROE_INST_NUM 0
+
+// Default SPI bitrate
+// Default: 1000000
+#define IOT_SPI_CFG_MIKROE_DEFAULT_BITRATE 1000000
+
+// Default SPI frame length <4-16>
+// Default: 8
+#define IOT_SPI_CFG_MIKROE_DEFAULT_FRAME_LENGTH 8
+
+// Default SPI master/slave mode
+// Master
+// Slave
+#define IOT_SPI_CFG_MIKROE_DEFAULT_TYPE spidrvMaster
+
+// Default SPI bit order
+// LSB transmitted first
+// MSB transmitted first
+#define IOT_SPI_CFG_MIKROE_DEFAULT_BIT_ORDER spidrvBitOrderMsbFirst
+
+// Default SPI clock mode
+// SPI mode 0: CLKPOL=0, CLKPHA=0
+// SPI mode 1: CLKPOL=0, CLKPHA=1
+// SPI mode 2: CLKPOL=1, CLKPHA=0
+// SPI mode 3: CLKPOL=1, CLKPHA=1
+#define IOT_SPI_CFG_MIKROE_DEFAULT_CLOCK_MODE spidrvClockMode0
+
+// Default SPI CS control scheme
+// CS controlled by the SPI driver
+// CS controlled by the application
+#define IOT_SPI_CFG_MIKROE_DEFAULT_CS_CONTROL spidrvCsControlApplication
+
+// Default SPI transfer scheme
+// Transfer starts immediately
+// Transfer starts when the bus is idle
+#define IOT_SPI_CFG_MIKROE_DEFAULT_SLAVE_START_MODE spidrvSlaveStartImmediate
+
+// Internal Loopback
+// Enable USART Internal loopback
+// Default: 0
+#define IOT_SPI_CFG_MIKROE_LOOPBACK 0
+
+//
+
+// <<< end of configuration section >>>
+
+/*******************************************************************************
+ * H/W PERIPHERAL CONFIG
+ ******************************************************************************/
+
+// <<< sl:start pin_tool >>>
+// IOT_SPI_CFG_MIKROE
+// $[USART_IOT_SPI_CFG_MIKROE]
+#define IOT_SPI_CFG_MIKROE_PERIPHERAL USART0
+#define IOT_SPI_CFG_MIKROE_PERIPHERAL_NO 0
+
+// USART0 TX on PC03
+#define IOT_SPI_CFG_MIKROE_TX_PORT gpioPortC
+#define IOT_SPI_CFG_MIKROE_TX_PIN 3
+
+// USART0 RX on PC02
+#define IOT_SPI_CFG_MIKROE_RX_PORT gpioPortC
+#define IOT_SPI_CFG_MIKROE_RX_PIN 2
+
+// USART0 CLK on PC01
+#define IOT_SPI_CFG_MIKROE_CLK_PORT gpioPortC
+#define IOT_SPI_CFG_MIKROE_CLK_PIN 1
+
+// USART0 CS on PC00
+#define IOT_SPI_CFG_MIKROE_CS_PORT gpioPortC
+#define IOT_SPI_CFG_MIKROE_CS_PIN 0
+
+// [USART_IOT_SPI_CFG_MIKROE]$
+// <<< sl:end pin_tool >>>
+
+/*******************************************************************************
+ * SAFE GUARD
+ ******************************************************************************/
+
+#endif /* _IOT_SPI_CFG_MIKROE_H_ */
diff --git a/hardware/board/config/brd2703a/iot_uart_cfg_loopback.h b/hardware/board/config/brd2703a/iot_uart_cfg_loopback.h
new file mode 100644
index 0000000000..9172b135c8
--- /dev/null
+++ b/hardware/board/config/brd2703a/iot_uart_cfg_loopback.h
@@ -0,0 +1,132 @@
+/***************************************************************************//**
+ * @file iot_uart_cfg_inst.h
+ * @brief Common I/O UART instance configuration.
+ *******************************************************************************
+ * # License
+ * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * SPDX-License-Identifier: Zlib
+ *
+ * The licensor of this software is Silicon Laboratories Inc.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ ******************************************************************************/
+
+/*******************************************************************************
+ * SAFE GUARD
+ ******************************************************************************/
+
+#ifndef _IOT_UART_CFG_LOOPBACK_H_
+#define _IOT_UART_CFG_LOOPBACK_H_
+
+/*******************************************************************************
+ * UART Default Configs
+ ******************************************************************************/
+
+// <<< Use Configuration Wizard in Context Menu >>>
+
+// UART General Options
+
+// Instance number
+// Instance number used when iot_uart_open() is called.
+// Default: 0
+#define IOT_UART_CFG_LOOPBACK_INST_NUM 0
+
+// Default baud rate
+// Default: 115200
+#define IOT_UART_CFG_LOOPBACK_DEFAULT_BAUDRATE 115200
+
+// Default number of data bits
+// 4 data bits
+// 5 data bits
+// 6 data bits
+// 7 data bits
+// 8 data bits
+// Default: usartDatabits8
+#define IOT_UART_CFG_LOOPBACK_DEFAULT_DATA_BITS usartDatabits8
+
+// Default parity mode
+// No Parity
+// Even parity
+// Odd parity
+// Default: usartNoParity
+#define IOT_UART_CFG_LOOPBACK_DEFAULT_PARITY usartNoParity
+
+// Default number of stop bits
+// 0.5 stop bits
+// 1 stop bits
+// 1.5 stop bits
+// 2 stop bits
+// Default: usartStopbits1
+#define IOT_UART_CFG_LOOPBACK_DEFAULT_STOP_BITS usartStopbits1
+
+// Default hardware flow control
+// None
+// CTS
+// RTS
+// CTS/RTS
+// Default: usartHwFlowControlNone
+#define IOT_UART_CFG_LOOPBACK_DEFAULT_FLOW_CONTROL_TYPE usartHwFlowControlNone
+
+
+// Internal Loopback
+// Enable USART Internal loopback
+// Default: 0
+#define IOT_UART_CFG_LOOPBACK_LOOPBACK 1
+
+//
+
+// <<< end of configuration section >>>
+
+/*******************************************************************************
+ * H/W PERIPHERAL CONFIG
+ ******************************************************************************/
+
+// <<< sl:start pin_tool >>>
+// IOT_UART_CFG_LOOPBACK
+// $[USART_IOT_UART_CFG_LOOPBACK]
+#define IOT_UART_CFG_LOOPBACK_PERIPHERAL USART0
+#define IOT_UART_CFG_LOOPBACK_PERIPHERAL_NO 0
+
+// USART0 TX on PA05
+#define IOT_UART_CFG_LOOPBACK_TX_PORT gpioPortA
+#define IOT_UART_CFG_LOOPBACK_TX_PIN 5
+
+// USART0 RX on PA06
+#define IOT_UART_CFG_LOOPBACK_RX_PORT gpioPortA
+#define IOT_UART_CFG_LOOPBACK_RX_PIN 6
+
+
+
+// USART0 RTS on PA08
+#define IOT_UART_CFG_LOOPBACK_RTS_PORT gpioPortA
+#define IOT_UART_CFG_LOOPBACK_RTS_PIN 8
+
+// USART0 CTS on PA09
+#define IOT_UART_CFG_LOOPBACK_CTS_PORT gpioPortA
+#define IOT_UART_CFG_LOOPBACK_CTS_PIN 9
+
+// [USART_IOT_UART_CFG_LOOPBACK]$
+// <<< sl:end pin_tool >>>
+
+/*******************************************************************************
+ * SAFE GUARD
+ ******************************************************************************/
+
+#endif /* _IOT_UART_CFG_LOOPBACK_H_ */
diff --git a/hardware/board/config/brd2703a/iot_uart_cfg_mikroe.h b/hardware/board/config/brd2703a/iot_uart_cfg_mikroe.h
new file mode 100644
index 0000000000..5eeb3f33a8
--- /dev/null
+++ b/hardware/board/config/brd2703a/iot_uart_cfg_mikroe.h
@@ -0,0 +1,126 @@
+/***************************************************************************//**
+ * @file iot_uart_cfg_inst.h
+ * @brief Common I/O UART instance configuration.
+ *******************************************************************************
+ * # License
+ * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * SPDX-License-Identifier: Zlib
+ *
+ * The licensor of this software is Silicon Laboratories Inc.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ ******************************************************************************/
+
+/*******************************************************************************
+ * SAFE GUARD
+ ******************************************************************************/
+
+#ifndef _IOT_UART_CFG_MIKROE_H_
+#define _IOT_UART_CFG_MIKROE_H_
+
+/*******************************************************************************
+ * UART Default Configs
+ ******************************************************************************/
+
+// <<< Use Configuration Wizard in Context Menu >>>
+
+// UART General Options
+
+// Instance number
+// Instance number used when iot_uart_open() is called.
+// Default: 0
+#define IOT_UART_CFG_MIKROE_INST_NUM 0
+
+// Default baud rate
+// Default: 115200
+#define IOT_UART_CFG_MIKROE_DEFAULT_BAUDRATE 115200
+
+// Default number of data bits
+// 4 data bits
+// 5 data bits
+// 6 data bits
+// 7 data bits
+// 8 data bits
+// Default: usartDatabits8
+#define IOT_UART_CFG_MIKROE_DEFAULT_DATA_BITS usartDatabits8
+
+// Default parity mode
+// No Parity
+// Even parity
+// Odd parity
+// Default: usartNoParity
+#define IOT_UART_CFG_MIKROE_DEFAULT_PARITY usartNoParity
+
+// Default number of stop bits
+// 0.5 stop bits
+// 1 stop bits
+// 1.5 stop bits
+// 2 stop bits
+// Default: usartStopbits1
+#define IOT_UART_CFG_MIKROE_DEFAULT_STOP_BITS usartStopbits1
+
+// Default hardware flow control
+// None
+// CTS
+// RTS
+// CTS/RTS
+// Default: usartHwFlowControlNone
+#define IOT_UART_CFG_MIKROE_DEFAULT_FLOW_CONTROL_TYPE usartHwFlowControlNone
+
+
+// Internal Loopback
+// Enable USART Internal loopback
+// Default: 0
+#define IOT_UART_CFG_MIKROE_LOOPBACK 0
+
+//
+
+// <<< end of configuration section >>>
+
+/*******************************************************************************
+ * H/W PERIPHERAL CONFIG
+ ******************************************************************************/
+
+// <<< sl:start pin_tool >>>
+// IOT_UART_CFG_MIKROE
+// $[USART_IOT_UART_CFG_MIKROE]
+#define IOT_UART_CFG_MIKROE_PERIPHERAL USART0
+#define IOT_UART_CFG_MIKROE_PERIPHERAL_NO 0
+
+// USART0 TX on PD04
+#define IOT_UART_CFG_MIKROE_TX_PORT gpioPortD
+#define IOT_UART_CFG_MIKROE_TX_PIN 4
+
+// USART0 RX on PD05
+#define IOT_UART_CFG_MIKROE_RX_PORT gpioPortD
+#define IOT_UART_CFG_MIKROE_RX_PIN 5
+
+
+
+
+
+// [USART_IOT_UART_CFG_MIKROE]$
+// <<< sl:end pin_tool >>>
+
+/*******************************************************************************
+ * SAFE GUARD
+ ******************************************************************************/
+
+#endif /* _IOT_UART_CFG_MIKROE_H_ */
diff --git a/hardware/board/config/brd2703a/iot_uart_cfg_vcom.h b/hardware/board/config/brd2703a/iot_uart_cfg_vcom.h
new file mode 100644
index 0000000000..6400706395
--- /dev/null
+++ b/hardware/board/config/brd2703a/iot_uart_cfg_vcom.h
@@ -0,0 +1,132 @@
+/***************************************************************************//**
+ * @file iot_uart_cfg_inst.h
+ * @brief Common I/O UART instance configuration.
+ *******************************************************************************
+ * # License
+ * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * SPDX-License-Identifier: Zlib
+ *
+ * The licensor of this software is Silicon Laboratories Inc.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ ******************************************************************************/
+
+/*******************************************************************************
+ * SAFE GUARD
+ ******************************************************************************/
+
+#ifndef _IOT_UART_CFG_VCOM_H_
+#define _IOT_UART_CFG_VCOM_H_
+
+/*******************************************************************************
+ * UART Default Configs
+ ******************************************************************************/
+
+// <<< Use Configuration Wizard in Context Menu >>>
+
+// UART General Options
+
+// Instance number
+// Instance number used when iot_uart_open() is called.
+// Default: 0
+#define IOT_UART_CFG_VCOM_INST_NUM 0
+
+// Default baud rate
+// Default: 115200
+#define IOT_UART_CFG_VCOM_DEFAULT_BAUDRATE 115200
+
+// Default number of data bits
+// 4 data bits
+// 5 data bits
+// 6 data bits
+// 7 data bits
+// 8 data bits
+// Default: usartDatabits8
+#define IOT_UART_CFG_VCOM_DEFAULT_DATA_BITS usartDatabits8
+
+// Default parity mode
+// No Parity
+// Even parity
+// Odd parity
+// Default: usartNoParity
+#define IOT_UART_CFG_VCOM_DEFAULT_PARITY usartNoParity
+
+// Default number of stop bits
+// 0.5 stop bits
+// 1 stop bits
+// 1.5 stop bits
+// 2 stop bits
+// Default: usartStopbits1
+#define IOT_UART_CFG_VCOM_DEFAULT_STOP_BITS usartStopbits1
+
+// Default hardware flow control
+// None
+// CTS
+// RTS
+// CTS/RTS
+// Default: usartHwFlowControlNone
+#define IOT_UART_CFG_VCOM_DEFAULT_FLOW_CONTROL_TYPE usartHwFlowControlNone
+
+
+// Internal Loopback
+// Enable USART Internal loopback
+// Default: 0
+#define IOT_UART_CFG_VCOM_LOOPBACK 0
+
+//
+
+// <<< end of configuration section >>>
+
+/*******************************************************************************
+ * H/W PERIPHERAL CONFIG
+ ******************************************************************************/
+
+// <<< sl:start pin_tool >>>
+// IOT_UART_CFG_VCOM
+// $[USART_IOT_UART_CFG_VCOM]
+#define IOT_UART_CFG_VCOM_PERIPHERAL USART0
+#define IOT_UART_CFG_VCOM_PERIPHERAL_NO 0
+
+// USART0 TX on PA05
+#define IOT_UART_CFG_VCOM_TX_PORT gpioPortA
+#define IOT_UART_CFG_VCOM_TX_PIN 5
+
+// USART0 RX on PA06
+#define IOT_UART_CFG_VCOM_RX_PORT gpioPortA
+#define IOT_UART_CFG_VCOM_RX_PIN 6
+
+
+
+// USART0 RTS on PA08
+#define IOT_UART_CFG_VCOM_RTS_PORT gpioPortA
+#define IOT_UART_CFG_VCOM_RTS_PIN 8
+
+// USART0 CTS on PA09
+#define IOT_UART_CFG_VCOM_CTS_PORT gpioPortA
+#define IOT_UART_CFG_VCOM_CTS_PIN 9
+
+// [USART_IOT_UART_CFG_VCOM]$
+// <<< sl:end pin_tool >>>
+
+/*******************************************************************************
+ * SAFE GUARD
+ ******************************************************************************/
+
+#endif /* _IOT_UART_CFG_VCOM_H_ */
diff --git a/hardware/board/config/brd2703a/sl_board_control_config.h b/hardware/board/config/brd2703a/sl_board_control_config.h
new file mode 100644
index 0000000000..ad7793aa7e
--- /dev/null
+++ b/hardware/board/config/brd2703a/sl_board_control_config.h
@@ -0,0 +1,42 @@
+/***************************************************************************//**
+ * @file
+ * @brief Board Control
+ *******************************************************************************
+ * # License
+ * Copyright 2022 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * SPDX-License-Identifier: Zlib
+ *
+ * The licensor of this software is Silicon Laboratories Inc.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ ******************************************************************************/
+
+#ifndef SL_BOARD_CONTROL_CONFIG_H
+#define SL_BOARD_CONTROL_CONFIG_H
+
+// <<< Use Configuration Wizard in Context Menu >>>
+
+// <<< end of configuration section >>>
+
+// <<< sl:start pin_tool >>>
+
+// <<< sl:end pin_tool >>>
+
+#endif // SL_BOARD_CONTROL_CONFIG_H
diff --git a/hardware/board/config/brd2703a/sl_cpc_drv_primary_spi_usart_mikroe_config.h b/hardware/board/config/brd2703a/sl_cpc_drv_primary_spi_usart_mikroe_config.h
new file mode 100644
index 0000000000..10fb79458e
--- /dev/null
+++ b/hardware/board/config/brd2703a/sl_cpc_drv_primary_spi_usart_mikroe_config.h
@@ -0,0 +1,94 @@
+/***************************************************************************//**
+ * @file
+ * @brief CPC SPI Primary driver configuration file.
+ *******************************************************************************
+ * # License
+ * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * SPDX-License-Identifier: Zlib
+ *
+ * The licensor of this software is Silicon Laboratories Inc.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ ******************************************************************************/
+
+// <<< Use Configuration Wizard in Context Menu >>>
+
+#ifndef SL_CPC_DRV_SPI_USART_MIKROE_PRIMARY_CONFIG_H
+#define SL_CPC_DRV_SPI_USART_MIKROE_PRIMARY_CONFIG_H
+#include "spidrv.h"
+
+// CPC-Primary SPI Driver Configuration
+
+// Number of frame that can be queued in the driver receive queue
+// Default: 10
+#define SL_CPC_DRV_SPI_MIKROE_RX_QUEUE_SIZE 10
+
+// Number of frame that can be queued in the driver transmit queue
+// Default: 10
+#define SL_CPC_DRV_SPI_MIKROE_TX_QUEUE_SIZE 10
+
+// SPI bit rate
+// Default: 1000000
+#define SL_CPC_DRV_SPI_MIKROE_BITRATE 1000000
+
+// Receive Interrupt Number on Falling Edge
+// Default: 0
+#define SL_CPC_DRV_SPI_MIKROE_RX_IRQ_FALLING_EDGE_INT_NO 0
+
+// Receive Interrupt Number on Rising Edge
+// Default: 1
+#define SL_CPC_DRV_SPI_MIKROE_RX_IRQ_RISING_EDGE_INT_NO 1
+//
+
+// <<< end of configuration section >>>
+
+// <<< sl:start pin_tool >>>
+// SL_CPC_DRV_SPI_MIKROE_RX_IRQ
+// $[GPIO_SL_CPC_DRV_SPI_MIKROE_RX_IRQ]
+#define SL_CPC_DRV_SPI_MIKROE_RX_IRQ_PORT gpioPortB
+#define SL_CPC_DRV_SPI_MIKROE_RX_IRQ_PIN 1
+
+// [GPIO_SL_CPC_DRV_SPI_MIKROE_RX_IRQ]$
+
+// SL_CPC_DRV_SPI_MIKROE
+// $[USART_SL_CPC_DRV_SPI_MIKROE]
+#define SL_CPC_DRV_SPI_MIKROE_PERIPHERAL USART0
+#define SL_CPC_DRV_SPI_MIKROE_PERIPHERAL_NO 0
+
+// USART0 TX on PC03
+#define SL_CPC_DRV_SPI_MIKROE_TX_PORT gpioPortC
+#define SL_CPC_DRV_SPI_MIKROE_TX_PIN 3
+
+// USART0 RX on PC02
+#define SL_CPC_DRV_SPI_MIKROE_RX_PORT gpioPortC
+#define SL_CPC_DRV_SPI_MIKROE_RX_PIN 2
+
+// USART0 CLK on PC01
+#define SL_CPC_DRV_SPI_MIKROE_CLK_PORT gpioPortC
+#define SL_CPC_DRV_SPI_MIKROE_CLK_PIN 1
+
+// USART0 CS on PC00
+#define SL_CPC_DRV_SPI_MIKROE_CS_PORT gpioPortC
+#define SL_CPC_DRV_SPI_MIKROE_CS_PIN 0
+
+// [USART_SL_CPC_DRV_SPI_MIKROE]$
+// <<< sl:end pin_tool >>>
+
+#endif /* SL_CPC_DRV_SPI_MIKROE_PRIMARY_CONFIG_H */
diff --git a/hardware/board/config/brd2703a/sl_cpc_drv_primary_uart_usart_mikroe_config.h b/hardware/board/config/brd2703a/sl_cpc_drv_primary_uart_usart_mikroe_config.h
new file mode 100644
index 0000000000..73c4662bce
--- /dev/null
+++ b/hardware/board/config/brd2703a/sl_cpc_drv_primary_uart_usart_mikroe_config.h
@@ -0,0 +1,70 @@
+/***************************************************************************//**
+ * @file
+ * @brief CPC UART PRIMARY driver configuration file.
+ *******************************************************************************
+ * # License
+ * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * SPDX-License-Identifier: Zlib
+ *
+ * The licensor of this software is Silicon Laboratories Inc.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ ******************************************************************************/
+
+// <<< Use Configuration Wizard in Context Menu >>>
+
+#ifndef SL_CPC_DRV_UART_USART_MIKROE_PRIMARY_CONFIG_H
+#define SL_CPC_DRV_UART_USART_MIKROE_PRIMARY_CONFIG_H
+
+// CPC-Primary UART Driver Configuration
+
+// Number of frame that can be queued in the driver receive queue
+// Default: 10
+#define SL_CPC_DRV_UART_MIKROE_RX_QUEUE_SIZE 10
+
+// Number of frame that can be queued in the driver transmit queue
+// Default: 10
+#define SL_CPC_DRV_UART_MIKROE_TX_QUEUE_SIZE 10
+
+// UART Baudrate
+// Default: 115200
+#define SL_CPC_DRV_UART_MIKROE_BAUDRATE 115200
+//
+
+// <<< end of configuration section >>>
+
+// <<< sl:start pin_tool >>>
+// SL_CPC_DRV_UART_MIKROE
+// $[USART_SL_CPC_DRV_UART_MIKROE]
+#define SL_CPC_DRV_UART_MIKROE_PERIPHERAL USART0
+#define SL_CPC_DRV_UART_MIKROE_PERIPHERAL_NO 0
+
+// USART0 TX on PD04
+#define SL_CPC_DRV_UART_MIKROE_TX_PORT gpioPortD
+#define SL_CPC_DRV_UART_MIKROE_TX_PIN 4
+
+// USART0 RX on PD05
+#define SL_CPC_DRV_UART_MIKROE_RX_PORT gpioPortD
+#define SL_CPC_DRV_UART_MIKROE_RX_PIN 5
+
+// [USART_SL_CPC_DRV_UART_MIKROE]$
+// <<< sl:end pin_tool >>>
+
+#endif /* SL_CPC_DRV_UART_MIKROE_PRIMARY_CONFIG_H */
diff --git a/hardware/board/config/brd4109a_brd4001a/sl_cpc_drv_primary_uart_usart_vcom_config.h b/hardware/board/config/brd2703a/sl_cpc_drv_primary_uart_usart_vcom_config.h
similarity index 100%
rename from hardware/board/config/brd4109a_brd4001a/sl_cpc_drv_primary_uart_usart_vcom_config.h
rename to hardware/board/config/brd2703a/sl_cpc_drv_primary_uart_usart_vcom_config.h
diff --git a/hardware/board/config/brd2703a/sl_cpc_drv_secondary_spi_eusart_mikroe_config.h b/hardware/board/config/brd2703a/sl_cpc_drv_secondary_spi_eusart_mikroe_config.h
new file mode 100644
index 0000000000..486c94c444
--- /dev/null
+++ b/hardware/board/config/brd2703a/sl_cpc_drv_secondary_spi_eusart_mikroe_config.h
@@ -0,0 +1,94 @@
+/***************************************************************************//**
+ * @file
+ * @brief CPC SPI SECONDARY driver configuration file.
+ *******************************************************************************
+ * # License
+ * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * SPDX-License-Identifier: Zlib
+ *
+ * The licensor of this software is Silicon Laboratories Inc.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ ******************************************************************************/
+
+// <<< Use Configuration Wizard in Context Menu >>>
+
+#ifndef SL_CPC_DRV_SPI_EUSART_MIKROE_SECONDARY_CONFIG_H
+#define SL_CPC_DRV_SPI_EUSART_MIKROE_SECONDARY_CONFIG_H
+#include "spidrv.h"
+
+// CPC-Secondary SPI Driver Configuration
+
+// Number of frame that can be queued in the driver receive queue
+// Default: 10
+#define SL_CPC_DRV_SPI_MIKROE_RX_QUEUE_SIZE 10
+
+// Number of frame that can be queued in the driver transmit queue
+// Default: 10
+#define SL_CPC_DRV_SPI_MIKROE_TX_QUEUE_SIZE 10
+
+// SPI bit rate
+// Default: 1000000
+#define SL_CPC_DRV_SPI_MIKROE_BITRATE 1000000
+
+// Chip Select Interrupt Number on Falling Edge
+// Default: 10
+#define SL_CPC_DRV_SPI_MIKROE_CS_FALLING_EDGE_INT_NO 0
+
+// Chip Select Interrupt Number on Rising Edge
+// Default: 11
+#define SL_CPC_DRV_SPI_MIKROE_CS_RISING_EDGE_INT_NO 1
+//
+
+// <<< end of configuration section >>>
+
+// <<< sl:start pin_tool >>>
+// SL_CPC_DRV_SPI_MIKROE_RX_IRQ
+// $[GPIO_SL_CPC_DRV_SPI_MIKROE_RX_IRQ]
+#define SL_CPC_DRV_SPI_MIKROE_RX_IRQ_PORT gpioPortB
+#define SL_CPC_DRV_SPI_MIKROE_RX_IRQ_PIN 1
+
+// [GPIO_SL_CPC_DRV_SPI_MIKROE_RX_IRQ]$
+
+// SL_CPC_DRV_SPI_MIKROE
+// $[EUSART_SL_CPC_DRV_SPI_MIKROE]
+#define SL_CPC_DRV_SPI_MIKROE_PERIPHERAL EUSART1
+#define SL_CPC_DRV_SPI_MIKROE_PERIPHERAL_NO 1
+
+// EUSART1 TX on PC03
+#define SL_CPC_DRV_SPI_MIKROE_TX_PORT gpioPortC
+#define SL_CPC_DRV_SPI_MIKROE_TX_PIN 3
+
+// EUSART1 RX on PC02
+#define SL_CPC_DRV_SPI_MIKROE_RX_PORT gpioPortC
+#define SL_CPC_DRV_SPI_MIKROE_RX_PIN 2
+
+// EUSART1 SCLK on PC01
+#define SL_CPC_DRV_SPI_MIKROE_SCLK_PORT gpioPortC
+#define SL_CPC_DRV_SPI_MIKROE_SCLK_PIN 1
+
+// EUSART1 CS on PC00
+#define SL_CPC_DRV_SPI_MIKROE_CS_PORT gpioPortC
+#define SL_CPC_DRV_SPI_MIKROE_CS_PIN 0
+
+// [EUSART_SL_CPC_DRV_SPI_MIKROE]$
+// <<< sl:end pin_tool >>>
+
+#endif /* SL_CPC_DRV_SPI_MIKROE_SECONDARY_CONFIG_H */
diff --git a/hardware/board/config/brd2703a/sl_cpc_drv_secondary_spi_usart_mikroe_config.h b/hardware/board/config/brd2703a/sl_cpc_drv_secondary_spi_usart_mikroe_config.h
new file mode 100644
index 0000000000..6147b90de0
--- /dev/null
+++ b/hardware/board/config/brd2703a/sl_cpc_drv_secondary_spi_usart_mikroe_config.h
@@ -0,0 +1,94 @@
+/***************************************************************************//**
+ * @file
+ * @brief CPC SPI SECONDARY driver configuration file.
+ *******************************************************************************
+ * # License
+ * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * SPDX-License-Identifier: Zlib
+ *
+ * The licensor of this software is Silicon Laboratories Inc.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ ******************************************************************************/
+
+// <<< Use Configuration Wizard in Context Menu >>>
+
+#ifndef SL_CPC_DRV_SPI_USART_MIKROE_SECONDARY_CONFIG_H
+#define SL_CPC_DRV_SPI_USART_MIKROE_SECONDARY_CONFIG_H
+#include "spidrv.h"
+
+// CPC-Secondary SPI Driver Configuration
+
+// Number of frame that can be queued in the driver receive queue
+// Default: 10
+#define SL_CPC_DRV_SPI_MIKROE_RX_QUEUE_SIZE 10
+
+// Number of frame that can be queued in the driver transmit queue
+// Default: 10
+#define SL_CPC_DRV_SPI_MIKROE_TX_QUEUE_SIZE 10
+
+// SPI bit rate
+// Default: 1000000
+#define SL_CPC_DRV_SPI_MIKROE_BITRATE 1000000
+
+// Chip Select Interrupt Number on Falling Edge
+// Default: 10
+#define SL_CPC_DRV_SPI_MIKROE_CS_FALLING_EDGE_INT_NO 0
+
+// Chip Select Interrupt Number on Rising Edge
+// Default: 11
+#define SL_CPC_DRV_SPI_MIKROE_CS_RISING_EDGE_INT_NO 1
+//
+
+// <<< end of configuration section >>>
+
+// <<< sl:start pin_tool >>>
+// SL_CPC_DRV_SPI_MIKROE_RX_IRQ
+// $[GPIO_SL_CPC_DRV_SPI_MIKROE_RX_IRQ]
+#define SL_CPC_DRV_SPI_MIKROE_RX_IRQ_PORT gpioPortB
+#define SL_CPC_DRV_SPI_MIKROE_RX_IRQ_PIN 1
+
+// [GPIO_SL_CPC_DRV_SPI_MIKROE_RX_IRQ]$
+
+// SL_CPC_DRV_SPI_MIKROE
+// $[USART_SL_CPC_DRV_SPI_MIKROE]
+#define SL_CPC_DRV_SPI_MIKROE_PERIPHERAL USART0
+#define SL_CPC_DRV_SPI_MIKROE_PERIPHERAL_NO 0
+
+// USART0 TX on PC03
+#define SL_CPC_DRV_SPI_MIKROE_TX_PORT gpioPortC
+#define SL_CPC_DRV_SPI_MIKROE_TX_PIN 3
+
+// USART0 RX on PC02
+#define SL_CPC_DRV_SPI_MIKROE_RX_PORT gpioPortC
+#define SL_CPC_DRV_SPI_MIKROE_RX_PIN 2
+
+// USART0 CLK on PC01
+#define SL_CPC_DRV_SPI_MIKROE_CLK_PORT gpioPortC
+#define SL_CPC_DRV_SPI_MIKROE_CLK_PIN 1
+
+// USART0 CS on PC00
+#define SL_CPC_DRV_SPI_MIKROE_CS_PORT gpioPortC
+#define SL_CPC_DRV_SPI_MIKROE_CS_PIN 0
+
+// [USART_SL_CPC_DRV_SPI_MIKROE]$
+// <<< sl:end pin_tool >>>
+
+#endif /* SL_CPC_DRV_SPI_MIKROE_SECONDARY_CONFIG_H */
diff --git a/hardware/board/config/brd2703a/sl_cpc_drv_secondary_uart_eusart_mikroe_config.h b/hardware/board/config/brd2703a/sl_cpc_drv_secondary_uart_eusart_mikroe_config.h
new file mode 100644
index 0000000000..0b42be5391
--- /dev/null
+++ b/hardware/board/config/brd2703a/sl_cpc_drv_secondary_uart_eusart_mikroe_config.h
@@ -0,0 +1,84 @@
+/***************************************************************************//**
+ * @file
+ * @brief CPC EUSART SECONDARY driver configuration file.
+ *******************************************************************************
+ * # License
+ * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * SPDX-License-Identifier: Zlib
+ *
+ * The licensor of this software is Silicon Laboratories Inc.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ ******************************************************************************/
+
+// <<< Use Configuration Wizard in Context Menu >>>
+
+#ifndef SL_CPC_DRV_UART_EUSART_MIKROE_SECONDARY_CONFIG_H
+#define SL_CPC_DRV_UART_EUSART_MIKROE_SECONDARY_CONFIG_H
+
+// CPC - Secondary EUSART Driver Configuration
+
+// Number of frame that can be queued in the driver receive queue
+// Default: 10
+#define SL_CPC_DRV_UART_MIKROE_RX_QUEUE_SIZE 10
+
+// Number of frame that can be queued in the driver transmit queue
+// Default: 10
+#define SL_CPC_DRV_UART_MIKROE_TX_QUEUE_SIZE 10
+
+// EUSART Baudrate
+// Default: 115200
+#define SL_CPC_DRV_UART_MIKROE_BAUDRATE 115200
+
+// Flow control
+// None
+// CTS/RTS
+// Default: eusartHwFlowControlNone
+#define SL_CPC_DRV_UART_MIKROE_FLOW_CONTROL_TYPE eusartHwFlowControlCtsAndRts
+//
+
+// <<< end of configuration section >>>
+
+// <<< sl:start pin_tool >>>
+// SL_CPC_DRV_UART_MIKROE
+// $[EUSART_SL_CPC_DRV_UART_MIKROE]
+#define SL_CPC_DRV_UART_MIKROE_PERIPHERAL EUSART1
+#define SL_CPC_DRV_UART_MIKROE_PERIPHERAL_NO 1
+
+// EUSART1 TX on PD04
+#define SL_CPC_DRV_UART_MIKROE_TX_PORT gpioPortD
+#define SL_CPC_DRV_UART_MIKROE_TX_PIN 4
+
+// EUSART1 RX on PD05
+#define SL_CPC_DRV_UART_MIKROE_RX_PORT gpioPortD
+#define SL_CPC_DRV_UART_MIKROE_RX_PIN 5
+
+// EUSART1 CTS on PA09
+#define SL_CPC_DRV_UART_MIKROE_CTS_PORT gpioPortA
+#define SL_CPC_DRV_UART_MIKROE_CTS_PIN 9
+
+// EUSART1 RTS on PA08
+#define SL_CPC_DRV_UART_MIKROE_RTS_PORT gpioPortA
+#define SL_CPC_DRV_UART_MIKROE_RTS_PIN 8
+
+// [EUSART_SL_CPC_DRV_UART_MIKROE]$
+// <<< sl:end pin_tool >>>
+
+#endif /* SL_CPC_DRV_UART_MIKROE_SECONDARY_CONFIG_H */
diff --git a/hardware/board/config/brd2703a/sl_cpc_drv_secondary_uart_eusart_vcom_config.h b/hardware/board/config/brd2703a/sl_cpc_drv_secondary_uart_eusart_vcom_config.h
new file mode 100644
index 0000000000..7a8e267e97
--- /dev/null
+++ b/hardware/board/config/brd2703a/sl_cpc_drv_secondary_uart_eusart_vcom_config.h
@@ -0,0 +1,84 @@
+/***************************************************************************//**
+ * @file
+ * @brief CPC EUSART SECONDARY driver configuration file.
+ *******************************************************************************
+ * # License
+ * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * SPDX-License-Identifier: Zlib
+ *
+ * The licensor of this software is Silicon Laboratories Inc.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ ******************************************************************************/
+
+// <<< Use Configuration Wizard in Context Menu >>>
+
+#ifndef SL_CPC_DRV_UART_EUSART_VCOM_SECONDARY_CONFIG_H
+#define SL_CPC_DRV_UART_EUSART_VCOM_SECONDARY_CONFIG_H
+
+// CPC - Secondary EUSART Driver Configuration
+
+// Number of frame that can be queued in the driver receive queue
+// Default: 10
+#define SL_CPC_DRV_UART_VCOM_RX_QUEUE_SIZE 10
+
+// Number of frame that can be queued in the driver transmit queue
+// Default: 10
+#define SL_CPC_DRV_UART_VCOM_TX_QUEUE_SIZE 10
+
+// EUSART Baudrate
+// Default: 115200
+#define SL_CPC_DRV_UART_VCOM_BAUDRATE 115200
+
+// Flow control
+// None
+// CTS/RTS
+// Default: eusartHwFlowControlNone
+#define SL_CPC_DRV_UART_VCOM_FLOW_CONTROL_TYPE eusartHwFlowControlCtsAndRts
+//
+
+// <<< end of configuration section >>>
+
+// <<< sl:start pin_tool >>>
+// SL_CPC_DRV_UART_VCOM
+// $[EUSART_SL_CPC_DRV_UART_VCOM]
+#define SL_CPC_DRV_UART_VCOM_PERIPHERAL EUSART1
+#define SL_CPC_DRV_UART_VCOM_PERIPHERAL_NO 1
+
+// EUSART1 TX on PA05
+#define SL_CPC_DRV_UART_VCOM_TX_PORT gpioPortA
+#define SL_CPC_DRV_UART_VCOM_TX_PIN 5
+
+// EUSART1 RX on PA06
+#define SL_CPC_DRV_UART_VCOM_RX_PORT gpioPortA
+#define SL_CPC_DRV_UART_VCOM_RX_PIN 6
+
+// EUSART1 CTS on PA09
+#define SL_CPC_DRV_UART_VCOM_CTS_PORT gpioPortA
+#define SL_CPC_DRV_UART_VCOM_CTS_PIN 9
+
+// EUSART1 RTS on PA08
+#define SL_CPC_DRV_UART_VCOM_RTS_PORT gpioPortA
+#define SL_CPC_DRV_UART_VCOM_RTS_PIN 8
+
+// [EUSART_SL_CPC_DRV_UART_VCOM]$
+// <<< sl:end pin_tool >>>
+
+#endif /* SL_CPC_DRV_UART_VCOM_SECONDARY_CONFIG_H */
diff --git a/hardware/board/config/brd2703a/sl_cpc_drv_secondary_uart_usart_mikroe_config.h b/hardware/board/config/brd2703a/sl_cpc_drv_secondary_uart_usart_mikroe_config.h
new file mode 100644
index 0000000000..d487a3e44f
--- /dev/null
+++ b/hardware/board/config/brd2703a/sl_cpc_drv_secondary_uart_usart_mikroe_config.h
@@ -0,0 +1,84 @@
+/***************************************************************************//**
+ * @file
+ * @brief CPC UART SECONDARY driver configuration file.
+ *******************************************************************************
+ * # License
+ * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * SPDX-License-Identifier: Zlib
+ *
+ * The licensor of this software is Silicon Laboratories Inc.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ ******************************************************************************/
+
+// <<< Use Configuration Wizard in Context Menu >>>
+
+#ifndef SL_CPC_DRV_UART_USART_MIKROE_SECONDARY_CONFIG_H
+#define SL_CPC_DRV_UART_USART_MIKROE_SECONDARY_CONFIG_H
+
+// CPC - Secondary UART Driver Configuration
+
+// Number of frame that can be queued in the driver receive queue
+// Default: 10
+#define SL_CPC_DRV_UART_MIKROE_RX_QUEUE_SIZE 10
+
+// Number of frame that can be queued in the driver transmit queue
+// Default: 10
+#define SL_CPC_DRV_UART_MIKROE_TX_QUEUE_SIZE 10
+
+// UART Baudrate
+// Default: 115200
+#define SL_CPC_DRV_UART_MIKROE_BAUDRATE 115200
+
+// Flow control
+// None
+// CTS/RTS
+// Default: usartHwFlowControlCtsAndRts
+#define SL_CPC_DRV_UART_MIKROE_FLOW_CONTROL_TYPE usartHwFlowControlCtsAndRts
+//
+
+// <<< end of configuration section >>>
+
+// <<< sl:start pin_tool >>>
+// SL_CPC_DRV_UART_MIKROE
+// $[USART_SL_CPC_DRV_UART_MIKROE]
+#define SL_CPC_DRV_UART_MIKROE_PERIPHERAL USART0
+#define SL_CPC_DRV_UART_MIKROE_PERIPHERAL_NO 0
+
+// USART0 TX on PD04
+#define SL_CPC_DRV_UART_MIKROE_TX_PORT gpioPortD
+#define SL_CPC_DRV_UART_MIKROE_TX_PIN 4
+
+// USART0 RX on PD05
+#define SL_CPC_DRV_UART_MIKROE_RX_PORT gpioPortD
+#define SL_CPC_DRV_UART_MIKROE_RX_PIN 5
+
+// USART0 CTS on PA09
+#define SL_CPC_DRV_UART_MIKROE_CTS_PORT gpioPortA
+#define SL_CPC_DRV_UART_MIKROE_CTS_PIN 9
+
+// USART0 RTS on PA08
+#define SL_CPC_DRV_UART_MIKROE_RTS_PORT gpioPortA
+#define SL_CPC_DRV_UART_MIKROE_RTS_PIN 8
+
+// [USART_SL_CPC_DRV_UART_MIKROE]$
+// <<< sl:end pin_tool >>>
+
+#endif /* SL_CPC_DRV_UART_MIKROE_SECONDARY_CONFIG_H */
diff --git a/hardware/board/config/brd2703a/sl_cpc_drv_secondary_uart_usart_vcom_config.h b/hardware/board/config/brd2703a/sl_cpc_drv_secondary_uart_usart_vcom_config.h
new file mode 100644
index 0000000000..4371ae942d
--- /dev/null
+++ b/hardware/board/config/brd2703a/sl_cpc_drv_secondary_uart_usart_vcom_config.h
@@ -0,0 +1,84 @@
+/***************************************************************************//**
+ * @file
+ * @brief CPC UART SECONDARY driver configuration file.
+ *******************************************************************************
+ * # License
+ * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * SPDX-License-Identifier: Zlib
+ *
+ * The licensor of this software is Silicon Laboratories Inc.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ ******************************************************************************/
+
+// <<< Use Configuration Wizard in Context Menu >>>
+
+#ifndef SL_CPC_DRV_UART_USART_VCOM_SECONDARY_CONFIG_H
+#define SL_CPC_DRV_UART_USART_VCOM_SECONDARY_CONFIG_H
+
+// CPC - Secondary UART Driver Configuration
+
+// Number of frame that can be queued in the driver receive queue
+// Default: 10
+#define SL_CPC_DRV_UART_VCOM_RX_QUEUE_SIZE 10
+
+// Number of frame that can be queued in the driver transmit queue
+// Default: 10
+#define SL_CPC_DRV_UART_VCOM_TX_QUEUE_SIZE 10
+
+// UART Baudrate
+// Default: 115200
+#define SL_CPC_DRV_UART_VCOM_BAUDRATE 115200
+
+// Flow control
+// None
+// CTS/RTS
+// Default: usartHwFlowControlCtsAndRts
+#define SL_CPC_DRV_UART_VCOM_FLOW_CONTROL_TYPE usartHwFlowControlCtsAndRts
+//
+
+// <<< end of configuration section >>>
+
+// <<< sl:start pin_tool >>>
+// SL_CPC_DRV_UART_VCOM
+// $[USART_SL_CPC_DRV_UART_VCOM]
+#define SL_CPC_DRV_UART_VCOM_PERIPHERAL USART0
+#define SL_CPC_DRV_UART_VCOM_PERIPHERAL_NO 0
+
+// USART0 TX on PA05
+#define SL_CPC_DRV_UART_VCOM_TX_PORT gpioPortA
+#define SL_CPC_DRV_UART_VCOM_TX_PIN 5
+
+// USART0 RX on PA06
+#define SL_CPC_DRV_UART_VCOM_RX_PORT gpioPortA
+#define SL_CPC_DRV_UART_VCOM_RX_PIN 6
+
+// USART0 CTS on PA09
+#define SL_CPC_DRV_UART_VCOM_CTS_PORT gpioPortA
+#define SL_CPC_DRV_UART_VCOM_CTS_PIN 9
+
+// USART0 RTS on PA08
+#define SL_CPC_DRV_UART_VCOM_RTS_PORT gpioPortA
+#define SL_CPC_DRV_UART_VCOM_RTS_PIN 8
+
+// [USART_SL_CPC_DRV_UART_VCOM]$
+// <<< sl:end pin_tool >>>
+
+#endif /* SL_CPC_DRV_UART_VCOM_SECONDARY_CONFIG_H */
diff --git a/hardware/board/config/brd2703a/sl_device_init_lfxo_config.h b/hardware/board/config/brd2703a/sl_device_init_lfxo_config.h
new file mode 100644
index 0000000000..93fb41af03
--- /dev/null
+++ b/hardware/board/config/brd2703a/sl_device_init_lfxo_config.h
@@ -0,0 +1,66 @@
+/***************************************************************************//**
+ * @file
+ * @brief DEVICE_INIT_LFXO Config
+ *******************************************************************************
+ * # License
+ * Copyright 2022 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * SPDX-License-Identifier: Zlib
+ *
+ * The licensor of this software is Silicon Laboratories Inc.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ ******************************************************************************/
+
+#ifndef SL_DEVICE_INIT_LFXO_CONFIG_H
+#define SL_DEVICE_INIT_LFXO_CONFIG_H
+
+// <<< Use Configuration Wizard in Context Menu >>>
+
+// Mode
+//
+// Crystal oscillator
+// AC-coupled buffer
+// External digital clock
+// Default: cmuLfxoOscMode_Crystal
+#define SL_DEVICE_INIT_LFXO_MODE cmuLfxoOscMode_Crystal
+
+// CTUNE <0-127>
+// Default: 63
+#define SL_DEVICE_INIT_LFXO_CTUNE 63
+
+// LFXO precision in PPM <0-65535>
+// Default: 500
+#define SL_DEVICE_INIT_LFXO_PRECISION 100
+
+// Startup Timeout Delay
+//
+// 2 cycles
+// 256 cycles
+// 1K cycles
+// 2K cycles
+// 4K cycles
+// 8K cycles
+// 16K cycles
+// 32K cycles
+// Default: cmuLfxoStartupDelay_4KCycles
+#define SL_DEVICE_INIT_LFXO_TIMEOUT cmuLfxoStartupDelay_4KCycles
+// <<< end of configuration section >>>
+
+#endif // SL_DEVICE_INIT_LFXO_CONFIG_H
diff --git a/hardware/board/config/brd2703a/sl_i2cspm_mikroe_config.h b/hardware/board/config/brd2703a/sl_i2cspm_mikroe_config.h
new file mode 100644
index 0000000000..05ae810b6e
--- /dev/null
+++ b/hardware/board/config/brd2703a/sl_i2cspm_mikroe_config.h
@@ -0,0 +1,58 @@
+/***************************************************************************//**
+ * @file
+ * @brief I2CSPM Config
+ *******************************************************************************
+ * # License
+ * Copyright 2019 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * The licensor of this software is Silicon Laboratories Inc. Your use of this
+ * software is governed by the terms of Silicon Labs Master Software License
+ * Agreement (MSLA) available at
+ * www.silabs.com/about-us/legal/master-software-license-agreement. This
+ * software is distributed to you in Source Code format and is governed by the
+ * sections of the MSLA applicable to Source Code.
+ *
+ ******************************************************************************/
+
+#ifndef SL_I2CSPM_MIKROE_CONFIG_H
+#define SL_I2CSPM_MIKROE_CONFIG_H
+
+// <<< Use Configuration Wizard in Context Menu
+
+// I2CSPM settings
+
+// Reference clock frequency
+// Frequency in Hz of the reference clock.
+// Select 0 to use the frequency of the currently selected clock.
+// Default: 0
+#define SL_I2CSPM_MIKROE_REFERENCE_CLOCK 0
+
+// Speed mode
+// <0=> Standard mode (100kbit/s)
+// <1=> Fast mode (400kbit/s)
+// <2=> Fast mode plus (1Mbit/s)
+// Default: 0
+#define SL_I2CSPM_MIKROE_SPEED_MODE 0
+// end I2CSPM config
+
+// <<< end of configuration section >>>
+
+// <<< sl:start pin_tool >>>
+// SL_I2CSPM_MIKROE
+// $[I2C_SL_I2CSPM_MIKROE]
+#define SL_I2CSPM_MIKROE_PERIPHERAL I2C0
+#define SL_I2CSPM_MIKROE_PERIPHERAL_NO 0
+
+// I2C0 SCL on PB04
+#define SL_I2CSPM_MIKROE_SCL_PORT gpioPortB
+#define SL_I2CSPM_MIKROE_SCL_PIN 4
+
+// I2C0 SDA on PB05
+#define SL_I2CSPM_MIKROE_SDA_PORT gpioPortB
+#define SL_I2CSPM_MIKROE_SDA_PIN 5
+
+// [I2C_SL_I2CSPM_MIKROE]$
+// <<< sl:end pin_tool >>>
+
+#endif // SL_I2CSPM_MIKROE_CONFIG_H
diff --git a/hardware/board/config/brd2703a/sl_i2cspm_qwiic_config.h b/hardware/board/config/brd2703a/sl_i2cspm_qwiic_config.h
new file mode 100644
index 0000000000..31ebf3cf9e
--- /dev/null
+++ b/hardware/board/config/brd2703a/sl_i2cspm_qwiic_config.h
@@ -0,0 +1,58 @@
+/***************************************************************************//**
+ * @file
+ * @brief I2CSPM Config
+ *******************************************************************************
+ * # License
+ * Copyright 2019 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * The licensor of this software is Silicon Laboratories Inc. Your use of this
+ * software is governed by the terms of Silicon Labs Master Software License
+ * Agreement (MSLA) available at
+ * www.silabs.com/about-us/legal/master-software-license-agreement. This
+ * software is distributed to you in Source Code format and is governed by the
+ * sections of the MSLA applicable to Source Code.
+ *
+ ******************************************************************************/
+
+#ifndef SL_I2CSPM_QWIIC_CONFIG_H
+#define SL_I2CSPM_QWIIC_CONFIG_H
+
+// <<< Use Configuration Wizard in Context Menu
+
+// I2CSPM settings
+
+// Reference clock frequency
+// Frequency in Hz of the reference clock.
+// Select 0 to use the frequency of the currently selected clock.
+// Default: 0
+#define SL_I2CSPM_QWIIC_REFERENCE_CLOCK 0
+
+// Speed mode
+// <0=> Standard mode (100kbit/s)
+// <1=> Fast mode (400kbit/s)
+// <2=> Fast mode plus (1Mbit/s)
+// Default: 0
+#define SL_I2CSPM_QWIIC_SPEED_MODE 0
+// end I2CSPM config
+
+// <<< end of configuration section >>>
+
+// <<< sl:start pin_tool >>>
+// SL_I2CSPM_QWIIC
+// $[I2C_SL_I2CSPM_QWIIC]
+#define SL_I2CSPM_QWIIC_PERIPHERAL I2C1
+#define SL_I2CSPM_QWIIC_PERIPHERAL_NO 1
+
+// I2C1 SCL on PC04
+#define SL_I2CSPM_QWIIC_SCL_PORT gpioPortC
+#define SL_I2CSPM_QWIIC_SCL_PIN 4
+
+// I2C1 SDA on PC05
+#define SL_I2CSPM_QWIIC_SDA_PORT gpioPortC
+#define SL_I2CSPM_QWIIC_SDA_PIN 5
+
+// [I2C_SL_I2CSPM_QWIIC]$
+// <<< sl:end pin_tool >>>
+
+#endif // SL_I2CSPM_QWIIC_CONFIG_H
diff --git a/hardware/board/config/brd2703a/sl_iostream_eusart_mikroe_config.h b/hardware/board/config/brd2703a/sl_iostream_eusart_mikroe_config.h
new file mode 100644
index 0000000000..2878fe4aee
--- /dev/null
+++ b/hardware/board/config/brd2703a/sl_iostream_eusart_mikroe_config.h
@@ -0,0 +1,107 @@
+/***************************************************************************//**
+ * @file
+ * @brief IOSTREAM_EUSART Config.
+ *******************************************************************************
+ * # License
+ * Copyright 2020 Silicon Laboratories Inc. www.silabs.com
+ *******************************************************************************
+ *
+ * SPDX-License-Identifier: Zlib
+ *
+ * The licensor of this software is Silicon Laboratories Inc.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ ******************************************************************************/
+
+#ifndef SL_IOSTREAM_EUSART_MIKROE_CONFIG_H
+#define SL_IOSTREAM_EUSART_MIKROE_CONFIG_H
+
+// <<< Use Configuration Wizard in Context Menu >>>
+
+// EUART settings
+
+// Enable High frequency mode
+// Default: 1
+#define SL_IOSTREAM_EUSART_MIKROE_ENABLE_HIGH_FREQUENCY 1
+
+// Baud rate
+// Default: 115200
+#define SL_IOSTREAM_EUSART_MIKROE_BAUDRATE 115200
+
+// Parity mode to use
+// No Parity
+// Even parity
+// Odd parity
+// Default: eusartNoParity
+#define SL_IOSTREAM_EUSART_MIKROE_PARITY eusartNoParity
+
+// Number of stop bits to use.
+// 0.5 stop bits
+// 1 stop bits
+// 1.5 stop bits
+// 2 stop bits
+// Default: eusartStopbits1
+#define SL_IOSTREAM_EUSART_MIKROE_STOP_BITS eusartStopbits1
+
+// Flow control
+// None
+// CTS
+// RTS
+// CTS/RTS
+// Software Flow control (XON/XOFF)
+// Default: eusartHwFlowControlNone
+#define SL_IOSTREAM_EUSART_MIKROE_FLOW_CONTROL_TYPE eusartHwFlowControlNone
+
+// Receive buffer size
+// Default: 32
+#define SL_IOSTREAM_EUSART_MIKROE_RX_BUFFER_SIZE 32
+
+//