Skip to content
This repository was archived by the owner on Feb 4, 2023. It is now read-only.

Commit f72f6ba

Browse files
authored
v1.12.1 to add LittleFS support to ESP32-C3
### Releases v1.12.1 1. Add LittleFS support to `ESP32-C3`. 2. Use ESP32-core's LittleFS library instead of Lorol's LITTLEFS library for v2.0.0+
1 parent 3c6b591 commit f72f6ba

File tree

31 files changed

+285
-833
lines changed

31 files changed

+285
-833
lines changed

README.md

Lines changed: 87 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@
140140
* [9.3 Normal running with correct local time, TZ set and using NTP](#93-normal-running-with-correct-local-time-tz-set-and-using-ntp)
141141
* [10. Async_ConfigOnDoubleReset_TZ on ESP32C3_DEV using SPIFFS](#10-async_configondoublereset_tz-on-esp32c3_dev-using-spiffs)
142142
* [11. Async_ConfigOnDoubleReset on ESP32S3_DEV using LittleFS](#11-Async_ConfigOnDoubleReset-on-ESP32S3_DEV-using-LittleFS) **New**
143+
* [12. Async_ConfigOnDoubleReset on ESP32C3_DEV using LittleFS](#12-Async_ConfigOnDoubleReset-on-ESP32C3_DEV-using-LittleFS) **New**
143144
* [Debug](#debug)
144145
* [Troubleshooting](#troubleshooting)
145146
* [Issues](#issues)
@@ -255,7 +256,7 @@ This [**ESPAsync_WiFiManager** library](https://github.com/khoih-prog/ESPAsync_W
255256

256257
1. **ESP8266 and ESP32-based boards using EEPROM, SPIFFS or LittleFS**.
257258
2. **ESP32-S2 (ESP32-S2 Saola, AI-Thinker ESP-12K, etc.) using EEPROM, SPIFFS or LittleFS**.
258-
3. **ESP32-C3 (ARDUINO_ESP32C3_DEV) using EEPROM or SPIFFS**.
259+
3. **ESP32-C3 (ARDUINO_ESP32C3_DEV) using EEPROM, SPIFFS or LittleFS**.
259260
4. **ESP32-S3 (ESP32S3_DEV, ESP32_S3_BOX, UM TINYS3, UM PROS3, UM FEATHERS3, etc.) using EEPROM, SPIFFS or LittleFS**.
260261

261262
---
@@ -440,8 +441,14 @@ then connect WebBrowser to configurable ConfigPortal IP address, default is 192.
440441
WiFiMulti wifiMulti;
441442

442443
// LittleFS has higher priority than SPIFFS
443-
#define USE_LITTLEFS true
444-
#define USE_SPIFFS false
444+
#if ( defined(ESP_ARDUINO_VERSION_MAJOR) && (ESP_ARDUINO_VERSION_MAJOR >= 2) )
445+
#define USE_LITTLEFS true
446+
#define USE_SPIFFS false
447+
#elif defined(ARDUINO_ESP32C3_DEV)
448+
// For core v1.0.6-, ESP32-C3 only supporting SPIFFS and EEPROM. To use v2.0.0+ for LittleFS
449+
#define USE_LITTLEFS false
450+
#define USE_SPIFFS true
451+
#endif
445452

446453
#if USE_LITTLEFS
447454
// Use LittleFS
@@ -452,15 +459,15 @@ then connect WebBrowser to configurable ConfigPortal IP address, default is 192.
452459
#if ( defined(ESP_ARDUINO_VERSION_MAJOR) && (ESP_ARDUINO_VERSION_MAJOR >= 2) )
453460
#warning Using ESP32 Core 1.0.6 or 2.0.0+
454461
// The library has been merged into esp32 core from release 1.0.6
455-
#include <LittleFS.h>
462+
#include <LittleFS.h> // https://github.com/espressif/arduino-esp32/tree/master/libraries/LittleFS
456463
457464
FS* filesystem = &LittleFS;
458465
#define FileFS LittleFS
459466
#define FS_Name "LittleFS"
460467
#else
461468
#warning Using ESP32 Core 1.0.5-. You must install LITTLEFS library
462469
// The library has been merged into esp32 core from release 1.0.6
463-
#include <LITTLEFS.h> // https://github.com/lorol/LITTLEFS
470+
#include <LITTLEFS.h> // https://github.com/lorol/LITTLEFS
464471
465472
FS* filesystem = &LITTLEFS;
466473
#define FileFS LITTLEFS
@@ -582,8 +589,14 @@ WM_Config WM_config;
582589
WiFiMulti wifiMulti;
583590

584591
// LittleFS has higher priority than SPIFFS
585-
#define USE_LITTLEFS true
586-
#define USE_SPIFFS false
592+
#if ( defined(ESP_ARDUINO_VERSION_MAJOR) && (ESP_ARDUINO_VERSION_MAJOR >= 2) )
593+
#define USE_LITTLEFS true
594+
#define USE_SPIFFS false
595+
#elif defined(ARDUINO_ESP32C3_DEV)
596+
// For core v1.0.6-, ESP32-C3 only supporting SPIFFS and EEPROM. To use v2.0.0+ for LittleFS
597+
#define USE_LITTLEFS false
598+
#define USE_SPIFFS true
599+
#endif
587600

588601
#if USE_LITTLEFS
589602
// Use LittleFS
@@ -594,15 +607,15 @@ WM_Config WM_config;
594607
#if ( defined(ESP_ARDUINO_VERSION_MAJOR) && (ESP_ARDUINO_VERSION_MAJOR >= 2) )
595608
#warning Using ESP32 Core 1.0.6 or 2.0.0+
596609
// The library has been merged into esp32 core from release 1.0.6
597-
#include <LittleFS.h>
610+
#include <LittleFS.h> // https://github.com/espressif/arduino-esp32/tree/master/libraries/LittleFS
598611
599612
FS* filesystem = &LittleFS;
600613
#define FileFS LittleFS
601614
#define FS_Name "LittleFS"
602615
#else
603616
#warning Using ESP32 Core 1.0.5-. You must install LITTLEFS library
604617
// The library has been merged into esp32 core from release 1.0.6
605-
#include <LITTLEFS.h> // https://github.com/lorol/LITTLEFS
618+
#include <LITTLEFS.h> // https://github.com/lorol/LITTLEFS
606619
607620
FS* filesystem = &LITTLEFS;
608621
#define FileFS LITTLEFS
@@ -2182,7 +2195,7 @@ ESPAsync_wifiManager.setRemoveDuplicateAPs(false);
21822195
#error This code is intended to run on the ESP8266 or ESP32 platform! Please check your Tools->Board setting.
21832196
#endif
21842197

2185-
#define ESP_ASYNC_WIFIMANAGER_VERSION_MIN_TARGET "ESPAsync_WiFiManager v1.12.0"
2198+
#define ESP_ASYNC_WIFIMANAGER_VERSION_MIN_TARGET "ESPAsync_WiFiManager v1.12.1"
21862199
#define ESP_ASYNC_WIFIMANAGER_VERSION_MIN 1012000
21872200

21882201
// Use from 0 to 4. Higher number, more debugging messages and memory usage.
@@ -2205,13 +2218,13 @@ ESPAsync_wifiManager.setRemoveDuplicateAPs(false);
22052218
WiFiMulti wifiMulti;
22062219

22072220
// LittleFS has higher priority than SPIFFS
2208-
#if ( ARDUINO_ESP32C3_DEV )
2209-
// Currently, ESP32-C3 only supporting SPIFFS and EEPROM. Will fix to support LittleFS
2210-
#define USE_LITTLEFS false
2211-
#define USE_SPIFFS true
2212-
#else
2221+
#if ( defined(ESP_ARDUINO_VERSION_MAJOR) && (ESP_ARDUINO_VERSION_MAJOR >= 2) )
22132222
#define USE_LITTLEFS true
22142223
#define USE_SPIFFS false
2224+
#elif defined(ARDUINO_ESP32C3_DEV)
2225+
// For core v1.0.6-, ESP32-C3 only supporting SPIFFS and EEPROM. To use v2.0.0+ for LittleFS
2226+
#define USE_LITTLEFS false
2227+
#define USE_SPIFFS true
22152228
#endif
22162229

22172230
#if USE_LITTLEFS
@@ -2223,15 +2236,15 @@ ESPAsync_wifiManager.setRemoveDuplicateAPs(false);
22232236
#if ( defined(ESP_ARDUINO_VERSION_MAJOR) && (ESP_ARDUINO_VERSION_MAJOR >= 2) )
22242237
#warning Using ESP32 Core 1.0.6 or 2.0.0+
22252238
// The library has been merged into esp32 core from release 1.0.6
2226-
#include <LittleFS.h>
2239+
#include <LittleFS.h> // https://github.com/espressif/arduino-esp32/tree/master/libraries/LittleFS
22272240
22282241
FS* filesystem = &LittleFS;
22292242
#define FileFS LittleFS
22302243
#define FS_Name "LittleFS"
22312244
#else
22322245
#warning Using ESP32 Core 1.0.5-. You must install LITTLEFS library
22332246
// The library has been merged into esp32 core from release 1.0.6
2234-
#include <LITTLEFS.h> // https://github.com/lorol/LITTLEFS
2247+
#include <LITTLEFS.h> // https://github.com/lorol/LITTLEFS
22352248
22362249
FS* filesystem = &LITTLEFS;
22372250
#define FileFS LITTLEFS
@@ -3554,7 +3567,7 @@ This is terminal debug output when running [Async_ConfigOnDRD_FS_MQTT_Ptr_Medium
35543567
35553568
```
35563569
Starting Async_ConfigOnDRD_FS_MQTT_Ptr_Medium using LittleFS on ESP32_DEV
3557-
ESPAsync_WiFiManager v1.12.0
3570+
ESPAsync_WiFiManager v1.12.1
35583571
ESP_DoubleResetDetector v1.3.0
35593572
Config File not found
35603573
Can't read Config File, using default values
@@ -3573,7 +3586,7 @@ Opening Configuration Portal. No timeout : DRD or No stored Credentials..
35733586
35743587
```
35753588
Starting Async_ConfigOnDRD_FS_MQTT_Ptr_Medium using LittleFS on ESP32_DEV
3576-
ESPAsync_WiFiManager v1.12.0
3589+
ESPAsync_WiFiManager v1.12.1
35773590
ESP_DoubleResetDetector v1.3.0
35783591
Config File not found
35793592
Can't read Config File, using default values
@@ -3661,7 +3674,7 @@ This is terminal debug output when running [Async_ConfigOnDRD_FS_MQTT_Ptr_Comple
36613674
36623675
```
36633676
Starting Async_ConfigOnDRD_FS_MQTT_Ptr_Complex using LittleFS on ESP8266_NODEMCU_ESP12E
3664-
ESPAsync_WiFiManager v1.12.0
3677+
ESPAsync_WiFiManager v1.12.1
36653678
ESP_DoubleResetDetector v1.3.0
36663679
{"AIO_SERVER_Label":"io.adafruit.com","AIO_SERVERPORT_Label":"1883","AIO_USERNAME_Label":"user_name","AIO_KEY_Label":"aio_key"}
36673680
Config File successfully parsed
@@ -3701,7 +3714,7 @@ TWWWW WTWWW
37013714
37023715
```
37033716
Starting Async_ConfigOnDRD_FS_MQTT_Ptr_Complex using LittleFS on ESP8266_NODEMCU_ESP12E
3704-
ESPAsync_WiFiManager v1.12.0
3717+
ESPAsync_WiFiManager v1.12.1
37053718
ESP_DoubleResetDetector v1.3.0
37063719
{"AIO_SERVER_Label":"io.adafruit.com","AIO_SERVERPORT_Label":"1883","AIO_USERNAME_Label":"user_name","AIO_KEY_Label":"aio_key"}
37073720
Config File successfully parsed
@@ -3791,7 +3804,7 @@ This is terminal debug output when running [Async_ConfigOnDoubleReset](examples/
37913804
37923805
```cpp
37933806
Starting Async_ConfigOnDoubleReset with DoubleResetDetect using SPIFFS on ESP32_DEV
3794-
ESPAsync_WiFiManager v1.12.0
3807+
ESPAsync_WiFiManager v1.12.1
37953808
ESP_DoubleResetDetector v1.3.0
37963809
[WM] RFC925 Hostname = ConfigOnDoubleReset
37973810
[WM] setSTAStaticIPConfig for USE_CONFIGURABLE_DNS
@@ -3850,7 +3863,7 @@ This is terminal debug output when running [Async_ConfigOnDoubleReset](examples/
38503863

38513864
```cpp
38523865
Starting Async_ConfigOnDoubleReset with DoubleResetDetect using LittleFS on ESP8266_NODEMCU_ESP12E
3853-
ESPAsync_WiFiManager v1.12.0
3866+
ESPAsync_WiFiManager v1.12.1
38543867
ESP_DoubleResetDetector v1.3.0
38553868
[WM] RFC925 Hostname = ConfigOnDoubleReset
38563869
[WM] setSTAStaticIPConfig for USE_CONFIGURABLE_DNS
@@ -3910,7 +3923,7 @@ This is terminal debug output when running [Async_ESP_FSWebServer_DRD](examples/
39103923
39113924
```cpp
39123925
Starting Async_ESP_FSWebServer_DRD using LittleFS on ESP8266_NODEMCU_ESP12E
3913-
ESPAsync_WiFiManager v1.12.0
3926+
ESPAsync_WiFiManager v1.12.1
39143927
ESP_DoubleResetDetector v1.3.0
39153928
Opening / directory
39163929
FS File: CanadaFlag_1.png, size: 40.25KB
@@ -3988,7 +4001,7 @@ This is terminal debug output when running [Async_ESP32_FSWebServer_DRD](example
39884001

39894002
```
39904003
Starting Async_ESP32_FSWebServer_DRD using LittleFS on ESP32_DEV
3991-
ESPAsync_WiFiManager v1.12.0
4004+
ESPAsync_WiFiManager v1.12.1
39924005
ESP_DoubleResetDetector v1.3.0
39934006
FS File: /CanadaFlag_1.png, size: 40.25KB
39944007
FS File: /CanadaFlag_2.png, size: 8.12KB
@@ -4099,7 +4112,7 @@ This is terminal debug output when running [Async_ConfigOnDoubleReset](examples/
40994112

41004113
```
41014114
Starting Async_ConfigOnDoubleReset using LittleFS on ESP32S2_DEV
4102-
ESPAsync_WiFiManager v1.12.0
4115+
ESPAsync_WiFiManager v1.12.1
41034116
ESP_DoubleResetDetector v1.3.0
41044117
ESP Self-Stored: SSID = HueNet1, Pass = 12345678
41054118
[WM] * Add SSID = HueNet1 , PW = 12345678
@@ -4136,7 +4149,7 @@ This is terminal debug output when running [Async_ConfigOnDoubleReset_TZ](exampl
41364149

41374150
```
41384151
Starting Async_ConfigOnDoubleReset_TZ using LittleFS on ESP32_DEV
4139-
ESPAsync_WiFiManager v1.12.0
4152+
ESPAsync_WiFiManager v1.12.1
41404153
ESP_DoubleResetDetector v1.3.0
41414154
ESP Self-Stored: SSID = HueNet1, Pass = password
41424155
[WM] * Add SSID = HueNet1 , PW = password
@@ -4178,7 +4191,7 @@ Local Date/Time: Thu Feb 10 23:50:26 2022
41784191

41794192
```
41804193
Starting Async_ConfigOnDoubleReset_TZ using LittleFS on ESP32_DEV
4181-
ESPAsync_WiFiManager v1.12.0
4194+
ESPAsync_WiFiManager v1.12.1
41824195
ESP_DoubleResetDetector v1.3.0
41834196
ESP Self-Stored: SSID = HueNet1, Pass = password
41844197
[WM] * Add SSID = HueNet1 , PW = password
@@ -4227,7 +4240,7 @@ This is terminal debug output when running [Async_ESP_FSWebServer_DRD](examples/
42274240

42284241
```
42294242
Starting Async_ESP_FSWebServer_DRD using LittleFS on ESP8266_NODEMCU_ESP12E
4230-
ESPAsync_WiFiManager v1.12.0
4243+
ESPAsync_WiFiManager v1.12.1
42314244
ESP_DoubleResetDetector v1.3.0
42324245
Opening / directory
42334246
FS File: drd.dat, size: 4B
@@ -4300,7 +4313,7 @@ Local Date/Time: Thu Feb 10 23:16:26 2022
43004313

43014314
```
43024315
Starting Async_ESP_FSWebServer_DRD using LittleFS on ESP8266_NODEMCU_ESP12E
4303-
ESPAsync_WiFiManager v1.12.0
4316+
ESPAsync_WiFiManager v1.12.1
43044317
ESP_DoubleResetDetector v1.3.0
43054318
Opening / directory
43064319
FS File: drd.dat, size: 4B
@@ -4359,7 +4372,7 @@ This is terminal debug output when running [Async_ConfigOnDoubleReset_TZ](exampl
43594372

43604373
```
43614374
Starting Async_ConfigOnDoubleReset_TZ using SPIFFS on ESP32C3_DEV
4362-
ESPAsync_WiFiManager v1.12.0
4375+
ESPAsync_WiFiManager v1.12.1
43634376
ESP_DoubleResetDetector v1.3.0
43644377
ESP Self-Stored: SSID = HueNet1, Pass = 12345678
43654378
[WM] * Add SSID = HueNet1 , PW = 12345678
@@ -4405,7 +4418,7 @@ This is terminal debug output when running [Async_ConfigOnDoubleReset](examples/
44054418

44064419
```
44074420
Starting Async_ConfigOnDoubleReset using LittleFS on ESP32S3_DEV
4408-
ESPAsync_WiFiManager v1.12.0
4421+
ESPAsync_WiFiManager v1.12.1
44094422
ESP_DoubleResetDetector v1.3.0
44104423
ESP Self-Stored: SSID = HueNet1, Pass = password
44114424
[WM] * Add SSID = HueNet1 , PW = password
@@ -4440,6 +4453,48 @@ HHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHH
44404453
HHHHHHHHHH HHHHHHHHHH HHH
44414454
```
44424455

4456+
---
4457+
4458+
#### 12. [Async_ConfigOnDoubleReset](examples/Async_ConfigOnDoubleReset) on ESP32C3_DEV using LittleFS
4459+
4460+
This is terminal debug output when running [Async_ConfigOnDoubleReset](examples/Async_ConfigOnDoubleReset) on **ESP32C3_DEV using LittleFS and ESP32 core v2.0.2**.
4461+
4462+
```
4463+
Starting Async_ConfigOnDoubleReset using LittleFS on ESP32C3_DEV
4464+
ESPAsync_WiFiManager v1.12.1
4465+
ESP_DoubleResetDetector v1.3.0
4466+
ESP Self-Stored: SSID = HueNet1, Pass = password
4467+
[WM] * Add SSID = HueNet1 , PW = password
4468+
Got ESP Self-Stored Credentials. Timeout 120s for Config Portal
4469+
[WM] LoadWiFiCfgFile
4470+
[WM] OK
4471+
[WM] stationIP = 0.0.0.0 , gatewayIP = 192.168.2.1
4472+
[WM] netMask = 255.255.255.0
4473+
[WM] dns1IP = 192.168.2.1 , dns2IP = 8.8.8.8
4474+
Got stored Credentials. Timeout 120s for Config Portal
4475+
LittleFS Flag read = 0xD0D04321
4476+
No doubleResetDetected
4477+
Saving config file...
4478+
Saving config file OK
4479+
[WM] * Add SSID = HueNet1 , PW = password
4480+
[WM] * Add SSID = HueNet2 , PW = password
4481+
ConnectMultiWiFi in setup
4482+
[WM] ConnectMultiWiFi with :
4483+
[WM] * Flash-stored Router_SSID = HueNet1 , Router_Pass = password
4484+
[WM] * Add SSID = HueNet1 , PW = password
4485+
[WM] * Additional SSID = HueNet1 , PW = password
4486+
[WM] * Additional SSID = HueNet2 , PW = password
4487+
[WM] Connecting MultiWifi...
4488+
[WM] WiFi connected after time: 1
4489+
[WM] SSID: HueNet1 ,RSSI= -19
4490+
[WM] Channel: 2 ,IP address: 192.168.2.85
4491+
After waiting 8.41 secs more in setup(), connection result is connected. Local IP: 192.168.2.85
4492+
HStop doubleResetDetecting
4493+
Saving config file...
4494+
Saving config file OK
4495+
HHH
4496+
```
4497+
44434498
---
44444499
---
44454500

changelog.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
## Table of Contents
1313

1414
* [Changelog](#changelog)
15+
* [Releases v1.12.1](#releases-v1121)
1516
* [Releases v1.12.0](#releases-v1120)
1617
* [Releases v1.11.0](#releases-v1110)
1718
* [Releases v1.10.0](#releases-v1100)
@@ -48,6 +49,11 @@
4849

4950
## Changelog
5051

52+
### Releases v1.12.1
53+
54+
1. Add LittleFS support to `ESP32-C3`.
55+
2. Use ESP32-core's LittleFS library instead of Lorol's LITTLEFS library for v2.0.0+
56+
5157
### Releases v1.12.0
5258

5359
1. Add support to `ESP32-S3` (`ESP32S3_DEV, ESP32_S3_BOX, UM TINYS3, UM PROS3, UM FEATHERS3`, etc.) using [ESP32 core, esp32-s3-support branch, v2.0.2+](https://github.com/espressif/arduino-esp32/tree/esp32-s3-support)

examples/Async_AutoConnect/Async_AutoConnect.ino

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
#error This code is intended to run on the ESP8266 or ESP32 platform! Please check your Tools->Board setting.
1919
#endif
2020

21-
#define ESP_ASYNC_WIFIMANAGER_VERSION_MIN_TARGET "ESPAsync_WiFiManager v1.12.0"
22-
#define ESP_ASYNC_WIFIMANAGER_VERSION_MIN 1012000
21+
#define ESP_ASYNC_WIFIMANAGER_VERSION_MIN_TARGET "ESPAsync_WiFiManager v1.12.1"
22+
#define ESP_ASYNC_WIFIMANAGER_VERSION_MIN 1012001
2323

2424
// Use from 0 to 4. Higher number, more debugging messages and memory usage.
2525
#define _ESPASYNC_WIFIMGR_LOGLEVEL_ 3
@@ -35,13 +35,13 @@
3535
WiFiMulti wifiMulti;
3636

3737
// LittleFS has higher priority than SPIFFS
38-
#if ( ARDUINO_ESP32C3_DEV )
39-
// Currently, ESP32-C3 only supporting SPIFFS and EEPROM. Will fix to support LittleFS
40-
#define USE_LITTLEFS false
41-
#define USE_SPIFFS true
42-
#else
38+
#if ( defined(ESP_ARDUINO_VERSION_MAJOR) && (ESP_ARDUINO_VERSION_MAJOR >= 2) )
4339
#define USE_LITTLEFS true
4440
#define USE_SPIFFS false
41+
#elif defined(ARDUINO_ESP32C3_DEV)
42+
// For core v1.0.6-, ESP32-C3 only supporting SPIFFS and EEPROM. To use v2.0.0+ for LittleFS
43+
#define USE_LITTLEFS false
44+
#define USE_SPIFFS true
4545
#endif
4646

4747
#if USE_LITTLEFS
@@ -53,15 +53,15 @@
5353
#if ( defined(ESP_ARDUINO_VERSION_MAJOR) && (ESP_ARDUINO_VERSION_MAJOR >= 2) )
5454
#warning Using ESP32 Core 1.0.6 or 2.0.0+
5555
// The library has been merged into esp32 core from release 1.0.6
56-
#include <LittleFS.h>
56+
#include <LittleFS.h> // https://github.com/espressif/arduino-esp32/tree/master/libraries/LittleFS
5757

5858
FS* filesystem = &LittleFS;
5959
#define FileFS LittleFS
6060
#define FS_Name "LittleFS"
6161
#else
6262
#warning Using ESP32 Core 1.0.5-. You must install LITTLEFS library
6363
// The library has been merged into esp32 core from release 1.0.6
64-
#include <LITTLEFS.h> // https://github.com/lorol/LITTLEFS
64+
#include <LITTLEFS.h> // https://github.com/lorol/LITTLEFS
6565

6666
FS* filesystem = &LITTLEFS;
6767
#define FileFS LITTLEFS

0 commit comments

Comments
 (0)