From d35239dd28e279220d257d350b7b7b359dbb177a Mon Sep 17 00:00:00 2001 From: Mathy Vanvoorden Date: Sat, 25 May 2024 16:00:19 +0200 Subject: [PATCH 01/73] fix(esp_driver_spi): Make spi_bus_free() exit early on issues If for example there are still devices configured on the bus spi_bus_free() will report that with ESP_ERR_INVALID_STATE, but not before it frees all other things like IO and DMA. This means that after the function exits any other task that is still running and using those devices will all of a sudden stop working (and probably crash the device). This commit prevents that situation by making the function return early so it can be called again safely later when all devices have been removed. Closes https://github.com/espressif/esp-idf/pull/13856 --- .../esp_driver_spi/src/gpspi/spi_common.c | 3 +++ .../test_apps/master/main/test_spi_master.c | 27 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/components/esp_driver_spi/src/gpspi/spi_common.c b/components/esp_driver_spi/src/gpspi/spi_common.c index e1c9feb3dba5..3e54e769870a 100644 --- a/components/esp_driver_spi/src/gpspi/spi_common.c +++ b/components/esp_driver_spi/src/gpspi/spi_common.c @@ -921,6 +921,9 @@ esp_err_t spi_bus_free(spi_host_device_t host_id) if (ctx->destroy_func) { err = ctx->destroy_func(ctx->destroy_arg); + if (err != ESP_OK) { + return err; + } } spicommon_bus_free_io_cfg(&bus_attr->bus_cfg); diff --git a/components/esp_driver_spi/test_apps/master/main/test_spi_master.c b/components/esp_driver_spi/test_apps/master/main/test_spi_master.c index 504c448a5d6f..cde48af830bf 100644 --- a/components/esp_driver_spi/test_apps/master/main/test_spi_master.c +++ b/components/esp_driver_spi/test_apps/master/main/test_spi_master.c @@ -1757,3 +1757,30 @@ static void test_iram_slave_normal(void) TEST_CASE_MULTIPLE_DEVICES("SPI_Master:IRAM_safe", "[spi_ms]", test_master_iram, test_iram_slave_normal); #endif + +TEST_CASE("test_bus_free_safty_to_remain_devices", "[spi]") +{ + spi_bus_config_t buscfg = SPI_BUS_TEST_DEFAULT_CONFIG(); + TEST_ESP_OK(spi_bus_initialize(TEST_SPI_HOST, &buscfg, SPI_DMA_CH_AUTO)); + + spi_device_handle_t dev0, dev1; + spi_device_interface_config_t devcfg = SPI_DEVICE_TEST_DEFAULT_CONFIG(); + TEST_ESP_OK(spi_bus_add_device(TEST_SPI_HOST, &devcfg, &dev0)); + devcfg.spics_io_num = PIN_NUM_MISO; + TEST_ESP_OK(spi_bus_add_device(TEST_SPI_HOST, &devcfg, &dev1)); + + int master_send; + spi_transaction_t trans_cfg = { + .tx_buffer = &master_send, + .length = sizeof(uint32_t) * 8, + }; + + TEST_ESP_OK(spi_bus_remove_device(dev0)); + TEST_ESP_ERR(ESP_ERR_INVALID_STATE, spi_bus_free(TEST_SPI_HOST)); + + //transaction should OK after a failed call to bus_free + TEST_ESP_OK(spi_device_transmit(dev1, (spi_transaction_t *)&trans_cfg)); + + TEST_ESP_OK(spi_bus_remove_device(dev1)); + TEST_ESP_OK(spi_bus_free(TEST_SPI_HOST)); +} From 72c389f77108ba3ff90994ffdfab004e6b0ffb8b Mon Sep 17 00:00:00 2001 From: David Cermak Date: Thu, 20 Jun 2024 17:00:19 +0200 Subject: [PATCH 02/73] fix(lwip): Cleanup lwip -> ethernet dependencies --- components/lwip/CMakeLists.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/components/lwip/CMakeLists.txt b/components/lwip/CMakeLists.txt index 448588615353..f45eeab2ed16 100644 --- a/components/lwip/CMakeLists.txt +++ b/components/lwip/CMakeLists.txt @@ -207,10 +207,6 @@ if(CONFIG_LWIP_ENABLE) idf_component_optional_requires(PRIVATE openthread) endif() - if(CONFIG_ETH_ENABLED) - idf_component_optional_requires(PRIVATE esp_eth) - endif() - if(CONFIG_LWIP_DHCP_RESTORE_LAST_IP) idf_component_optional_requires(PRIVATE nvs_flash) endif() From c6c980b893cf5ee0236d89313f7303bb44ebde6b Mon Sep 17 00:00:00 2001 From: David Cermak Date: Fri, 21 Jun 2024 18:00:07 +0200 Subject: [PATCH 03/73] fix(wifi): Call DHCP server API only if DHCPS enabled Closes https://github.com/espressif/esp-idf/issues/14006 --- components/esp_wifi/src/wifi_default.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/components/esp_wifi/src/wifi_default.c b/components/esp_wifi/src/wifi_default.c index 6a687084c403..4d3acdc741a7 100644 --- a/components/esp_wifi/src/wifi_default.c +++ b/components/esp_wifi/src/wifi_default.c @@ -465,8 +465,10 @@ esp_err_t esp_netif_create_default_wifi_mesh_netifs(esp_netif_t **p_netif_sta, e ESP_ERROR_CHECK(esp_netif_attach_wifi_ap(netif_ap)); ESP_ERROR_CHECK(esp_wifi_set_default_wifi_ap_handlers()); +#ifdef CONFIG_LWIP_DHCPS // ...and stop DHCP server to keep the ESP_NETIF_DHCP_STOPPED state ESP_ERROR_CHECK(esp_netif_dhcps_stop(netif_ap)); +#endif // Create "almost" default station, but with un-flagged DHCP client memcpy(&netif_cfg, ESP_NETIF_BASE_DEFAULT_WIFI_STA, sizeof(netif_cfg)); From 1d99cd827c628f8b98830647fb1228b00aa10867 Mon Sep 17 00:00:00 2001 From: Linda Date: Tue, 21 May 2024 17:55:05 +0800 Subject: [PATCH 04/73] docs: Migrate user guides of ESP32-C3-DevKitM and ESP32-C3-DevKitC to esp-dev-kits --- ...esp32-c3-devkitc-02-v1-annotated-photo.png | Bin 385839 -> 0 bytes .../esp32-c3-devkitc-02-v1-block-diags.png | Bin 81043 -> 0 bytes .../esp32-c3-devkitc-02-v1-isometric.png | Bin 244132 -> 0 bytes .../_static/esp32-c3-devkitc-02-v1-pinout.png | Bin 279856 -> 0 bytes .../esp32-c3-devkitm-1-v1-annotated-photo.png | Bin 349164 -> 0 bytes .../esp32-c3-devkitm-1-v1-block-diagram.png | Bin 76929 -> 0 bytes .../esp32-c3-devkitm-1-v1-isometric.png | Bin 236210 -> 0 bytes docs/_static/esp32-c3-devkitm-1-v1-pinout.png | Bin 353343 -> 0 bytes docs/en/get-started/index.rst | 4 +- .../esp32c3/user-guide-devkitc-02.rst | 236 ----------------- .../esp32c3/user-guide-devkitm-1.rst | 240 ------------------ docs/zh_CN/get-started/index.rst | 4 +- .../esp32c3/user-guide-devkitc-02.rst | 237 ----------------- .../esp32c3/user-guide-devkitm-1.rst | 240 ------------------ 14 files changed, 4 insertions(+), 957 deletions(-) delete mode 100644 docs/_static/esp32-c3-devkitc-02-v1-annotated-photo.png delete mode 100644 docs/_static/esp32-c3-devkitc-02-v1-block-diags.png delete mode 100644 docs/_static/esp32-c3-devkitc-02-v1-isometric.png delete mode 100644 docs/_static/esp32-c3-devkitc-02-v1-pinout.png delete mode 100644 docs/_static/esp32-c3-devkitm-1-v1-annotated-photo.png delete mode 100644 docs/_static/esp32-c3-devkitm-1-v1-block-diagram.png delete mode 100644 docs/_static/esp32-c3-devkitm-1-v1-isometric.png delete mode 100644 docs/_static/esp32-c3-devkitm-1-v1-pinout.png delete mode 100644 docs/en/hw-reference/esp32c3/user-guide-devkitc-02.rst delete mode 100644 docs/en/hw-reference/esp32c3/user-guide-devkitm-1.rst delete mode 100644 docs/zh_CN/hw-reference/esp32c3/user-guide-devkitc-02.rst delete mode 100644 docs/zh_CN/hw-reference/esp32c3/user-guide-devkitm-1.rst diff --git a/docs/_static/esp32-c3-devkitc-02-v1-annotated-photo.png b/docs/_static/esp32-c3-devkitc-02-v1-annotated-photo.png deleted file mode 100644 index 5b05cc38b4a8671e42af3f131c7895a6a01d23b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 385839 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 dPKe+W&?-aLYyMn(J@S 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�Jz`TEC7v?P}EUYQs%&+ACSbE-3Hx&SFV?0 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

HwvYhVO^$OsG&kRLKy1MmHDjextC1r`E8q)Y{t z{ZamQc4{Jrd_RKpM=5tVh1jyk^`~;!N&zYWyd(K=(W+Pcs$Pc6_HF(Uy$^$5wYnz9gf)m)od(E z^Du3O{3g;cfCuD7l7vLM+i9j24&?Hg01$w%^vufrVFifBaO zt|Lp-;>s#ySuq-+sVg=T3&4DcC|x>1tp?|sgC4w?z9iX_AQ8=A zQcc5BIIkd+18g-nbkK;9%^lg2q(9;8fMY8fp;2Uv_hkX-vT)Us^g>pwj%~8Y3&(YF zZ+&7oWSP>qCZVPyvxQ8lpU5E~-;e84yr0H;0wes}4H3xzZak2*c8d5z=*kK2J4LD8 zWRNn{?PT%3Ni+5XxVBh-c?rksVqQ^qk)3BD`j%{|+eRG=PERgK8}lKzq=bGU>#Vq( zejeqO=(<0&6ng6e4?2`$(apBkzWdp_fVzk-bVnU5~s??b-U)!k}qke0f`p{;gSGea^WBOqbGo8MNxO23BB|*iNXKVf1vkIj0Pe z#r)z~+KMAr0mPuCxkabI;oEqAB~jxSaHtFB@H^_aAXyt(z+TA5=m}Hp(Pv(BKy7Dt zJs-`p&$*qw`(&Oyf*6q4iKA~NOTiohp!Y$FRfI0!)`iq61To%*opCRLTVZW(+(F8GvOya!ME)*+jpS9aCVW8>{UA z_bUXlW+~x!Sx1N}IHm#0)BvuP@$ezXNy>STnNmp6x5icLT?~1q2iGMXQ-37c(wvYJ zmmHSD)Gl>VgWw5KGn1%yY6{Z4M|F21f6nLds~#dPGWTHelFb0Dw@2x*L&}452{Uev zV2yFrN~$R&8K3%sFhTfj(I9dJMCpk)A>ZN|g?uREtT!vO=`>ZO4#th)0Res|h$9Pc zWkIyA2=L1yImxl)isxj4m`8p|xgZ37#!LYrW$RR%r`j)Fzd(8)SuK8(x!Y{V9)GNz zaLke1(=g3Q+j*AyF}5fo8`5hpzVxPj`o$*@7VZgaQ4%8QW8FJw|ATGx^bs^~orhGB z`KYnMWiE?(u>s?R6)V=mKp;qDSd>BZ={e+FRad0z>rb~q78!j0zqz*E)@*g#{FUFb z=aJp!x$;2bv@f~cQ34@cJF`Odhdv0Oniq08{LBwwR>n;)kuvrdhe(M4X+G@uiSy%u z{|t=4_ZWcz0`ffuY2YnC&Jj>LJx=skwHO4@0oMZfMB4a=3V5Tj4rc?wD4oqJ;zSA4 zO3^!omph_n-P+Jte7)%LlK^dk#}2p(Kso|KQ2a>&3ZsAskBU6`zDh0K=#;%^msJ$5 zV}{uS53!M{HjFlCud)Dxs!)#G)Jk;>Lnex_n6{1d@DdfGd40V#awB z^$P)HeOR=r+ph}KUDyfBmN%|Wb$m*GehFlt-I1ON+@;uP`bp9EvylzOu5$yr;rg0p z06(%WK*@&9^bSBXoP+ISD-pKW-u;wKh_NEdT12)cij=Lmu#`=j0$TaWv(X0%h|H56 z_~^5Ffc-oR6UE+h>;(IEO*MpqNN9PnmEz{o)MfVYqfc2uezq;&T+KBloMXvO_y{)a z6!*eSzk|7-d;(|(q_J7%B3sA@u&Yl&2+7oD{Px4tH>mr3CmX9I5Bu&rhfNbu7HzSP z-n4C^Ia*6on=_%aIUh$}2N8(zdy>_uBYg%LgfdP2l3j_s5qWgcCEgDJb7AwUS``7_ zC}SW3sD2t5++h;jU-of|!-;fLW8p^f;RBom00F9(=>_b@6M%PQc{zoZNY0RTo7hIsVjLdb4xFW*ps!9rL$bpa&ro;jWH;~AVJ_R z0mug3aZSu^W_z0Br;sKFCB@?7^2*AcInDH=__)Q~9b|*@%W#KMbIvTD6J-=}mXggg z<0i})V9v(@qe1MI^=!D4dHk)PDux|0%;dNyM9;}IY_Elga9`VT7gNN-xyLk`Q?^l= zN7ZHN)khtbfLofLHY&nZ!E^{>-9c7QS->>JBZt}+o?gqvDJ=}y>E-$KK@c2wGC-iB z@NVjJWZ|u7e<`Fig}km8;GS17#PUW=v9@lSdLDEjO(Qot&&43lbp(Y8UaYE3dp^BPLC=MN1Y__%BDnL4Je_RjnB0nB;!@ZTS`C+@k;a;WJEl@!n={7lOw>-zW$FWbYv|D(-Y zw$#=xUxi$AE+CpLBmi78DG?pLb~KDtRGy3mq$fX6$TLX24#c3JdM-WhZstLnAdPBd z1gQ0ZDdWRp3)z7PiDRZ-kO;Co8G;T< zC+)BdX5R6AWvUg7(%PYeIXNEIXgA(2DILh#S$&M0A^;010Ws`BDa4h1AJo>Q( z4Utku9qVj>TA2N8jvo7P?15L*!I|D`-uqW6_N>wck&)K&j9BF zxe2+6J`x1%jJ7(PkK_h?gcMms`umB%7oaolayCyz8_UCmoIg=@BsIz)bg-wee_H|9 zo1}=n2Vk79ehNu8U9dqI2@~`ONmnO2=q5JAY|aZwMK-pn$Xe8lZpNtL)=i=A>go;D zi8R=WN9}JbC z-O1j4|4rm#gE@D4WiZYq)K28l9errkDEsWQkDbPm**M~8EL60a!irS!`$Y@qTULIq zlU-3S6@d$7EHb>;g(h2eu9Ap|+<+967~-#}Q^2n-zl2H2=m2B{fKp+ulMDv{C_|Js zf|FLiqvuXIQkgIj-(DnNGA)Qg;Cv7U84@gCy2^=qx^0a^EIT^@v)rTUJI@5b=5md? zy#S$5!d9*$Q^CL0DSms?+8qFjtb#f@R~C(6o^bOWa)kXbnI%{&w;9L`F;hq6H~>M8 zU+OQD1bo1#xUWh6LcYShcVu;B7W|N#ETaF7ScFy-m)o0fy=Pbb;!<1i;pgT;*B)jb z1ppZyeJ=MqmwqW-I49lr=tmB4Y3ptRxB(Ucav?PK>hXX`hdDz;8$z|EHD)X8y3L(4 z+&=!Y!74{kSJVk{2B;U53}RmE{`5kK^Q?O9QpOyh=Ns;Ht(IM=%hO|{Cl2Ge!m5{d zR#8k#&V`6E5pck#6OjgV$LQ%$LKDnWF8i&G`1}+56KC-W1^?S#c!3@lar&9$BOwXX zY}9W>kk0@n6H$u)!;pY%8Uz}o|LbqpS^?Q6fmDIZ1Z2=f1}-At2@wd8t*T=jufO^4 zm=2_^nP*N>`9a9{%6L{Pnfp~EsyKgYn|u45#)m5Q4g%nN0m)%B_SuC)E#6eed{ES$ zF=cJgbEV8`ny5X{o4P9^+5AlIcs|uD&`Cawi9u^qt81x2rTvfL8tL^sk%dguzZ+*m321Bu^ zkJ=Wp<=7$QFLSmNl}(5;-wCls{}2U3$5__u5y; z;qs9^=G)DD@35o$Y)EA}V>=X64-6iK;;D3j-)R;n=Ay@*~%itD4t4VzaE9)iha6dXO84B$(qm~BcR}r6cHY> zH>`&W8fm>$mROR_l#1N7@DY4bhDnknNfw>;S!`Bk3G)m?Aaowe-W_$^Y4(%T&b5g< z?PG(Axj$q+%W(b6%`YH>v5_nd$LGy1YF9koT<(dNz8W25o@DsYN6@Fv);B(7+nRk= zQC@+2TZw)9&2mUrmTh9K+;`8N?YL7;v0HDx(So@-mKWj){HH)!oO#M}-~`5GXrkhO z*}40CIqU~sirRaz1@7Vv9?mC^*#{9~O>o@kIDUe4Bmg;6JyL?X&l{cnNIhN@)X+WC z`q_#EcHlKI0zYH~1_;Ox8Lff${-{QvYDhT+(Axpp0Bn|g;2NNlC@Q*NMT0my`DAIBo!O1c0rcA1b=k#;fz%K}c}C;cJHo5q8(M7i1%q zi~<s3&S~-eDA^trBsO*e#K?do*^m;lCFYnRqKtiP z>N)?^)mggneu^Bk72&6^NQ8bJ+T3JU83ur-;s74eu0I>;OEbR{p^k)%2^$-1fCgJ(`V@59dz)Sd4m_QJw=Apu+0wH{~#n05FoN!ivB)}M69qZpGJdp zs0Vxq%=II|Yp1?q@4ff6d0&0b_<3#2_^CF3-g^)?-5cfwE2N6aRrEPz>=fiZO}2d5 zDvIen)3_y%j5Uhf6zD@%iL^3dG<-P(ERFDjLNjU}eGF%8T7Xivd_Cw5R$#6QcFFxX! z!<>7y@6mhO=@*?~f5&pPmF$vS;BtMrbg!?m8Kb9K%eEGx@zf+if}|n}A&2omiUm;Q z{H5KYQ$fyRb=Zv}jh+W=yC8I+EpyHloQV>d$@c>)vd;OetmFXImrk zpiG)5FrY8PSoYPn@~H{xa2TuvM3D%vK)Xwz6z~)6&v6K4BH3kYzkJ84oPt=NEm*eD z-dndA(uZ~*9eWN1`AHFbo*miY#+6MVa~Fi5B}KA$#`1GRIJY%g0rI3yGB+UzxZKv< z)ZMh!*CRzNw`ZQYlV~smA0QegaIr=aWwJGCrNH%Kl->m|0H==Nkq9jGRWwJ9R2CmKS4&RNy+j!4L5_q zq@8o&*%&$$km01hg*lX@tN5GqJ~q0Va$aPrIJS$MwG4N$GcGxwnwlW%0qY=yuo{Di zJ8r+0^L5+c$}GkfJ8MApwZFcKXPR-~IZ<{l266TgxFOcUm};D&*0>#69b;0GTVfq# zJA289slQJLrWi@qSM?cDhCs#ZS!A(#Ad~=`KxDr@it=1!C8At^i07GjJVXuX&e$mR z(9MGtgpdeKCn!YM+NVA;x;I)6Wfd*?t5a7b(5=saKqzCUY)guV#t*SjZH^j9Y7S&H z_5l_eo_l_i_wjS2t-9B$7ZC|jP$US@=Y%;Qk$(1v62QLXwXuzC0Ye-K~4ntn`UPtcBu?JoQBk+Ak zK#%IcYhVQauN;9|nsfEj-@r|j(<%ByM&+f@Qp>Dt1)X@Z06SYy8e$=EqRj;1IU590 z95z}-nOuNrMaM+~^t)L|g$Q~%;K-4%H>ZitD8w7b&aB1tMNbb$t(I2;7Xrwxwxr?BZo9*yzVjtq{Q&(im^ zRhS8w=*20hAK*cr#`z36U1ihojT5j6xkg)fKg&ka04#^1 z-`18|$i{Fx=)eQ4f<||>+iHkyL#q1X5QSo*$5GB1SxuJPMph27k3V{k`iovW=%B+G z{v_Re3+dQ>lJ!6c(q8n?Y>qH3JMxf2opV;ij}x;^>(<%!_U!<@A&zV*lcUHVRm-no;Qe-{?B7d}PiK+{KcFAozvPPS|(TAgJP z+_v)a(SieH)gY{7*kF#A%fEY>dp_<<7oEZbwqV^R%Z9KPQHu}?Q34Ce(sAQ)<|dz+ z=9oU_FQoy1+8u;B#4%$4BU$AJ0WHdWrI}B?fLf+F&QiTLbo@AMhntXXHCh6%{~6P! z*^@87Vy;5YscD-7Fyf49gpAtKZYep8NG8rhsyr874$d;{MWTWQIGkaq${b%;F zy^cGP`PL1w3EE?iK4TYLbds%u*iNEL`!{P=W3*6=Q`;cB?)E$FkH7jAfXok=ZYIOf zVuR_pUPVTvxwXY1lO;5rTm1Dm79dlU2f=N_!7V}tC7+J%#r$caN#vpx3+;g2_JUl7 z?D020!{)i(X78~J*@{jA9DwYSeB@IYNe~5S#Q@^jS3V+*NXK_-HUf;VY@kzQg^~bp z$qQvO9V6-vN@REegWN+8@-huf5 zDHItd)#qf8I;caC=0B6+8K;h@mOeKMf+*wQ;u%R(bC%@&A^~zba&a8>#nHOa%zra{ zFM%|%jpL;Gz5*w=DLEct?CWbg_KYBSqZ?mo=HiHl#Nyv zM&bQ_2&jvPL{{PIoe_iZXf0Ou1KR35drqy2fsLZ09}63gy}5 zH{Q(JLGe5L$BY?!+1u}YY5q9Z3nw3%JCxco)&c4moouUgp>QBh*C8`5=1U4A7ZFIMUr4$k5l79Moo@a%F2s`c_2|92$=RpSzqga3UR3B#4%D~ zga=*&Bk+AkKxk{=H82AISB^ji;Oe5NnLXXv=(R9w<5U5yEGiud1>i@dK)Q4vi!X0M z3(ou4^aKhqDRDMhZO7VgMP&3Qxm^ipd-?D_z(cf?F4O>nP6&$^u+T}TT1C6_08c6+ zSJY2HLdWPQGqIzm0-sG3Pu*wHXIP4edJhN5rD<9SrqNA-yyP9)P`e31hu9!?M5fpj z`JWo)C5Y0;`JIg1cd)OO4K8~xr^x340zClKIMI9Q>T_@xibfd)&O>zt88%)uDQuxY zobpxhJ)oUGNuq2iqWbD*piGA(V2*T+B4ZajuJrCHKvc4?9kNCzT_Wj&vus!{M6YxN9o=c7MNNiN*w6U6k+N*4-bw?%)pTLc-63U*cW`Xtw8+Suri9#I z5vWEo5(gZzH#HeUoO9T`3Bp1ZW>At0YB=%=Xnxq!Y2{@@0bg`Kr}J^YirOgv&X44i zWl>E6x@}O7hoARA@S<46b}#o}*l zk3IIF4kBia8&+{2a1X-@H_E(J$LUglei@mWWvf>JQaKi2#|I&e0-8~?1I+YHNM6M8 zB4#f>^`JurH!Q(5D?wcnQB!H+`;n+s0D1)0!bJQf9lZPATex3b2lG?r4NfE&M%Rzy zmjLgM=ObayJWWp&e$NN!>}Jdv1)g29XOMYCu@CO)usQt33LM(rsb0%G6G;bf@;mq6 zc`r|B%;plwRnfQdlPMzJ0$snj?0n~#xgnz2M6?AqBh)wbQ&8-K4CL?(x05aGq1iS@g6?!>0#xW-w@T@E@Bv$fM zNRt8)ny&$5bDA?gvP4?&R8NqO68zA4DhR_kbCQe~$Bl57ya$mI_l7kE0Nl?rE?}JM zV=zRL!_>osae^Y-dFfSGS%lsy-!^R~D~HL!wrcx=fJcP$$t}W8yPldP*6Uwi`I7B4 z{$18?>bzJtnzxg29hysEg4!xbd>fghEQmxVO2nVB4N!l=YJ*|Oj(MtnF#(=y)$(}& z;gTA0sm?smX25NQHL&h$UE`dCTI6}{=$8TyWXv=#ebn=F;&b~+6dq^7#vJ367Q%|%6u3tSZ>FL1b4``$c{IR ziJ?&F%nTGzQI$*bHrj*)<8UUO@yh4Vo2 zl$q3i;{@eccS2-{^^6U?21ekAjKBZ^`5~h<@ZKNQ2!xRVbjh(Okk8^t#0RkML+4KH zhz*2|2cSH7@F*)R&&AG^_#T^lJ6VJfm9r; z3b4uoysO?qbt@uO>fsP#15OAmkhLj*@Td=piVP9@8j^U<$t*j!+=+r@_hbd2V$?A837t*t)P#^#qBcblb6uz( z@+NQq+;bv)A?_|Mtz5Ono*PN(Du5z%7gHL6+hBBN6zHvoa@K(^JowVLro3ti2@ z046SKE*dzeP&b<}*Svb$W;^VJv+b?7pR(x__ptn;0-N{YTq_w|%-cC@fIxfGdi!|$ zW^~r2Xs(-8hC>kmhH#< z(6|Z&D>%WUZv99MbI4Tv_Se6GumiAhFWR!E!8sQn>%b@?`puoSmTZ7XGv{+v|IrO; z0R%=0vT<~y7@mxqYA51ku)G8q)Xzr^LDhj={bfXcGO7m=QRMlOY)0hIX;K=-RDp3X ztfWxbkNX$|vaGnkX3pHro_OkUvIXs|9bv~zKtNtKY)Obmz?(m)K|DF0}az7ut)@yv|t2feI4?0y8sro#9Ni(#m2hugJG`D{&NK zy-HFmv~feTUH!|$tgCS?4t0JAly->U(7e3e?@)9 z9hQp}@8Z+XutN_!*jBGzW1VE1W1O?rJ_TXsvpzL_Tfmp@2$=&l0c_p-Lf1l7D|P18MTeS`(QU9mZvuDtVEjVsYdZO%3caM8>*P06j<- z-(^f_q6b*SY*xFkBe!XX94Jy41#k(-^+3ivY(Oe-&L*PW0e|vS8^TFBwGB>3cBDmW zmevoT^8y}X==ME0{`3IIXK2X9vJ`OTcK};N$YFb&Loc;4NXF+xO3{(CQMb0%TX|`vjT%12ni{tfErzIZj`{TF7&d%QK7~lMip$&UZQ0TV5Qh?m zhE19w8ZmLAty!|rDhr39^{=%y{!|XFaH6P^wh4UIcD33*dy;LzeXIjJ-9+0qKqj>p zxNb#}*>!fbQgA*98|JvRY^}8;PCpkgxYAaxUTSBac7Q$i+WR<8xoz4w8Wy6B|7z|h zHfY2s=G12U>tnA_Q!~UKA@cs(>#tILEPA7+iXkG?SPS!~i?PjyJgfFZWHAW<(VR>( ze!7mb%6tH4FW|9>;mg>|PdsbyelpKq`DB5$ZmH$IAx(rBwzsEj-jbEb=9(E#h&c1m z#r$?Umvip~a+FO-s@4W@8e(qyD6Bnr?_+HDS#xaR@@9LhW~0rXI^6c2F~^z!$qj2Z z+FlbU*z)ytfGEE$pZ~61eaSUQQL^oV3(u!Mq=$&_;WlUAS@y-^8rx@|vEqTsU62uo zTlt_e=5@e6`*ejB4=%T1@4are=1DvAxTEaUv(ExxC+ru$e9WrXY~nilt=nB;{n+rv znEw&xPQ+JhB}AnI0mvKYE7uu+qSAM`Cu;VB}q+ZR~M!i%x&gN56(vyUixc0{?L=Sk7i9s#fA>9 zwS(p)%MxMxRdu?z9 z!4%fH9tanzP+as%?98jLvu{3smurW-Qs*J?E_qwj*GsXuOJ>|5yKGk`UEn!Ji zAVtj=89rwX)XBsF+RCPId#sOjPf}VqF!No7?T~H)2Qo$o;jral572YqhUkehzxML8 z=BXM>;9#h&edjCI-6rmFjPB>vWNC85i7h+X!ZSPEA(~VXI?ri}b84ySao)qq%UagQ z-k|KC?h~tRR@#~tFXOr+M88qD1d!u&$2YL+u+%#M05C}uGK~C2pwR{RRF4Q1 zd-{+>^s&)FEu1K`hC`sh6J!~ui#Wdqfl%t5rJ3K2;oGUmW{fDI6FCC_YlBGR-L5E8 zl<1g>BPG}9W7AIKz~XWNG60Hx0EZ%tDHeJG{4@Yd1+Xb32hJwSd-Ktk$Jw9)WGXU5 zgq0;IrXwJ36vKSl~wog3_klA3Q+}w zTo9eO`k%1jsV9jWaHHV1Y=R}n;0s4xu8q?f3yMMmY+R`@kyn0}h9sy_S5Qoc2wM(g z+DU`32o}DfEY456ExUM0SqZYG1Xn^-4#%swGj0@;v-wA;gHW?PMf(K&Q;?9Z7NjOf z6vCWO9~)2TyjShpfQL zRo|f7Zza2f%mP5ty}k*MK~{r%BcjyN+CW5mIMNjEBPXoR@kuf?p`0SPAjAoIOK+kb zIZ=$-5o$IHs0(2;ZzR*PV%A?w{N4`0JB^ z=seq8U2D^J+sD4ZYPV+VHmljP5s*O?6(T0hxdZyR=Xn65PBJn+BDEf}Ky`JEbQMRM z1-q=E7UCz^qk?km{^#EStUb;(lmLFX4+3(`q0XjSt6S1#eIla3F|U9P84dLka6vK! zG(~VC%!efXXkK}3zFm9Ab@r!+Z?&uk?=}w^jeaCfD;`VR7Nl~TOCiYa(y9>@?n6%b z+$;N~9iDOfQ8t*h&OYrv!+;>)wv6QR8fI!D##BsVD4+Q;xH%t~}qayW=vO z_wF|qZ%f!VYE8-pjY1;11$kDU^W3(Q-IE2ik2;$;*OgP0ZC_X80`;c{?9e@Tu@g@D z35kR)I4%*>?kS*}zXbw~$6l5vAdrXK9(5>XBP;C9C*QT*58B_JeEtP$WLl_W zkkcA#Lz)71C!TzIc0igUFuJ`5lKC&B5JEEkd=eX_t)F-vBh@y;Rgfq8?2c?NtB>XMPY@Fs2c8AAuD4OgLo+r zBzHpf^^oMRi#1)DHsuN&IT-^W39eou6a7)@W-v)my;ww=Cti+82y2eq(A>DB^^sL> zB|{`cFW0RImdhdbgnr0eu&&l3JRi*j7_uNf1!TO2lqc+f19w8|+HR>%oXc`tSSN3? zkA z1qlT8;>IT#o#e8F$q20EI+?G{Z$y2VMgs@IyvmfPnmv(HeN~k7@*f*+kkaF#sh) zAx%E}Oa@JOl&FvvX%!?&nk4y5GNr5pi#gFOB)@F>q?~CUrVu1s0YqiTCM9rBZkqQK z*-tk)(IpRywxUe|)kV;;R}vCsK6ncYKG9ab*b&X*8+QQ``Mg>(8ER0a z{$?U{r0j96k(|p9A(0Jkk^u}M8&VN; zjIjd3b6`LazaOR0KNN<8jk- zXlu9B(7-T{+Y_K6-gXEIBqghmngt|rh@69vu5C!+=FB>bW_|1E)k1v&W8D{rbU@@J zZOFJgDaT1!2f#QdpA8$Zl}!_|y?5Tr+O}_VHvZ;V6T0?n2*NOnwQeVriq;*OMl=~vK$ z zt><2ycKYG)Xg}mNA2PMg!m+Q-)4j=_dh!M<8Na7xm+irYFvoO6t|fuy-OE@jXz<>d zXPbSzf_WUmWsE)~>797rw~S?(J@?$RR#)F@f4li!d-3Vt03cKLr;CrUL-s+IXQP-e z6o&&e5Bu3)Fbx=I)pZSa=1;GNfV^lm*vC$qHrqxHN!ifJd+{v#?A7O%*sQ7^yYr2A z9m$>tOIndIfm;WKGGF@0e)V;>T5WBMU2^fomW!j=CojKaeKh>sR?}d^kQq9`25gdj z3aLA!4B#pvEYl0b_`R4`6z2_v98+)8*=-wEFR}Y>-rJ5p|1A=w*$(mM$>o?l2OLul zXkDF+)=8oJUI*`oTxYoD7T~JJT-e;PmU-N59Y}yE|DiT4kIZJfE&gh~?LT{_?K*3^ z{bAu!$A0|1yKXmc+bXh#WX1sJA)FNEV*z{Sb=TRTk+bZ+J8wn$^_;!^>O1z=hyH3G zefTjo1717z;tTA!qmDw>)J;Z$=Zn5XF7%S2f2xU6_D{iz6akl=XU}$IJo$zBR`=N! zyZFt6 z(n(f{9rKhuX3(H-wN0hZPzcgp$Y%}4P+()-8iE((c5$1Uz3*(h=hk}}KOgr7XT49} zw!3b*--ZnxLV$_D0-vkQvE)U{aEwL%*+Aw`w(1H%qzUvKaqQ9d^pnpxvPd^zU9M8m z-WL1%t3_5;R%UO%_Oi{xg>Tj#d)vi-{-ag#JP#jI4Dqk0@#n7eU>RgfmMymGEt`?M z7Fj8o*@Chv`*z)STejjANb@i!gFJuP67F%rmM>c9IL`T5M{~${uR+SCwKk1Qpd8K; zyvH;j*bhQTQacEGOc*=S%EwkADIR2FhK;cpS*xXMmN-pN{gB2{gC-Kh>a?wOHPnFM zx>r#ELBfTwb&E|NHQo+9Y=7I*xWc~tTe=LPO?J6QjHd2nv{{a1@`4!cbGl?uW*#iMKyj^67mx^`sh-|`60ERFlMYyo`O+%y{ zri4jik_|-}5NY4LJfUNSWaY9ri4lV!!L#%?~#w%WQj$3-TK>+XUCxFqx896dzpG;%8BmJM(U zDTnGZBw6s%5HjKFpdN&53joZkT9_!CCpva%nZH``t?jYX3~SlG3F$x?oqX3@N$F4v z65&-x??&ncvhlw6Am?&ZXqoP8vIN&Kd!K_H4L%=hL9!3sMEVMXqpYQ)8?ZpF4aB6j zI%b=i8?3y%%CNQee~4P47P1U^S&#@FH{dvL4W)LW zhk05ENsA+=S+iyX<4TVh$X~A0KZL@4W|ca`t3QDR;*w%`xxXnSdjZIhUo{s_#8`8h zIvjtsb6y=ijn<4!b0g8{2OfFE_L;SxZQi)a+UO7R#e%t(EOOc0cfYV*ciO|wI`d3> z{gn@??ctvKdTn^V+lH2sSz}B#wGmOC@DmFc7umf}ykr|Uud^vtqiz0|-{@(ubIv@& z%8=>wP@AEbRCkhsxdY!&to}7~Z6BVEgl*Z3(@+U@EX?O9(#dM(%(P4u;9T>c-W8uL zv;$A=FjrZE@h+f6$Qs*TU+Z+fA5=($-&;y8L!V=0fTe`3>BwcIsWrg<^vTa(v=Kwb z*~p?iIN@Sn6HkXghiTGTZliIElaa!f`5TCmnl^&6$0e{q=ztEjJsI2%GC|>fmxxcJ4)I*_0_e*|;%dEnHP@ zf6ZRxR6DToiy3* zzT>_f=g)Y=S?3$+2~?R^>bO^hSpO9m+1|nW%bL4-{Z{+=AFs2!@4uV(cG$jSr!p2I z>t;0@mf7=<@L2>hrtLn(KL2uo)oxl(ASi{+GWVRUwrtW{u|h5?%Ce%t5OemEqLSV0 zr1KB3D=)Z=z(cuB*#96~x2?gldDJEK%*qZspFi-Qff4w=BQQWfzVAp4yzfUh0tpH~ zi0wPI66&0rCL-r28mt}~ir}Uw!ppQG4`SmZOpOj5*C%QURMZ_{qm(#E1>$Oa)lbwi zjwPbc0S`N(aVkU?O^~IgiZ#3WJbAl2R*f7(08WydbRWQj2xlLlTwd~sr?g92AVL%z zf{+qX;j`Eq9O5DGdN1Ge5oMI`yBvB_Y#s?dN0KfT4yUC_=6BLK!YC6GaNgI)-^gVC zX(RRn0+c?_Rn)zCt3!BXH!S-|HJfWkKIQ@Zgybnqv|H{?iZ}-tC-p3lOG=PTiPH;& z43OK8CKxW{f)F|N0)QbZo}Ea$-k+dCKZ>kN*&lD1v4sJV_~3gT06IUBYV|lkN6hj1 zAt9Y@J=`B;Q&@1W!UbmB$a2V2s~vy%$w=a|?Q^u_y%kv$^o5XwhS-)p<=ytDOm zG*W=N#v&67t*L&C%_NH2(Ntrf%>9Vt6;UHYhJt(A-qj2&;bS3Ca^aFczZ>wL*7(C% z-Hg2&MCx3+sZo$4nhSE-&;3u!nT*dUMOIcvC-ml4Bx#VtujhSjqsNSKY?+A#1K_w` zu3ZupUk-)4$V#Md4>I3Eau3pQGp8j(^pH&oGruf6*dfgw?W(Ejv&+so#&(@Z%~KMY zOhph$Oo2_Ab_!&;pW@uJu_R?2a4X8mh2SBVi^_h7MvN}xY1J)tbhaOZ-EOY6v{c)P z2ki>MpXEry4m)H9@{k~K@ zJuqJV=5))YXdxCawHscq1E`Ah3!IL!eNMTQ@kcV1AH)T%+^+o96_A3Y4H`8RY1mfC zVk=Y0gB|d8yX@4xt$zJn?rD`BJ9RV}OKKd*oThS8bQ9lbi)-t-HtvfGsBxI;LgG|g zM@EbWklg_7u6P%Z7EGDvB*HUKoC1j%*-q|V8j|GVzP8oW+0>Jcx7~(@EIYH_Mii!O zuiQ>+SpAL_51VG$oTsFAci#L90v2fV`#Nmmtv6bIbEAFu>Ko?IqjycTi8aS#?WtC$ zkzxV;WysA~C(p8%bNc9$xoG>dZGCOKHMjIQ(ypy7Zd)7A$7L!)7Aj3PBV=20$Jhgp zKT5`~45?w0mFJJO_dfc7ag0;@GSV8|&9>-^53PV=?}T>~WSxjSm$$vM%?hZUi)pQ* zc&Z!u+_SI0&3(+XtFQa5tzYql?X}NTyX)EqteAQz)ow`or>yXF9N~OCvqv9%2=fpJ zK^&uQx$qCR=SgSSUw-?0B!5KzApxI#yZ||v%c@&Doq7({Z3K88#^N${(a$d7YqO8O zU2GSgeW{&$;ZL3QvAMk)V~bDegVSU4K6#&U470wG)g`(=Y}8mAH(`S9yz@-f#aui0 zf@>YSXefH^M_6gQC>g(cUl*#*8 zKh9T0L`L>HU{705!_j0mjc}1(v2svQ-ea2@x7aDip62X1S6_a)^*`~rO-J^(?|!pw z&pG>3vk|e%K_dtb;hYCalFTyBJuE~@n)D>BsyJxhy!N!Smw4P|wqeb;w)orCwrcH0 zd+CLjoVv%azy8+AZhpONnT_6K3IrmH49I$0wR$btCNlqIKJ&=7vEZ<#ccKFwspW?gX;I11)EWXY+Wbe_6_{|t=4_Zxu$0`mRFY2aNy!VySN0Ggm^+NTIS zz>3|Ug*_WtQyX9jpbjAHA|mPo6iEB;#{Nm5+sg(WjS^{MfmWAoNdVN_L8TFT31F+Z zP!uH&;*)k*9k-qDaTwKisCGk|UhonG1DOiPNlA_X7*T{ypDAzpB+@Vu3^ADqeFsWt zj@AZXRiBLvHbBb2C>rKhCW8oinn)kK0}uzxKvTY>+cg;nYEUFkaXQj*-atcu7J6|t z9c!p_h(&~GcQ+Qdl5%M@vH`51SW7sCw7Hy@KqQ0%kdq~X7NNd?EJza4m7AMSF(}y` zLe7$>c@@Eg=}7vZg83lCA|?x12%HxZLk@+_yAMeSz=kpH;b`LkWI98#B9x? zuWU%gU}Q*)E79)+097tSt!$>9U77=O9>dBqhw*0fuczlnK3Z;dzVAmm74J&gvSrAB zD5!3wXTmTDj^l8n&6)cfgt+W9ZH~=b@G((bKnC|JOg+nR$VU^PSvMp|eMJV4O$x|X zty+i7Vy0!fTli7bHrG?SwrfM<(#?RN;fF&|W zkb!X{hvC46#D?f`9{?+uhV%jGGMsaE88Rd~Dy!ZlMZHZ19@0Cs zQMt(7L~FCjG^HW6N#u9xm$GW*D%*XR=@uzR21kukKZHhhuWsa6BsHwp9Ya7=%={tJ z?Lt@1r}Q#U!vX4RI3}0RJYx=U-B}a~OB*kVOfO`slH%c9?39a2xF6K#WFX!yK&6Lq zi;2zgIomLFP{d#NkTM9{ymo_?7gR!Y1c-vxykRA>xN0jKvAcD&ts|m8i1(+hcI#4r zy${*TAS=r);v{OV3-`JLMeQjP-+lBD`)vLv6uGO;DnL>DK0IQ|hBQLTdaaaB>226! z_jS^DCzP@g!z;1f&2|hK3JY<0f>`H5LfZ%vcVX->e8LpI=dx?AzR4neD=F|LD^gHS zy%1x~A3c{rY__w>7Vb28lD+Zri#%_TOgSXcc|Ayfn-AwL0-O_QKn9a$%p_b)GQO($ zayDniGe#s_HU`snnPFbeCka6sTriwxqS^*c9?7%BbE!E7fss|Ltg}@EmX`-%@2SOY zX|1)>yCuk7PDms=M1etOwn_Tjd7%|qtmx;y{ESVLlwN*#ax3Ajxu zIKaK3UMQROf=37~;**=4wZqlNTE@C`(kZ7oYtf2>4`*G_ zit{h8d4O^^61_e5oz6FPjY*q0c6V#r0!W@u{R~;F7;~8(4AppYb36`-NkjeH#n8!_>;RKN$eDV#P z=x~~2oe4DckTs#UjEejMp4%LysJT$}3evjV)j>a)$`YiRd)iGm-(|nVE;uW~^WcJD zat(g(VCtj_G1h3MR;wKgY_b_+$Jx(+dL_?c!d`vl*A{JSwuKA6jgZWmsy}_P;?tOdj^G17X{^Pul z{eS?Eq{A$&Jo^f!rI6JUkRr$ucQWk?MB(hmo*{#PuAVyXUCMrQ!_74OoMPvncaeSh z%}4g_qGk5CXYRMv^H$g;KfToU-eVv8Y~JfugYC*fPnmf!5Vn$k81>cA+i_Ur27GdAa|!Y zF-ZZc&$671gH%jGC;I_tK+>T!v@#U^bglLSj2%lx0J@WDV8fCuN@OFhPSb3vDWo(4 z#A(QheDc|a+0=HtCyL}rxsEi%#FYT#^BZb@6`&ZBZ#d*YZY1jQAZda!Cp{fetHpsy z4kzlyt_+RHjC|%jAwGd9pLTpjO(jK2a15!tyx5bfVWR3a1QeVIFT0lde{^)xq>l!0 zUDa*WW3&J$`~XD?l(nI;xds4eZjLVpogkniu4p--?idm8Bwx!d$q%_fjmGEqa$XV6 z0rN>V#td1dPKcUn4kW7(fB-Wven?`-)P%5YRUxWJ1@6>1fXe`F6i0>&2!aEoDK-yL z+YzOsa)RTiKg$BL5q*HgZb16r;bX0k-yc-YNK$8@riklTFQpM<%(?)8VMv6oI|8wh z15^M2EqRm1P6r!VIM#-Z9uF}U6Y`Z$#CG17U(o9!-#W6!fXodMQA@;@Cl6< z%dD=c4XjPGyXGz{Cc3_K;e4_>04uq$F%PnkRD88;DZs*w?!U;Ab#;uX+gfljD#*{J zFTg4a-gC$naj%(E9gs3L8%q-@Z$XN}fJ6G2gUmVgEhwegUVlM?apk@#3X5DXjKs{% zaaxhEb>T9VPjojygjyZVH8;1cZ$f@Fl7@HGlK^C#J_w9)7;qfthWj9yvKaPp4E2Li zCuNa%rWhGAw{-xf)%@V4r(dzKPfk2> z*xT-V&$gG}e2;pW!4C0%^QDih5f`7qWtBwr`)uQi7nr-8->Qw)2Ow{0nvY2w@*AET z6)QEi3?_2i!C9DUPt4$nKp8l)2(duVf0AI$E7WsHWVRy;>kyB)UcU$%Iq-| zRo??a<{4$oU0kQzTY|W%+-fi>SlU1kfU%V`nu~gvqzBh04%f@P_{FuC+v9(^#{Tx; z&9;Twl7u@4m!=Y)vmKVvEj9JnB1b7sABv=BN6~&hL5-0^vTWFpQY(TGh5|fOIAC=^ zXmfe)6A)9*fGfZb8VQ~!aS+ErG)c`bp1H+UwwZ>(wR zIvye$APJL)Y+5&gheE8hHSN<;w{6?nU=6sCrTpDw782I#Y2umYk)Zm#W9<@a1yss4 zZo<@^EG)+(f-G4`!eXpzFF*IX-FEvQ?8`5gvOdtii1j1Z)9kDdPhz7Yp#M|C9I$XvJ7zx6^|sag4|NX4hH-!8G;R) z)*!oW!}@okeLnX?TLEd+fEFVSyyKz!Y{@%sG3Hzk^D)44v8iS|W)43i@W7f$a7DJ( zT0o>JnGHY-e;9zAz-dP=QE4`V3=U5M)Zf)*!~nEF zcRr8EFvP{Hv^;=4PShxXG)g3Zt;!i(PRpv0Tj3ja+b*yy?ypd-K9JnO6qDf%_*+>q$?ha}nTx2o)021gE z5mbOTk_t7jlfQce2~ICAHEu{z2C(5nh9kS$Fj)+NN;#dN$>LhH$x$dxABZ@Es77hZ zf_MP6>dT%$_T(uJAlY#9S|xXnGy0oNP%{M z09nPVV>}l{G#&E6*ds2pINwuWg}l6C3hjFVBu!SgZ7txJF^2r4$OxpVm62;!Kh9N> zfCaKBl62)#2;Ys{63%D*?I-P|PVmc@eZ?kD)DS5{hOwyw9OVH{71@@I$c@|Bnx)@> zHJB$l4_vR-Enkc*hfELmRP{EEM9tfK7Qvo4Hm3_OWBk)rKtaA7mx2KP827=$@hXEO zIX~_(!6udxni@BLo9Lp~h#@he_7vK?V|sTx_Y~oQTYJ;INbeh;Cbt_kIDj zH{A1VK(s>)gh?Dp8yO9{tVd}SDZ-Wwf$Q!f!iyBd1t4vJY;?9ni30nPRv{W;EV>!% zh~^LH-A}e__g(kl`pu3%^#UTV%lNt%l7Pb)_g5XYb?zzdshbR(%nVe^l%~){S*{Qw3I$OGc~+A^_k{VGkYh7t+9y=PV7u zM*_H+J`f_VeqWKj`QB#w=)@@4hPb(kY(?!-D=z{RQx{XfI9j^i>8Vg!j?F1fP3!ew z=*1kZqEEyhfBid~Pxix|X|mNDnw%`naO_3PD+k+h`b?}|O|2Fve6u3hJPRJ?^~UOt zoTh9!WL@I)@ZrL(5|^+7n&M?*%~ngD&%wxoCJY{9&6_DG9$IP>%OT+0$2RIMyje&Y z!yPt+=ie0zk`)WtN{lG{JeT?96YRB@UbmNDc-hM7jNXkSQ;eDtxhts-MU5goWH7k^ zNI1_FKrczQD2%(;*UP_jh#NGVx~@tq$|gIJ-HV2wd5+_ii@6+!aO*mvJg@3-u6vQi zd;k&KNk<(lglT!c5^G>i^^s-i!8t0^m?Xdf@zMQ&JYV(4KhqI@tMxQh+qSivY}y_> z(}$(NN^{5YB(9=(`;WLxt+81L9AnuyOntTR9lQ9VpOcNHKLsFuIYrj{7U$ceAAM}u z6^xm?!A1{lv-dyia&FCc{|N@ew%e||6S;4LsHN<#KU{7P{K-qUEZ?>x34Gi~R+szf zr)DY;j@rUcU$UcT9b@;59cKBgJ4aAk^N7FTyN~;K|L*2`)+32L_Ovrt%eX&neKrw? zIrXk_Lwxo8w_$~?(3Gl@FI^KYae{{o~_xk9Q*Hlq>Njfy^Dp0CtU#v1&*{vGiM1LWEW|^ z4!j0N;QNoj00H^_V>R&3AK3^L(8MW9{f37{I;wsiI0LC3!w0ZZG+m^^19(hlkY7L! zJf3VvSKUhlUm!jlW>WyHtN7Td69Jezaw>10Q*5q`3Gr#Z2BafT$wk(X=6JH<6-XEH z@c`)hsXIxKRqz8iyhO|dw7uwUeMk*bWD@j8(LQAXLexHhB%Mu2(j{%C35bCjX$kDh z&C2OI41m!lfk7w#roN;P+gvskbxfD`T{~C#kTSIA$dHie=rg<88%XJEqXPs>&PAoY zKyi+b^8k=J4XQX|1_Gh;SAB{{V2RC54G4Y8WB{H)*fiVAc8aglfEgbW1J#-&s3%eV zN-p~J1fP+N0j_9rmP5DS0L7`~ZU7npF=|jEL`KyBPFine_GN>c;yTovOLaSH+SQFr zsi2^YATb@0*;M;w;R|W%;~4DPTmwb3M17vg@t z$HB?4aTwJ`5N#GHR3~r|Qa_P@>DzroQvCq!6q|U8_lbZe_^Qms ztbLHC9LNnw8xle0h58D0PIs=SbG60EA;PQGjh&Pq$pRHMCMJT&AI0=>3FKs zk(C6POFlkZGC~#ByO?iY9s#!b(kG6Wf%aSY#-0)3NlSc zT<|1BZ?HZ0$}31~>g>{sue4g~DULnqIHK_RwqWUEJEZX#JL#;mtgn3u^*3S8w1_#2 z%`&|jQZb7AA(Bx@b`hDF6wgt656>3P7Fo#9qWJGcI{>M?U(a8Napg&3p1ZNm=I)UN zQIog~WJb;EG*^0As{$~^B$4?dGJU}inLXxOM^h)#EPB3>af_nM@9*n0H_mjqIfIGb zZ>5;HkTnCVR3t%Jm?QKsr?VMex0qTI*L&jKC^2kJVlle>X+=W;-!Wd`t@%de?)P6w@C>*=N`tO&Y?Y>%3X zjvY1K7Ju=LHEwCJ^UgoT{&dq{Z0OK+wsyf{E261usAw2{V>X&6?6sO&wv?5m#}sItYgXX*O}{A=rGqJ_rXJdK@5_VWV_11*E`% zYb?}6sEC020LWq7hWgaOoXm(KYbwIbh7?4U$-t4tQF}4u0+a%-Nup?ydiAFOY5=$p zSpY?;(*R{R09j2xLNqUQXD4j;lA^vG zAw2rAbD^%qXN3T?9yazos?r)VktYHx=XCrkB*7(VF zE5W$L_&Y*IM%}mFk}9!z!fhY}kcS?w6XK^#kRpouxrfNPT)JXNLp(IAlx{x&$>Xj7 zN{~}1ea87ps?&u;EJS8RW9EZ=Xmh3z22z774o)(Oei5J^M|&>#t>06lxH$Jk3`WT} z^k=$l%PKDEtpnMp$3d|*G!ben58}ZRR?iIZX0QQ~CgIvJtHhL9E z{~u>OL+)J22V{!#3Xri%bA1`+p^Bpu)bhB9u=^keDrT2d%*}k4uDznX)V5V`p|=O; zqDcq%4u?yTmTaQSJy{^`mnSYMhvvKhH(9kF?jiF#;L8EvP%FekBzm3XIs;fQ_j6Bz zmCSGML6GZHy-kqL^pOO8Uoat9zXnMb&#C6eR-B;{fbJZk|MhDY*c_x-i(h-xz9Osj z+pDjK_~PQkm}ljTqL6qb&ruzjC2Fer>A6u-gv(f|9kSQ%xNDujHMHBlvk$c_dP;aX z&m#{y)bgn>dG7wl?XsWG;{1^`F+aQk$O87i@oq9zMA-eFsI^c_lvO^`+He_5lBKKO zwuU)Iw497zn(*JC_bm5XB@H;Z8Fe4Xg#@gxx%xMD;Qj~N zkRgMtwYJxeJ7YhG?DjQv@qD+@BM0)Ug_Kuzsh_o_gu1YZ1NcJ}cBeqo7f`3w-3f8a zue1w;b#`;F+0{7-dy(}c{KO;XdHSz*C7^r|q`)EPMIRyJ!l?vjE{4Np>kiwnL^4ee{iS zDFaG~L4h6B8nUvn<`Mj0f$C>}ibLY{^ALpTSCEhY=oR1@yJ6m9dwRksEo|IVh#H?E zvcl@a%UOBM`(l@!%KXWG`DL44UvI_Rnk<8Dc=yU?0#9x`mTS{`||TvbCh{O_K^r=Na0`@jPae1GA>g}dsr z+S=L*F2DTpJFBXys$YNo^&|h^em)ZEOmlNHr8z|{-+jja&awXS^ZxPQ-yP$>lq&og$)1v@FerlTCzC#l>p;C#ja~ano#e+ENN~0iJ*ixx2XCdCqmJ z$lR-xKbe;(k!VStQbZAnD>=I1V46S0hW+k zD9Rjf>(;IZ45Ay4L7@12H{+X&!%-Wum%a9wMG^M`ih`B`=Wg}H3NK8yjn z+sJYhWU*@^K|sdhqE;r>90h!$D+fe6(Rg;%4ze0K1@yE)QjtRzg&Ro}JD+aDTi8H4 zDcbI}DLYLi!i$`NvC0rR^%rx0z&9~Ab~SV?K(1EX)XdNNoUv#_3Kb?Q8R0ldHyI?Z zvkX1EI>BckTlo~i_mOD`(_vn<5o%_px{PilF^b+76&C{3ARTP^NdR~~&G#zk91Wl4 z_W?N~92g92-m=BUjUQ`U=m+4J(e%;kOo?Y|5~&?c}`k0Y3Qv_XI#%o$XIN<3!uCaU<5W z<@6^Yv*0eVg3==9F93)dB9WOmE>3O;kQcxwP^7u0-Xj^vIzG$HE65zcNquT$zR=#% zXcZ-ecHQs)V0Td5tiBcg0(A3(GGs%hSQ_x{@((26;=GIdP%{U_A8aMnX$PT24xxnQz=Wudrt_8%FT6XbZ`_}ug^K5PJ z?zDOemsP{i!@O%DTQ;nGgcUc9v*S)X&vs?r_2}M(+_t!W3HKD_igk4=Q*MtQd>mt! z&pe`G8$p0%Jcx|zOG}ciaS_3nA%sjGwzh8Mx!=V~#tm^uyvx_cc{4wGE?s2STzsA3 zxGgPMC}YjrNF7KgR;_!^+|_p9eU3f(;@@|mLGGO&qk&W}_fVNv&O||u1d_sBfOkIx zvZ7*$?Kk@X`fdCL3s&wcPDCACcO`vc{Ky#N6zAs#i)>>(_e!?A%@7jqNda>(L8F~a zzsvSMaZmgDqc0p2hJ%irLzaR03z6)t-A?gyj`a#W11JS56>)dbv{S){2Oj#fJ^jRe z4jGUU!gH@a;}C%q#o`5wMIYH5FVeh3e}G;WIdyYJ1j8GDVR7V8Te zGkvD5#8E1j;7y$1NQx}3kLQm(EkqCMz`7l0&B)IwwD;!Ew-2c)Ir6--?X;_?9lHG* z%g5}Xi)N;gL_X_lh#&x&Qr6f6vOEzF7lcr2yQFb$o<$E|yOBD|fh&gVRXck}KD8PD z(Q7;JVVGHKbbZQs@Vv60F~ywEWMX5g(MKjLZZjr~rI@~%HJ&UC?u4U9%(P$Jc9&IQ z;?csq6=iJ1{jG(X6&HIBRMqKpulzMJsUO{oF>^inEeqozIUH}_W9(*6Hk2p-~0Z<4?ld~cf{qbx86GJm}8E4 z1@hjd&(iBZJJvn-+;hqE&p&_S{Q2|u)O&S|!Gj0a?6uckpX=Y>ecs%;bLV{b@BIAy z_ESzd<(YpxKb?m@@6t;zz3ckxum9bYDN~l6d+xb^`|WRkdxNe)zyDwL8XzG5RUuQX`>4>qlqo&J+SJVmPcoa**)|E%|WLNfF(2CrPCfbtl318adNQ= zLSp3bq&gAFih7BRcC_>X5Zrdwc|W%c&;NZuTY40m{Q>0xQtans>5 z70DetVjRQifdqB&c}SBW9mT~J+_@dmf8Oo=|yL`b4&Xou_ zn>{}OG~sLm&?>_2)XjStJsV2*cYdlL6D_7Dhu`%%rcYs**wVSz31lAr z3Oj#81HMiMyf4JNH6ox0bFFXK@jUwUz7@Y>ub`cQChSC5| zIyREEVmw5&`MHuAIuB(Ly@<7{kU+tm9MI#!HErau!;n^0Q7GO5QEjAVrq4nY;!n-p z&2~n1Q@gFrrVblx8#h!tM11F2`_WfpxSjLjlNKDCXCtQ^#=Y*~iXThIz46*S8&Wk0dDURs(n&9oxeKhon{PV-9Q){ZBe2!m(T|fC zK#?GV590+7u2fmd7*HeCjFCbi5~^<&e$Dr>GX@s+DvKZ>$iLM)MK-IGrkr5m{Grxd zvxQ?rjF>;FZSp~2yL&q9+xd$KAk^~xYR;1^DjA2PPdUZzeEelAlY^P=ENesn36F<0 zBZM^16-rtU(RDWymI~ed##JUFChrDI@I6&hx_b_K`+@uk37IU$|q=0U^R`KNkB2*Fs{fTr|KgE z!X0H^hRAqu^C0|5=2ADs^KpVT++r&$FXF$PGwy)f$!I!FP?^*rvQ+uFokhs}rI}yq zKT^uvUPu3%R;+;&yx&d6Oqt+>)25yLg3)?{2r-jiWEyO*9h9nX!#h$n^Tl&l2Aw6|M*f+o@{WwCwo!93ei zo3Ne647Y=iJlx)T;}z!HzohQrlj$**4Q5y|<{(ip!a!7%t=zSQ7E%;bMffl4;FjZRP@qagd+Zaa-*e#NYI z-+k=M*Bi-nka?Xt*;NK!=gtCYqV_Y6%mzt1`6oJann^U!DQ zzWeSAe)F5(+^Da0P1V)aRr>nB^5tB_f8_xOjx{g>|6N9ac5K#2Lcr^3r6V*lD*$Pd z4cbM4A-M)p`Va^LO9EGl1jf_dPF+GMOyt`|v>bR9SA>$^jd&^MRV@M=H5J)_Kq6uM zG74} zlY~uC`PRl3KnnnkXnhDkQIt2vsar`(E6=f2N0DYTu4zhJAw|BjDD~z>t*IBF0pRr^ z%SZx5d;RTJz_EPXzqAVVal=X?T|s2$fVG6`BPi@_>y5A>2k37CnZrY${{SK&aRAV4 zz@KDxxisf1DKB$6TBjjDr4X~-$OIA;GA-*?*8o0fCWnUJZQGHZZ!kR1B&h3(!XN+fUZ48j=yi z)4$Z>opq2V0B3P7=PR;6_715H`6Npy1Jlbb6WEjy0CNm@$JhhBA$`h>gpi0iq?Grk z088Lkh&PZFGA^>xkNk{5LT<>fXG2oSpj9J>a^;T!p7VK;GO`Ph1!YqpR_*jWsc&qv z4b>ZsVh{6Sed|ty9I)7t=&}U&x;uL!<3I$wa3tfEM)o({nbRutO$QPdqrZacotnAN zdP%Og^NhjR3eU6~{@6|yhx2PSTTLH>G;_6e?Pj`rXK`IPd0~{0 zZgQ)ttWo0)IV>TwviIm+ZS%@%%Sm=yJMjd$Bvn$B?~)8ra!;D$`N>F)8I;Gf?y+re zzs>wHyS<%t(Cp*) z-?!6GI2fWy#uul$IwV-dgLAEtIqHJAwAXf8G|Y2>)bhn=UnC10u*aTy!QOi3IkI@z zFBiLccE}uc@GSRxEkMR<$)a@>?K74XH5cTEEyP+?o?FKJE+8`g4eVwuPLc76khvT?X^;~zTC#kV zv)|nPtE=p|bI+p?{UBSvd4-LvoNNz1`y5Vx5GOK@LG}|DwPsH6f$>p)B?S$FtTzb^ z8`7+^+J|o6Wd@U-w{g{OtrI-sXz!dXyqmeCpbvw=&k4#n0TV5KSRC^wP~^p4yw;95 zJQuga8bgJlqPS{7wi`1MxOm(}0jA7I_{iI8AX-~HTk&z&@9&YZdWd0t*#M|*pF{s$j?aKPlr zlb8Q{-~VoCDk>`KCrz5P;>|bTJbcEC8DD?*{r~J(#~*+Ei`QLu-5-Vx8@5H~fE2S& zU+Z`O@$_lqySc>I-DUU~aJp5J%J`|t4g00H^$a2E#7;s28nh@pSaW>=LA#n0jz zC0Zz}+1{=+YqbCj5h6D044PoC!n(XKNHokx#Hg#A`U`9b14Q1F6pynwQFw@>3P3?o zWH)sSeir=%08T)}&1NA7BM;y$MT0m2I5(hJ$IVb6tv()E6z+ERu<=1u_zh$OfIY}c z3cw-Ytc-*r{iFCP<#?7Su%lTblaJE*Y7i?!>$TmCi*aNINF$AF5$MtZn zM8LeYE9|LfZ?e3qJvqP4TwggGeU<~p)1cR+&>pXEmM*lPU;TH>&l-$o9Zh~V-KS$A z^KD*eH(hm2g^R8R%^Yv)30Va_gWjZ)7BI#AV z>+H{0Tn!lN#r~7XKVzQ&unNe>$oLpV%PsCgd-u!FZ2>?}y-H-283XtO$!thg$__g4 zAR^4vRRB;5B4oY*`aQ88Yi(&j23Bt|YAjy+WSKQljNM2Pv&JO}iQ2Nc$^3~P+y9VV z03Gv?;sKt#JKH{UMmg?jp+L56YyA|P*paqq<$9~F?QpD6GZ4Zg^T3D9Vj|-_d}O=r zRJwsEWYl5+X!FoqQ2K7P{k{GPv?U&6Z+`eCfQu{;wHPW`C-`o)8>r8q_GId=fS}lV z>kgAyK_W7;f-FWEQSfA`r3+@-yK}#_&0DwAjhbu?^S}?e_IK6URTu4KQ>GrseQQQ8 z29Us+%gsD>BFGf9r^CbWSSqmVAG*c1tVNW>bHZ$NYFVd+ODKAcQgRW}b$S{I#`5Ay4_X z^RV$2t3%$@QD;6#QKVC!jI`*Rjda7_Zg0PRuhYjwH79Kl)_lOENKcyQBTCkyRJBPe zcE@&9a=L^harAw-?hn7WsS`%qlMg*;S6zEOz+DXUCIIfgO7<&EcU?Zyf_ z_BVG~K6MR`Jb1UQTffF`y!~G0zS+#(W&*|{JSX`?ev#%B46&taAs|i9@mz&?rdc^) zB?%(lEiFxCwzwBOj|Bx)HjH`RgDq+&O-&PC0uV@P)b+fKBAsN40&|?)B(>6$5JlSL zLVj6GMoQ2!lF27yT0+ym0tkJv#kzgAa?u7`_T?h7ka;NJxN4iY%BJwaqz zXDl){bR;f( zWK!z87Lvuta|+nYhK>cWZ?`|+@H^}6MCynum<$z`uUTaeKKwUo=aEru+Tx5=1+vu> zPCCIJdiq&paJ_c_7XZ8yq)~&) z#-{DI*X+rVkDVZWT>$xVe$&fmkm(>8Q9h!|`6KzE^I{(ArEIB}TBK}9M24|FZoge@ z-|0i`&{NN*{tbZ7IG0bDX3fjLrNJV^n7%#gr_qYcw!+0a$k-&fPko+Vh+We5o3oGI zddu(Zo!8%WYH|*vb9xV8ykW^VRuPW#>`>drx)UV0uxZ^EyZ^qsoS@Jhf4LDyuTr|q zQ~1BtN0v6MYO&&AJ8TTK{e`e2~{V4$!R@;C7B@*ymeaJt)<3IYo-d9&w zSNV_c|6d(TB%-CIrRX1j@8A2pfBpIY(Ro~Q$tCyb&v&0EdDnMe|5yG!KtTR0M|iVRAkv<2T!p*PrjbWR*v~{k&t178tCy`J|L;ps?D_-x254#WFH1oI9+KcAHKI$ zPM8BR@>oRy9j9lM+U|QEWjpVE6cUeL(R_|^Vm#A;Az!-5mbJE8$^J*tn_(}T|K3Zs z77hB}pZnNm(RX8Tyv8QZsIWQ5|I&6oa$efx#;wOT zS$lOSPBtHN?-g|o+cU4!%5uNwv(arlO_SwQVqOla> z1Da$xoSR;28#ZTb?&6iq(-@%sS)2R8i+0+9huE;GKLwo-VfIwoL(J0>Y-l3|g8(d$ zr*7mVINgjMKHN&CoWZe?g+bhE>epIh^(!`Z+{MJo>3O`zP;2Yo#=PH0*MM>B;M$&fBp+B`< zrcbxT9OgOiNQ3Aldr_(&K*Zh0ebMVrcRg;));(iE+=IG^v3C38Rzhu0V^gDzp0u-# znmC>8i-H7ti5ls}fBC;Mh%bM-l7H7*S#}YiJmkE$1Nm7GvcC?pJu6nN1=K;70jq;Y zPBnL76 zcG?LS*&#E8m@RQWI%%_47FBS0`q)-K7YAA`s5QfsA4EUo#J=KUvfa% zMaxOf!?lGN`_*e#+aKEKT27<8Ni?vWG<=YCY^%0l(^{vV!XG5FiX^XqOx_KDyn{f- zj=HW0GEOeU9{k$_G#UMfKujV3cF}XB%g#FUc-xt%yE2s`P%@gBIA)aPQAg27mNZD+ z0g+gTX#DCA*VD^}dYAx_P;c9yG;DY4GTRC_97n9q-V9@k%oedO5|`JZt&o(+H;c zZI@Z6lF=i73xE%it zHesIwZA+KSPC9f?n>T-%9e2vHmOXqkwM7_LbWyv~P1a@LH827{U<3vT$PXB-fw%s+ zM&MV!{@u}NxJeQ0fG+|v=rH;Bzr4I&8R-kA?bzig;`^7MlYR#5{L8;=pCyJZMR>XHxo(J zf#}e40FsS%`kDLMwA~LO!iiMI+hM)PPy9s8T{N}o+o{T)c)iA|hP2r^bk#lmYV#CJo zVh`MQ9?~5^dTJce^=7;2j?1wy9b;J{V(8(MWJy#rk;$RZyr|wcK8S^;U}Z=!!5$YvJAvoEXDssV?q>Qnvf=RbQrpnHoA&YeJ=K{ip;9>?h`g|sW0H;njt1JT-;z03P*H?`TE zL(aA5?t2E{N3k=ut$%yuZp$kjicE!$)c~5jY@(1v`O`$3`;k+ujqi)D-e*hazGx3W z{Fu!-`Aj?IsKWs%9((QW+vo%EwG|OHZw4?+E)<4<$ZabLD(gjxl%3UpOwa6^U!7%# zOq*l73^|&N!C-s!u9JChiB*;FYJ*0NV2S}um>zO4$}J?bQ5d#|=GNM;XZY;##~z^1 z$wHg9+jxLko^9OtjV=26dOK*=Nw(8WT%O8jSbFgSNI;|G&eaKk+g?jw0LBTcEF}dU zBCJM|vgDMM(9!dg>2vdkLP!S)rU5rT`c7PW=^4ms(2z5)RT1L@R5`kKBye32gfMPT zvP(`=TwXb{f(UUp<6mIg`r43W_%w<(is^r#BE@vhtL5BJ^%k&IHHo?;yQ z)SqB1!5X1%*pjU%qu~dvXLBC|xP$Gx&%V}4kfE)ao)VCgB+s~HI~m;h+{{&C7)Wd& zDf~%B6Ev@Eu|@M2+S#X^X&uxER85<12kd*alO+)miQQqx1EUHncfV;0wvKO4t7+acA ziiD?9lFlLhVO{J;%GpB(I}{Aqp`CvFJx9L&{`>7^vR85q%K*@`A~^(>$Z)qnqL6kq zx3$^O(G^xPc$lqNvD}6Z8tOVP!xa*TShg?@9(CW7pnzBlA6FuRik>mb3Hh z`QQHB+7Cb29{cN!cJP7w5nw4KW1^b8m>qZcK{jLBB-^xpxm6;8^SO{lcC}JF1fZ|k zM*T{;Gj|*78?fgcf}Dz`uo!`SGH*Uvi?B_`DC3#hS8Vc>UFf|+{}Zz9h1A+DS@M-_ zUcZ57D8cj6PL{U8A?{PB%;fsXP(qr#WC2yMu=l~R*aQc>)TS3`Xrvb2QF z{p<_o7BycTJ@)A1k09;rg=81n@^6+{1?zVP=elTh9Ze;_LE=_p`<--}b@XnrnudD& za>=JQsEjI<)&k36UWKWb+_ZHKqdxE&7=iCU0s{o(`;XPYJAY&&FnP+9H-2Q7^uN5E zIPN{oY+PQVp&me&BBs~g`jAy$QE!7rw^C$C+8&F}w#F^y?s3`Oe|d(;=wN$y@Ei8a zU;PF-K#sL0n*cSqx)cnx-(LAEyZ6pN*{ZKM(%^0zn<4cI(gqV9ZbPz^O_BMz0F1z& z+yJ=UadPT)f|foa`}xDi*%_x@ZMA^-+~P@e?A=O~xPYtyT6|<)ZH@d6fN0-C&$kPI z_6vZ*5Q^TBxsh>5L~&!uEw)bAV4HNrb#~))>_dB-onrSknjn@CeGCG6CQLrqK~ZO( za%dXvNoh3VY>|S7t9?*EriEfw{Nsbm3!Iv z>HAvch#7XpHTNK|Xh1eJl;U!tpg5;_13mWg(=Xan4?S#y2Zin4`yOU&XE+id0lR|^ zJk~l}aj+UZ+zvhDWP9?lS7}!0vmt{A+3Ck$h*5*fRxMa$i;$iq)klYjw_`)fmAM5* zdys4eiO9mEzxnoaJK)g$9boj)dmlQQ{(j~i41)|0bA(2MJxB*t@E?H;$YsvQ-z9W= z4>Ol)Y8&h)=l{$p%6{mc+pMyDC_42oZ5_bPLp@X>H83^Rn;8crVnnouju=K~^HEmx z@_S}?JY(k^bAqiLH68+zvAgfT+hRoT8?dBR|BEuAWuz-TobX17a96C0ei|JBVd{)B zUECvtP)K*uy#Q7+CobX$N!;D~kf5o)V)a+^ZPkpa_WU!C+Wap*u@!4q0Kkz^Vr`p5 zX4yiGQcG)-RaS&;`pn%iP1uFcibL`?+52-B+DlKqYah*f3mTTOPU?v?hJHyniEz78 zz0UQ}ciy686#_Ya8%b7a^@feMKT-83Zn(vE*>zXPjV_67?5jneI2l(t)xmF=qx9iH zCYR`;;ULn(JbE5^se!us@@s6wsHY&lomN>@frDzFee=aTJX0>*>NeTNHJj}2`));M znzA#_JjISW^knWY<_3)4>h+8>VD{~2ol-c zk%5sUNd^rrJLS~#?3Gtvvt1^Q$G&!=9W``4*4M)@^60ZsLkE%K7-VbL#>nWcwNKxC z!vR5gD9X z2zei}zT5tCkKKCHtr(b0vv-SzQAg72T(f%DbSUFL@ERC_A20#~1mp({*1%f_M&N(? z2zZIE^-LuOsuYby`|pxwDR*Ijo86b`bf`<})7K#{!q zC}v->d>ufCdxp3>1K2{-LxFn8xrcHsDj&VS^IqMr(z0_az5d$U)B=z>LCV$A+G2lu_^*sD zg}sEO`v96A{zQoIs@5o@+9QBUB*JJzhE!y%g7p*;;Rv99|NZvkoRt#9N|ZwNEEQX; z;UzK|N3IA7>Bi!-Pqi*ce;kJ|l7FEv?o?doi8TC^+^w4$tt7wWRptZNx(F^wYM2@0 zJvt9WVs61JGDt!R(y4%bz4%)jUYSi_hsjPqjy3D) zSK;)?!5AVMvZIeU(Ye=t0BIlA3m)WGF6wOis8iWQ|C)M0;e}WI&dJy$sgWVL?Z~b~ z&fEHPDEj9d>7x;jblXcGyoxRED*$+EZ5Y?wB9EOpL0 zJrI!$Qp^m}!?5}WF-N9O#?%4lF)uRERL)ZqMlHtkufK1PKlu(WfZTToQ9pHR2{N83Y|)A; zD{a!$UAdM#+tQq{hS)GGRK^NIw{bI;&`2ulT73}CsdmhIiAB?|*fB?Gdf zj;^2YsdrL_A}ANtkqZ-wp@WO;Xb6z9b2;4K4C$;hPCd@X4I9aNM+-_E3bT>8 zIsIK2*9OQ!kjzp~WC&T|2Ih0z-g)q2$REdoq{tOeYZL!))=#ag|M=``O>`^k&QJ90 zw0AIWA|}kGg9~RcCt8>zJ!Ey8=vw~;t;s{8sCpDHM69H+m`!5fH829-e*^{y$oC(s zfp-p!!2kFW=mfCz0VsmF&2-XhLpG!Sp%ZP)UPsYEdNh`tIq16CwyI zPNW`%?#}d+$RL04p)t=OWooY@V?xGa>g+=)M5LwyrzCaBOA)0k8#LNt9bSqrbM5q_ z_O_}C)7kKm67kvTSSO$qeKN$rS6XGiyyH%5quciyB8$mxz&#st=e8BL%h-`*K*rO% zqSVHbNeE^|0cg~*AfHGAFjc_+@Z&F0xbFpo0CoXz>Q<~2M>ppiBD*kg;#lf>+HKUN znMByj+3-1MWIahWvCGc0uQ%1$`VAYb1v}R)eEJ)xF<8B3oz0xSGnt=!NCHLs0Ffk{ zaeFs%6+cjvLfAU&U84}4FIKFzlGeD>KSD&Og96VPQ>M~+I*({91+Y0G$OC;4a2cas z7f{uUw1k?XzAnq^Y(c8#wd=3H(E-@)2)t{E%6f^Qs@5oooFq&}CJz}!h|EnA$1a%~ z*~7#|p?}{MgZ)pETr1nE)6#E7J$1ip+=%3W}_)8!dTkyG5wS zdHem>kelTL@B~s^)HM}xOp4w4x|G7{ci#IL83)7(*5X0FqFx=+p7->CIDn#ljxDKS zA5ml<=jW9bH9%D_**#}4D(FIEu6L_1h^`0R=76LG05}O@iBSXP!PQMh3R$?g1+tMW z0p{^%&>NAnh-g7l0E}H^kL2M!@+lTXG~mH^m$QMRQ$o zqUO}d0Mz?vVk)_&z;+6vpqHEeLb6Bpar`9Kz$wUrBuza$f1yymQ|I8L+qqxzqBP@A zZ9$S6vjo?wT96bqDmwRgq74#EjR0AL1Op>r+l<4K?1STEpd8s8cPL8a+n?|`4q}p* zi9gCP!wrG(&}Sk{fWpVuF=|v)gO%!G43XUh@(4&U=H1Oy%P9g*J)1h#dyxzUIlhXz zGo97c4s2sS@OcnWHU8^Ut%NchyuSgk%Pi(ssfVeISXU?VDnN6F`y|q%nvMwfwwGt7 zc3UgYJw%(1_v)oY(gSIk)-&cEYd}^OHpz{egOc<4Xh5lYIX`n2`5U(3*}Ts~al4AK zC2jNhiZ~w#6AzSJ+5#{>kx3N?ra4zRMrFtv_rY*vnXbm88G6&GD}9R3^CGj0Qa_V{ zlq6YK1KhJ1W95`JVGx zgGs?4JLH1>=?fIL*IszrmTg#vbD7KO; z7=a%$0s{o(hm6+1dk03~fA|P&?tlRJO93QZ*4)?N$bi5-_9|gyMNT_CsuzF^b%SWF%a@08cig7n1ASCN**V|VgzJR8k zqELQsd%Yr{M8Em-m?m?h$Y6b4 zHvkJs4WK}Y1cBFeH2ph-egLR>06NG$1egF%4^WIOR~?N*L16&^8}N?~zmM#P`akpo z8pD8_tA2GoV2wWAd|)=&k=D-bjw4NyYxn7V2oI{OdTB8xx3LD~AcRbL_0y;_QBY{( z$a;h*>Q@Kl5RvN~YT({YY>MuqgJ5cz{3p03>nbDU#|) zwi5>IWdKcbhl^o*EK;Uafw)nMG4nD9Ge28=t1rI@r z`vG@h&d(v7WP+42AQ$G`U)`%DAYOF<>Y1Y#BZa()&xrz5IgXEerW%P9H9mz%Tto&` zXAy)5cC-V+Ahs&t4j`qH^>s!T#1KM(E1xs>I0!Fy0KI=FSuO!mFMe`JwM6_hCeS73 zMxlk7CutY%W{jc2(z0ewGWWa?m;hE;YR2j3GfDq&&k_J$-1x}w==zh&YT&jP2LQVP z(rJi=xQqHPWGL(pWRVp@<`gBGPOowti72#Ba(z4}0{t%LuNvFG^AHqMV| zyT*lDAAPPDRH~+&>U9)kZs;>r(5)`>BF4(jan{ZlB&g9*4P1=#jP|rawnQSC6O2KC z_lBvD@luE4C%7?kj}g`lxtlm~imh6`+}hjw2@3ciM#`)rIb#+%nKRBsb5K2seEh7U zG@p|TQ{#X&HSemW+jkVuoW^l4?SZV2p@dO#KgrfY=(Wb_+ErJijIi#RvMwr|)Bi+5 zlRRfSmWYkWOm<$jLv%tpdXAU}Ji8)#n(R@oEdz0w|L#Zj-s_+7JmO>sd5g#Eoa4A4 zWSY0HW5(g*y=BE^yr22)WEvrOkpCo3h87#jy2boWd`+!Q69J1F=C9XQRoAm-QnNy@ z7L7;T{jv2!!t+>D)YB+{?R1O)K~GD+J^b`rcK@SqGUv$Xah`f4;}G)zfgevFE^^5_ zMvrxxYwstYSc(f*ez=<{gz*Z`vFwUT;_(c!4`@CzZ~7Ul$up+&djqe55%~TiFhD@Q z|5y#Yb6^Di$B#f(O45w=041MYd&3`zn2)nf+d7F7E3z7}UtDtyvV&TH4B!heQ~>Df z=tvPMk2nDCJ84pqIuU;^pcLy#f#-sPayD>DZvcU8P`sJwEFjPYfL68wO}RE}H=pZ5 zTHydl0Dv}L0h9>fR~x4qEw+Y{3IJq1Sw1VsNAhM!r-5nj-%H zPyYYv-YgO!kfnm;1cl=Qks?EJcNCqrqN|F$5@qKX*+MC_9>zHlgC(;e;NXTF#S=u6 z$&z@zy_`3l%8|-|5FjtY=tz&~EFOSh5S(;KQ9t0Sw-4tT9Ll@^NsI*mnTozDf(sad zyc8CdgGKxfP>n-yq7;k@7y(V3>rplVs0XmX0S#?+fa@T}%I9-#B5g##MV^HH;uNn3 zk&vYTH4zAmz@Qh>mII)dvr>x8Lkg1O1{^DcAi(73e1a4R=a5zCL4wxbkwD)LP=f>( z=ao61t>WA+j;-$55hNk9{q5s>tu!qJ*77+-umK$*vN~SCZUHhN^)!*RETOP3r>8<| z$yt05JQc-;0Q^b7ju&Dm8{VJ*HBo6rO{0LjI3UaKNY11)C!4@Es>`yQF-$Uc9mqx) z3dWObrdVD52Let%8a@+gpMW4A#kk-K1W{AhcOS>oD+7qm4QhkKwe{>(RnamokDQ#r3b?17J=cH68;!-AF{|f^zj**3;KP( zfT^`{P6F?cRpy3Bx}xcPvW2l!?d`^vTMb4XnG%@~?w^XqL)5>>Ue?bAtAQpT$=qaY zkzncT4ELo!$~+J;;XTTb>G@JaKNlp<2gr;A&|O@&vXW|ksq=92oQWW5Y}GJNBuV)N z1q7ff%pL5TA$%Sj>O4Jwc-|v&A_)(VGJu>(M`Yc_@5?S)kGO1L<77ewR5=UIj%N?D z7UDkbn9DonOO$g9F*r%aNi_%IF!xW_NdTWfV87;}S7e&`svao%d64-m0`12FT$bo+ z;-|Vb?ivrj&srEaJrB!Qu3m~N}mtQf~90L+4!kR^$g-Et6edU0bA#3Gl zUMmQp7gL&Hi4!bfhCy6idPe!ZG(C@4QXpZ<6tQB#LxPa{E}BW^K&1R+Vq64)QmiW? zS`4i7%w!dfaIQy_Qbb3DJe)(;0gGPEaaR@{bRf@KrxNLim5d(moTq{%%0xwY{V$VP4jAN9M)nIPQzgAuf&2by+1@se#wP2>g%{7$6`&WV8m}J1_$O!$)A)$TA8@ zyX?OE9>Enh&n~_7eyjavzS9BulaH{PoiM>RZ|bpJq)rH!0rJQj00DZ*-c$fafL2)& zX}rS@U}7@_tof1B2#PKB5rBOkHEfwZy)5qi_W41Q$ zK06!vQVK^HMGy6UZFq_@I`*UhDMhDMh%KPk*$shVV`tyz#l{clhzdY+9s;HrG68O) zr*7m0*o!$JGzSow;b$Tml2r6|c0qmslz=UP=mZ*gu#j_Y?96~;m$eg_6&L}xA{8pa zNh|EQ6s52+?(GtkBf<+|0`d`PB_aqYk8oUpP9H$ZUBJ0f_aP9YD7fr1gLHtF97UND zFJNEbSYRp|C8`ZzkVSM_V+c6X*b5+PEJXN{e7;}zh48fi1c$)}6oN-IGZO=Z^Lf3A zR(@Y#Ie`=flEUxF)?Q6Db%72cPg69gPGNBAEUh76xz z5kKOj6v-EPi&7(^zXh({WG12cip|n`N$CXu>{V+ zqPLg1O)8C}_wh>_$0+jwK&hxWAU_LY9^<-#*)&(|!q5PVS4m?M8Kf(K-WWA30Tp%& zcyk{;+-o0WE2k`{4+&#cOypjqryfTx+1x4%rP>>12Xx(<4|;jH_D(Wp&LrU9QHYm{ z@fCgNhBFdK!;OhvQ|K6LIc+ zFv7TUVD-Sjc>FhMiSGaeq@1}D?SY4Y4NZy<`?a3cATHST?gbwj{b z{XNtJCPU8;HwEG$#!*N%gynadaY=Juk{r7u+UUO&uJh1IrP%A;D(So zu2_)S3_trPZou~$FP^Pdnp?^lPY;PQKp8-Gibm3YKaNjpamN~(uyap3lp3X@As5sk zanF3*_l;yne}B{U4uLGrD|9SwmAQ>_&oX?L9K=L+IdjM{_a7?9^5YO3Q6PO^GO-j5 z8-I531$O$0$Ll*trZ8t%zuF#r;c;8}(O1?-r}088pL-Y!WkK~Gy)+l~yl}e=Bux1Z1(0ZRLT(2Jvyaq<# z`;EYNGxGbrd*EFIBQP)m|D#8swx*3}+F<+BwSTlf-F%Hbcf)UN@xrf&4!Z23pZ?rx zvEs}LLmntC+Ajc#4V|ZOn2;K)FRPUGs zz_%ZO+SbwML~Gsru6h(myIw#sa~JobfM$I9j2wEsC@Uip*-G40mPS&ywB$$} zvmXaE5tDc?opREW-v|Ve!5|wKVXW2lxeLG*;n`PIOwNRhb3d)086n%++j)a675D5W!VMIlz5T z$7e~vRM*6T$;bf6i70!xZZ{ydmuvM=pU^~O%v^py4WaGnXI^o?;uItM$xbPcg&2)Y zm4Gr5I;3(*Bv8tdDb6iG8o?;Q3lS0_3Su|i-QCQ6LjDKv6>06mA~jN2!867D2ORgu zk>tb~d&pon4q73+hdpWz38+lblgNvlN7)KZAQxlc;~pfqMmKXlfK*F!CryaH0CM7k zR7$Q#1qJtv3P?eWR*Yv=K?kiR%A~R45Da3>nHw%L zSVc%GJCW3Col@pUK`1pDO+r$Y*>qka9*n7%^(vIDtRS=8#l#wT4UE7K7=Zx-@&g8I z;H?8A@IQS7vLbb zAYZewfgT$rHfq9->yI)f8Nh9Z+K~VS=v_pNGk|IE0N@!A04Ndph_k83kcoK!2_a=E z*xDtBbDoP)tC5?~b+8}_htvg}c zvFdfx>3rDGDw;*ow*}y|apOAfZI2at=-=Sa#^SRA85U#5pmlXBdXA3(bsH{fB~l>Z zB-sFEx;zQ8P~0EAF9pDoRjztnl;eU{y{Ve+(NQ`*V{1x-wP;T}_d46k>2=|v+xOsM z!yWmQH2GcKosijXvK93GAakT_m9kr^F%TJ)UZuT*=z0VxnWQ{iOVG)x^dbw%c7Sa> z8o}xp-9DtGlT4W;RRWhIMvk!Y<0jabix!z5OJ*i183IT$*3$iu4JloiicSv?&8;}c z_CZW^t+5!N1JQ}l14g>`bYGHsoP2JF2Qomt4@Acc*l((*PX#>|K%16BUlA{#9R+L( z{We5 z3_^hP&X1(993tM)Nf9|jp_`vYd5-%b*VuNSvAxJDvw2R|VHsP!awP;==aEHyQp75; zbap^6e7w% zcF(*uw)B}NI7T%j8u=7*sq)fnC)lCvYFthaKz8z34k7XL9Luds5+v1m@Nls-VwAx7 zsTN1sg;;loU3~FHHfQgB?WNB@wFmFG+lFKO(bAf+TOWPb=6$r-np?M67?TJuh5|0; zmaL@`tQQQrlSOe@7V{~o%p1=`ikdnX*&2~;A0$Y`RD@Ll8`YXma>Hqc*b?<-r@fQ2(KYvo&KY#WA^Tn}e|MNfh=PUjBKl1v?<<7@m!GHC~ zY@^v1pF3au82+R2{@Fo$lgb)+4UE9|AAtb^^8LqZ;GF{_@IQV8@{qRlr@H7~t1?=% z^Y`7|wnEyW*s7h7E#U!PE8HCUTv}EOV``FH5+Yf zQyqN=u(QpT3l~vq|rv4?659yX?2Ww&^=fvOoXnmqh0~?ccYC(x(D?QYEN20dVA){N3c=u zwv$e~*q(d(VY~X8Ut6@ZnE*U;G$Nwd>zwHMcA7oP z)ky`zWd%MuiX#UhYCVQtDn}lDl9O?I?cLWMd)EYVkS^S_3X00?-FMz3Gg8jj`s|I@ z-m->{R=fM2hwOx7kLO;v?Z5*LCpzo1rplUMs7fh2MN-r=Ncovc0g~e$#_Cd(OUAch?Pe<<<_nYgCcF9`V{m7hXVS zFWWA^@=Ck|(=1CMetT5d&^xfhpTf3vMwvJ8`>Mr+!-!Ipfn((b(HdOPZfQ;78X z$pmb+0%U`O=$f5FEzrs}EA8yl&%mu{u;o=1+eW%mAGOZ`WSyGmUSDcA-g&Ft@yHwY z?c$|&^B*p>(Zed8`}#i33aL)A1-AsjJ69-JJpIR#u1(N z+s9vjWFO6apUlp9TeG&>zWf4bBkDxPkD5&8vDv#ak zzH+nO_va_9xp6Dc_PaK+YN(xf_~CT)-r4?)^k|RW540(}?q;j$X%i}rFkeFU<-#xR zowwd&{HdWr&NpGwB-@IN@s>aS(RSNqcOv<2YiRATQG?5fyORyzNqF+5m+e=-{f&*N z8cCL^k7sqe6&DrS#TQ;;!-kKxm*08EM$Y}#&RMqBzC2=on@>|p4_3u5y!MnGb=2Wx zJ$OEl0(SBDGfzKlU(R2EwQs#0f6|He$7^r2OD;aoChUBY-Es4kw&%<#wuSy2=bUo^ zPhgwX)~vNvD>hhD^$I>S$a?hx*K~sY>HY`Ef@E29eGBK)E#Cp=Dv~gq?qn^T#!%zU zSKlG~*I~2wo@r-Z{%bq&*c0umB-H}HhZVx~Fkd3A>=WsHR z#~ghWnGbr>kl}jtv8QbD;w8x88l3e#f&?`S$(*Esak8<#uouU@PP_G%+iaJqvuwdP zpWD#~9cQn+^9-4%EL-&TGS>Gx#-rX@BTAS9FDzYclZI4zka1C7B9ZLCYhVQa*CQ}M zK>pWbH1Ljr5%|%JKuo%QiXvTrZ@qfEkXIB_yo+vK(iwFYRxaPi1}m4Nk_b*p>?g+` zGsi}a9n5B!OQXL@{JemTuFy&A&s+F`t*u#OBPR{FV!#+`cN*BehJ+%IpCf$&EbhJU zEC6!chD{i4XPc!>MiFu$y)Z_P7>|6c)y7O3XK%jqA|ry%96fXZIZ9p4cH|T; zJ8+*p7_XqMUb_;I@R?JCLdl73t*x`$=(_yzXY(l1WdldLkU<`k!5K^i-d>2AfRiK{ z{y?wg<0O{vLy|P8(8f&O4W}B4kO3>*)LUfb(;%*R3>XVAkK@g!pU$Pmpa*?;+KxZ! zB>Tg4*V;o5J!F6T+kN)Q+z)KcLck}Vw`lHD=+jH-IuC%v&@CL+~H+2(fSLTI}S=y<&I)V*vOJxu;|)1PhZE)%VzVLM&5k@WyVN6*;RrjMI! zzq|VlyZxF=Y|hb(?fHlAvll*GjGV@-ID#Al`BF)#*T#++4;hPDIkf;TwEt6g+tXIf zU&S?d+U~o|q*HUTQ`9?V%w)Uvy6bJsm!_YHOg$V;fzX)hsg$t^0ll?P0~p+?tRLKKtB@_90`GrY^;W1gM7VI_20? z?4rxg<34SMNbVp|aR7S*psj4!INJ@fcgtdTMY zBagjpZ@%@8-SW_TwsO^NcE!b4+U5@2|0uQwLFN^-v7b)gO^W|0A?|$)f^Yypc&(8m;?Y`?Qd*=D4?a`;6v#OD!ZOXV|W)KiJ&U;JibowQ&6=5qUx-XG_j`%^l>Z^Yu7 z+KmJ@$dHWt?tQ><3%mHDv#gBqQJvCzi$9}z=3vI5#Zo-4H{E-?-FnwOR?pg~vXh|t z&`@{x$p`Z-)rk~!Q zcrM6NoZdFs)T@mgTwx!*GuN_R#gLOyI|h=QTaciT{#1xgC&z2%y&O=5?K>Vd2z{RL zBzM|T;quqOYhVQa^AXU58F&qhz`zLnUoryY$B(wxUVFj<^s&(E;XD6qXFm8Bt7~bo zrF4c?ZAK4T_}AZg*M9wn>jAVen>cc;4WGQf#n9bPCL-3;+3wh#cGXu~KFtgF-SbEq z74|r8LUF)zV{@JDw(HLJ=9>UAwMz$>UVibq;B#}(Yni3=$mgA*wSymwa-3VNaL?o?=&l!p>rx0;fq5HbE zwKjXtea(d?e$Dc4ZP3_BHhRoNYisGY$DVzdPUaFA^x}XOv^J zwrttT#vQWVruuB{+O^c1geiUC(`F5VK?9XI0f8YwrI(hHe>W;n@VP-t+mls zEL-L@I-E6oHUM;@{qavX*`Q%nw!N{I9vNx-`A>h!xRlu|FFb5FU$)h$u~3~)%lb8z zpV?%C%1dk`U_3W_q>UcA6H(Lz*{UNb>g}`UrdFFYVkFmEfSVebghfm2fI|)ih{ddE zP^GotFyx`8$PF-Gx#%nIH-+esy!YS!h8mJiD=DIQnx<|K-2Quul5LVbtUH*rVPnVG zprIqk-cj2?;qa!lE9llu=V*$`WpUfoy4_xU?RhILKZKvth^@Q;g;}e0@cuwiww-^) zPbs+0p{V!{%PScQvGZ6*ll1TzoBQ<^d+3(80dLtHFKUZdy>Ext?PE>djrP~Sy^J|Q zvAy#0n>KCw6grq^Q`^*UZ+`eb#JtWb%7)t5qH*>~ka{DUjWiRnzxB3T?Jo~LgfkXI zKa<60QtTVdSP|e}mZtIUS}Ti?GJ@<5A-aDa;Pcm4{|uo1tX+Q5`PiLyL)u&Hj8l%L zPGGw&TJ(io@Y56RInt)s8*oFxzdngRQf9yR9SBHo9Vnm6Z>%zubG5O`bT-sjXSEVu|fMaiX1e z`gs=4EwN{)g(xV(4i|^6zufgCK(xwk{{8dz+9xaRs@;CVyt%?A&pyqz^(O3vkCxkz zswtd%BgO80w$m=VlHIDYzrApeO`g6hk$38Kh^n7+{)x6}!$Mm;?{&)~BefIcYW|R7 zYwc>X0A0Cf&zfn6o_UO&fBG+M!Q4d{R>bX|7hkn`AHK=?kGK5}*dJpB>Zsxb4Mq>5 zS>86f)i>KtlSi@+r0k5-jJ2}S= zh;*RTp1JQ1G9uK?P>`)8OCGf@NeYLCROC}X@&B}U9^g^cS^qzo$xM19Jt2ia=mH`F zq6i8rqS#hmd*8LKVqbUdYuRxEl#oh#og|b0=Uo5u zK9NTxJ_7HG=W3XlJ9lpR{(g7nd{6nFYPs~%DU#DCo!Y52^2F0G$l`Clq2Run@1=aH z*}e&<3=IKmXrf4DC^s`(7BBdiMt!{`n2235_fsg5q6ie!o_*m}x$8k9L>1IgP?vSg zaYsTR8)V#x=g3F17s@p^J-}FnVZKwFL48Rggm?C*i)F^^vt;eEPvw|nCUBm73vJ#Z zDF+?F_d~VRG2SoF`i~UjSn%L93L-MiPT5C?JU8_j=bZmN<8^ss=F<|JKqT-vYESy~ zmP_xvM>Z0%c(-*HQSMSn!|9OC_xKjRi|S-61f*PY5;C|)cgl+oT}z2aifk&(lYxT= z%jZP&vU+mOG;XcjUPEN}JIQ3l8xf9RBI%(-K&%!-0kLI|2p9p`BSf}=A#mUzpaxf1 zlt=1ItDTDq#bcVC(G!pQ8W}x&q^$gQwUb72%5jtA(Z9Wl)a`mXef)`}7)8p53ueh! zq$*o{s6oZVQ=l0|0dbhDFIeTM=cFVjP~n?^A)bxyf2ni}&y)JLN=b`PmuFsj8Sg7; zLll&5%wH|jNk#eFkU^vn&v?&DxPt&fxS+`17e7g*9ceV`h^p>Qw zc-hfh>O`a>+b}HHMvH)}win3Eg4K`>^u>@bjtHhe8oMP31+0dq1fn?@1}!^KV`?N_ z4Mi@Besg>D!jLV)v+9zJtlqL|hpKzk6Pajrx-qAB?=EZdmN^BwYQbP4Q9xTFmz{r( zBd=SJ?5y^vh=E*cUyx>+zxhbzLtTJDcY~52)(YnL*~EzI%z0} z%E8%mpeCBzP` z&@ibeE|r}fwNhVIB0D&rXCKd#7oK{GLhW)QmJy^Xsx&c?kYe#lPhEeVnR zFnp1uB@&Xv7$#G6+^1I-4KhzBsu?L&q%OMJdJ$dH#-bZ##E3z%U|}q&N)#bOKsq|g z<*})^L2~G10s%-(^T?wQ-RL;KweUQL-ZeXMP_#3KUX;=%jXOaWeDS_4{CJ+6f9846 zB8sZp;<<-&Wy6N`vSjHelD8pGvKi+L=0*p7D=Lwr{nxaA6B$XBXP>xNrakvC5mXhk z088BiQ9PCM_ET6MLlaLosbAV8a@pclGGyck`QX!e5T*<%E}tvi8T)5mdsPk@Hdwl| zzbYh`M-1pry5mtYebxtvS0vCZl~Qu%YzV1}?x;AuiHHbSGE$N9^@>$QA=)G^o_mV) z(op8}^L&R5Ad*tBb&aY)NPStETyx_skjMMv-G!f#t`|jm)e5>&so zqhRJ`T#}LJPVcEEmzOlZFPw3zDq1U<>2XpX+RVM%Eb)-(Lk}AvQ%ag8{g3y^6*`Gs zSt9e+>oY_^a;1Rir0dSRVw0%D6H&?N+nfOH8a+sF_& zFc1ij3imbEAyZ4vu;A63yXbRy;GR3>uXo%k&%QWS?&&|oiJ$-bz4xRww%Sp>S-U-7 zB9bEUWF9WlNf+sxJ5VAk8}L5UCjzyW>bfEsIA{O{Y&SgTNNr+BbVSiSEVO~9cPO<; znPjCT%Jo-Wk1^0g63FAPBz<7EUc#Y$Q7@j_|BKo0ldC9SBDPZnSxL?>Zv6-y$X zS~tcX&Oa$5>|aEVeH1A%Dpl*kYuQ-cLTXbgsS2n;;Z<*Ks+QAFKSho{<~Yen$sr{r z8nqrjUf()-VCuWFaVv&424}Dv*e_QBY|3u4vgw8^jBz>e$Bw#NXx+BUDWGn{&_3%$39ZDG+KZ-G5iFh3_}5P7*Btq#Pv_WBe|VO(g+En#-tnS zW~vsner>+&C@hiQIk{3?wjH@z41Nr-AXgLy9hZUcQhU5;Dp(^*Iw~{jVH1`4t>pSc zsRe2xN)p;YT3n^u@z4(-?gCd7F5Hf zgI_Z}O;p}>C!YNHxL&etO9kptMVuD(McsQ!pV3DC#d|S8mc#I30SiK-xIBMp7KZk^J@YnP8d(B9esK6QZr80Y!R<&X8J`hA|zq z(@!UBl&a!l_^|Uo^Tj6>+#eo@_~I|Wl}3#3l&m!ImQ~0QqF^NuI5%}K6+|CH@o;O; z4tN#DE;T^y^xi@7NY&z)5|F}85WX#>5#?aiLrQw~git0pie9SjRJF5K4jDN{{&dUb za>4mm5{=tLLrm_|om-rGq_~I_Jo8BT(mc@@%)C%PJ@<+#x;YZGZfc&WdGK<)U^;>? zUA0_FQPB#aM#keMZ4;?y?I>Q4+E)Z*<>LiQoyggMK}7SwzbEITfBjK1n>BZ##R)=hN7382Bvp!T+o#>zQ?c#Ydp6DkK%B5$XE%kl+ zIs_suC7ZgZ4(hkkq@e=5sE2S-zvgZaM;VR#o~W-XSw&+Jbr3a+Llw-gbF!+Ix{Fe# zVS}7?++}j;k(1@=m!={C+#p9DI@po@{wwum{|LQZo}T)Gd`uc~8YBiPq77OOg#_L@q#~gdC3?DPjk!IB{ z)k#{6O~HDHKbufK60pdBmLZ4R(hwvc%~~WW^xbHzLza~8>-l+`1R-jHkkr@H|AW+&#EcM0NlM4No&1)%(w^F74aK(` zi%Li_t0T7^$y2&ilfXm6J<{MX>@-T?H0`6{HH2tHJ04at)WuCiBsvOjw68>t9en~# z^U{&?q+@wS2`Oh7rx^3vcrY#|MkbCuj@lAZ+ep_dK*Bc69RZGU6sc3dj#t_XX>b-& zIU>k0adX}JdH4#RcZ^Cc;MX1-X^FCRbG~F}^_4KvgI0aLf^lnu(DtN1L8}buohhx5 zyzRw1C=^~J;q~>-ZbKmftH1ijAt~BGQJep%lh%cC)yiKTbrLGP;Nkc|Op4YBdWB$Y z`kF|Sfy9P!-QTQQj3+n?gB8;b1F(e%*j1NYN29upbTqFcZEq=26+cFNJ$doSnj#$? zf+5Gz7%R=IZ-lfU(@OMBCsrE-sI{Ib8YKG5ukxgK_8>{@-CI`Bw80 z;swYor%D4gHhyG+TPSe$xMGMTlpwND#CTu^MnPiOr;eQ(irNdtOOJ?p8ah%dPp_9W zQfb;D>a~*Iy9b0mP7*`Ys9#!7)T9~%*2^_CIz3j3OAFl7J^3eJfZ`RL@_m4AnHUq%Mpgi?Lmz~1vM_*lVSaHWbvo}k-;z3Mhxp8;{gh_^8+MOF`Zja^CslC5;rt(l_Qy67Sa5*GTD(0#c#2NpwmFSa`pIXskc^@Yn#H{C8rO}r54=myE6 zcBQcivK*2q%T|6RZ5oM$=tdD)K6TDDb;5wyh+=rRIEK)MW-ZDEMUABcx4|@zRD-SWXy$C;|nESb*65;=@arn$wrA+Nz9# z@ym~942DNL##ng?Dpd5?h$b~DIwnpkFd%4;CTokfNHZxw_0%LZd+NwLuOJ6|svJCc zgyXe#ex>-QiqwQyy!Ic?n=AL+^%v4~5}eeAit=sZ>(^hRQGvl0Bd?s|biBQB-4Zca zwbd40T~a}O7=kO8u9Y2Y*W;oq#e3gIA+}KLe5VW_HcHCz5~fkSsh!6kn)aSd8aq<5 zh@Sk=X?|A+&4z>A~n-mmnl$L<9%#LkE(j8@> zErnYtOvRXFzq1y+M`5=b>g4#x@x#t0dNEEr@TG*~dsM`2T6H@$; z3a3X!BWXbx8{eIChipQbrVzEBTs)TXiJ8<6FyutKh z&>VRDnz|pS?*mbh7CfYC414f$yYQ^4w-c8)brnr?#Ey_Eh|x^aUar3Udd7ohW~B2) z&?iEbu~daijdks2otlv>t4r~~({G|%Mxt!qP{nyr=&#;$w&SvBmWL7#4ISy|fuY9d z@uTYJHFZUM9<(>$?I)EfmHG#Sqfl65Za|RKz|w|j-pFovnti00PHRQeL-%4)UaVX-ZLPz0@-Y zI*5*GB*_nmn$qX)G;p_0fp%~`~ z$W|GtNQzHmBgX?*k2dXO%=JEwWS-z zj5;KW=%1U2NoMvyd1dEx(%QC&kMW2g^0hgCBg9JarWX%Hx1DIMD%fd6D464FieorU z`Lr*`{rCM%MhqPyy?PFURF47!($cuuwex*2w@?Sgm_d4jN##=2JB^O`5v9-um}^fyR>l>SO32%Do$J{3 zpOvSKmAojIoH_Oa`FiatDMMi{oI11mVtV5!_dpGh(_=0uMFT_d(nhC^IEdPrTOmY? zf|&naBAJ>BT2q}b8Ke&0eBDjd9%(6^LoG6cLHe%*fG`M@?)7;|t+rKeZ4O zZL+A{=yi#TjA0As)^J|iKZd}b5HJF=Cxq;ML*M{I;P%^Z`O~duUFZ;yZgrLX2;nv5 zN7+vb2`$a}(bpe*JZBW!Hf=7a!*hhRqDJ%Xs`V1Ju}lslRYRpS;~^>P-StqE=~oXP zjsDi>Z<3AV`9~nx>ZR!%CZyy)?;^=dVP$@iTzTXDa!_u&yaqXW zl`Z|`pGWg!Uixvde6;LM@g7qzgAX2xv4Gu+5#~mE)P*5K<7PaCZL(?2b}5+m9-h4x zNyP|l!jKLo#b&rSTIM|Xg53PTgEC|4RE*UqnfKSHWch=ClV=`%K>jrLSb5^PCnbzR z>NT?#N@`h)OgtL7U($|3)Z$i)7^9;FW6`AsD@Js8Jb`LKd`97XGC$thperjaNg9@{ zlXEY>mb~iX61jOBGNx(LSp2!8 zC>Fx8)F=+dIB3K0X{N(_80ivyFor%y6)3K%Mj{~%q2z{ZGy;_HzBW6Cj2mODodRx+ zmZ)KVyKAA?Z4!>8eq)(+G)M9171RBlL2%JxdxG3z~Q7)CpmhZ@xl z6uxUTOl|yVQjLm=%fz>6g(Pm-A;mR?5{2OyM${sV^U)5<+K|pM)EQVmxT~@0G+`uP zNxL?;Q%m8YIbtKV1GS_tCH5G=c_ibi_Dlr*Nena zWUR8WUK%fIL;DW!ZBqjiqR|SL%Cg!tN(AO!>RY550{Q-I#(?^f)M_V!q+RcwCXAdb zNIP?|66K-wUo8{gCQ?@#tE8>EU6RPf_cI@Z*|#>LYa?P6Omw1y^YVdV5a-cBL?Q$% zT^R7*O3dUn8znrQ+M+E*j<>p`sLR;4c)dhq6w3q};Q7{W7JuYU#}M~&p3cB2 zVGCl+h^pi-oF_hNLPn&g%6uYC$*yp`>XAbKQU?P+jqVyzZqrWiDGai9$8Kn?#}N@l z)S*uLl6o{UEJHfVxch@4t5u}>F~^mhYu#2YDM$SfWXS9_j2qh}Zxy{ETefa<)R&rZ zR;02ngg>v64KVaWBHJK<(J|2oU{uqz5%S*=CQ%gq`zj%s+8}d%KILZ=vr`L{L{v}5 zK9qFM5F$yTq{Hb&_JR@iX;Zo-OTkyGcVe}nJ*P;9MBeHtUDMhswwzR z^GkQepDTZ=N3ziT0ud9cs6d4!aPd3H*TV4iTh{= zkyS`atCJqZoCim(@bM5Sbmn+1%^95mU_b1WStDEKFO-U_uaO8u2sBdSegkL3Tc1eN zMJJ03Dd8->3*(7Kd59LDk~3JwC*{aRGp~@5nVFD_FdPNVQbqK~!}oIwq`eiAsZI;G zM&2NHZOn6x&T$KXZ>#i1JfmRt3`scjH>Avh)b?8C8W1n))Yz^U_ozApLLhRvI3ntq zU&W*W26Nq-j@pgy6kV#zE8*ea-IvY^`^OO20|G`s_5hH*Z3rA_2;}7CY`S~e3%MKC z=k>p+sVPiQ4^_UAx~yCv)=qQR5uJ-h>3bL z-FWcT*{DD9PA6niqFnSiaJQ1`f^pD}_zb}!DJZX({5hY<2aA?T&%Q%s2&!6|Ru+Pa zR|V-sMVoiZ{7;ui@zy+sniMT|>SgG|AxnOWf#EEUp{WrUwNg}0w7HE)0>+6NOWVQU} zn4>vw<|f9xdb&MGovJtb%N0wds-{R1AtbtJs3)5F z?;;ZDf&8d39n9FThagXDeTS5q6D17-somN&$`eMRdK+Y72gdDdA1#sXs1k+Jy}P2O z5f6Mc5jf^q2lY>!mv)}^qIRWG4~?oMgcEVls8Wo9u<)SE3_e)B65>Z0f4BrjwAeGy9)KmQLb3F1<)WJA~^qhAPwOXzS<{w78i}@A| z5o$nrP9p{y`Ox|#B>-eaQp5F?j2kn7w7+<2(&{9|8E8$zLLec!n`}i=d-1YG5LZ0@ z$jG)q+O^;*il|h$Mp#f4Ya#uqRiiHu6TMblv{QH_>7NaJ*JMyP=cl+r$4vRJ{Pu74F(FCsIXJf#X1#m=}x>5o8|(HJS)( z2m4AwB3rx2Uw7-x^4!CZgBzfcvg*>PG~XM3q81(qkqRFuS+7M*V&xjhWh9~%J0XRr z2?ldKM(8_d2K$On?#5hTK5`5>)rf&aMn*ex$GLds zP#bfrhGS?Co(7yOX4KI^)UG&Te96ss+;)P;Lt&FGhCmk)Fapv= zplmZk;6Orvg3paqeQx}vT~it-eDHoe>0FL=?=fTd%Mtb3&K-NCocqTq`|Nme?0F!6 z6D~P-pB*ExW6Uzi;_sM?CI?pS^T)~K$B7=z|Kzi`b=>jLU6)Lma{Fa}xa97=ec%Lk z_>WU2?RK|5UvsG1(18tzK!rebu%^FTLqs6NQ4CTx$}>Z8|)gQnN`LiO`XR`h>ll0)#sV_jlQYn_X~-Q#O+_v&*^UD6aX z(*45pSRYaQ5eBgt_ov%JwugqgnlWruOkzvXc5h8cq#%NthEJdJS&r=Q7O`1dYMiNSP+CKq{-hzkH99m{q59cB38H?i5itTKypi5!h(Qdgi}AHJ zK?&XBg1r#OoixpChDZemwY%4lKed2fAfrZ&k#SixdWrC6mv}?Av}9+OOu6HZpzfKe z!QDm==e#lgs~Ur1W8(;n_<|A==u4LM#e zc<^5OgIq47s8!*5#Dlt)3?0rnLDWeNeeZ+MWX{|Vp&BCDV|877Jk#qRN1T*Ib#hIs z9NmN?g^6yNgM}ziS9&we~0bgCrxqH;3Nhox=EI${`#OWD6yd0a7H|FPB zX0;nZ*L;<|CF<9`hf+S$e_>s%!<-h9;=(@?xv`PGpn@~s4g&&>-&}A;5>(BDy?>hsoJT&%rh+fu+@T&ju zNn0ZEdp$&ReD(UzejD~D5T&w$Uyib-m9XzI0avDEps7FcsTh0(4f*nX8fFxd7JPizr^pAvCK8YO+94h!>NPiN*eYp*bVh zHsxMB{B4Sc$+*B*nb%HgrvQEeI>4X z8w#mUAXDbrR7*1Qe;Xh0E#Z3F+S;C=62i%V_1HW=lsi*{PS412H3(l_(sIdjM@;6D zw#fbN0r6be))zlG`B6j0Ul)& zW7eSXr7+{GmX?;y?^3nw!BYjM8ucRq-LCE3`~L46skjtY;Fq)$z*K>K*U{nPCg3jFZ)X;VI<+te0~%s|0`r z%QK>h#EMdlF*7q$nwXfl>k|F{^t5&F512YqRxCT!BLrk;}~mXKH(QPE*&}HU8F?mOYa?1!ib=zo&hd@0o=g ztCRVSk1WOoc5lU%mD-`fd%B7TS3>eWPfLp#@3dRAPnqgU@`FVN!_p7Mn zj`w?JHssXR8JykJRz-H@whvVKa#dT~uY(ZuN51fM;IIQ$w9 zla=Ik#HIZ5cvIvC=texGrgo-!a28C@x=Fwqg)W?Ta&o#+H=9C8OiEJm7CpWx#!5|F z$u@f%0+x0zSJa|4IYB7y+FCawoW~-Q+Igz+F>!IlXFq^f>DiYOOQ*ux=bg4cwm4Cv zKN_PfbLc|%7~Rtvvzylsm|tVIN=W#2!Z9Z6%Sj}o#do=UXh#9@r4uPXpe^-cRmlA4 zi$rGz5_vAry*^>=HJ&QOBevIN(&_X8N@#=Oj{DwSdD!Bdv7!nh0>UR6GM_;cg$nW; z7R7jdK_)Hc)X>a&q}v~VB$Nlxh#@NSX(CH4vhJ}1@bfBAg>8Lso(2ovh~o85!kM#c zJ$>XxN`pzzbe~wgRf>VX;_lr;as^V8&)hOIfz`nDSyC%Skr&%Zg^{2Tleq%;!ByFi zhDK0u%3r`)<&+m7)bfaLVuTU9?~XC{1>40xg4v+r7)u2SS;CuJ6+LnQd>J}XUuMI3&v}9g|ES2hJL_) z`Yz~pJm=q`OTZ$Y#FAQZ{5nCVWhnU9pZk<)*@_~_7ZSMSOQDw zf?6|z$toxe6k(=9p`;Qk6)ZyTTu8cRqz35&xwrQATyB>{hI3LAz;oS06#lbo7b>y&*$ zqj7CvMd6S`d7h3A$(Zwjne;|=q$51U2zNG|P|u?u!*=yo;;imQ`<0AabIwDd))CY7 zzZz49lHFy2@`QqoU55gN4@k5q^I;m|Im;rLl`uIKFdRe=QBi z`Fnk`_EhT82~D0v23gVn*$u>S=|WMYhg6d)-m*gCQ0uz$ z6=9^Z%MR)27$w4zjO0vr06K@QBv3X=)zzL~1y-M!uv!xtrBv9R!%{dYvejg5j-;b= zxb$&vbfBN;@*8E0Yw>MTB!}hjPnnL|3C9A167s=UQpNTVh}!I$yjnMrNK`*#(@)H- zp$TdtQ&1C`n$^l*EO{irqnbzQXzn=Q$dEJ{OG!}_nKNX_EGkrpk|gsK zh0ODG*6sVB>s;rYe&6p(c;EMV?t9;RueJ8t&)w4}RTjv(=6l z@X&3o9d~!j4QEn1+N(%~7q{>;E8h?Fe)8nW3kwU2h7j(9Tppe8Za$BR*U7Y170h z`Dk2D!xbmV%XR06M>^kEI{*D{kslIrinsR;b|`-fd4msC*r(g?FX-o7(VD-%Lp4~z zw&Rd|LcK-tuUXDYF%4#|s6MA1jW@cbwZ|d?#ZERl8P!X?$Ude^qZZ1{%^m%YYBkNm z%x9tWYn+=mJLoY{rxvxdVpCW)lTGO=XEQM{GKyO6i}qINe{f2{O=j1wT^ZR6j63?7 zlr?giEQ5dLT;;a@mHp?9tkYjk|2uc22m1QLZL*p;3)03JZ@+h5TA0mvuXi$%Rw?TJ7 zg#s_G;O5Pn3WYAi!N!@F)TVFJvrfr4{ncdAeWV_@W;_1_wX`#FpOa1bh_vcZ+uoz8eZ#jlRdLN9N$=+uAct ztJEbUYc5nfvSo23C;R)y9F2%yi*=4qP8Oi^HIs~N4dvTi5xNI))+MtoQ#cYg#;Raa z5x9g+@KO*G5_)+l^8ik^=PR^(Dj{S9`AqsQ-E{ckZtbrY6KOgQraNxj9`rD;rE!h@ltDYTj zkyP+naJBUEDv6E}*i>m(ZI&gYboj9N!1pAFMCE`jk@~sT#U<9Q1++uX9vY)XjEL3N zLKmAGx$R!_&$Lpsb41zcM&;5~j~sbQV&>ZE({(q;yxPgGtk2#o%j@ULZrC{c^y$;m z(6A(O$g<38Vxzt0{sdV4%GSM#$SW-`ecx&Ob84`u-nJr;eUVkf;O8#f`G=3AdzaW7 z^KCnoPOGS>eE-*4*xgqX=@MRk(QZEuna%RjqWQ$1dh-{rXP@KX@gomlcjh*CBOgsQ zoHJ&quC1LGPkYbSZ6FdJSJW;_4obk@E8i2xtXK2;-Qy@7FXH0dbnQY@rs*>WdwX9; z!@e4`tU|R1{09ahAN=~fUWBOlGDBssj!nj(>%J!zex8tN|Tvt-}QtiPu z9HPG+&V@CjqoajyXSxCsIQC!3)(_>oDOS){RS*H>?(R?N~7PQ$VdXEzT8*F;L?-s4kq zBRREXajJQEZhpQmeA+_=LErV96Tv@v2BG@KvgzBkPoXGj0YN0Tn;fSHyk~~ zE$=?@aro`>(tTgwRqdf+$^M(E6@`pgu#ASHr^O;`{{8&KWM+(cd6RIJ`>$4%v31+q+pjWq?Ywz6ZVh+2)Xo#fj{UOjd*&i?6kjlryc^0_ z{&V?oqf-e|9MVcL!=pX=KitZE*SHwrgJN6$kp!H0F5M^~sYL{lHt>Q%YRFn;jhAu9 z!<{|J%Kq-{on>8q@?Q;e9B%XclvS%R-_EZdF_?iwonm#2Zo$TRCl10T9F6G{Pxkdb zIh$}&YqxIGu~5D^gw0jJ29Mn6XzpGQQegO(hK+qu?Uc_~+df<`K+am+v9Plb_|>%_E$za%Fg!HMz>Fw z%>SEjsH{xLn3;5oYDD@UzjA#&63!V;t+MTY_m27Yxyh4)+iS1u@~@@o$RpD%q;wLI zSLY`FoN^rc<&=a9xUqKpM7=~AeybMgt;B0_uBW#u+(j?f+AvZ*QZh%*ed4mZVWV40 z!{1HRimcR%o0T=_*RK8aukOWr!K^0X;h(Q}kXI{fXkPuEcwf@4>jP`DR*LgCoeE{_ zoB@N?k)w3HVRzEgZOZCi9Ij+V*nfE}7VACvx1nAntgqEn^P@dZBz9eLh7|4j#p(9p zkDouU+g*~xi=+p@z#(xtW4iM;_tFdFw_XmbR=i*H>gc`@Tz|0{(yV?7DBQ zp{DLxntr?N`G(|(%QV>3qq?UVN%ZVf+2?-c%9Y$(3>^P<8%0T>@Y??Uo^<2j{9sle z38)}{tvEwfL=HYIQp%>pbfW+34)R5LqNSFOPJfnVQ|6bA8#kIqN?H}DV~2~3r3fTC zM1Y&-84{{o+<{{M2Ai@rB7x7*BD_lyGBWBCUU6(X7W(oCGVrs#7v3FTiS5@q29)Q? z$sfmyPKtBmGOek}F|y|n5ERTLX(Ree#QuS@Z&Nh+Tv2_KiHV7U++H)Cod}UMWCNk$ z#v=eL2Q*lag_3%JDy*%oOL3;XZUfn|EVHj5x^lz|Vxk@;17)MI$BPSTP*+!%x9Xh8 zaH4>}W?TAQl;!CdK1cE{(!nO$DGj=X&O`5IWMr-*^41%)d}={>?Uj*nGYl6oTnY>f zl}zk{|OKE=TZNwie_xc`uDe z+XQpUoI#RlNIKhB_gKtCCEKdmIS2reZKorP@_kZSmzvC@<)u95CU%XDk1q~7dwhMa zctgQ^yhf@$wuWXcuiwJ9>f!xdr6Q=12Ac0A zCwDbvneU)htb6zF-4}Y_=g3VQy{64=yic9d~zk&n9rw>X)NFLgoia((F60S=@F&*34bE^TlSo=#E&0 z3@2lAqp|nmj4HS1#1&^}=Zx39FK|km0m80SKNj2Zw=w-~bm$k{eakV4)#Syzxy@El zq>=)lay|EE1MxwZ8sfd|~iE;SIi z(eTZ81H~2xj?}irxq)a@+r5`RK9zBpGre@_2zd#C%?h(U4~)rcG6?9k-h~hPeDl9W$~O=RXdZgQ z%)-)ype-pWnMIx4;~%5fX0-#iF#F$0snHeQ5{~?MJvmw7_6BZiKu^5 z6+l{ccJ{5^yLX2O`d<_op27|!75(=!%K1RC@G7l%hIP2!dy&c{BQa4Zwd3alzozwJ z!Iv~hjM7n6+A&cpHb?}mJ|vD)sCzdkkTxKjZV_>MENlK0_wuee9p!$HWlipR zskyee+FS7g{(M!Ld}^VZU*~S+P854*i7rNZ4z~{;XNenLjBK}=D0cCfDsFDD;`Z5F zAq|)&5?&Q!5pjOslb(0)l%gjG8gqY0sMD=mS5Q~tIj@DwAhh^uW13a0MFbNY+vEBd zhi`}B+ay_G53ZyqC-);X+LO*E^a6pqxw$O~X}{`EOisR>+Z<5fJXD~`teis-0l|~V zILI#=xz?>`cB-8r?DKfI$WXF?|0SemP}+sVC(+=Qi--)fnus?|O-*I^_NPyu21xe08o~d{_-)DL z?0DaMB(%`bP)SmQie0ZA9&qUUa&ufRVHZFD5(^7U*oCLwqtf0@qbOTKqojc01Z~-) zXGsX%ZuNRUf;f+!Iu-I;I(R?HXO@QJmokTYb90Xlp)%ly=Pq_FP@Kn4!U7NDnRhXci| z!5bzwaLMU}qgJFFdwVa=O-_qf{qng_-8okq6*#%M-$sg6Y?F7-{!Q3P(0F%uw~GU3C5W@ONn@H}5MF}> zbW#F0#ZhS|yk}499O@9qK*5)DNoRUB0eW+7IV(>_$>};Zzp+wxGVF_ujjh*zW0`-q zTiO{I>M>b^MhW#h{{EjYlPZI1EpGnhh;>We>#%qWCBh4Tr0S;wG#zmHXD|c!5sFku zC|q;4Mb-~#>xtK0p1Z;NTmgoL@S}yr#c`1T?4q90lu3DG<91&{rVF2x^w~;VCM6}c zE?KvW&pl2~juG&`GX1YL{HLYlZQ-i;hYufe5wz$Z^9vaEpr@xN{jsSy^4f7E*7@9d zqca098D8+d(3Pv*fj_PgmOOC;yh#39N)HKZn?|krz7Ie0@0R{iuExn4u@$cgQxR?pKQ{Gx z^RAPc%_W{5N}m**V?9OX<>lS6sC%sAhu6^3n&)0^w4SV)C?1%^A|zen&H}K;Mv0Eb zmz>KKb?UFXU`qIE=G5!1c9U}h9^~{t2n%DmI8l7ZwtIfayWL~iti3tk!Mxj~GPr@_ zv+}{IA?1~o!)bbIAl7=ycij&@g? zxD5XM`tp@$x+`}8K+c25k7rmb?FPq6nC;S>23}6$T$P91zIpT6sgoy-&Seg>SK4F` z<7g)*3;qU$0mD8X`Vu=qTWJ^O9kRaSr`7Z+EiG`G`(iYx)^l9}qEW|=9{s5e$p2ut zc)IQ58u~30cm4g3ZD3%KZ+~r4*^9$olAOGbL$w{*bQ736ma*h3`rJRID3o86jTLi4yqws zsTVlYu{B@mSw*P#Rosh;;xgq-*G~Oq*X;_-ar(rG>ZIq-pAQOZB|nw(n6i{MS&wwf zTOML=YPyD_ud<>de$ARSrj;K)Je7sMCSkH3G63BxZ2rdX8FI4mo(~>uKK<5f(X*_q zOjk@yEP*HnhZ>zk0JWdnbypk+?8X^7UMCS$TT?S>)0Ej;0ST|VzrVkJpfUZ_zTjLG zN)NIjEM73Jv{csKG3D5bBC~ZBzhRf!LUsZ=gWl33dz60;4u> z-RiCYRdf+Zs<=_Q4f4R6icvth>9fqr!U6&#`O8c5-jcz!K-E;bkK%mat%@d69n+RA z&LaEv?d!hH?Zw7Zm8q$tbD3M(wj;b^6e5%T^X4H*06w$|Yspa=Lp)-==snxc*Oeo`J}?-`dSafzbOlb8&f1`4A@G)LP=ae z8F_2T>Ag7F*e(@(DoSovrhBFe7x&uk+UJM6Z{WC!zkB~4)O0W_np`We+8_L!lZ~DI z$wu7Xzq`AlWO?~Fw-_L}Wg=$^qv&RJHse-KT?}F#fmP@_C-Gn>Lvxrg3~z5Or0Y(WarMEsZw)4{aJ*H zV}?!5&1n&Ni;usCqXHP!^qY`Ge2Md*WB+NZSW%)2g?tTn9{Rn-%vgs#GKG&LAQd(! z%ygXSb{#F5_-PX2X)^J|reyZF7;X-ddGpy*@{>3176L>|TtB0ffBrSSG~d3gV8Y2Q zY57xi=X?~_{$bp(Cm6vF>o>#dWN~9fi$~tkM{liM5pM#!iJaM|Vmt>?iA#L0Iu`iZ z>cWK=i^EgJ2#UU3jz1oTh0f}Gnx>TymISna>py<=$14k5%gdK9C-d|3mvE{%q^vD1 zI8Px1m`%h%ppyy=4p!KPW7?2$;e9JPrV;U@v>Uiy;blYvE`X}`Jloply^^SX zBkyj~UpF1{AW7LSr^MxV^^-dTlf?y216+H95wp*&Ej(>d*@A*f!tdS7*aL}1NLF@k z0>D_0&2zVynB9%9=Gy5-tv~vY|F?h3z#<1yk_B6iqM+!YgnCPrOfRLDoP#XuFL zi_Oz)tmjiLXw3uAN)*~_fp!b^rw)3S^&hu+yErA#JwsTxQTlK(j#s+JT-!W%kymkv z6a)ZXm3EKGhI0ptjM~9|emziW&ogR&V5&QZc%J8|c`7>!}0jF#5T zu@dv8gr!z(j*a^&^04#sK#W~PR76+}u$#01(hSd%j|vG6J~>QS0+9ilh{P&nb|`b- z;l{Ll>D8N+r6SI`7-T_xxSXdYgFv&m zAZnH^Tjtorc>w8KQ_iKA109}BsEUJ03x>MCR&BZH(Oa9C&?Ub`Xd81wB#W

SF~Nbycc&T%#HTLO9uX9H|IYxpb-LN!N}e(Dl3X0LB`ES)-{e z+KOf$k=*{x>6xg)>d-og3m%p^0XvSAs|Ih{wCN4U4%GwBgO|_PGix_Gc>z_7l9KVs zj`Qlzj7}~SzmL+4l$GlFBh_O>Z-*i+BWI#ZN9lF*H#C2u!tVEts4WQVm{`TIYdK|45*zM!f_tx=ATSTRRp^%`$wPs2Sw2>Dx2Eacvi} za-8xnIcMoezDCktTmjqM&-R;f2WkB5@~nkMb&TU?v0l5liaDUUTIfscBz6F-O8)7| z1TE~#jDRI%A}REMAaV_TPpY>!VV2y#KSy6fyw;r5%c|XRrx6!5)Y4+X!A_O?GG1h4Uvt^?fb}c(J+4vlymrmLs!$yw-vJy#^ofjHNb)2V z)$kVMHrb^o=21^BqT|%t`bIzQ+pZTv{@c;_(h=Trj-01GIvE{b$O%pktk)$98=Y^d zqao|(!foUoyWNb^jo&UU0gf;<<=L5}{H}?#fs}7;BAMjcAZeqOG)-j(!3Q0q$t5sa zW3e%|zc|ZvQ1|ZnZh)Bcl!tCC&i>Jgy!LPhR(?mH7&^l5;!HCcApQMn_~WQoRp{w` zE{@?4&{<=ue)z(|cf+1K3j~)qZW98h&|tanevk zTD_g0OgKg4G86eut91iuXFs>{hOaIS$MYj4F_dA-kV z@!KZh&qP04R{>cV46bN>UY^8pEv?tCyUlIR{CRYqK(1Zt5fVKeWjCC_4|mV-_}$Bd zMys-O!3bY|R$^Axf_9JPBWpI8y7o`l-++prJ7-A$x9O*1PEj+oTqEDRF&`Zb(;daT zAqqW#vi2oXYB=pSm;2@4zH8|JO;pUc9%J!A7xb8#+8;}&lm zKb~<(y&4~uhhq@=PIkJCaln0 z(_fiUP=hWEemfW(TDKNmq%P@T(yVbNZ4a`tmm_{V_0|iuvIb$T#4Ds%RJAt{kENhC ztRs#-NwvxZLWNCUwuaZ75GSjGy*My+kLeDsR#0SFNwFk7YN>zV!q$`91Vw;w{3i z*!n|8+yT|d{L9n35@t$8YH@21p+AUj&$eZ>5Z-1H(%P2C70jgcxjycQV`B1OCl)QJ zj?UoC48twh!GoDho8`B=t zXVM0PP}cTlECG!*=mNesZe)>WiV(0?b91O2c@-1&^*;qCZ%AVo%fJuyQneGL{@wbg zRlmRS8gESE8!%oclm;o?RP9|uJ}2pTrEu$HDUt<40z9tQ9bzOW2>KNgvCb@Rq*b5D zB5hmzG$Sa~M4H3iT1?%*T0mG)3ly_`dakCQXvr`oY++`0d;vrq2|Q3$C@+=#O}Gr= z3dqSLm@|4I)c3Y>p*^UA_b*60+oOp7-BTzD@Bd`D>93MKeRmZTD$ma2j~q{(II$qK zb7$Obsil3mtsFfNzw(Og8lv_7j0>W3`n47^y`Us=fcxa%ZLTOc2b0dFw^7-oED5fn z6C74)5j4wU$A6US-qtOmysJm3QYZQS3^X&>i;|On2S7_i#M*f1SI!2Id{_OQ!s&XV zXtwr5mygRG-YN7IyBKyqcTb^U@QU$=E8Ogm->=FUE?h7-cIyUqw zE26FaMp}M4-!zM@w0gd1lCeC(k`n1DWb6Jb--&=Gp+25`eFqWB{aopMpHudRxg5aP z29fa=zSuI@fk=X-8$HG;jZh5SS44z$ekgH}u(g$x-c1pIjLmVSgd>Nck#ot_3bjdw zoq}4<0Z2jmNEYZ8n4zUNQL(S6v7GIOaFu|}_KI=2BO27T9<@jO(*{m6uSrh!6{FE$ zzOe7f(q!ZLqJ$U$C8p0yhP7;m@5j<@$yyV0baV%A&!dYm0)JQ9v*o+gLbv9zTx+>hw=b9PHJqP=!V5u9w}QjYYIeF&Ci$ zlVk8}*1$B-t=0V^3cxdH%D`|{)z#}67#M2MHdjW;;LwPtyi81_gMmZwgXwPjP%Eb#AIYJ-M@eTv=$2_-*@MXJ#P+|%rk;N zEuXXQXE*uy=~Efn1*7Pp#KLi4y3Xs8ZUuGX@*h^s8SXV(PdwgBh2Vs~ zRSqRrzE9A9Rc{*@rhLp=|b&bT^+msDteS_*0b$>{=JD>StG+^+8Pq|YBe=AIz~ns z%EVyPW*~o^Lgzg#)=~&Wgyq+lYMV7v^;kG76(5-j>t<5#zxv}yO~n4!R~iIyMR#KE z0BK(ry9K?SS3!YGG7{^59*WgD`Ggt!{f3SAA3eGSuo4TFe&@~|N~Ikl2TkM(n5F7c z^`%DSLZC%n04`>exP1C%l+|`WS5a8XD%eQ3>r5FK36XR8)IPVr{q=U>R(z98u=o$U z8{K&UYW==+!QIaV)_tq5AN_STow#B;q!|m+-e1~xq37d$w!P;mp!Y#&UUdVgs-SAv zP7Ug==agpJ60io$@D>N+Ls(nEI@>!fQ0$m{F6%MrrX|*)cJ%X{O zSeZ_s;Yz4ifuIvx5cL3SY_g65t5&V5OEWxx)h`cV1xDip3yY_ARQh=E`rR0TfdY{* zm%}7CKI2n6249zU{L7aUcffb1-|)Pwjy0(G_HuC0@{+lE_rmPBPQLw4a1K_u8b5sa z&;hSd8EjzWtY1Wie=P38n0zih7^)XHFsBN{>K6j*B&}QM!mDm#>t8&7PJuA`v(QBp zCml7gl#SYvF3?3bq^de;~Z?vW0eh z5&aXL?8_Uwy1PgJBt&1FPHU}`7>ei{{FP51;bkWS-{s}DA{jIiUSIyY9Vq*9#LC*j zdeQ$aj{XEc@otXH55MgWKJd>6O-DCxYgDkhI7R-&Z}uAL5npzpcB-F0fBqzCz0kr` z@yJErTJy5||LlI5s)5Y#iuk>>n@f~n8MN3OzY;A_;yfa#2co72}JP54!5SMQG z`B6{&ZJ<|BP#`z+uXx(X@>lj+7!IgS)*~Z8my#x`VxQ^jLX&rodJ|v&F7s zB?mYuS#S#&ftJ=}fvK3O_1@a?J9qCYLIjbQDka6QB~J{ExYIg1cVG|cYV#PL46Fn9 zkhuC|eJEciBw`#JoUV6>zYuiaO`z_ht;B-HI=V30j(@(bfk^n_&c+?jEw(~n4Mtgb zf&WK+)>ny{0aAZHAWN-y2m(%LU!P0OnK#MF?wkH>-n_ZfQI@2p@831AO*NUb?Z2Y= zq-rg_uMZ8w*3yHe+(>t!d=i)IDCkd1I}fr+s0-E0&^-9$M}#zFlL{OWri~k~V}P@*`g72KRhFzwzxl& zvQlw9Om!3qRSdyCGc!ZUlQtBkTXjU^$b}2M6oc2gFGiPrc@Bm0W!toK8GBB${75$r zLAf>gnQ=itK%f+S@dgxS6cy*8=CX_Vd0&lM3!J{@Ts?O*^iokL#Ru@I15^x|5j)*j zw7XG)f#hElX)&ZBczRZAr?6lr67_RM(1jzH0f!39-Me?gbDDL$v=*G$X9doOzdc!N zQkv!#d|%asiJA({XjPDKa%Oh$@=_tiyu-aSVtvRih8$cfMb26uS)<(+%?{&3IYl5M z{_B_!h-@inklFA2I$ZM`H|WgfZu%^*IJO>RRo=KIpnSa6Qqtp*99#rPR8>vD$xz|0 zrwzcGf!kfJsilmJbU`xm{=IuXrKN`!fHJTKhtRMCw)1)QN?2GYgMxQf$w_WFFB!R! zgM&V$!GC$7?;y-^ta~rl@q8#R?*!C_D$-L8PRFV+-0^j7 zbvX8>=}Jxv5DfW&S@mP8fO22dbP5H66VON<+POLOZ&6aFn>0C9R!KCt- zTue;ty~mI507-SD??F%=scFJ`*>o_AtgSW^*L!1m_v6Q-s19U>aPyUDZ0tolx9ZUe zu?kXAi(ujzVRenF#I^bZlx&!|)AbAw6YeeEdDi@97lnJ=i_9&^lx~VWT28g!10V8srh2 zviG=1qq0~`*qaSyKoJVtg25~fsOu34Jk`6~2HO?VUoR09LeXS4Ye|qk99@HtC z`F>R zGeguR(iMz>%?82TDBoB8M4SX6J40|c(?<5|XuxmZzn=wGxLX4L(so_c&VxU%6F|Bp zAg<`3C}fjU2|IO=P+x=gp;13?ODqTQ*rUDv*1N%bL*?gt77$6^ShubN_RGu5OA&F~ z7y1FcIX?)qWwo^%P@T|}FR=V@P)dpwrZy!Pwd{@$A{dfVG6y_kry&SO}U{H&@d#mUi0m?Ax~qAQC`! z!XOrJK%xY&3+FEY`IIQ#_>o_Fx+waWels(!>$k}=qcwX|!2k01#ElnCOfJ0EAypGc z#bBIM_t9&+Zk6w^v^L-0$Z9T$^ECnnbOF3pr{tOpGzPo=I$mMp63*2$>wTi5+f$bo zt0-QpN0@zLyt`JbV2A>WsU#{^F6@xsNN-t`Pt88uB@&3};mLXlMW|KZXn4YnUYd`W z4SaQKby#Zn+;t^_CaO<9i?tx_hM4vhTZfzh_PcG3RaCo&@|_H)<=$jVZtY{MwODY$ zoy$7*`=A`3h>%;mC98bAgl#xzqmRMB)2?AEN>5MEc|^V|a@#0SPn{UIFoADN> zwI-u~%{~PqzH=M?C-rEBMFwy0D=Q^-4Xyg7j!}CC4#$) z;;&tJ(m31pQQhkk$55uhuwI|>kh{vJ*`Q6-odqF6ZYM|ka&?3e62fbo-Og*U#D6xp#cML zZqP)i(5PH3{KJubZV}eSY7ldX{9hlV98g0XoV%+=9(^Eu{@kGZ7sBU@hEzw`O`?M6 zcW3bUxo!sE(9)7A__TxNE<^`Z_)SPm^M3VzCa7xa-1Y=_<0Q}{oBk8+>gtjll^fQQ z`oeOTPt9MzKUr#LG>5ey<-RF9<_q?~rHQs(@L@0u@UmN=Uu9Qv9!*~rlJbw~Kr3Du zKL9#VfzD*)CsvV^e5FA`{hgKb0}Mp4`=Coc3wNA%#m|FhylVAF@?rC-g|l%cLUIZ9cafoq+Hwe8)7=!_563Yo zQdCrw2uY#X9gONnL0aTzour~O=L7AC+u>s1T{Jm#PX%{dH*?r1GWFn|(}vKoo+&LY zT~EoarG2pq(!PW2GlhuwC&;ZYVc>5cIb(ii$uYnGkSB3NX`vFixvCi9jp7ps2PxB|b5At|Gh(*o7hNic-+!CF#l z-BG$cHC5--nswM+4LZOZ*4yzGfGcvf9$d!1a)OG*13i`fjrBE{>3lnM`ArQX`(~@6 z(q}5}O3ksMR9A9)a{>z8vv~xfBv3 z@ThsTYV_OH-<*u9N8NJcisBLy8dsN24>h~^@u>xmS#QYC`xS!*ErHjTlKO5^w_A9y z$Y`h%V%6LF@EET76DCQ}TP+%z{~N!W384nqvUwYWv9a;qiqkv!Y34T!R%VOFccRb< z;5_5Sq+El9cR*Dk6qn6};8Vh}s;f_+^Fj|QsB-!=lWP>M$$Fv)fXzb@K=+K2ZQc4S zOWX|~{y(hT*m(&3^urp=1o0ud{F;Z*E#)h4{Np<^Vw;$ZO0Uf$EL@#cSO^N$n6?c7 zktjKwvW|2xwe+_Y&#NE2)#pY{OY6}Vo}Dd0z{MWD>{3)&+lhXSBPuE}uqeT^2we%p zzcPfIpoi0^Py3(>_}#qO2@2QWl(lOOe4X?X>f+nv-6hl>nbMmKzTq-54Q!p_U_#)_ zV5_gH*YnMB7}(v3p^L0>))$?e(mvO08_~jv8i;lY#y@rsziCN)JGrLH?y31M2a^OF z4JM#F0})mX&jqgC%>NvI#-nO#ipW@BQK^OX->io)p$hN9u8zxJW7hDWcy&j%S4!1c9^qsZ#Ypk443-M}S}Exls0*FUY*;JYcG zJG*UR>cv2Ky6jo4$ti>5C+L#uAd{nLW$c53t?KCLSdhDhS85x4rjSoEv$8s!3tw1l zm9%LKgau{|$Rv_LDd^t)2M=yMe8?;}`eAc_OTM^>L0(7G%VF3@4k3m{(M&dZ=eKrd zqW%;)j6??^IS>H#E_6W_#@nlRs05ZGV&#rMW>(H0`~@DTMAXZgh?_Y4U18^puA{oZ z^m7x_72ON@<8*ZEecpGL!l|~RK7x&x0t5M+QkbRA6egCWLm>f3{*57UHl$|jvKlE*-3EoW3km>7OvevQbe@TN!6B{{C<`Y znk~XQK8;2m3}_c3We}|dV!_apeAk)I+oD$wk6vvaa(=4dxfMxK5s2+{+%XpP4rgX( z0bzQ2eiNeV%kvzOKoS9X%vZG1PejSFL!~$jqRi{RUDoAaAa)Q^&kk6wZgFpBVR7o^ z*y9hijVVIPhB2y-yoTs{fByU-G^@n(0A>#D{zqvb?|bIVnGE#E$Cd(_?3=r!8Of?b z#5(_4=X0S<5BG2T{Jrqezf4G|FWtcV^4(bslgU0q+5I~KMXJMwng{kuetsID&`CaH zXeY$_23ce5)#zqwDmZ^`V<6~~t_otA!n1q#r}3NU&V9`^Jr1uf7c@I1J-w|LFJ5Hg z;`+ya{lw9uc^6yHk6s;@3jry~zWj9+2xkQXhOidgrAKIMkn_0|?V2p-@Bd6_Yscx< zt{vs`(ih%x$}~OF^Mu9lIfzRC>dq}v=YwZ$yY|jTcJ#$WnT(cmhE(_%ek52 zqtH{3LlImcpnkBX3;6rCv>4#{clrAr1^&aOQ7~B-2G>CIs(ao!)i3$f`hTQykaUSW zT#6NfWKvG(AYfW2=I0bquK*2hV?^%a%t$Ajv@H*^(&$%JZbgl>XB{@0-(dk`CB?_0 zp8p#3EZf4?qsNaQhE@6VWQ_m{RbzYxI3~82;A-@y_Q4cF zOra1l72W{q78Y5|ve-VLx^sUVHTO7kO3?ypiCq51ir0yW0@o(Kx~}J#T1Sp>?W|#e zV;Q|@5rvzZn{U^yZnzQO11bb!Y>_5LfGB^EWuu-3gf>co?BY&KmgcS&0oS|YQspbr z54?@(Qx1&s(!SCjFbxs^;li3eDx$UtE~vhI>)&D(^CrSV7!MBLb6DIggj&(3)vOXa z>|Kzsi(Mb?);VoM`X}raG4gp{{J%98WCHgi*0^BIX^NtT^WU~&p$G|Gf0*=m4;o;4wcWL%$A7xf;7_LNz}^`gx^#Fit3#^bl0FS z;=m#7rue?qK9$*w4H~0nhFnz%zPpi|djkeZIlKbF1o=-sMIonwPTtZqeey$PWh{*R zQF5>d@>NIdr-%K0g8J<8;;^>{uq*O8lKlC>pRX|k7o+a65@R1ti>#Wo?4($HK)SKU z9+KR`LHCCtD7cj~WDEF1?^bbj%`=Zx?3T?GHfbwzbHz;L2!e_TgpfZ;;X)L{?u8kP zW5sU-{1Y{bX_B>*{#tOfSW-P3>$LnEz+~WB*RNXSP2k}cW$Q* zTqDjPGE<0=yZSMdf39BXFINRwTOApX>Zh16rdB{ zpN!_AI{^Wtwp_?raGW-}*mCTwSGQod@sy{Hb&7$gY)735U-C zGsfSYo=v~$)nO5#P>FnDBfW+fx4Fg!H(VSPJ);ZB4JvvJJgw+I_PN#4g#34bY?#91 z<>l2~yLN5!VGIe_1n^CG2k@!oYAxO1p?heHRx^GvO%3c5$>b{Wi$Q{uwFy}1|I+cc z-4UbFeRRCFg)J|S*&y`g8CvR~%7Rww+I0*oUEDOCoE3eK#^lxaJ|^lH)i++1H(S2e zNh^?;cTcZDWbn`_CG~AxbM5l!?5+oVYM8&8jPG$+P5M(v!B&vNF=xmH^*(>_ceBnv zLlo)kD-G*#!Qs8nV2=P?Big%8=B2eTR-^R59d!%fDi(8_bQ?CHM&W$JU04n}-C>`f z<{AvBPJn!|`?S*eL(daF|DODH4dso%utXf&B*l*nM*4P;$I}Y`DWMI!7wy}sFTHMD zSSX^dqrx$~$Z zRtNYABxW=x?wPWqC-DLOgi-W>I#SY0lyE(e;fXqrnK-bG+7qgyedhx^zkEL+2DJ_B zAv~#uL(=jPgeMJ*+o#a*#1+5kg7}D0zYs{0Ms^~Vc2VqT)PGGkK3FvNStwB}Wy=~~ zmcZoXi)4ruS8yT%wDBH>0EH(|1W!G5*1>OVo zhG0hLIheH`>!s_vs%UB9DhwNKW^!06$K{A2KrJ*)I=ovN7IYfY;~*Un-7GWGE1f}C zP(E_^1Ai>$|0a;H*Zr{RZM~y^gfg*SOY5pw{GL@AR6dPIe0x9Wh#$SamDoT0?RK=m zxp*o}y@CxSgHSX=gYd`%WuoT8Ttj%~)U;GUjKm|X7$C@MvbN{h_06GDgroZ`=S2PebZuo1NuO3^TK z-oeZ%f%2u0VIli{o^Mp~zt5-ky2+A}JiNrZDrl3P9eZ#iX7DYLb^rSL`PHB^u#;{T zv7zC_C4UP|9dbT^Qv|^dokY^RTM=)gyyh%$r9+wH${I&7`7}c0U3e&ooQe$ldp7@m zqS1m_C|_B7JGWdd#?lsch|^1j9yMAp*dc?^~#vfLUT7C3SKzYgk| zoi8v6i;Q(Uw?PSGmw3Vr22$V-(ER~r)Xa>Zv`3@*2=603R;Uyxii+4b(G&yIYJ;Pp zeym2WR5%rA?G;-7AYi_)&tpvCKPtZk$_fG<4JQ4PT6UB5(8`hU&k?O+pVePW$;hu5 z6ANS$TZLKI>s7tJZ{K?7FQ$DABO~BsR;p;UB=;LNPoS6x=0ij=4k0KjE89vQD6(R# z^SkG-Rxg2J0ved?k>MlaVPv2u?bE4$tpVU>FEHT_J#ZJB35o*ED{Ud4<<<@;n)Ck0 z^pIc@wNtnH1e8@0l7=pY;UjbVt`BR`R3)UQ9|Q1vHURvU0d(9(`^`wQ@SPne<}u{O zWgGDoF0d1=i-m=2xaA$f!hvIl1YxmK#vE~uUg}AkV~1!3H7GIYm6373Ha!Mn>ET`G z(tR`v!-nDOBTxsBFHB%t7@3}~#6U|K+u`#a%b$Dy76b#GTrBmWvXvFxvUyVTO~Lp{ zkfA1rVqjD>;|DU=ovm2nLCC&?Pv$FDK);~xR=foX4_FA&XLQkzeJ*h9N%W~uzS=ec z=4+aqNZ$iLtd2%W+r6U~Et&b2@aa=(qubfhxMQ1rC~b!S`|8m5LMM!ypq-XL4sjls zIv(#cUAI-rdhp4lw8QT}^Q0}6cJM!x!uG@fw@L-umnivwFrjnr(9hQX{00YV1_Kox z0|WGA4q4iDghyd{!2$CU9g~g5m5^0z{*3WMp~8~JU{>*5bsC*7#oOB(f|${?taUC2 zLIlM*iqHLw*vbQ5{x4E6-v+CstHXXW9Ngnv%GNFT?n@00Cm#3!4X3b=->_by1rNF* zjT+L$0Uv#i$9*87L$OhXG3c77XBmt!`}Xap z5%Z*Akd$I={cjJ$A?e^7fO}BwZQR|$<1M1p*MW&%J~y%M*a}5>w(6e!cD2xNWJK>A zaq`1(+A_pRfXU}f%c(aTcH}EW^*#A?$$nh!R2BVNUZdN1a7b_O%~d`iH=%r=45O;z zcB=U{S(Xg)7h}5ea@}((=YK7CG5k&dDrqo~e`27VTqryn_3$A4a>(he#Ch9{lVRAFy|6Cv z2o>Fmp%Xu0*7my}Hin7a3{2R)1eH4p$cAY_W4#U4_iMHc|< z&~561H>(s6SUFwjY~}c`h4}RX#c&J>mj~b!Z?T?cX{>kJb~0f+lc%!RnV6l>O;xnD z-HYQ`#e8jV1y9u&OXF(WrtWkXqfwKcwGB?&KxAhArljvR|HApW#!POcbTwLMy^ATl zAU}

pe|HZ&XT|RHdKq5S0*E{(rhNu+qTKD_^uXW$! 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%0A3VV#v8lUlh>p{>>YAaR`g$f8va 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%0DV_0({htjCD}u`RB0 z!;-E60ZE_DKbSZLsdpKdXn~A^BAq;4P{&9!h@sGXO##;U9Ix;C(M^55+O#`4z&1d5 zakIu;1$+oIuiT!2pLLKPkbfP|2dOG2i33ZXd){Izg!-^$zm0TjW)?3O7eR0_1s#0z ztbWW9LWA92gNMx@t_tO<2z?Q9%yAhughK5Gx*fPgKJ>0EDP0E}O-9lH-i?B;4Qd?4 zJ?^JL!Qn~+Pb<5eLiFyW+}g-){;y5+8d=&$FkULJ+(JOfSR>zty1>SvRS* zc;_H?E0B_ciFr>l))O**H-o^9;>PwTpqC`|i}BLA=bwN|`P*pMk4=TZh&0Gkn9T7{ zc980Ba(0CHCWCPfT9uEpWwZMa>FNeI4OD>@Cz*GgaXo!;Cbc`VN+uFaruhE}XMp=6 zvU}{AofirF-3xuz#Z7f3K7@( zyUILAPgAqbQ^(`vT|N5fLcZu4H{kZr5xz3qzs;T0++*ZLRlsRL-gWNog&-p-+03A% zw#rSwbqfJcwYrKrl(osSj=X5t>kq(>^F=a;>qR@LU61CYSrs3<9$2j-5Shlrj0tPaxqfv3_=?jsGGK#q^2Z9_Z%K)$u%?OSjYA27SZ z%-9TcO*||1ENTL|`30H47$VVnV8BvQ2ZsPB**)kqF*3n6sB`0zAZ9**q#}*>SS|!1 z2&!qS{y8|{AdGkefhqc<+_hqn{Sa9FMC9(tr_i)+#du)l`3xD&&F61LctASgP-p}Q z_BO{G)FqU8!3Z8%RVaGUu_eq7n3BFPbkjKQkuJU85V#6i*zx-D#ORGdX6q7wT(2L@ zy(IJ|tlsG6cbtw;gOg%dJc?t=Ai2{32B^Qbi@M%QT&TaGk7Tr^LAlru+Z%eM+`K<` z4$%vqFxBv8$2>#Ml*b;Yd(ESxm30gXU`5XbCV?||%T~lfZml5?I3%ZnqxCAlJqe

yJn_@gm(H)^hI0?Uwm4=u;T}$ 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 diff --git a/docs/_static/esp32-c3-devkitm-1-v1-annotated-photo.png b/docs/_static/esp32-c3-devkitm-1-v1-annotated-photo.png deleted file mode 100644 index 1f8b081d5e005c018e46281c6b726084b5c5fd82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 349164 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


~>z)4tP0og$Jk%iv_Y(C!?%x8IJOL&ME*6v! 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 diff --git a/docs/_static/esp32-c3-devkitm-1-v1-block-diagram.png b/docs/_static/esp32-c3-devkitm-1-v1-block-diagram.png deleted file mode 100644 index 29c14e0a0b022a0734fa9b75c218286618d4348c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76929 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 Im$00F0BWA4>;M1& diff --git a/docs/_static/esp32-c3-devkitm-1-v1-isometric.png b/docs/_static/esp32-c3-devkitm-1-v1-isometric.png deleted file mode 100644 index 69667b511fd5cae29abff1864c4ba5eef298042d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 236210 zcmeFZRal!}@GXp&;_mJ)1qu|01a}B-#ia#W+#P}!iWhee6n7}n;$8|AcXx;6P=5b& zzVG(jpC=c|yCeJA^Uj`GGi&Wcs;kOjqLHD&!NFlF$OAOt;1Frx;NVwLQJzPPU%kG1 zenPU5Qjvm#tBps0e2@HmO=BUisR9S*%>)M*7zzh>|2!193kT=M0|&Qn1_$>p4Gxaj zIkQzm^!W`Gb0s+d9PHmCx1;3i^T=ywd3_f+IK1a?<1xV#S4BS083?BUkka;CIDGPG zwwecJM|W9_w73i1Wey4NlppV_S2;E?B!x*Lh49X8o0wAYi2fl7;hBUd=itF(3B*Ao zLHZL2(1v5rov9itD{m`r{XDj|>2kg7Fe-dZ?E(r4SX)4u{M1?H-3nUEY|y%S{7tfQ z6PcbcX!#~xnd$5E(>U_Iuc_qA%YP$YcVCd@|G%rTUkD8UKK1fpQ5#G6#Q%L^na%ed z?*Cl887I{b{6D{$z7xYC`M)PfA90Z-qWPcM(v`P`>CwOZH}&(_MP|bPo9@}b|F_26 z-U5rR5P$h+|B>P3f5sjee!b_~_B01EHT@Xw)5-ncJxry4xh<*4*2Sq16aBk9Y}kFk zeV9krO~DR#<_ZAnVfLRF2t)5W1D|ip-C}Wh`TAzr^x_IE2>bCcBwhl#fOnzui~H&H z#t+t|_ucdCb$9lO!^pq8y}cEjwgo%3ev_WcwdB~;;RNgPS$Q}%^`Beo9d~54uvJhe z-*s?bKL6e1yZz7!^9eBP+1(ZXj{4#_+rqT}T;U?o%F)q(*TwWUI^gtx`kothe0b*) zEseU2BuZ6pQ`NI}=j64x2)%viyz%k3^)%ZZy723Gaj13*XNjk2i6>uEndfErs_^oq zr==NPi@=U<0xk<+Tl5m{XZu^oAX4KPT%c6U)E7t4offlN74x6qkBg0Be{A`;b50z_ zUzSp&di~FXQwczzJ9J{M58f*fzf(%=<(p)|vGF9tWKtYl_&!t=a|A$odd3l~L*lXb z#2y<<*>9&QU~&AaVG)1)#=?_}mroazEC)b4@safHgs}eGJlr2&b_zFXYlq`OcaIFj zcf4)oqPigB+UdYmdN>dvLZ3!a@{C12LoOeu{nyOpWw%_wfnXP8{t`c6=i|yF`;oiP z{hdEYz&8M&t`4YR@#xyP-Sg9h)+?;`g`wT!d6x%fB2E+6@_GAlJ0iM&rnxhu^ZDl$ zO2I96cX`~tXV9((hpu}E*xvaTA9@9v6RKX{$o`%jGK*fwcLeTmemXid&H3)&u&++A zwIc0xRpO6!ObYkYpra}W<(xO22yV>*YRZLwyj+?h8y6$_ZAD1!7e~V=UU&2}EZ%cgd z=kPX(XK}eRX8h-N`Q~Y#+kah6;?CHmj!z~TNQ;1%7bV0jq|yFXL#w}j^Ry#^Q zD5D@s-p28}+u`n+kH?2aceBZSV2KIcE9dmgbp2BwYFGg^Y$C#c%ha^Z+h0mBsgqo# z|1}&4Lr5diY71i2(!RP`hJW*6x%I9#At6DDE^)5*Uue7#c!`4-`Gt!|jaZcL+IJ+L z9>@K5gCeMW-AW9v-%GO8lHf+>Dz0S+fkr}2xXno>=`@gKaCb^?>ZVT6RhgKW7noIZ z{I04g7jNR?;xcg)PJJboySS{kxlCF*x5cQTR~}D;)V_zX%&c^>M4Gf94=e$Cln@eL zdzVfjkF%koTEw4mf9qU+j>*YJ$Z^@=z65s&;Y-LMro6bgK+Nen>2!Js%YlX6P``7v z)Y8{ciNw&Q~n>NL+zYTbW<)#ULdWttH5kvxS( z6VLgrhEU&)2Rxp|!#2tW2j5rZ@5WxSLWBs_Bj|*#02FMc{68C*M0kF0eSf_`PsE2E$ z9mfy}uhMw3XWr?@5#jRk2wWDjA1Mvw%^Pt`97fGx_qLvaD{^PH<6+as^C^d~(}wPc zf7}C1+no0A`~&|P+3VAPM()u{0UgZK%U!o`5C`n(QZ=8jJEdiOI}${YiVegeP!BS2 zB?<1QGA9hq({Q#H1iqpJ5Naa&vykeR}%0{@px#d4Ba%B3h*OcfTP9 zJz^e9y@^)rxu+aPHGyFT=%nP7344(h(22p23N=&FF1y8)kJ#5YSO4S2U2p$$WBx2h zkJZVJSDkyQ61NFARKAb3M@xmXzJe~|PDkug(VS-d32|V=-1rIQY zA^|b9k!rzOGPoRpk+?ysVIpq(efeym#*2*~ylQ6cV=oZ!X{`t|tq&~u%>ap z@B}W}(=@FcjUr^X+S|noFk9(tP^13a_31hCnjZN?3J%!(0}oCS|1AuQZ(2zg0=b)T zfzOGC=Z3pAyW%6^82Gi1JDkNcH1ahD0)0v;-@JvE|Cb0g}IT zVvn&RBu#3_0~9ps$-cT#A`$khv-%{9_#RH6t?aKfTlI#&`W8EIA%^@Vz2z=J%@2yc z@-TMOxg(Jy=Jx@puU|k+#|yBw-fn*DpIm-Oql$w&)tDiJAzI@<%C>xaFIZ!KXI5z-!c%W)^8ZD~WIPmzm;vdj9o9&gI6Y>w>w*Pto z&+WOT<{vWOxj}#Dz=}+vv*V99YVB73?$$JYc=4+aC&B4-1T0*n6~La*eAVXfdP)%n zfk+q$1a<60IJj(@#UMPk;EHaBVz7aRGBQYg(o()jl9nxR`XU0G(s*f(O0UIk`uFUK0zB)r^F3o|MrTU6F+-0>-iqIKVQ0LG6 z!$b4c@2tblC#)1M{czI5fNMA(Y|-A^KDX9c3airH18RgMRh#U=z1PBi>t9v^PA3-j zz8iQCHy)XOd`spse)I4G9=WOhOYtPF9p7Q;Ht`*I5}g}M)bkIwy6)lM7k|Xy^aN`# zZ!uX2!`CwmFtF5g$7V#aph%(8X>0Vbit{Jx@v5m&DCCo*;TGT!=CiQ?lH?ge$-Da1 zON1mb_C`nVWFoSSSM0Gl=IcK_g#a~1#8bz$K>h18cjzL^XPq~&eH)20IVbiK=2x|B zq`F`smH2e&JtwSHvTVl~y}agp1u)@}_;`L1dh^4vSfzejb^9XmXnLrjdQ}E2&3w~kVI`48i5~k^nyY=ohnQ!6Y zvT}lzh7al*w|6`1k^3oDJ}W^o5ZKMheLps}?`hCd9>=0}*<9ZpLPZvrMhsLoq^Hy0 zdS@GKRfuEyU=^CzBi{Hyf1LfKHFb+!hiAfm+P;y5l+tQ%z28X82MntC?L1rsp+(sk zO8%spDWrI_0F0v+ADTVj)9f!7a=-jFCR=bM=(Kzb&>+wceOY{f;>+T_`Y}4hguM?OK_Uc8}*s1B?n_m)-@m;6Y9yubnBZ|>hG9a*ZUz*M+8*i&MQnY7Mlq4v* zwCIwZ*P^g%Fsg|DZ>zZRA?7;v-g)rf z(3QCR+4aykUls{(Q-(UhAxS_%1((1UiHZxLSWoJ-{)U6FiW^xPC_~G_##LnwEU>|K z!Tk!(pcQv6=*D@S7W9rWgAp72S_2~%ml=MND*xFhijX;H!DMd)MW%&3Pk&Xh>sD6l zRO>;LZmJ&|{If?UBFpv|yPo6%9-YKb*KS}32dS!Y1~IDIykUB;(0;aFbvR3}NQTrF z6<}aq1)+A_d71M>gSzn?oc)N6A@@3h6i%*2lh|9Qu>aJcbz*1`8~^5>tM zLwIW@$i%mtt-gc}BdV^re#>*>Ptr95LA`QL7gfcJHI7GLV>zT>04+@VKbOce)H#xo zQ|mah2{>M&_Pp&GKgs46`RFw0`W_|iw>csmukc%=Ab3W_K6MobZNZ^IbkIl)iz0u2 zelQ{kOr*|TTKHC4137evZc>=PMX_`yQJzpA(dFm3K9!puB}khglW$gBn90?n zQENVEzI^KDwCV=&M;Gzty`aEs7wa97-kdhr6A4qLo7kz>o1y$jLDOFjbNR~3i1yaKZp z-oBZ|E-_f~wXSF8DEEe*Atp{Kj!jCCY2={!JyKN)A0nQ6azCRE*VyTjaonLmRJUl~ zCl3r~yb6j?zi$ml&{t%aG`y-<5jQBiwVe_coayi0o7-UPf#1lbwO8Y05bK>5CW8I=SU zyYk>*mSj};h_ZE++BBVdaNr>3fmc+AwB{lhl?a1)DwIJHyCSJj31H1!ybys!-Rkks z_%VW*OV3#vhC*lAI8A#07!vQdGv0YY?7wvx^z-+a`wqD(r;6K1sd=}#Tiu)t5Et~j zYUNjU+p*OObmP$H5uPhkWGEjf^Y_z(BZur*j>zcc3=*OYA_oPzmFtI?y*saBo1Hz` z0%_+3GxN_;ddWsDt_d3@V=iltjNTno8VJ1a*g{#dak`P}d3@_|hQ5E=?Vc1N<~IKP z@oFgfq2tE1&QAUR?@IXPB+-03Tu09!?P;4Ey7v>dy0~3jjiIo`F#AEMhJQ~z$TorP zw@Z9IYuLa-(|hLh`AvhqR7!g!Vv z9V4e(|9vX~?kms2YrVn~Tv{RRDS)J=5kxswtua1J^lFH5u}MPU%^P1?&<1Sm!qWN; zuW-j^0rf*KHLM%*IHaa*B-E0t1=N+70xQPYg>gg{T-qSz;q_+LSe}`ua2by6be^v4 z-54KtUJ)HPUvbIG$&!$g_X31`wh647dUt+#QcnElEf^FEq9@Ul?4wSL=SWdClV;kz~!Lkgwlc=Cv+xk-Ju!|pmh6vlQubkF? z6b)AzyctTFCAY)Ao<4NY5*qirkr<sb@`?ucSkBC2zp{H$Kk<&^Z$ z=}XP$g0F2AS+0cJw+%+3h*CHo0J9W?V7{$1?kRU8*Q;|E2;;t;((NLHsG78$)33l} zBs}MgA-8}!mh7)->o2JGbnstG__6AZ#0n`i8X|t5)pZSxe{8F>iQ}Mk_p6b&KP;tr z+dR)x3g3gvKGpog;oeRmA8Et7pe6D>F9Uun8;C#|0S(|Lk6I?APDzHiUbOsI(>z&} zsRyBSEfbGZ9YreBJh>MhDoYF|1|L(>9GQNwnpr%yXq6 z-UONu01c6Foy+op*3W;i{;$8%9-KUA33ccBQkI?`*7bCz2HSjCfmKs~YxXp!&HF6R zDL%rZkq`I+CI%<3_2Fv($R*i`UF}ZQA0#<|J5e}5o|7IzR^0May-G*2*`Uo=3H&1R zbA-4cZ#p~qba;jNftl=WhAPBP~gPixO}`+FbWW ze%)Q9x}Pk#4Ts2tgy@zvbwef6Ph3&DPP+?Mu1}WFE>1+QFZsSPTxaCtMiY)XbSxv6 z!xzvQgq2RQMDc&cm2u9MwK8VnGFkP86b4w*5+yTZQEaYXRk-?4mLH2kx^|N54GLn^ zl=0R@K~1Um>NrvPQqvFocev__xA>sGn5fO0m#x(Pkb;sKK9mbgh-LeNG{`CG&vPqY{a;Z>Xj9U_Q z7s*PMecX~L4TR2PqECP2j|DJd?H2M#u=>++1l$58&wT+E>b^^!X}=pr49}%WJh=xS zxuom0uZej%*2j#6ns%qI&I~g;s zDBZ1MGsW?cT!kkyLGvhNX%MbOAqIT3S+bcFOIuL-nL=^Nw%2vHRJF12@Z6F=y8{tt zfi1s~$I%<(ie`uLkCg`BqlPy&Mn=Xp4U`$9>9mQ|-5SOVufL&|>SY8r6IDs;b=ip> z%vBabmekso%=gxj}4u^8aA#hz|K}4dUY}5FsMyhT?YqWfZO(#%1iQf zP;9C+c!xF6S?X)W|thV*)(YTBugdpe@4pXw@%xra&?G{H9U8@+m4+Y7Qezx zj+nOlejN1?zcgLGs)b#fcKU4J7p)B`)2#QM=BKgpq6*0|N_Kp`Kd8+Dmy;lv-#-?Q_ZV60n*jc<{cs@RloTO_MzTjFWOMOe??|3 zPPxnIC9X`U;q2zB9b;x4s(0hpmt?Yqqm3YrrYh+ykE4uCygvw6nBn}2jF6e(Bsl0R zfzOsEkQ%QC;H;{lgd8z;$3Rxj-vh>rMhE7X7EMu?S+>N)p`+GO8>_hR1 zDNT%)-el|ingCa{sV2>M(8;nXCmA%p)((uyZ;%p|2N;DU0EfR^vtWx|^FL7efkEiR zyp6WPT{n9YHhX_)LS!rsm)cT=L{fEzjf^kT%zM=dN}_JErNvk{D9PWCe{9pQ@kNe> zzU`HHBKa|L$Zt`A4yMf?n>92MqYa5GZ<;p-IR?0pe*7sqKGy{2Fi@f7`0t z5zd~<^=tK)yu<8%gVWx~Xj_O}9CU9S`a=XZ8d>m=8u9&u-l5VKIAf|qnJw|J0v!@T zq=9MM><!{Dy~t%DnDNx8WBnh`kD6Tv3)MO|H^18xrbjkdf6Pah5Z{Df8{>&<%o7C87z?YFI_0~>m^d;<-5?k--(&p`}fp-^t7(EnhQ%u94| z0>o@{8?}Ew4(U33fUUXYJWV_8kH%t~VU@iDPjBwgsG-VHUHaN;R! zpJ#&x!PW2-3PQ+gF~RcR>nl(~1MyKAzP92^Y868CC9}S}kD@I@xdXm@G;Dgt&t7yx ze@80&*c!>Iw&!w0d@f^W|6UbOOILi4ATUN_*PN+}*8{tPJr%4yYQehLWThDS!cpoX z(?!zlc!-`SS{%ILZNg8HwgM^wpW8X!RZcF!1r1KsH+vzWE8g3BAssbg}au)I84G-f^UrSxmmj_>FI zMcj9Mpij22$u$dQsN2>dAOM55N=gAlecn>bft>uFmbAA;f0_978OBeH2jf_D16XCSD+?($^zeK|Ilr!iZ+)%4^6}APYjgmL9#J`#39F+Jb8u& z;wkkjNb&S4f6`g?wY;ekxgDf_P|&F|>b*m^*&T7)b>Ar+`n7o(8iNtrj7k2Ma8$<- zi&A`K*HWGQ9k5V9T0azW6F z!wIBW<8bJD5(Py5m@0g1wc`?;L0E>Xz=;MRyM?H)@>_9d72Qk>20jd3_(x4&6?O^Ur zqZvG6$kQb@WpMa5RsO>XNF+jqhiwX*8Ol~P|UFL zgWm^N&rL-l+7~m^yfFG*(aPf^oVOinzQ?atZYoZo@f$XAoLH2cQ|s|~j9~||8j9Vg zmz8t~$-k`vH4ap<;UmFHXU)l|czK`UD-{zOy$jk9D}yy-^&lwe*Ugh^)fyA4n)OcF zbY<=1EIiSA{4+j0J%G)1xC+Rkkp_>W{ zcdeI0RJloXR{~_U90zZ27%J6!6#9hwy}l^YC`R$>M9_q$ku3uq3uCU*4pg;9Rn0ma z_X%jlxXq&kr(A3Yl{Sp=tblo!KSY7Ub-weOI$Xv>r@N?relnL=4W~f->6s?HAxUsT zOFGtb$KGqbOwQ{x??Kq-?oG#+7$`3w7&!p?w+LBIHM7}grY*kOCCDMKh;V<4i_M=d7;EQeSgNoe z6d~)53-4p|_iSp_dWEht7W8kIG<$r1KK5}d5T0HN~xSZeG# zSLQky6f+Y1g~^qYY}?Zd_4#yZBnF;utBiWo9{b|IKcp-QyX<4&PtSdoqi;pvFN3biRH|lr6`>JkV|)2o~T;V8>wY;_cyik7k#|g*j?SuuDg;s zjyDLYL_Q`>c0@5B1fAMaiv9^PUit2_GxqTCaL=4`a^v%_s|CIO&(>=HBuv<1ZmS0Y z_cj50AraaBWubur)ZuPVE~ zB2U2^MjClCcba|H%vT8v&dO7l^u>Eo_%e(Qp(39Iqp`DuGS!Mb&{Hsu3-=V?%^P;S zV*M``8gpY2{J@1T~a2oG9U z=N(ELxnafq1Ev!M$~!q`1EW)GEFRpYF+}SEBtXf<)VzH&fmG5_e+lCm+T@}RkPE*s zZ1NX{>Kp4H105)}1k074?rj-xrYhyM9NH@IdySSPrksCF5e`4sc}tmHzUlNOab{Ci zox0}b?Q63TYfDSoR4$YEmLGWO3wrs} zj=LR}Z_084PLMNOm29{x+eQ8DHpVF1sCFH0RK!+J9{&0E5*k)T+;@Tz$ z2KDHA@RRU(T2HXbivoV3qWx{BjHl7UJNo6@1(Ncq<{E9)4dB(}dw!fNfD0>%5*#jo zHcegOd+Mu>PvR=f9|iJk`B`Mb!oYT61cA}o0A&YAc%64_nd*WjElNT8RNi74UPzD& ztCS+e7bIB%86yD06WDF0T0i3g3D@9>vvcdC)0*kC!YqF}Yo~9rK%T>{X%P_3ir4(M z96c%>SEjX??a!!G!VMNgxhv zo*$FEI+c2ZtKA3#5Ea}ZVOb&!UUA`{zWVQRqXyuPbR_WkE<|rPwH~3=Pp_G?#iX4& z(RmB;exXik(lYR>7|yit7oEj5u5)H z?)xU@hE2&IyQGwbS9a#L6rD8}&y}qczv-2& zsjcBm5f?O5g64d99l_dYT+DXQRuHipru1wcF(R^J*rcszQvJO)KV{au@L0BZ|9Nu7 z9W!jVtxP&X;{L0e28c4V7%Q>VE?KdxyNJXrS#rzQ0KLMGyN9mRL_vm5Iw89>?M)Q$ z(7M3ecrT8XpA7lt(2Ee_c~!A{a$@tr7AbQ_(IfnVPmC)iVT$uXu;AbNf&MHR5kO67k^yMD;P85*U1Z;Ph+3L}jqpAinEKe=LGW4D1~QoBRd=(x;v z@Y~oiV4W}Lb^sfC59vR7U|zW?c*c^Mj6VN}t8K=xw53+o7`6JI8Q8-D&ME9!4F(QW1VC{nUSeX{8IWb=x`!k_(fiwJ|)9FqF%YDDIuwo z0U3;2q`0S~m_bI9)S$931eVXRH(PbOC4(!ZlNWOX2g@UZ^2&$dfpkQaIGT33ErstH z7~Y5Ca;|4VMmJOu3w;cf)CUoS zF%L-29=taXEq}XGA*DQx<`(6VP2$6!@zFdG7)@N~_+;>`4)Yp+SRQ7E9*%>zovmG~ z5a_0Oz)?s&=`;&{Wtw5~>c~p*lXKHw!|Xi#A|kYus&X@i%33b3Cr;xUnGu+%kt@z z!2fSsBt`8rP(sz?=W8|73usJKQ3U>ix4>SBqx zOZR$rLHUpC;B0GjdAwCn%@NP}-kJFx)SW-UA5X9HP5YqveUM(0zh|;{)K?~ER$gTu zQN2omzp-}7%)d$qSUBORVUZ^X$5b=&^vRc-F^~`K@M_WNkq{mKcc($u=>IiWOvzvRR)SyB=kF3E?nhFglWqQch+Up{ zBa>UT`5Lm|TE(+g+jk$(6d-Sk?f( z;MdQ*$uE_H7FKaZW4g4dx^@yWN%?+eJyHyC` zjvzsRY;^o8u{(79hC^Z=D}(W!Pd`b?D7H`6o<>H-rnu0IdN+&^OB%{#5?MzmAij+{(Z^rn-uSv&q?R#4eEjx9y6y^|vPu%#g^sCe(eIZg zdIiOlh~jGPw$OAq3{)$e0-*^g2fr)d_YYm&%0|1_F*Y6j(V_6WKEr&LWa&45T&%+8 zCm+4rd60P#WOfO^DA_h|nm_yX%lSWeK#!cBw~+*Yz|r3{Z$E|D z`XA}P^QCD7%zPNNd9OTYB6aDa&~sDrKRNYnmn-?>uHa~6?r35_W-6rEg7GWn3K5D( z?8PY^70d_pCHv>T2Flk+QqDxLcKb$ECllWv28`b` z%j8L~E(GMD8?&t!qeTUgP7gEf>GPw5*}@3YdMd>Hgi@^v zJk`;G?K{wtem5rSw7fTnFI6+aChV0qn9Tp|#-@YzD@w9b#vHewwh$TeZb-LcW|I@A zYHa2E{oFo?gF9R?_Y0dq7P;MikcJSlv;ls_OY_5n`h^R5M15J#ul^hf*4H*K}8(&z=CwTQf0eFgF<)d z2)R;e$=T@xHqW=4KY1IOA_1g)@%Tmg0LI@-jFOclbZ+;cnzUl^hW8R^ z+C@cllJX|sNbK{TH!LUFQLw7h+w}Pko<>VTkHZ%7k8!8O*kU8PUH8O&k#!2%&-$FT z`~r-!P|Z`jr6CM~-fwuwQ;=f9H!J))5Tjq)nB>or@**eCv~6eV&RNUJA65j*d?JFw z=`PIrJgtGq=qbOFD^jD>p6-}E1itw-+Vu{UMCI>_ujG7t0k>EG7)meF=_B_=pB(@D z28o+EkEi|RlI+$BK8d*!qC{>Pj-{6BFgOG$#N?v3ojpstP!`sK29p*%+DPOu9L$z< zO!Reo{1%<&g;bn_UI!~hSA=yi(d(;y&HA)rF6lRI(Q13341+O5MRhq+dW~ewMCQUu zW=fN3x4Z^BG0#fqLb5_eIG{>I#B6J*|M3(XhHmn(KlgdH8~!=wsugV6wxZzWeotfK zQ$1TKG<0W`0fLa}q^F7hP8f9R=Ps`)cMCHxOq$nLs{B#EO#&A+yk8Vf#n?pQ{gnPvY-O9~ax zEG=HLPSsNuU?hG?AW+aTU z&2@i^1y?asI!T?p!f9rE_SF%aIhTqNLV|k#W|_K7gR+AzQvU3LtY(n_lahle8KHUZ zo|uS7)dq9G`p@}hcluY@RGUM|>_Tq!iy!M9X-u2^5vS|4LWfE#=~Cd);pbfUc7_sl z>LTy8hf0{_>8olK*7B4|n^PXw?LfmK&#LOyV0E27Z#06T?!yrdluDDjlu<*$i@vY% ze0+QfXjsDpRv!etwQDSY#N%FFX%9|qhN1S9{90m3_-?WjRrq}XCvP7aK-npObhY(Y zhe#y``vO^PF71)2db*qh>#C^4oHO-Q46CO? zpR|k9UK1szlRG9+rAQXi0{1b>#0bLT`MpD>S!~&>|?OPwTf)LJC7S6t8yz) zh+WgY=VMvN$cV}`2igoVAUXykzIG=W(&sZixxqYb*)K8#*QqXz9fg2`^3aou!8k_9 z+Q5#K>5|kTIeDqwfhSPFfa4Q{<1O@&!6pVc!*~MF@XYjtdN}pSWcO>XF(K9oZLHE0P{*j6^@*TvEa%h%w7f+MlnIEpFt@UrszGfI+1dpJ9 zEc%Yxo0W7`b3WAYf(a&j-YTOtaL<|%B44~BUoz!@rNm0}Cq{_())I$dXNG%Qd}k05 zJtE?*tW@1npUBTsNou9k%3KbmA$43CppAd{#!u{8j}wa#Rk_Hea<9{gI*^_<0dDbsNX$f58?>dCBi6OGbmD)~CUH@w=KphMsfUj@OY&-@GvuXM-P;^;=E%~JLW5? zWW=_duX^+o|L`cqZc9z|q3k2N%i{;V3ukqUK~kvDDU>&j$gR$YboF@nKL}pDk$ZEM%7ri$?D}!u`fYdp6V#nNucgeRwM})J|4Be*W1F zo^NpYeSEQ;`iz>{|Dk5s!3!Et-gR%QLVP}!wJ-5_IPP~k_>-!oWP0z)ZV5~YzyCub z)(!A+!SV+!_#Nt=N57fEmp<23SJVVFZadE5*#qF1eN&Ut=nl~oF#*OIE2ok)9;JK1 zt^v(#AZjvlzS3DO9ew{YNGaJ4uUm!LG+ndb}?gSaRIJ3!9WU#~3fxBLvHRf|fuo&Lvy#2w;E8epNX^+m!gXc1C zldqeE<1KdtLdtht*}XyW-w)NplaOYe6$@-9j*b?a}}Dcsm~0T zQq11C;u59a%NcMm4cJk~$a4 z${3nNq;IxwS}N8?Cs_E=<)jcRrW{fRG|E>A% z%O*%R;?FQ@_l*2nqIQu!?wg_(a6c{jbSaKgbc$)-1i*Mk7cF=5zo%bix7f_?&;Cs1 zHgq2m)_ro5p#Rr4@H+n2JN9~Qk*2Jy%z0lG|17W*f9#2W{Kl?Z%@G4~#g!rBZP2nP zbs;eMBx?YxeaBjM3Wz4*Wn|G;{I1EXEE8okOAybVi1pigkovPsd!Js3+H4my4sUJJ zCP6H@z_LLqa=FrEO=sM>n1B|i=j)gYAsO`gCUDPFBYjmfReJFu0!mtno{i!C4~ zpQU-@_s7R?Ik%slJ664X57}$?GXfYz8baD(#W#PihI~jUsotOPjn}+?LJ1F#@Y?N( z(C@Gp$RCLOYC}p%o;SCrt^>l;$}7Z>UQ2A=zg9#$VKE9K?hT$SL&!UvJXNtp9U~MH zc$XDrUH4pQt@{NLr)CR;M3EQJ^-34+U)f$=)!I$#5XHux_u)S$EcQ>xl6az6{h~NN z+S;rihhJNPrcS9KioHd1!rF|q+F$}9P^M=&fe{KwvZI(amYt`9rnn3ZWvng9b$fr? zo9;lTYOAgDpiMa7W5%#<^(tZO7DWNQ1;J?WWCHGU#yVDPy5dyl-i`zaxn5gL=vX< z50NM(krYS-K!3D)z|J8ZJ6ZwfktZ47GAR{XN@eTekO0$5pEVGpwY6~&_rI!xQ;vNN z3*X8z*9OXZ7l)#f2~_bHJsRi#wMBt26B_*1Xy;8&96cpdj}&C4m96Al5C5&Qye+D! zrj!r#rDSI3P2LAepNGr$mCdk%f)%8?Y1j8v(Nbe}+3F2BmoLNT&abJVxS39;n_6n0 zjut@oWMz}>9ACM&FrEDIdC|s2FEHk~O}EyQl|C%gBp{>z^xW>2`t9`RS8%PySf+Ru z6XBQ)OAq0tH?0aC!|U{U$5h#b>XMkUQ?=O=yI?XR_WEqmuM$@dYpoXDi7>FwF8N-i?YV1`chD1Z6sx=&F*7U8>C~ZKx>Jq1cT=Hz zP9r3>I4n_b&811pwKZ+wLH)w0Ix#ed*x>#K|crBselx_^HbV6ys>3Xxcczq_5z%lPbSV5^9wKR{p`wug==~P;s*=Hu9fxD5?YeyH{92N&94gS8v;cLq6Kv- zG|wmsgWDL4_@C}}r(f$$ZRQh5GF(OUCB-nxQ!+c0dbf8a7+A4-6Vv0_d72(%STYF` zCefu&(9d9bF#s}^wBUfw;%|5+##dkxogo2_OEAHmF_ZP~o~Kf_DxI(SwiB#ABjawK z!-gv{X{RmYe%Y!vaUv(JA)pE!XXp>F6i$8Fg4xZ!$mdfN@t@EBw#=ZfW6lP%p`d}< zbt~VF31*gP@IMo80J>#?si38nnN1VV^6!9T0@h+$6%u6)UG-~4b3(g%bbweW_$^uA zgw^A{kW8=4hsDkiD3mB(;$A3E8Rect6W$_fOJJ9jws5Z0mLToLAx<+H=;i;qtmiUk7AUNI)VJp_Qs>;#@qA@dT&#C~_%c(;7IAowh-#v35QsIxfG zxnH!P5b+8>m>bx0ZLQSr%AT#5IAmeX8FSas0E>d1+ zt}0dG*t8(6=1J+aC^*9Q-(u8d+B}6;-1d9wHxY%>B82_?bjzB|VT{w>F@vF01sb-9 zg|AU)%ZMnj#-P~m+d+m3v_2|9bg-(8=pGKAJYiL;yTL7P&PjS{z3<&0yz8S{tpJ?c-pEQ=y+E7_{jywMc+3 z)-NsG+6pY5q*^C4r3_U)5NzL`6h(KrBY!r#2(pVZ8 zNNh?9=v5_jXz-J=ej;ximLk(m8a>i2HV%Nyw5PU@?cMw>+Ih3`E@yLJWKeoEET_NWIzsw2ly!m%m(|b0~PvU-=t7tk4(T0t#tKh8mp|) zvCDv#GT(zr2or2?j4h%j-+=w|+moo_`?8kP(7Bew2~*qN=+Y;soWI)#h8>?@2Q5<= zb-sye^xeFA{EK%Oedqp%JhGsT$^$SP_S^c!YY)o%a*faKhCv$uHkR@dtEf*0kp;1P z2&g-#)|jNNaZqL8hfIov3p)>w5{ij8rp$Y)x2S|vL)J3GA|01DWCz5_4--$eYEKT$ zrW5Uj&Ee`z-J(XPLdPXGP?9BKA|NQDMO%?o zYImmQJeTEc&g)&6ZG4(=c)q23)>9}4eLP@|0$$#Pk0%RkoB~5VuM_O-?7iiUHmMiR z?wb`Tj(5*s0p{pDsWE z#4Z@6#z3>tRZw!XqwXLX{lz-Bw>j*jPn=_R6tVX*4ye&{Ufz87W;@|@I?WR8pNs7` zH|uHA(upnYEaEYwVz0XcA8v|Re3OTAJW~-SnwW-riHGHG9{U`gVi0 z4YX!$+1YrGj&PY~(kVN`P)&(e2D`F30z~(NUpGx(UsiIS>9C`iw`+%TOk6!-jojNY zW)ssCW7{q~sN`^1cDJO64^CSUk&y44&bM_suan@wp0~K4oSar$o%qDW`UrVkqskY= z`nSAwLyr^b^6xLFb{h0x0DfhwzicKk3prX-1P_u;xZZ)|S+#%{_hyY4U^qt?d?@0* zS@W{RwO>64%6ltJu;JP8PQtAb)WH&8-p6+PDf{~R0A)+oQ<@GkA-^;h`w6}wCkE!j@ha<&`_0=CpF3Y>DUgsGezFS(i4p~4gPov%P{z#`)!1u3^cH@T zt54OOLn5RC+Z0GGe*mfOzn)5Xq-2q!@)%tCt1V-KAgGiqv4(a{b= zS#I0n;LFp`yf;+ih}e+WNS|UE5XdE2U`4}*-zh{3exxs$BB}TMR7Xe{L6QKOsKaW^ z?$S&_iiJU{cv@}Y={7{k?KtVTehaaGA8fu#UugH|tXOb3-GzVFg)w?>tvMKNk&{=D zFB#6D4Wo$2Rk42L(qL4}$EQ=(5uaTCYpSW*kj|*n5p?%Qi;b5fz}gJx>blY2M~(mN zk1fZ2J48hBKCg~GY366=<#p8&|6kY+4(Pw5+=Mr4yjzRp`{UR5BZG_Y@AYsoUt`zG z&Dl70OM>W>6-@eNpdra6LBk}u)6kURAItvo#m!QDj*yhH7In798!FK+OH?mvv=aGJ z?i?<;Foe1|)x)}OP*$G`x4tc^=y_4kD715IiF#N}O^Y;3G z?!T@8EfpX%#Pr*~WkqK!%$y~M(N6H!=cEn8KR*-X!uX6)V=UB6**01|+&P^vHGkXM zmM{q$ofv0j;~8JoPsw)()8aLcRV?Y{5tBc>-$!#qLb;uC$bM3c#g)a6CJ(2a=1qP~ z+}(?$W=jS;mKGie4T2QI^MZ^qJN+XZU!N%vC5IMWPO3Ooz7lUdPy+qVOkFjwg)WaB zg!Sb|zRKjK!f0-}TJ@-Krcw=*F$5!6zUcmXw#>Y7YYh%2utJN)>AwFn;I$dH*?7bz z=KqGSF*H7=r(OSzNQnsCvra=?a;%^t3r#)+sW_8u05T`~qTD9r?e8uXhDa<(%5N|3QU9tJ<*G*D4W^^0xthBKCDD=lv-g5RD4)^0IqU{ol9z zpU~%KTfDf$a!~MX$oCP7pdN=|k3(FaRP2;3mv*BG z&(2N)ztFxvfN^vwVHJK+z% z*{wh2#8&}nMf;vu@-X&gbnB=lAh6L-lRftNN`t|(=5v#o!Kz!Naf8m^lfOmvr#@hK znh*TG1O?l)N|F3M4gmW8%lO%fn;;iEf4s!Mw4?S9|3M-@K3jP1T_>%MT;=&AsUs~Qz{)CJ^p0&f)j?8DR+?ufD)8cIW4fdN=&FN zY4Wg=(A1U(xcGX#-0ep$qoXk2Zyw%KDgF|RwyA;X^Q{ax(x|NzG4Em|3$ngfBR!I* zoig1!plgG9`;Rr`wCk)O^qRh!J3F&!EbX1PI5Fz9;~wxU5>;75;=X`(aE4$lXdlM#-guXHoU$Xp6(rt(|@G>?!HW~UAH;#5?%f{ep>24NP@<6hCJrIf6*^PrN24vcpoXj&Z>NdpP;4s%aj`4C;>J99F z)ob~FM=upaD3(>{K85ajwm9q`2*>kn7hL6Xe|Yke+Ogbl7%w(3Sv&9ptAqg{mqp}|3$L%)7F+B#N7;%C?c zb2tXQ3B9{z-@d}_!(CwS;&0Z-WJZ~@qcQ4W7J%r;Mf&lyM3>BLI0$&Xx3-_^GX;HM zdsv-*g{YRQ-pMj1(~{lUNDEVv3o48TsNbb)bj#`bBT~zll^2HVy$a@?2cbCun*a`r z{&sJ$+^X*els?!KR7Q^=(@E|o<_(qzP<_;7UkG)-apX#`x+VTeJl08#n9O8x6+f`r zw1ch5Xe85CBcaj&_PFMN@_}mj`%GIAA-PpnPCS#KmMP$q**6sXD5q6|O(fv)GH%f3 zD!|GQcGuV)v@`lAQpmRXk3yn!=3RRWCGojF@jVynx)FmzAzT-nIcv=ABw&g!Mk)uh zDC5?us;2*#lhH`V|HJvjF3O~+uK)E#Qxw!_3=b$tJZ_Q7X*UIWaw+{h)1fmf93FSS z`sr4JBIc_|8kh7Li3+LW?F9Hl!;Gz|=(L5${MA7altsiEjVRq|0k7ue$qQjTQWaZX2JR_xDvNLJHTT?6BN#2-f?L=PGpS%-|I_e}^Yj>NUrVpE4T# zy7(T{ZQyloyfi)FebxE*m-7>QadJBb+AO!nO~yw5;70qXO8v840; zP}D2oFsx{c9gBvlxc<-^9BV@UFJe=sTh!0J)? zTP@yC=miC)fWCIN1+y`d)#H`-U_2WpIE0r{+~S}Z5KrMXZ`6kFl*E2JzNIs%?B>}Y ziJunzqK2lLXW}U~w>``1sLrM^F-fVUw)0{XE`v=WO(aPgA3+K;@+8BYDKL1tJEuEY z{M(FTlT${`k~x^rD!r+2tc!BgTLra3xPHmZ))~S^lgaXFTVl1&1_$^u4R9fJne4pm z{k_4Fs4mWJ0{aJE`Z>4<&v$Z!g5TpXO2$q1UxLeQ5S0K*eWi-eb&Z; z@C>RXq1L$o7^`;HGAAP`8H`RP(U@K=6O_KGpe!e+pG|4O8k_q0E<)=%(Mo`kEzZwV z%MG&_if5lJV8D!A>5P;P7M#AVz?P6f6$lx`%gZ&tL57cnf_xd1@gvd=wj%lo#A;XBxWOUc({x7Q!8MkwHs{_%wSr_~lHgWE2D z>dWOOMeNLpvlST7vK%>6G;cWal}u!Q{@&TQxCqMm`;wA+G75k`I+L@*^iHLLL+3Mk|cQ(U08lc&oNQO zllR%R!y&aT$rUu_h6m}s;ETXyZX5XXQVd4;zhVDLX0n`Ho@3OWov6cN&}p!R0eq%m#4tI~6b3NC!jg1BF zJ8$1#{}qMwKb##A_tQ+pLUr}aAs{9bdTHKxeeB9i&m=rcRuMBeheMr1<-BA&J1fZ; zrBgx3iRgj1iULQb%Do%e^>57^$x)Iro8XuJ-RveG*N^b8a=TNbEEkpM(+V(2Qk~oL zz{cWaRhjkZ{#<-33u0SitAUo^R#1wFKhM+x5L`;;C$7=%U|!( zH(#pTbM`V2yh-corqhmcZlyYzuQpw2s`5VSthp}tG8#U@C`moJU2HVv0~8;|CNBtU zim_o+NB01Di!a!iN@FBNPhXr(5104R!1FV^uq+=uf$WB{+SUX@s<=F_N2ON zj`qG!x{?qxkfjTM#b?sfifg_m%by%0HYn?!aYZIGn>gggJ}IJH5EiAeD=T5frt7Z@&h9qr2>c!I?fEbZr2}t-&i_dnwFN1{L7gg zQw=YO*k9t%;(WK=NONrCz2jW5j=u8Ip*IkW=)xM^)6|mzoW~Wu1 z$BwRMmG-c|*w8;ORa=vN(b|{GgPeEr&};#5qc#~GjZ~ItvSqLH_E#=VMuX8;6v6H_ zx2}Ntl5s$0&1te^-iZ{13o@6%ik6%)6`{qalc}7uL(5l@sE9Rj~E7j%Cq7O z@3G>{08%;U{)l;IpFlHdC~XmmiBULL#D6MLViVxZ5I5UuaouBgTJy;C)U7tYnPVOe}5cO}}Sr0D@S7*y`VMt*a*c7tQsTVteC> ztOr(3qi=i1=K7_F$v2Ed2HjuVTsOU;F!t`(9;WS3;`ToyXHFj7gPpd>AB3(^Qzo+Z zj)NolTi!p^*PDA@Xrh_qo@r!mPGs|R*qMAY*#mZP61(P=nTdx3fqx8-;(rW}FrfT= z^}P)3dLN(oevW9LopEt%njBw1`MNe|BdI8yFRWauT8DbKb~Ni|Sk$(7wjezUBUr0=O}%@h=hEFF1E4^-|I0}Kge7+qg)PoU2qurMS#Xs-lA+dM7%9S{+lthLEotsGys{^s`hbS`(+#^u20+Md7*ayJju`EA6 z&c2d%pz*LimRzOxbX*Xt@(63ARkbxmLt<%b3qjxe1_jsRzJ;E`tPc#68~}tXI)Gsk zJoCF8%O)*7+v3}|%p?X)woiP0dK>VeRz3+ z6<2CTj*^Xat!zzTQK_DW6i1&&Z1@xd6gEY*GA&^cWjA(I)TAv}xP^Y3pa{>#9`NSf zwi5N{cGW1%F{$ZSJpiu2r8*xti78>$k@D@sygp~%o3h3}x|Dlnd{jK`L(UJ6t4E?Ooe^RHeTZPN?s-U&|RV*9@VOB+g zj%P^h8#28AHh*WZcVAm@dO7BJ-UG-yL}Bo<4}xo~(|c40PX8Ts`0;S(RH!eQd+np@oP6`iugoR~6X3_CRbN31@a zA*IYkRzc1VlfUy-|7FCDI{mNDU}_}g<@py4DH6KhJl)`UH+;Z8;j)q$o7z4>U2Z_2 zh&OSNV34OUC#uz>yHy^ApTbJ*Z=en~nJR)xhc`sLtj@5IrLk zj_U2+09!?%($g~JC7QWPscOcD&6>~>2^ZjrK+{MZGlVm9Rs%iCU4iwfb! z)W%<*QCIQ@ffw43Y~DXK?f3T&9D`Z;*$0W5*LsFcX@I0MDX_~qWApjypm)h1C={WQ z=SBkUE>D<}@odX4-vYwJWkjPmmOr-l=v%jMW4SpVoHf@O+d=@MOnF7cDZ6IYAOJ<5 zJaM_|Bvm)pWdJNMWBIu_4BiIBshXRo`%a;SSX39my*R(f;UQJ>XbIVbPhs+tZ1tOC z6jqw+ji*HSEe=XWLzm9^YgY=&J%LA%?vl~Gi7>Hx$}b!7Z1Bs0ESN^ll#rgZMmBW8<9#ZI3Xl+@Jp0LcO#e=;_HpX;6H)22JO8d&fdRL2^XeA?K0o;$gH02sDI z+E{@%Tr~_W6-(_~?GFgCXz*+UB-|0AtaRA|-)(nhXKy2j^qTo+?V2qCMYYdA)PnFo z)WV;feE$68gsc4}(5XbRX{bh_sBP97Rpbl~_S111gbBoyvJ%Gha=gZHS04J5_SP&a zBKMB_oXi*K*@kG-s}QX|&@pR?b{Jj2TrOr`Ce+mt@?$i7_`vgKMJg?KE9w-1)Z8wF za@op6uqU!AIu)sS6!B!=Lb#G*&{Pk^+mg_8*W-BC--ln$cldDkB!x$6S`zg~X-BTw z?e1iNxUVAtO|3j^0{3qZ7MkW#%ogL+`SDVpqbq}|}SO_>(*cV@U(7U!vW^&rKU3y{B(dcBJphxcPMaM?RVOSPC;2X&VOhSxj z3-nc7_%JnZxZ6SMl=#J<;k+O&!d;o6_@7GEm zo?0$n6HJ{W!L6Pt=oTV@nC#%N@k#%eH(OdS)%2I<7A_$0V!?c?7bXbz@PdFe1k&XF5|s-cgz8kD*CJyb@r2&bH$?rpYu3sH2DRy{f)Dx-;>C53K##> z($y~8Myq=23zjr3-JkC0h&~_=d~#u9d!*>kYNrfC!s z+b-N;qAdb%4kkXWa(CD5$)#my?jFxEH0Wh#t=MlpKY~N1XpOhxi|$&JroJ@)`u>$r z9i%awgm_?$$)rdmq}Z&*F7#>abd_JL#xQ>p@=k{FwpE~YjTw;TZOGAS^5sgDAVeW9Pef}eDs6zRzzEag&AnQgH!n#rJWUe~{CdFSpSLfT+vWDwf zd$iW-6T-RI^#?8H?CnM`JJY+?X#Mom-5H}dL`@ch-wth?lW&29-rMlR9;X%F*As#R z2VE~%_kwqnS}cZ?LBxuYm^@$69Fc!;K#;k|@6eji-*OVHwjCg^U#2hA0YjnW5cY6P zRx@VKTR%b!eEo&#KkgJ#Qrx6ssTC|Jc$E%h`%Ao@eRq2qrSt4S z@1OoWUPLa610naLyk8w!D|Ne4v|lyBmGLB~$PAr}rV$4UQXmrp6p-?KaH0zCxl}}x zb4xM+HjEhD<9I|!X$F?5$;~UtW3n;|kMKs1mbdSP$j+HiG}+`}{us#_$BS$M08@Vh z6%-(P*j^X{2fgT)z%f6WWVK<};F_1+*6}V9um=}kW{pCK;Gi(t1%*i`LJX3>?ozF%z1ayzuUMhbrpSnLGiR6w3p7B`84p zq)3#n4nnx5we`r;@{CC-R+tlAyv}sH!Ur`iFCXELnZ@~XpQL6fBbbWCSqpn!Mv?xa zTpUc%WEWmi8NDAbIG#Nd!YO8&Zv5!0G+^y-_PyEoOpQs%=fX~vs3W3=U&cTkeT2Hu z4IMxwl(?XtiR<|x1{Z?7wTYm%~bul@dB9?GI{wVtq;q3KQ)XJ^52;7wSqmU@?$}0EdIN?2bZc zU#p5PhYO3k2%C#vUjV8`xQJaufE68@hWs%!6NR`!xQ5Hkui3$!58`S8PwKe1J!wiZ z`h_)B;PxLT+CMyfq?P4>ydQdHXBQ<;`~yJKWYIRz?A@2~g!BIL7X)#C?vviKM3-sf z2M=ND=^9ewJ9D!1)0GI2Mjxa>g)TLH#UNOy-Z{R57kt1m$_HjkAl{(Ud&5Uwas1of zw1n;%tOb>+SYN4|y2kM8En)L{XRzN-lP83jEdK0HrJot1O#RX|<;ND^aB&Z%!V<~I zr%D->OZ&JHMnF}X6*2o*&(8=Z@&?$Q_q|{(RNAx*mLvP-wDfdEQL`y@>cJ9s&kIA? z5V%7ETr)s6r^NpTX3(n2vjQU+u{JqCC>nGiU>}Z-ecK-@?F=UB z!66YswtHMFl%Jksy1HZ75(P3wz*?Kd)9T~|sKe{N4amA~)Fr%5oB~Uq3n=eCu(0^s z07ikFKeR4)N5$r>N-%<2s2F??RnO9;i?aWab^0%!_(xQ{DWOs#=P(}T(U=;02 zL^ecRLfbmyDage5Dgv!(I}ROiQ<#KY%9g5ba-~sc`_rYE(J!a!nUiXr=C>os|B3E6 z{~K^%V#4|*3miSH94?J%)a?QC_|6zql*!|hK2479V}R^#>QcU*(droIYFtgKO<7Kb zMz(oENl}6t@VU5AL|+7wI&b|PT^&+UZCMlRB+SUs9j*UJK}c3S0e(%D-#*a~M@&I2 zgKHR%Ol0P6U0NOevsuHK&|6nml(ZS>oQ&ib8i%h-KJW!0Y;+1Vjg71UjBB!jISugkwnk z69jC}T5B@C`!4>yvHCN9TZ!@FGqe6T$}M|mke{It6fCOxeuJb7~(IsM0*L8yiHYJGjR?4l>&o9?l;;vNteg8Jzh)?+92GvFUySv-UqfV-FTG zvarn9a={Z5uXY4FQ9%z){sz^A%(p+k1xkWcp#BF{7%Zi@o<6D_2_)#4}UEvwmbZ5yu-gOCAX zX^FkxF3y?u_wBBw-Zvkc0 zg!g?)&bUDuiO{!gB2#%^&{0KA=kxP>!84S!k&h3CG-xZHQb#)BRHS6)X|hMGey)kB zzwb#3>?s!NhH8ei8j*Sj5+IR}f@+f{!6BxCL`$niRox5}rq3PPbg!XaKsz(&@oK-k ziur^dBoXSzfgaEYi}#hQJ%>HKiDirS1A(0TmFOU&U!>b)5v>Y-F*4E(&byLtI!f0q zncc*g)8Bi6b{DIJy0(R4Jxp9v*6^+H8_T8TwVfob_00m3w-2!Zocnyt+v6%z9&+*a zJ9LVAOU}qUt=EN4F7{?K6OiRNwR@cr(YEatNqrf+{Ef=ec?mJEwVEwct|9j0&^nru=Pqi`n}g@0nS2TxKm zM8{BvV)2)`ibw#uIzE=GtDB6P7znux22oB9*zgN5`d+;regRa}P6Eb{R706kjS5@4 zssvoI0+o`VJSPMvwI)k?$fLyMRT|s#h&=^=A836+Q96bXca9CA9RwGEwq30Uo{xEh}w@6h@v`jAj! zB6^dKSbUCga;mj#&L~1-J58hLI;R%=JD-m$YV5J@;NpNv0s?${&8>M$3fIr}2b_kG ziK-Xt23`W&*nBs=p!`s4@j1n}!6E}PqPH*4(x}8II}m7)=K}LmlzU|D{WdbfXhFG1 zkYt#uvWX6*sGuJ4uqI{49dhyu(R-^SSy1AnG)@&4DEJc10_Q7VE_z?uC#fd}q3ax{ z=UWd$pB)8kfOuO%lWIQvxp8Kq{=ye8?&SMD9PwcM+tGG{832HFzTiugC=?lfwmAM^ zHFnT-X?_UjbAALGimc__4*S4Jl17+dKW8C&I=_Db>KZp5E5?7OboX zAFvI!zkkA#2xrBw3MW9N`yuJyU_55pYytzBcC$c%&;OSP-Ax3<`P|RoN2$Y}g z4MFwEiX~zNhFiNwGnM?h0qbanAPM2gv;E5IYX8vSV7SC4GdIi7t6}(t=|UaZB3)Ax z+o+x?$MPh6>-gy}XXK3*UtNN?deEGc$;~To)>f8Gfsn|lGP?9=UXNzE?B=WWPhN+# zmWo;1$17TkOB=Ccsuz1gAJn^LNVt*7zA3H~2vOLx`dxy~RQ%T+NUtPVD49LaEX6+* z-)3*-t}wM+pL4Fae@}`)u(hwbzOTw)tgfC~+SqmTy`-?UZE(M{sVTS=&`Xg_xMf#F zCgYH`sf-qRn97628PD9`O}jb#55NsJ||izQo8VUJKG@{n*J zVQ9R*c9Fq8Hnvdoyx`jH1vFOC2mA(dImjc_X^atREiJM*++inx4`O*A=n}6I{C#3? zU~c1tQ3PFdbLz&6OI2o$H)!>xG10Xox3T_D!JI-2QJRIDWsaT`iu?AcBcOZfzCPx) z?|S8`ULjLZi;7uFv9mi$j$xEZOU>Nz!!k(G*fLzC8MXu&G_OOzZYt1PSHu4IS_GPgRrn6gzrbmseos;#S?zixGX z{HG?)jW4m<%*;40G9}yO=aQMXNz~pPr)YbZl1e`rHRArjkuL_B0MRPKyH$PGy85C{HgDQ$o=Y)2bj%z&R{| zM(J{252&8yV-5PQt`8zIf!L0L#fj99zv#j#N`+~IortS23a6zBPEyd2aUew&i4i4@ z;lTuF2Ig&I0&x47voi3VSujX(?8 zU={qT?qncS91EE+d$X2?nU$R#V6IvDIQtf7AqIymJq`x-^xdy{zBJsi@bTo}uE>XZoIQp5~d^ z*dz=DQza(S;ut)T`6XVBcg6XWnnJI_iX36ZfRRww17RhVx|AUkC4Os{9S4Qo)rWzE z)qfm*?TCGQCv_yhU9R&y(?L@YP!`nvB~BVoPPq<4KNfZIzJ9T<^j;^sW9zK;IZ?c^?QMGGi7Nn-`F{BUkR$7NcqG^? z*vDH*eBlTjgILbWR9qTpjlX!_gmYYXdd+HHvO813PS)eLn;LI376^92l!!@mtWa4_ z-MC!e36zpk&>h~MFyK|EH+?iJGkojbs*<7!$zK_0g`~jrSlZiu8fv-qw=7$L)7I9e zf*u|j;g^-Iyff1Y<`_;DbogM6sY``~G^?YxX52MnVPX}x_2aWESJR|5ps+!;92Zbb zrg}t8W0Cf6MmEpaVEiC!^Cg;ESK76?`3jwjn+wm1L)*aMvyThBr9je`=({=2rUkA1 zy;0cvdsj47r^ib)z+E+-p|x&SF(*k+D<*91e}hfsDWNXfFZB^E8E;1N$|nw0Xt+&V zjF2q|m5~-&69TB`S7#}jNR?Ztj@`y#e;@dLA;t<8ZjM&5~f=5Eqd{lcsBH8)--c4fi z*(3Vz!}-)v6PyrCXA8@ws19Qn)m7z1Ck04H3{%%4n?C*OtbdEFFuW#afe@k(H$l^{VESv--&%ZT6e_A>hFDx8O^=&z&^+`sba?9`bf5q>^C$xv4v zajnwz>6kgrUSV3Ur%}q9M7%*+T3wEE3x=9p(RDW&vjgR){0$40oI+HR%20+4c$z1^sn|w zt>*X&w;7;{=FZVsA#(w@VS%D0vm`qtEzqN;X^9T^d1A4N(L{6O3ui0nBuf6QcJM^x z3s(s1fKdacuGsbuaC8g|_h!px^gCautHb1x0`uq2Py=YBf6niWK+~PeEMj2mOum8l+N6&F3wol*dV$Ko?t5f@nfV(xjOdjf`T!JbBnN~zkU;3NzX6L z|DFcnW6DljAFTfRo~4`&%EKilHo5<;5~Z%5@zGml8aNtlW@#%;bC)(Zw+afAqP}#D zpRY5Yxgr*DO2raxb&n$1>vxJ;3WcH$U-t|=D8?ZNMM70a+;dV<5cFgFqmo~$BFaEQ zE&|R0}D?}ksKH)`)s}*zfH7Qx! zY2tsb06p^|&|apOR|;-BU}?%OW2~lr)CL1ND&*jaV87Fk4AB1ASEM-Y;?QD~Y%65Y z(q$%d){|h-ntN_8>j5Os?)&agQFllf3WM<@ohCSg_Bo^o&d8W=|bP!bLjg^6x6+7Z5dD;vG zyC0&uT}-GX^FWQ!C+wK+dWT&V6gi6h1~6X$UhxnO$8 zm{7`Ek4)clp(Kl^S^37ZsVjlPa(`+UqVjtjk*_Hd!|&>yB$^w4GYLY44(tn5ucOZ( z$SAZ9sE4qWYY19<<B zR9aq`aWBOj{;}IzN_)fap{_JT7^vjAqLmuSg5O!zrTCJy1ef19*xb+kjZJN^`~4** z3CsjUtk?gvGN38bZzc&-OvzGQTIK$h>)v4{<&;S$4LWud;xAK`-YVtJn62RSzMQrB zSX^9U0^TUJ`udX$74r1_tiGvpbbbWE#zyXC{y=aDxOKAC8I~+Ku74iYyjKOd=k{0UOH&VZ}`*wX!cjW1?u zigueq2^3y|DF$ts!@H8kA5|IpJ9FOb;;=t! zjXb9K?PUIIQpVOCc3_&po?^|Wf7_Qsk$4n|g{>}Wg#W9O|fxIdwr*;v+GjaS*Q5c7H7K0jLh zKaj_${Otp9&}_UQ=$o>BBsvk;iF-~j}glO#D7QZe$CUT~D89EE2Dx_i@75v77Kv$#? za4iW^RrOvLLGv)*nLD?>wfIlpK&~%?qhLZ+*#fr$hj^uuiwboHj|ZuTVo1njRPP_| zTe#g~6?M?#PR}p4s!UD10ax&v-FP4zin1<-Xs$}dCqe$+!FlRAj)G)!XuPshxeA8a zI{aq4)j|VjV9*^{Iy1um@WJncjJSw8C7qL-eQkYLAQ!x-cKgjQ<0V}kOLy#S<$EB5jjn6CRy2lN|gPl;=rVJgLEUFpdHaBB$RBwm|=3a1agw$;^O@+l7L$o zedC0#p@h1ZkEt)#J0hK6E*hZ^JQN2C6MNKj-S4LpkmkQwQF6H->ja<&M6lVOo~cw= zL?I)qR%rfuI%g6EMa4urZEaH-wtWLAPGSlL%!~C-2{&I968H`1qUcn4O0{c&sSE(l#2x47v5ocu6&?_IZ3h|mVUr+eU4kf?%XL$y*hGkgBC7-wpKvDG$$;r3Tf1{M&QE9E`u%RJZg{ZG&z>ous$G#!|+t(ux1#~?dH9MLcYwxzEe*DlaSO=b3tHhBk>W?n6 zV5x{nK4{oDe{?0(A7tBJX*UmFJSdcSNzFO5;XQ+ObO9!O#KF0+M~y}@jhO57!j_GT zz0c^S{#{D&c`Nqk&xXOVHaFT4^rN2OR7EXWk*GhWJ|gjEQAkMBjo4H$ZD-87atQXr z4g1SydeVd_``AlI&eG1kn~z|~i7Y-h@b_KT8x$Pcn|MSeL5U-N6ky_6X1`|*UR>7T zefVxybepYfp$tN}02ywIg*!P)-bl7eF&0#Nw>5(4^nGiS3P z;HbUyw`5`CWD~JQoY&%ZzfX$s_EeNf76Bb{X&)q5D!KDT`to?um!mlEmj{tj_=FBom{sgBL{esO7?@xQ&EDdVcJajEfVZHsDTEg(#?IRmB z^MVD^3{@{R?)Z9IJW$McO>M;;z7 z-b;p@=e-gVuhXlVj~|h%BLCmu{H{iRTRQL`ju;{eN*Wu>y6Ae?T;IS6+S+(*G{VVw znlmC};fDx+n3BC)7lI7Giy;-x6T$UXfrQw&Ip9NK7cb3KkC@i+Zf6-27rVB6yL6IQ z)O0X(+8d!Te90y;+5SH?on=_mTi3<~1{gvZx`!I18)@krqy{7g1tp|QK)SnY=#V^! zfHa7JbayvW64DKd@cz&7dB4p!=3@4>_gd?|@84?IJ{noEeDfxy#c0iEO--#nbq!CmWSAeh(IU?- zzXuN@gJsBp)U~&YtQRr3gD9jX+fIj{Yn}t{nZCe5@2HyS39=CM9k`zUTzYo4Y=q3j zz%B6D|1;x|kLuhkg@sAR566^z_}1Os4MI{CfkpS3F2=77s6H!aq*c{7jWp|5>O=)3 zX1c_GDAucBMzx2x2QRtLFRsYl1ZWT^Fl4{>G0omv=mM`3$xW`tr+$G~kng*MzIO4< zDE@&Nq=o+!J3-vS#f*y4v^fopBc;IH=oL%t- zqy~i$M1VFiGnpz&kA!kUH+lJ5hxZlI{=J9@jvTNy$?Q1+p<+u^pr#GN-u zvipdD>nU5=D{vNl2NUjvflq6B0xcq@m;Y}Z`;g%{xeJBLrB7`S?2ZdUw@xOyVq)T|>Z?_4+thvYI*QfO`XyK# zO`72+1f`EhdloIZK?r5F6jb$4HTa6K4z1 zVZ8w-MPyxs_iOY&#;aKkRuA8KJ0w1w(m&u^oREI)Tn-i!;Kl(73(wBKG%BgDRelQO zy_tQ2Kw88sFj=ag>kxxKlUwF?IIp-!tX^fg1cbWN-PylfJN`m+I`n4ug_^& z+Gw`e<*iYcuM?fOyaH(kWW7;c!oH-7cUmi^g2yNxB{ zxFQP<)C){ZtR10HH1EUY3}ZbS0OZuB+V2!77!8$x()~dI`@}GooGv0 zOGVc3;)#gV5(aC0d{YjpB$?WY*XHlCVHFJZ|75;c0AwV0+cdA*f$3qP5BCR^lRWQG z(;muOfeMW;xMU&DS(~ko@*z?|;HOCp&*0YMnGi3K7dm3k%9A8%Im~z|Q;C%wEz~XW z*Ba#e>H7DPhm$esfy(<|mN&a79T59{)$A7&Ru*B1sckCVLBl~?q?Hz@qiHvqnzF&!=C zOA5IQZmj>x?FYx{|K^ECx^fW(#+9u29oM!h8h!n5jlpO7YHJjrbT{uzmD&kLtS zZqLxa8saMiaI2S2x(NAoTI-~Q=AiM~hxtjy(DouMOJJA% zI2_QsuXBY|nQt^z>!R${S5v<*@F5YXRAoH1`AGqOsj#F>WNSyiO0rUYuh|Y%UNxAI z9AsYl#?&kGvYzFuB7VPZG1HhF_R)9Wewo@{nZf}F+Ygm~x16-;xw0IJWh?7fBQ!DU z&%3*t67oRuUCdyrs?eR$*roFFO2(J82;$`N5s8qs`K9HzuBOC{AnPQp(wX^}CK#`M z?Q@XD@UoTdjz1Cy2S-|!)2cO~oTAoGMw*Q)Z~XkArLeWVhUONRKd%5KqAkV^*dDcU zjTx~T#te#gAqeWe(&J+?wUO}-Ns55n!sI}8@B}yjClGlr72pCxGS_#Dsez%93M9aXrH+sjy=a0fz2$ZNP ze72@3JBF=dbxZ!O$HkuZlEj;!7kh55&~R~apT7EjT7We8CUIZP>vOcRS4&}REli#D z|F!nRi@*0zC`<8h*5$7sR}TB*+gDeo$$jxzBlS-kX5De*n9z>7&`t4 z8jt+|8JF8oh{VM`mMp$@ZRU?K{u_X0nIokW{6-xxRC8INAf;-anJSlR3Ujgh4rlN}+D`TkPH6K<4v(GQBSbBS7 zGnzVVjt>hpOL$M)P?d4gkOKRO8!L&yKpz9iUb~7dv$M0SX>3wQlsRoKx6NJJNv$6u?hc{dOK#1;W%%EpQMz9(a1aT3@xktU+3@ z4aUhUHoTu(lhvw7<-tBG1d!jF` zp8EX}k&d@@yx=IL>r{4%zD|Pd+W&#UmDI9`GHWiXT^ZPdAfiMIeD%-Y{k$O+#D2Sn zCCg50Bq1S`*>%^fZ(MSbnv-Ln>-m%2+3BrbtJ`gTWToHX50`jp=TpuRFSFk?zI40) zd4ven{~n>9Vw8;tHg%<=qx}bVJHOrji7qdPBWTuP>wE}VgfJ=k8f5XZKAsvQ z*Z`FT)-R~rK3EXEGr2#fU*E0X8q&H8!Wy@#@1MSg6r;nMF+nWsah zWOm@{88w=aAcvB?Bx+F9NRG!Y9UYylR?u^tZ!sfA$E|Eqe8A910^mO*)S1=9uICL2 z=)`(Y`X5E(mBC8Qy)DCGGb*JgpUo|8lNmrttSBB!H;YgK6il`Atdq%>#+Ct{ATTir zz@q3>=*ogW%}|$>?L*KNC*C+Ze#jY77q4hteIqGHfkCXwpr#W?FRg0!8bY+;(sW@J zSlknu9{-4A1~<6N?b}I8WsRt`X7dc-L!f7O8@>folx16hq&Dc_DmF7AlVl$sA%9xA z;S#qfs|E{Tu?s1#pR``TNurFIMvW3lf~jP>2X|jTyFO|e+G)Ed|L}Wp&hv8ULt*_n zgxmYjAwWSk0h|HR0`)dyp zPSCS)w6i-nyBfVJE=p35iBsPV?NL5BJW#grjQ3>-fn6BTS99yHquMd)k0bEH`Kjpd z$JOqNr5^x72lTbyn~d3ep3wSvhQ!W|M}c`rRkj>uwJHnMMjb8DaMUx%E8^fmr5;EP zB8j2k65cNq^c|&uGZx%K21ugqBg!0J3QM2HQGOpAh z1zX%5end^fw@64*;slOD#7U>eM=}sPvNLDtdVXOgA5p4hD4+nApR_q@%=6wV!k9IvB)6s=}z63<}QU zQmh003g~;2_+@n;sukgrWok=jvfcVdlPE|5vYTkECG`yp6tByV%@onD;N?TgOQzxR z9JfRRx=~E%7m;6zLqIP!DyaFat7AcatJv(#o5=UZRgJZZwFTC~Sd>uO{MKgfRiDeJ z&mOD}$46&JFBWPojVsI-?nQoykN>BH(MSCq4biB8iRxyJrfq`-Hl!IAC zyyfO35u|#s!BwTuNqEs98_%`82h(b{OqYZG8@}jq0yGNphR~wYLJbss?tC+Wd;?kb z{L-Ew$m)3+J9OaSpi^pvAZmihu~$iT9t;vQ7XIj?3{42EVM~M;uxu4~VaJo>vNQi! z9Gb^3PRV!5U1P>HzLN1+sR`y*i-C_bLI~$-ezfIKQ&gfvuUOo1RXYZ-l%b(7Y3bN@n)4^@U5_pi}Tl zjr|a*1b#kcC_EdRo1{Gc{Syjw0gn*SK9`*GjRhD}C3d&og3Mz1U6BB@8YvSvYO>Fs zHb{ZfBi?!wy|d?uNW2VVV)t4bihro^1s54amLw$hX>)6s2#a@DM9czXsSJ2%U_d)p z+&f#aPg8*ZnPUAa&|d}RcWBoM508vFUtie|N-E>^3?%o7@d-vxW?sg=_;%H6Td?%b z%i8n)=Kg5)qEx5ExI&lXfAvoEU!_BsSS|#nIvb8fJ@>xhy%e%EeS2#<#6zg9+qgNn zu<;VIR%~8=bfek!K%54p-?>;P`Z}~U?6?i|h}cpmTt-=0;NtK!w=}{p?w|lxNPn{~12Tt@t`-C{eFUR)kmL2_`l8PZWCL)kJ5=H4 zemrOlYQ!PrUm*R@!)B8t8;g|8DwJ)5C#l(Cvw-F$u9`GKODPjIe?toFQPnFMIW%%V zVGLWw$n62HI@)yL_TflPO=V`Q!S}EfbGf1oW@ZM%03YXbbxnk$kTzUUSQx-}0GC-x z9U>oDQQPz_Qdv7SuPPmu)XfsaWFS*080r*Qp2;u9KXB2}WyOsH1%?jLk+CW3MpBWRtmdqm}AEx7A;_3c<+ zg|3tH$!X2O)8@bgfk~&9SpULD;ficsp?LA97cRW~qT;>%ClxFOaTV1UZGd7gOsn6r`XN6{~18==0qxs>a+rifV?qW};Qm+QSPvgt|x4uy- zlMc85oQR1b5FYiZVx?9;e_xj!<{7VAaREuDqvd9K5ne4RH2OwtL9@qFcb%ScO*p{7 z-sqiwg(Bi<%f+%<1Vg{KQP3J4RJIUNT%|ay4Wb}yh6WK&Pm-3B<=2tU7OLm5VIT%5 zJ9*IIc;YKbu!(0`sa;mF*MXB?J*=jkSp#F%+SV{Fs5;yg8}p1SAwHGj_3n-)R73#V zFR$ew!ySfTkNT`^LlhX@!Q9f0jGldx)Q}>#520y|sBbn*dXv+$n49w)bcUYI&8MV8 zj(G`(gM(61UKBy_2_E-0@2lW0{TLD9X_HuDDRLM&p_f zpoj~u4X4V=R=`y@MC$438G772+UG{VKh@)s=xqAjUe4X>OJBPj)Hfu`B^Kkj>HH|9 z|MP0O)gMoJZT2whixvb|IrSe8M%76`_#f?&Z%a}bg(DgH*&CcfYCwc=8`q?@m$XlU z@IS(2*WYxX0+|3q#=w zOSuY3HeF`%ITo%?A;>~my~;$37j@bZ3ObI{>Cg|aP3=P9_3+FWP8I``gUnJ7x8F^z zJ&9;QhI%BkhA!?$tEIEXwi^c-f|YL#XX*c&3_9BWubxQ;?9PT)d5F^TN^agZgGznQ zt}b~=559QLm*!7HWXhJ_TICJi?84Oc#VT7bBXS(p+HWW+K8TKu&-1Nl1iE7i%REz? zA8MX2V3@&SV2hrwN?}u7mps&dhB)Q_8==kP4Wu-wi zDRb7dchQ?wdiC`2lC3Al?c;6); zRiMG1abPmWrnvJUU!E;lKvEK)v8t&iY#fr!JcM7O@u6_yBXe=5Vc*Z6)N0Xq6H!<~ zS#Dur$~Qd#V$S6D!qUkz{5f0Z3~q)1{^RM4XF_Tv&5^Y%BqZ2P&WBjCY~xX|L`lDY zQQePcMf7DcTOb}(Ll}#mvU^|I?6oE@3^>+&+lf??IS^E5EisQx<+Q}Z)8gQnL_zH& zAD^%*QVBlq#M6by6fH2r7!?YE3qW61GrM!yZN9pr>{Oj|k{a~{;(aZmlngI=Xei6{uu1XRBW1+h~41u%jew~Ev1Tyg-3{ib1Oqh6AidZ5q<%YLB`y(H4Ymf49PPdHeqZdpH z3^!IdB;v0Vz{O(z_o^Hj`NkEmQ5|C8N_q84Y>JKj3-hby_P#0gDP*5t`UTH@Z|Pn9 zdGxzV@!0H&rOccO?0B@=>@5zeNiNZ7&83|Bqhx~j*EvY^S6H{_U{o-ynECv~8j<0B zangCQrC?fT?(7UTA%~Ub*Tvb2IF1iW(2DtmlzeFF?mrPtF4VcZXuB87_1TbQ?h1Bo zW?{OqGCPCnlNw+PXrDUmpc|(4ba_W$Uu%@9GX#Ns1Gokt9LTpIevj3|R0A~cLvnyy zQUti@0~|z@2Sp8bb90oyvPmqic;UiHlPRz#ieM|DPxH$gXxyMCx7NpsuA3_P-t7u> zO+*bbdNgljK(1TcfQ6l<0y1cY#{{ks>PTg=CO_0#?Xxi`Hm4m0eN+gf07h`y$f4bF z2%Mu=N%?fPwxMAVJJ&CBfjNA)0kA^U<48eKEP)L9z??ca;~!)NgAZXgs{*VJ+rao$ z2W9XqH5iCYxIA3hXLACsW%E2S8I}3j9QaxgoFTbWKY=0_j*7db2m&#JyW@%EDt$T8*=4m-Qzs_gP+vX? z#*hbB@FTS#t-@5$h-0 z+Z9=wl=gR#n|SDg4b$IJSJX7#0!x1G&9j#FSpWt~yu z>MH&UOl(2Q`%--DcC&<%2C$|N@C}}-eYhi~;59b)a7xfH42X$U=Z|LCSm!5XW2qV? zs$C9RlT>9X&U^x5Ph^^{P7TF$1e!z|^ci?;^v)QtE02+2EY9Wfm-^3o+!Y56nI4jV zz^-c1sB!keFTU(_93R1yx>);?vtmh6-9~|ZirXRlt@1X!v{3W-5cQ&Ozx!p076XU@ zBcCBDgUmi`v8t$Bg1!+}teAQ8WmVb6BgsaH*qZdFeS4N%JQ0A?1x^EZrpwkYQ4R7j zqtL&r8tgx7ld>SJ>ykuwR0X=0|6s=u#A{pY=3`HhKpj@T_N**5&M&Q6czD3JMWD-F zXbmerwia|^)Z=>osk#>Cadv>$M}(=YF^`u{9hSXjiO z7cn3XO-(A@V^4yIsR_9sNdk^j7U715MA6T!-m&Z33~9OIy*D9pD$08pW@h2mz|`>Q zPk(SnAxbX)L{^Iwh~PYzOQM8ZI(IOg-au=6H?`#w(?L6uo`xGCijWhgfatME6gp%6 z91akn1i=hUHcr1#rg?stj?-de)|S=U607(__x7JBlyo0DVK^y8a!Exn)iAA0Al6{) z`(xh+$iQv;bVYHW{oRlazstlz>@xVubNf6hIpvdSsedA zH~)X*++XYdH4(b77k>p>!%EIlLOc7459t|FuaSVnYrFpi`az39wFcD(_5W7@R>29k zBoy#H0ZX4xJw#dN`bF6kkKSwGMYxqhRq8v~w4Qx$IZF(J$}y;sLfOt}ZRwCU<@F#& zZ|sNm_FV?~WSy3~!J&hOXMGyb{3-To#mEzK78b*qHF)@BSb(xx>~$`(wXsy@^-vI! zJ9srx;aE#L58Nv^b|=`bPZxRO_!MUR1`9?cIMgEM~&aCeKf~ua0L;mJP*=> zQf4cbTWkiE8Pl}qs>z|V&7tNlMokgMia?Uk92p#B$j|7|KaNxIht7B zXSGwww4$zjdfQA+4O^oXM&%Ws6D-)}FqOi>%{*wsxw(Oj?zH0X@DmJZmRdq0Ziy^? zmr={D>ek$&U29r77`50QmzRwi0V9`j zFWi(D*gdd*QB9&-Lk&3YIE`!%4v+H{f@Z0cd!^GT^gO;)jhg(myzwC+<9|krXOGqpMJ=lfJyW9%B=-YZSzqvlCIMv6^zqy};D?2r3-OW1Q zV`&<}5gBz`Jfyr*E5n1z( zeqfB=QsV2QPuRvGU%g^f=K!<{Qv;f46vtZ%h%N^e;7A5jP(1;FQrS}1q6lj_i0iqq z$Y)~IgT8G&!FO*M`R>z+UL3i8Q%v zl6TaLxmsmUOrZXZLPvgrQ+_fe>y&uj){A`c+tJ^YglwWTQ+kmTh2gCf_=P?)RTM)Cjv)ebCjq|p(&yNd(Ybq_ zUk9cFdz6D+?PU{iA;*q$AqNxYFv;r+otBFYfQ0I*kS+e6t@UpEhox|Xuy|h_oqzLR zGxK+z|6Z>dibwF$){c&jN{UzB?_GS)og^GfM=Blzy)p#G<6h2HQT2TR7=AIgoXu2D z9NIaZT@Zct{o}IivBQ&=`}>h~<^(t0q>)U))4FE<1PyRHm;5I%hLBQ_mZ+n57C1c@ z3J{w67FJf@08{#mQdOwEosJr3i|;M>rx(Ga9K*EfKL%qZvc;XzU#RjwVL7e?%Mpik z8%8Jaa~Y$6c%S#yyZ8xUc()N*bg>5NRS6<b6@PqlaLb!*>05pR-54()l`PM=75 zXaxdtobyHZfQl3azx4T0Jtyf(l7PWmO9H2jVX7k4M7U{P{sL{$%wk_Ndf;1EJ5u(I zu)L~V@9U%LrmyI59ap@!mj8St#6Q7nyNLF=0vHoupRSRC;8doqqCvom$Of#=VJ59%+jye<$!b5Di2!}F zugVXMR`etSvhORHo=XQ1-$zd`bjHrlQaF9CMErt}Z*ThMm#xoFCTNMfwr9l&>4(pk z+AhT$R=#zt-t*+s1fM2sM8ee8$q?coVmjiwNy=hiHjpdXd3^i%ySj@LB_rr^I}f0$ zKEKj=I5T-h*YaK3?@r;b=fca%3&Kat0VFTcLZptMccc_n^G zkfd_<&HMOCS68sl_v<@oZI4S>e}cE<`Fm7+4PjASzSRg#r&ksqQI~7U}aY7 zV_7UB!W-dnZoE2Dl+>@^nz`a#KRA!I8YG0W*!3${|4D=muY4t|Wwq`-Eeu~cOr?d= z19Gx5ASYKhH$}~om2*Ra`a=`=^^=NlRwatGK#uJ8?fo9BtST|7Aa)>AdHb^EduCDH zBYGEZffnqq7=_HBM26~7<|4VaJ|X8d9}T@y{%3+i)y&~vydR*}ENJasDuSWpIE2vE zLNPvt)>+UV#JH-8Z|vwu_!5b^huNo@Be!=`KMMR`Ti_EsRmDI06PanH-lMaV!LJr` zBCt>L6W_>bJ6&|M@4i^t_DplHY*Vv!WEFN*?HSPNtAhF+?MQdDF1erN%Yft4qLz_h z0SAM)oIIrMJF_D+LMTslb#)whQo)oQyrVy$K>INl4-Wu7%9g(7QjRy?y1&C}yY1oS zb3c~yB+B4k5n$y-S7OyIs~7EVdIS$tt?KCeAdg$5;YF3D@?N%gSi?Lw+A3BD>sak2 zm`IBagXorM>9cNxWCmq$E_~^?2_4#R zEPc!F`G%2=BZWgX^-)|WIe^+itk(rY&NUDg)xRhrA?zt!vKZl(SXAY@6NY3#tZIn2 zmV}XlteO@N8>|mKf&i&A3mbUp{>vx-uexs2{BPd#6EC2J3jjQ<+#fysbi8kUxTnHa-d*FX0Fnk&;Ev7Kog84DmmkqguI16uQaMGKxkpsie+ki!1(*0lmaxww zM6yigb#$Kedz*4#@usd&@VN`xsI*^ZU?P92NQ1}5G|_BBgU8t^o}Hcj+Bv}!busU4 z7$>J~`N4spgrL$;3T<}A`caOA?qtj)1*N@8F%}COT&+GAv4t6nB->$XlP7NEZpDAM z6?p^ht2NG3AI@Kk)DvKI>M(N&*J4l~&WeDDaKQso1M@(ixx~D7AC0~Is!)O4+>WI= zIBW!LuVCP>fs6SN5TCrdTzGx&MxmljeN5msLw`H4*I-smZ*~?(^nF7kWfrBf%DB>$ z9e!0?bI-sOE7gb0-s{E2miPslVsqF8UdP&r%FDjBg_VWPMTt4EXcQCRcn7Qp21vtg zle^)zw{C9rmLE9xkl`+X3+TB&sHAD>#7072%GhiWAmcQ6%}Q2Emul~^1@AB>03y58PcV^g3K&Gto8YC zur3%GS#GZpeY@y=W&G#o{_?j|ti^`v;=(#2R7Mew$Ae!k_6`wl9R(Y=))P6Q;zu-a zFyFWppQxT0L&~(924V(3Hl|<-7vM2qzbcDh?jv~H_N%PzBCunk8e33DurUR3MdPdf zcm90+cS7VFsZkwyx0Cz>rlTD34=r z?l;x%-`ko+FEu(Apo*s0sc7i8cPD^NG|tImKEI|=idkIRb>iMzo`4z62D!d9K?2nB z*-IioWV><9uTegCN2O3p^|i;x!L`>|-xwSlt*3P~Xr)I|I7K{u54wH*jhWwH`u2tC zfMNRvpOV>RxpHuP&m$?1AdDXvaL-SMQ3+`KcwA8JpwuS~TAmb#x=aqL=y4FxM=(iD zWpp22f&$H}3?ukg*RO~3NvZ!F98us4D>pgqf=c4(Or706nEW1Yd*i-`)k$`Gs{<`& z;D3?LjI}{GUY08?euQli5sHb#Ew2JuSnGlS0?*s`UO~tAH`f9}o(b4PF8DDq8x?Pz z-EwY2J&irC#E6_0SOMhX4&f-RpZhygQw{juw+V{y|B}uA^#29?+b zzu$Ih=6}t5@cBEng4K(gq`i#bVOp_{&fsuZ_T5#~5(rR{GULJqO#^=7Q(&aSL#m=!}Q(UY9mtUoDb=;rwS9~t^`J;VtmSOZRxAxmf6+{!-hVcw zvpM`+p^MNbvc*H5oEG)ws=CEjAqhqG94nGL6B`^27YB6>P8Kw5{78OL z-4a91>Ma;q&-s{dLNIom%lWYxdT%Kf6twFV!^an_;Kw6z=LHAmOJf=c4++;|iaY_`uXyYrAoCSLdVv((>TwsJgLLZ4Xz2USf2s z8|86*I5bn)a(1Q$JesW%{8Fb?|EuYv{&(0uL4u5pjifKH?}3M#-tVW${nW9`VM>_p zi+qcAaz6J5sgVvwja<>ujZXQZfc14E;kgE<(fp92Iu^jJ6%!xJ@B128YiAHl zCgF1Ue13D<1$@hWwhGm{qNJZHRpk6S1$8o5R9PR*@lm$cRjW!81g-HnL@u-(`E1;V z)Yy1C=#j$UVS3iZ#g z+6I31a^%D*s;W$q7ADV6|9A$sK`@`l=BK>%vp;x*@WNF2XUD3qH3QpM1V%J8q@NiW1`u5;wXy(!NasLMl5bE) z(=UCXRPgSnqi^Vs9*eSX?HNRI*j!B^a*QENM+Pzx z275GMFe$dBvgglI%LJsLAb&@HKV`j5=tza{*>X)o&FJt2{$^otjOOz^)Ej#VQu$-!*rQc2xZR`#Fz$3|;|YVYwt-tLgo0F_%=$ zy8~7$p`WypPLw-bD=iU1?@CXKF&V9nk875AfQ4V?mM)kG7%k~`e(CCj#GOL3&`)UO>OW4 z<*d|O_4*c*NLV$m@7@M#7{B|y{aC!>nfR+{4Pqel9g>h_ayQNDxfwf@`23jG(@@K` znT=grypz!Akmq_^Z)^(iKP+Im{jb3%^!=KlCM$#QdBFRS#WsvdMi z=e-LgY7LXe;H*IYgdn+ioCZG@a$0qSfgTQlnia5&hFZl(W1>;h%YZ^5fy?BrT-rWI zFOt@SS*O?)wY4^I(Cgxkqr1uP(xlIJZgamsgb&mp@vEa{SSn5~1T|g${Cpui+t>k% zV3?R(3z7j5)k>>mCy4GlcPK{`g28)Q#E{&8ZtQqf-Ey1MxYLOzz?z@e@7_h_BZ0x~ zBg103)>W8#*}vEW<#@UuH`Rr}rE0BbW@{T9J7V#<&0FW_=zS&-0`KT~H&Xp;h#Z+d+#b<4X}ZIZ{^fpuFWvI%>W6#{8!?Lz9B$6r!{r@lvk!-k^1j>Z z#=#2fH9)@1Tjuq%fGsjqhC%mEhbcjhA($m% zp63NQ3nK8O`ppno;Q5Yb?TJ<5pDQVgJwTm%>t-G4LXo?+`o~+;k{uo|47^uP7NDt& z?(xI-6NA?>E8pA=2pM3i{}>v+lIN5!oKR5FqC}mQSK0-*)h*G5g@y6;YK?H<$Hx}v z;`bdN9RY`}*>%YtNJ;XEwwLO#0#ueQlluc!0D7drsU^TrflX5-ymQy2lP%#LHMjb8 z^vWTt;9#S*2Rx9EAqXsZLY+p+x*|+p1tM}ul*gPeuV~vYdw3^S?ejwv_N_{YJ4o1w zMholWx(eK%A(|AxicZi{26cQU4_w zkMV=FkiD5y{=Xd`)OlJ@h$e+1CEHKFy@|4Uy15svc|J;0S^f1J)YfbL4}N41vjUa% z!6LKVRvgG)HjpeJ8YtFeixC}PlaRRaCZa>r7jKk$l`^Qa^2D{2OQLM*{bJ@Zt(L&KeqJ?DSR`k&-Vgez!GlbKC4;R*w4yAPN@$=Qp7G>o>Scod16O z{BEP|&wx0`NKF64pp|?d)7#GQaQER4tVEO6(&ruS{#Q{7 zn$+w@6$=^AWZpbGZf?sBtkFSwtK*ONb7;DSOXbK}C-c>;yB2Y-*Ds(0z)bFvFSjpu zxw~PUoog7+gwkp;rsUN*ZQRK6ylUz1y(0H4iLP}vGpp;sj8A>W(eNlf`ih$pVGg=2~NosrIc|JrM8TbVZVs2HCqKsc(r zz`2;^OMnnghggvc+bdZatr4NmG5(*qDidCCO#gH%nx5WwLy_AZ*(JL-*GbqbDffZ} zzUdXmclA~5A0v>;;Hby}A^;8A-`XT`H$3*hwX))iMT22(2ydL}#Z=zoma_z>IGLZ@Kln9vH z;Yn-9?M=R_--Yr659?^IGUp#-3I1bDVGug{^v}n+K0mE_+HR?vo4rGf9llFMlR{ZY zYeed--arsN*^$`s5o_{{{25r>&Ygln!oz}^ugq;cLI&~~spaK$Y19!Z3A!}E<${GB zK0iM%lZBe8SLZSDj6Q6AdbHd$y0IawXb6DA-r2f0I$zF?P-xOgoc=o5?Jpqh^e^Ov z{Y{}5{iWJ0$uNRi8>)TJSp9yc-H%HDj`TlM9%`-l=PWcqN`M%4%HuyQgzA=Tz><_} z2j+No5R1L!zHP zhOjiZL)RzQ5)TT|?OB|JNP?AJ@&@kj9bl=P1Eam<6)W69Y+|mv;QinBPq1u#?uRN* zE~YdEL>fcJnnej2_#@F}tOuqjKEPCouZ%EhX!cb~%`QLdvJpwo8EUeqfj`gbae}@O z@0e}NbE-C0vC;V}6>l`CaLP8%tXI3lS2wgM6eBHcY*N$OuBfF9WEew~8LAjxlTuc& zzr*Xe{sKj7iH_%d5r4*=0FsNhsQFd{FV-uZ{g{s`Fm_}rE@H!r`yd*}PsIpoaVh8K zb>95>LXx_GL zXfY<3vy%kBAi&ozwd&}-dV=0{e0%f&E-V2yg!yM(7QYy5i6$n_4u?RZ4D`7kd+zO$ z+UtTRHdy6-Diq2^gj4V%+taFN;CW!;I`~N^F)g62&6P>cs$?hxvc5e6m|Fpe1YbQdTw7wR9R`%*9=UvsR&?HcD9@Nt3&8)n&_63r!404VtXeb1z z62exb;w6uYz$hmK5oswUr>B!;QGQo(G*LG%Czb!@1x+{g~qmd>OtC>%6R9? zUj_Rrj2agfJ^KA@v&!aFZOA9DnybT3)C%p`oTllKu5@{(7SS zSDbV<+^_W}Ov}B`diW!Kul(Wmf>r8cRBNWsF-S=!s{cA*+|~nElqkSsj!FiuSY6vS z+KWZ+wH`cO_E=b0_~SoMpf8ui(AvFI^(Y4HN2}%g0%U6W+W}@_p>`=SL;8)A>vKmN z8^{RPXOe4&sa9q_U1c;eH2!h2ZbqA%Q?OKRSI*5ZDH%|k6uUyF0hM?@C(iTC8B1T3 z94Zx~B?e;xWk*Yo0i+%(z)Fk5ORi z%Zm$3nk1W^#64`0e~X{;>5ZFNtWL?8DQdmKeU)hl-(qi|2H&1^6cbi0)lh{g01AQ2 zU&2uopYLm@h=Eg8Vl#*wLtsyjBJ^1%YaSQ@ z*ch~Jv&&TuDw50@Drmc<`>`dCh{Cv=x z&@>5Q0L7;gTjL}9qRdP{G7LpZwoa3qp?!w&Cy5-;BDt)PNo=3JlN!q($#Guw8a5mU z#||g|vTjdz?(h6N+D}yQzo@O$daD*iJkLybLx5+zUmll=WM%u`q03*&em3@PZp4fZ zR>L2>9=(%&P23kQeJ3e>Auru6IOg}Lf)q$46p15#l$0oYUhNSAXw{E;)YCRkpWA#i ze@dK#4%8`4e&-qoP?}pnK{cJ=qiDAX7i*(93$a-rim< zf&7_6r`;2xqQ<*3OR1jXXidQ08zD?>^4c}XJy(Gy3HHX@j!dWy%&tu}8A10XG9ltY92!x?RWjG`Glk}R`x(7C=ZP<-yyzMG00}(~mxB>*6 zQu7}Ak}8waT3al}SlKSe->LfWLWr#xM)2uJWU>Az%>!U z+R=yHtl?r1Eh2@f4&#b>jek?fFYaz8CX_?plDyyB{K|8n~}utfR<9h-pujk8-uMFqEy z6Oi(&)lI^!M`G47s_E1XXdz$QziwOkk)q$$d+!$x3_7;SXFb2PXw0SFpw~@<*mqMg zku)5i{sDk#VaLl&*V9dXQ1AK$yNkaKN0#2-hT|#AV$RV?<-=9l!-2`eMBBMY>h|~C zaRJIwbXhAoJ}|xt4$~T@D5IBxJ(;ZcmusBGqyR+H8eNu=t=;G2v+3Is1LKzkY}e`8 zlm*GhQ+ptEv>l0ZyYj?F3CTYfia`7sAhbE1ZL#Zqy8SWc6Gf5h8;InNcK4E}62zaK z+S>-BmnO!<#cA2j{!4e;PE)a=N`d$OJR|ljQ_Qp)6yS0B1OR?0g@`F=u`MmNnPmIh zC(k%`#&Xu~%rvWN+muUIWb?)miT@BE)6F(}w3D5+Hiamt4Yq9Ek?f?W(-tBtwaaFJ zc>e37b)U*=9F8aX_!n4|k=jII>E?z$_pZZ zTlL!K7GDuY>aC7FXUm^h%tJ(u;ALN{EYNHL)51d^!=${BxaqT1Z{7&XVM2tWOcB`{ zOX7BciY|4q7=igoKQwf87vE@Gh-AS3+~m&-sjF9Q@pTAR02k7l&wOL-^=!?%l9O?< z>ZQl=CV{MZSbAM&6G;gr^pneNY$bDSubf>o97OTKFYuv@{-*2hj#X+1XbX6q{|wr) zC7%ItVld%$nt=(@+}%4ia)KXNe5sW5#M~OLXN#!N1HgH0D{q1PT7Jh9Z||jl4Me7X zZi$_kK`yA(;21?PNO_J7Ts$E@HMGyU=|Tw2mG-^5n8Tuut@umb@D=>@*Ds$gC*yEv z2dsvazTTt%ed>Qg=;vYS?xq!VG0E^E2pq&fDjV>BES>cu-S7YZH`CqSG2L}^H^X7N zyL-Ahx*beUGwsNUneJ}WHN(`j@qNBN@9!Vrm*cvw=Oga-+Z`r=*w(G^)%QpUUIn}L zXvRaVS|=9k?a4b1MN0OX6f3vg0rw@{tSZv+5y^ZVK}Jq?T4W}%@#=VN<$}N~=B3u9 zQ3w7UnRh?G2Nl)_9#|Ln{{{qTkm7ZQ$WTwhGC5JVxZYq^TPF{=T6jSIIPrnX%+oQq zIQJb*D-*&9ID$6qyC-=pSTUVjoLhR3UR5=Li$^?G79g*UZN7-pASe8Oi&*xhD|5C61n0&9K1FhT6J1X#!sPcGgz#XhXy>@gQJlZmD%1>jPSs`)wgEp)p`BQx10bou_F} zqs9}zZ!a>7r zU%HTmASGmk977H0qp(TI$bb05ak%)!uwk7C)gP$R(8Jei(59^CRn4-5oDT;lz>XwB z1xS7nZBs}^6*#kWy>{X_=E}JCFQSb_+sXa?v6m;~pkz?%zJGyInqu@l_#I==#2M2d zlIimYL zi=@=QPR{}A(IAodtDH&4^LtLy;KZ{@wYZ-VTJ+L*d6LSpsNLtfOjk_`Ei zLV|*K``Liqhtf_!5Q4oE@lD=iJ1yl>b+YZeW0555l#s!9#7lbJR;Iy`R{}91cqcXF;qybo37zIJM`l^|; z$KI*Z=B05ybr9;*w8=>|Ks4^{9OW*{Zcw49JUk}s(^R_pFqe|^tm8^fAm`2<7m^^;0&`w zMyBg=tlBCA>a*D{y$tl9nz2IxVLIX1l8mIWwC$l&xZ&3z$Jy98=U&CGI}l1yvm#w8 zC_x$UmRn71*cJIZ#fEalHF<%~fzN@NxjD+YiZnL4DA)Mk33}7}vFhhj&Q~6Q5G3Uf zjq&oe7yBX7tlcakw4NIf3C1>}=8a1Zx`;rx`fpKh8;=?e1j0{=-qK@bE0$+?}^^81D z3DY2h8I+&^f(^ToSo*P@IbFIa*6ThZeQ%eJQ?$O>8_)E4EUN(Id3#ztDgQt0UQY+T z^e^@VEmgS8Lxm_<*;tJXPoZhs0xq-ie*h8nl((mnmNko0fQHIP8aE zJnSuzs5CrjB7kx?l|=rL!RngovxZ+L6DO%D93`&+L~pw1UE}*@vFdJ>GbwjP$RJe^ zQ;`0rZ&*3^o`w4cVdS5w{0Q>;3v&H_EntbaXXN`VsuIu2R>S7;tCyy(>*l>&fu&d9 zg+~6_28Z12TfXg)CgtY0JE=Ue1mAsYZis8$rXrSzG3FwO;3)Q=2pWCeiUvj^$w&C8 z3HqLh+m}-v)0ietf4p08R1^QVYI;;%-xW2a8Tt7KfD|`!+GV*;J3C|VA^>Da9H^)` zBfpu6I7FjOXxP5n=V*J6q+aT1#2LvF&ku~J-F^QookPEw27TPpZF9o%3o7`^ zOvp{V?R6(!vDCSF}Jx;-l^ zu_eh;kiX9l`Pa!O|8Yzy9G28<@$1*AMUjz>xl2;PW>1P{BO+8zAMPEZVmkhG274m< zU!U`orAG5T7ME`i@BMXa$~BnovrGbdypQKb(qE6xpL0#mj*mM=B#iGCKI$5O`iETI z^R}wGjw&Qpxn=2UB0f4~C;4Sh;q~M}YuKORJuXkQj0tylbbtv8Q)~+}CSKsVI1v0L z3JPn9%zb7%WyJ=)Z8sbCSm7dOs?@>5><*5^I9Y}rmaGqH&o@Cd_OE&f{NytRAiiYV=z&JC3IDLi< z;(Q)&HSyC+3#9R3pVn=9Jzul_9PMAGo3X(~D5YaNO@DPAUyN)#&gR0dM9wYUCdZId z(^cSoP}Hc^Sq<4x!&edOa(|>XeOmG%AtB$tkKLP4oBRTWFT)nrEA4t`$p)4#rPId$ z5>9i<-e7_)$E_>}$~99{E`{@yw}O9U8iTlfQ^O{N$1xznMy|Qu(Fdf|_`-ys9mO%U z=R?j{QL2}YWDO^$2}4S`I@g^!ooA7m&-Er1q4lTpJwxMEm@@ zpvaCXsl{bwiE1ZH*ZX(hRanI8zz2Q3$Z8ZoiZ9ai{D!{OcscvMBCj#Wb?mfQ@1}FE z-tr;8TBP-M8OgPhP1Oky5_>e!R@g zGu1PCnaS$;7w~#B{c;*onBB8r14%WJM`rFjYfJ-PWZGsUb7@HfoBr5KaqUEwuwL3y z1*=;E8fhxc2J_KgbobDA)--D58Oqsvwn;Q)r4^mYqoX8wT>IJsyFfUxbts;tP)K9p zhKTnLo6J45PWaffD4v#9=?5^=VSl!kGGXSJ5heNl&s9%klB-+Cd(#EH`~kWl8Et!JtwsHvHaq3|SKf)YM4 zQJCYYh+}#)(a;&>=EQmkjU6y}pZ=WOA6Z#6u;OGhkj{(Ow5x$tD$LFBqXR6Luu!5TKJlS2*|GZTKG~pS!hXq z+vn!y3c3AbM>nF}Sv)GR@b?IZJjg|2X0~DDdW5B#%YA_<;3%`Wp@t3LU!co1O5>&L z;lUmB(HT=0n^x_sr70s)p?Bm4exU0bAR%i4f!|~*%IRelE8hRxdT{>Z_Y^QnfR^2@ zyrZ`5eP6xA8rJxcWf4Euw;@x{SG#7GXX?~@bqJu6rI18KN|xV+Z4{TvvZ(30ayshN z?mcYQrj)# z<>UQZ*EGQ8=HgS-dM7n2k{Aux14c`-#$qE z`}wahq^(L#P??=)r9cvtdQ`#8L4O%6^;g$_m+k24El)H|0h_C_>-q6eeTR~=!!JS3Vv^~Dx>;wChu+I`*~ckO zEIx-}<3`G|%2~jbo}Xq1BXVN6*}J8v98GhJh{UImLTm@eOqS}`W0L4}>WoGQ!>&Om z+~D<}_kkO~uHV6ip8FkCbx@#l@c&^uBcpuQb@R+dgq#KsbZL zQfD>6TKyyu?i_CX335uYxN#2;4A5jZdSb^|PwxDU$>wIl6d@Es)I_zP-q(hDORzA` zpc_Nr77hMgkhM{}T78X@(%!`ZM;=Kkm8QwAO42~FwB7O*M#-7Q(NY3>i%ZB&6l>nH zGE`w9z3MqO1FFb{RVS_sSpz_D!Hq&u%OL(Z95TVbyrGP*pm!c&%vzn|ZB^v?R$7sq z)Yg%jI!^k7LN)ok=RCPsAhIJnBuc(CP1pCXNLUE10!^Ay&LI{*yr)Mzu1u7(=NYbJ zNWL^W^_avY@SnAVis$o0=cbI04<|+~h3M;UbmaOfR!E zU--T#)wr9T^Ncy#;u)sHeEK+Y5g!+;Wqy%g#w`hl@`*~Ur)w>RQPOz4*Dytbct8nt zBA6uFwsSQjdGvT=XgYTATSn0sIF}{0k8i-b#u8CHLkH8Q#9hZ&5|2kAcmK|VuS0K@ zH2vT9QAZ*RKI*}#OH3CUsCPz$A4>K z=!D%A^)(w+d+h$w^!I;c$|SAKjqc1 zoT|Tg3SD&=QS10haU{JaZK%|jR4#Flg=Y#bkBJxLwKl>KVl_diAs!|v7`^)@@h2M6`vGY-WH-H4A-OUZR^CfYj zU{gt$%4LZ13gwkL6ho!52H0{rw}-S8&Ipl;*dYI`JGcIuHkh`~^9`f;&@o-Ko>3lS zl8og?!gWO126H760a`G13-#C)lTNuTi$c!FbAKxxNbZ+X#yK2m$wd4;(IK+PG+B4@ z72?eu!u>(9+&e=x=$`X!#}mTI?>2uV5n5M>l0FqBQ}P6VkHYU(?9CIZ{$Se6jke@*^SldswdZ7Gs$CYm)QNr=_+An;RD32^m^z$yLGu6=fS5>|a(C z9L%KZf*S6GXXob#y6-2j1hA5lKGm7FJ(NAZF9p8ykD59`Z~m)6c^4g&=8G&V#4kF( z-!Z7`zZ2byyTq+Xd=n$pDsSnKg{#ay9} z_&bPtCd`;uKZ+07nd(!-vCA`%Xb|@1wYtun&&@3?3JhxH^OE1H`&EVCm_cmq-BT?U zO!tD$gE-?=Jez&IXIJK=RTM-_|E(?C+dG(@J>D=CaVfDc{EW&pw#v*%VS!Ho@FPqE zIO$rjl>yoe$*PNPY+~i&Qow(*JU_c8U3U06KbJ1flAc4Gp+Z2C8e+5ec!RHk5%@HF zel?JuoW6wHrJ~7Uh0^tw9!i=MeC881MD}8nVvYRNEO2-~|N4ByX4pu`3~%zN!F<~9 zFr`oS9*JDqDm&@)j2berNf_?om*mNa$?NmN#}4!4l9){08`kRyrekM!25|)}i}O7C0Q2x81JHm<4xbmyjV3H6FSC*UREP#fWm+VCI%&Ils1M8Bk{@DUFps;y;9_KwWa-8jnn96xAIeCC6E_oDhRQeM zZ+OEm{L)!RvxiF{9DX#dHCh;17Y^EGk7$DOu4ZSNIwW-*iXpSAt$>)<8Q zC{_+|q)T0zU}uB3=t$9aR6$QP-e1afwRG}AFM@Zjt*tTc$U6^wTIcg=ZtyrTP_>ZK z!_CznLPk_KQAMjQmBg0JNwOs#KCkSDD_mCH8tTS^p+iE0^>w8==zT8P}&-DmhB+6box@W_ZD(zu93yVXN6L>`aOh7Z4gnQW_@Dy1*Yx5Z}UF- zmxNDd;p;J0nwA`8$Q8KIp)$BH>L2laOs}N z3)HTX3ZZHC<#X%)rF{CKhMKmlsB+*a+q`Ey^u1lpYUkq_Xe!_^FeGEnAeB;%l1Ccc zp<^sj>CXb9vrC=l%hfoC+>QKT67B!hvEN=KK2k{njn=T_W=VzZ(b9AO5!FNd_lJAa zU=3ZO94Ky|EgP0s=(aw=PWNCut05}Y=|?6n0c~U-hJG4pwJL1cHB0C4YmR-1K6eUj zVr{Pvb8EAzWjaGjVdE=_ySwk_<80=odi`XbG`i?5Gk=#<3ywa6 z2pv?}k*}Z8C3n(T)YyRp8gE`PO6nL-PZ*o(WJ8S)0;4*4iB281To`@90vlM)*VfL( z-sYs0T~&4Ra?v#?zGQf-mo&nMa4*~#4TmmcfOz;I6=jI=y`oyi*DCM?>k@~ld>u72 zzudN#SKUBMz-?pjIDg>F4^CdUXJS8Q-V0;150P&Ikd>+x=}ITyw!%KtSv6b;9cdaA zm!f*J9$ze^&}z(hLWpzU>z&kN!lzEq9Ar!&NLEf|NK<^5}f$IQDquvd*ChYaXJSj6=bL+ZK~;#Ro4Q;{3|n1_%W4T6+0wNv*`~07K+#a9bzoo5>gSYTzjUeysRkQ%1+J7Z_}3b-E_;FFxe?Df;^rBsZ?d2tHZGnV1%igQV6% zl<-(ePob3WL0Z+a>aFFxMmDN14rV%y8zs`4Tnt8zEX|@>LOBq<5Z!79KGZ# z++&6h@Z$;BxaZbyCiLBwX0}2Q35HMCLqcIh9HBKcYjeuL0h{1VB~@`ix1Gw{>64VW z>%JC8eB#7D@*H>oekzwkv^$C3R`y)`6DKqsYNFq!pKAIiMd5bPj}Vb!J>+uYG3?5u zRA?b=7*WRL9>tWzr2DnTs3)(*aoKZcjzRpXW13e?NUqjM z9yP255vg=&mu~v>R5S+J6#?yuMi&`gjFyN zb#O5WMW^J1&ML~tD}L?0yudt1=Mni89cL81M9Rz%!#Wz@@D}VI*_*lq$3Uq{OkD32 z?M83)P*mfrY#0023=f4Cot|vz=2GSR{mDQ_U?q#U0L%oziCQ_e-26@B)NbA|iWImy z?Y(uL8Z04AL3v~_Zs?Xa!zzKmQ2^&ilaU2eu~L>ENM?_WL-KscAGmzu{DkCWUQxbC`esdnD~3m%S_YjsqoPpHB#Xu{ zra8d)O>WtrNu6X_qduGZzNILZdF+5mmr(z^ix_(%LuResX!Z1W#i}w$-ITzGLgDd| z5oD#baCl3t8m#?02L|i@Zy7a4Ejd|O6uUe1fe;7hw=_kWy#$q&LY)Ugp2>%Kg&N!z)> zF*Dd3$gohfD(Kc|Fzqsh!q>v|&Qmsvy%LCuG6m78;G*S`AroO-)SoDi>GIT5z_|8_ zEiCALr~=MLN{j3lMOZIv>)xlb$Rr+0`j`lkpr#+Ah>|5R=(zRVfVnZjnHX*uA*G{M zq&8Cq5bri#p>mCiOR!I!uECu1G!sfw|d5 z`8w#){%DCAenryvA6Nx};Yd^uEYso->>T+bs*cRkDiAe_DFyQeBF&X%P_hn=fgCZL z8iwDWo)Z`4L0U)MS~^`PKn_|I3EX)d9QUHgBnv3ih?LyM%`OJ=VE&;{Xz*SY!9WYD27QUMO zJ$202UG_2pLp6;4})l*nbw=6e!pAaS$ z3d?{E0jA&;HJlwb^M!z(QwrQU#T0A8vi>10I;!p|4{}%w>JI-D1eWc=(Mi(^u$mmw z-se$)hNBX5^}B7}(Pc%uwGNH(SAWjSDF#oT9-Fw|-&i&aw9K@52<_qRK`Vwkg3rYX z2?_5X+bFH?rt+J8TK8~O3^0&^z=eszBQeg!^0!_TH-$lYWwh&}SfQYr@oP10m>N)d2fm2^}< z+IpO_1iC!e)OLW2i`WFBOeeM=fO$W#ph9S~I55n?3WNT*xibsIvvUTe8erMRK@~gu z6Pw}kGtt*Ea{wuAkBylqJt%Aig0lipH`3)ra;UK>aE|PR@mYk?Z>b>OEo_$bkuoR> zY+}x5&cr8`IU0-A2#Q2C_TbJ2F)dOGrAXveoLV5BX>P%q4d+J=!P(D%3;EVRD>4d4 zOlfZI&v}vPj={wwr}^` z0TWainXz&epHWmGz&p=VR+u&`i`enk$;oaenQK{RXI6QpPIG1`_0%AM=E?zhBq++v zHa17ZouYjgBP58NH=cj`h+E=hks-X97LC*niw=MGM|qKQa>#6T>x|rs#UuaQj!B^Y zuc9bn>~7H8yvU#ueX98W%1HGud+hX~oGD4p#33Q0=mIH)GKQ!A+oe7%WqYdgkHtyd zzrg2t(?iI)c;8m~wHpGxF3(t50q-kD^j|2m5`SPW}IVyglDg&*P+qqMs>DSp-rC2UK17 zCR~?RNd<(tXBvqQm$Ms^00EvJPSB-WZ_*sYl+FJz1_wXJnT{?tEiO*ieZ*>Oo$=!s z;yPk1hc~~JbSLVX1jc4xx?@wa5&)GB3KCemy`i{VfI%km-<;${qvA+2F9$6Ds)imrX;&V7n@g&dv>qKDp;PvfLCREaq-ZDEV(yJ=mwpAdNS~cI4;gy1GCfkYK&kxPn)-tI)7`e&c1$JARI?G zA$>zm8_@uHmnD_LPh7?mAzR&RguSzUn9rC%Biv7e>>yzoN7ZMDde!V?{^qxOGGhITH_C{M{D zeGeC4D|X}Untt1x9(#5aFVCawJaVgx{p)7$+f+{e;*6mcd-T) zRVe%eO95QwuR^uO_hg6!s# zudmnd{E*A6!iW8%Kd%dGT^}sj;Xc7LBhn@4b0D0VY!4X+k-irWn7<-$Ie$BxjM81_ul}%Lu!jZ^>~PRENZI0M!>5R}N=0I>Mo+D%;Hwm^`+n z=*!1Ybv*P?f*QSz@vD!HRT)It+4)7V&Ma`_z~6hOji7N7D$1hFr5R}p)g?eB(g?O( zZSrn)`8fuO&wALm{exvD-*-#xr#@gbs;V zL?52fL@)0F>Lszcc~OF=S$8izCC>{Mc&EF!9MO?tP@0Wp@!`1b@&1Ijj z|0^6^Gk?DW7IFWOM-#^SnHd<=_5?x9ncrR+xAHrgQ#i< zf#LZ()<(Utc(l{i*8FwXu53Up7hyf_Usa08j6aWN{j!T!SX7HYySb=rEe=tHq|`CK z>#&Z9!PYhA{17Sm%?*A%^MdL4vd?A}JJy|2r6EcQOW7XP9g~@Vi1Y$AH^@ysB%)9Y`EN&j2q()5q(kkmfr?`x9-R&`JRdCsYhSlQOM|2F6{R_w8_J_k< z4NY=tmmyk)kvwToG-@#S*tI8LOEVqB%FZK4v9A|$t$3a~r=^0cQ*R=pPZ==qv6pCY6*5WQiLbiO9M` zp^VZT=e|VSEXxYv$1G)RLHPhLl9qxfi<}+6$Qx52dpsj>Xha-ZhRH_EEGdsl7fz$@ zK!s?fzU{4-%kK>7?V%;FYgr<8oP~>=dES4L7&xpI@jHD=_S|@JY!s04O<{p+vgId} zj>O7E3>ys=L+@vqD*DI)zleZbKf@wzMDh!PSPM-ic%_<}!LF8hUl|!d%O6Eb=?@dU*KE(jXM>U@dcOrAu!CNEb6kw zi5Ff`3J52R?B5phx<`h9h7Z{dnf9-IaX8S%7D*M7@^`9D|6xY_W8@w}q>NAITC(Vt z{n~3gi<;--Yu`YRoHeJx5?6j0xYPFlTNV^(%`@F>>oR4w-aMWD{+|vfMC|_x3IA&b zBEl@4=gDF5CnD3=-w~ZELR9t?scFT54OP@4v#uDR)IE|NIkdCIk~yMf6Dp?EMiSxTTI`(*c~KVx|&%N92>pqltOez z`|AO$E_UeqtY`W{Ikr)~42-JGZYX1cusqqF?moX*7-pCPiu#8^Ad0~Ac$Yy~IKa-y zzStle%UQaXLNz%dl@x7Ci$ChPL*M`DapVAv812D=?qSG=1Ks$r@8RvOX(tgU!+`-t zB6SPpkr==2jAEp=s=E5z!e-y@DO*OF$4Cb#LdCq%z(WlH&CJ-5Xg(@3WJU_M*oK%6#r28+GHp!QcbZ6bY`HwAzqTo_YllI?IbXLAkqjSwGFKWy_KCa@*Lx~11xO2l53dV|41is?#8@&h( zRCd}@uAN)sVZEIc9qMNK3jDdM6uir~+V+7=2p6gE8!_$sL)n}JKHr<|;JLMY5X?K1 zsguTbxv#zP-O1LE9H&d~x>&etKbayMmBUf0jY^O_W}3iS?In+*Rd+z3#A|gG4-o%| zJjcojNRUdwJK0k#74!6ZS&^ZNtfg7|d$izTyKc%lvMd)A;NT?BJ!1#aRsNf=G1kU zj)Gj5c9eAC@*x}F%d#WigAw7JJ{EA>UsI7%}U%8ve-o=-!1w=XzGD!hzA-@~grB zI=%O-N^|AWR1YtO&u3dfr<;naU4KdGz>(L;I5=`}ReV$W2{6z>4AgeIp!R3bouOV& zpir)W^WlC~2@^@GnWpA|qbs?2pi8E!_#;!X=V6UA^1|r;Pgb&x~M;jjxRgW_<)wuvV$*FRk~l@mFW( z5%29+&6Br#Q(-3ahiTD3WUVni3^DA>4xCPi9+W|x?i=vY-nTn4nzFPVA?E&Cn_b*tU!MpYv+rjNMl5)b%OhF9*D?#u*xByfDGG$3g4_ zE$n@rVI~tGTBX?xh}D7HlL-sGCQLz2eOIqBK#h>90V--BPPow{(lIfJCQrHGa6(i4 zlA*$!$`ZYR!@-Jp!C|FdicChZBjcKpM*A!rHQETYGoTNatUoHu zcgZ!`q|1lP|K5JO_~X+PQTUW?YVnlhxYB%L;NXsC`!q~UDU=+?r?p2H_!_WvxWfq; zE7b#|2ajoX^~@8cMl{IHYI;SePNCvNJ#{q}B1xWhWg~+*xtJ!yiGmx_MOE2xN`n_8 z2Xg@XKDfVJEjP*A%L{!m8W2?iuX=gpw0PwSum=>Bo1K|i2|9n>R(LTtH*XfA@?(3; zcU0D2g1t!_*;|ph;7^)s>Fv7J+wB^pjvV`LGEvQ_-8anBc8Uii+_!(qcRkOmnmkE! z6~6U&wsko4Pmrqeu6LLs_-Sesxh88J^T)2`_^YM7|sZz ztn+lH+=~1q|JoPKM$>%yu+u7UZ7r?DFv$aFPOJ&G0ROnn@ANxT?}{#|0LVwaNtxxi zmL=%`ZV1y6W@yZ)53|8I555!8=;IZU7{A)I-rkwV3QRg9Yr9N8|Hn)?rc!E8l6C)P zu^+J$inWS-%qMNIwzh6}@(aD~O!2Ey;`I?nlkKv=SVknQLOqH+@~`4?FSY z3_#!$Y)y8JCJN*-4U;A)=#Y`9s?_?ceH^r4>Q-LZkgNgfzNF!BT3m!bKfgHIdx1YK zdP7=Dn2%O#CSA$a%dR2ZC#>;dhl|({6G`75N1obBJRw;eodG;V?Ip0noKRhqk0PN* z(=b&MDQQm-h1w*hOo+a$8Mze4ce9V?_mx9?L^!v&Yzh?{-Y&W252|Gfy_)^Rk$!hi z{GUx5m$mL_g7I&^3_Ie>lMZ~(XWa|XvoSeNnG&!j!5sYB#<)6i*rc$LR$5=DTj_k2 zckNotUQkA=qy9S+_$#5+^z$yPPYZMD+FAwve+XXszdy-*%i@QHoQuaL3V9oQ;%x=) z^7mY>2r_5uH+$A>H6>#O-@p4$1iOPI9$m$@bLq6&1^Ms0uW&%>x4*7_u}cbk4jabE}9ElzHxeBgx&@Yx7vq#D@-BH(iu`&j?0_P?#S zZPovY-UT)7bB2IWh<%Zsn={wVB1=B;_a*OkyWgCT99VLN=fLpexkXxC4|{xG@L{}w zZ%3&b4N6LyqNr1+Kb$#fxYA`#*HSumF@Wt(e);1rBqnG2TDLIZb5?vEJrXZlorio{CkgtfNR7>9Xp>a%Q5lMjT0i1^v97dg z2M3?P^h*s?9yad^x3^w*&S5q(f>aMJrU!?)=eAtu0o^ctv947z(t~XY zcb`l6&jb0L$<1wxf;9hE-H`vUe8}i zBF}#8rA|sb!GjTImE<_+r?`k*si&SL>`b{KKnT60KTBWFXm{ux5-~~7L|-5J$#UKM z8!kZ+GM5&Jm6H=b&JWs${+E5H96>eVxwdcUT z)d~j`=upRZ4OIH&+%1pAGSmcG(+^}g2RX3odkkSwczx%^ng}q`{M(Y%c zZKayvrl+oU4{PdxKc~~cF=0v@*foy3!z}y6q)M$V9Q}P|PcHHX&KALbadxrtVLM=J zuukmhSid6^Be$-s))QfHh|s2DcqBs@05s$0cXx*k1oM0Sc_+#p@Pv%?iG$D&Z7g-OIuPwSNaT>L9PK}JSro#-TWrQAS0Uch4A%QA_OY7e7dh2{IDz~ zaGf|@aCB|z8?ysb@H@(XdN{uO9{-6oV71+xH`*kK!q8;*d4|4i!yRd(JBVDuBc|in z{X;=_?@Q3rN=p!{f~im>FQK^{@>nP9K)#u;*OG~KYRaHV9ua6qNeNajtcOUKKfH#2 zH1^Z|$oceVV^;pUw@lMO`OS&F^Koy0REt3gP`)OvdsqDk^GsA1{kM_3T(kPu!O(F% z20GWhTA28MH=*-?14T9MS{>HF7f;j2ESM+nh6$~)4%$iJn_8tEx1pJoteQV(hi9%K ztVp+}>H#Wf`4k(zj`l8&6+qt=C~jlpf~W=C-;1$m1e_z;VQ5E{3u8v#k4S^h=)O;N zgpEIMkGgX6tW4Lxj!ic@EWYo#s6BUom_xD9#fbJkif~r&$Y`PNlSVuqSTu7%K9725 z$W-|WkZEdw8=z3;6CfMn8@LN4JKzWSi=(!N6tXgZo(TTAFBUmR~QlMA2ujK{y}!yFhglpB@+ea{^I zCbH|R#{b1=0S)$wZMH;qA^$9&h6a#Qnhr3>3=$jfu$dP3KIiL?cp4XLw)n zenvUEFd2!NA2$}tgFPLQjCsxmR&KYL1jB`4u2YcQGY>sA{J2OmqKB1Nay3^fT0-7& zDt7nVsG?IT<$+6=qFPzWet&97a@({_lo@L{#?h?}qA@Lv?6+Kjc@hb3`ZEgamafc1 zCeRfJhP5Ug&{IwoboL%mzR*4dCheb--jmKxhBc<)9JgJ|ymAwGKD8P@)nBs}7qkK=Zc`e1_<{uJ-tiR|7gxI_a4Izn#a@ z`ajXNpr%refY{?NpI}=L|KdyKgW3yR8c}d5$Z~{v^zmc2(?(-|a5cB6_*BwHK>JgY2*`JvTH>Lu(5(N_ zIq*hA{W9V_Fn@%d_EW+&hX^u6rs@hc+u0%#-}m@(HH`CTT)f-GJY2Fg+J9~pcpPpB zC>e%mIe#iZ?$JTcpKj4TfCk}?`k|7g*Ji^YxaG_H?;R0IA*J=%H~xvq30S+{Th>_X ziLxK@__@lbYd!Iomnb=;xg$i%HOAjFqba`?78F?jK)+dg$B|$gVsT!V$R|i}Aq@W~u@Sk*U9Xhr7t?g#E*uy^ zUKy2GR4q}>X}u}7JWBpg$b}ST$Sz4U<}I<+8%F=PCW_iXhZ~qt)jU=G^As&TN-cUB&Q->{-%lwAQjm&ThR>mvsweA^0xF%_ z%frByph@K!=X#@iOSp-$+n%Di%>Gp0iAlkllVez^?YQsB;Nf1dwDkXII?J#q%B|+niZdp>USRA@r6y{XFZh+t_ooOq$q4_4xY1GFi2$4Za6XW z{+?Amgc8Dm<#2JqBzhjxSp5f(Pb!iX3v>6Szn7{$gzH}6^rku|Fd`@7SSN9&gW*c^@n8SF2eAL|MYLDOnl0e+Z$T+r zKr6x#Ctm%B_+2NNbQIuX>bzLTJZ;_4dr+?^RAx$uz0^VmX=+z|r;tx@yuY9~g_@?N zryDsMW$oY41kwhk6?BhOwg#Nz;D6nmGlt$>J?n2>r{+p#_KB%Yu*qqV_*K-&pya{y z0+cnO4qBusfp28+G{96j(k#Mo#$;d1;919m4SbreQ}7}X6CfCs!k|f&ErsFEdo-Sg zy6NfZp8HE^JdNRAgkFDf(eH0$dhh3f$Qemx>?|ZQUaGbE@K~`FGmkUO z%od~&>mUIR<>Y3LNALaD`)*#s$_XAoco(YI3d8oKKu-^>=6mt7%1nFG@8Q)q%juX& z8A6JsS(v-Q5V?3bpi7{BQ?DumJ&*7Gn>JUv-~@YExqHap*y(s4%jM>rj3q>ofpit8 zf0KPMaKptlq)$PBvMFi;P(yMvEhPV166#-_E>j;dBf*;{OySow)=YH(C27-%3f^H= z+d5g^mT5Uh}_)1c5XijuQb@v6GAK1&jjBNBRLAb3{&)&Vc5JDsC_i<- z_sR$j1JmpzeTQ3CR@>L%0h@ZV8&RZ|aW=+gYPKxOfhB*oV zSSrv{KQ&Lzbtd1oyex3v&wK2rnu2`y(=xJ3>M+nTfqApb3R-k@wCXkWf6X`*~fMjS;1quMuxyz?kzxa2aeF!v*vo?+XNZLtr? z-P7&bb$Lf7F^T)R_&{%7M#GJ9?p`aw5$xv0IOmw|*o<4l=+2IrGtd-db$gbtt}P+( zMSp@NA~-D8??CQVzI0QF*rZ&J#{Dt)c2GJ1C4L8kbl!eu{e$&dO+@3m z3pXjhO=r6O4@p^EtFSP!;C>D%*C z{CUmkS)+1e;K~Os6cy+>dpEHXb)~sE`}DeAZ)BO`sHD!{TTe_KHz6$F9p?7?F}q(X zfiYCmIPU&<&6Ar2zb1Wy#Y)O*@L?(;8?^X>RvNf)G|b{m+COjw;lFxjHRhp`$YlJ0 z;Xoov;e&3ulqZZ)n6(;^060i0`BnV@N-QrQnv7f-r+J|mOBuH&?IeVTXUmmxs1FUk z)!_oe)p|uHPualvd)6g%{9^l3X?l5nd=f_IcNy;Y-NG?sLC-5#hu!pY{)5C^23x6xzaoPP$xnUI zj?p{~N@#^o=~7i|WV~FDTJ#s>(5nFNyw1TwLw2la`>TVG_W0^9b)2G~!tF!kppV2^ z8GGcn?a4POCRrd~w#8Y1Ya0t=mSx$NHnY(e$a2xtrd>Ir+J@!Ks!#b}{T zT|NH35PS*$x6x+p1#E1*YoRvY>quAZnc)zlBj*c_h6hYGC(}LKy|Ld$t%XmIOz_L$&Jv#PXJ^Cl)Z9JxtWxK4eY_j6qNR;*KzNq}t<(YcwS-Wy*}$ zFwKOyROm`DzIC}-P^l4`G6G@R*~v6iV?Y$Ustr z4O#0srh3JCzy8ZJq5I9@S$?90qaaukH&!YfREy0VbQ@>$ewx+rQkq7$7e6sRNGukq z;tg`o#C!;e0g#veoH(ozt7;f(V8eu?49=qouHCk5@9}`C$%sBr;%}4_XKevVX~kvqFyP5L>6iM||2Y3Za<6I$@u z=?uJA5)sc!Gn*U62boQNrC=6TeCKY!bmge^Lj=_u%b{?OMQD~axSHUM+<0f_>G2g7 zN+$Xs*zxMsF)+rzK6IrLEqZ@6;dtCPu=qDGQ~z#n!{9RHLtQe@fMQOky8?S^aeZNM zVIgWQx9aXJ?(ONuIJw(uZ;^twW>&7Dw{t+rluSS4e$!dImrVBV@%<$ehNLkxpI%lgN3 zkCj&uSkwwm!M^2X0Tvp^o8vct6q-Tb9N>FpXv(QqLV6Akh)fcL;_4U3JfATDQi#l1 zjb21BZa-0j?NW#vtWzAzeg=b|$_a;$R}+gJBMUPz1imCexgPTa0$iw*2x$FBXq@KHgB6Q2oNYXACbMnH#xuF_g?AKgsAsv?d&w7Js(+x4^f431YP+@cZam4 zB}C_>9xwRrgb6Rm3Tho6RC)R*f;*+tOtc%gB3|^hw;1HKjaa7-$V+$sqm2v^%USr? zEm)959mEDUPQc3x9?7i2nfgis^EXY#&{z-k?-oEAj`xg=Lp8QqjPvT3 zvsW=fo)@j6LdW#S#ykR)-iDXXg>_<~oFJ|$n=D>rMr_%i*aetbDB_=yr{wliQizC& zi%S1yo}TLI`8*^4=aBDIOPz!$kK*6KI9^akG%EKJbDyMu7vX44j)--Az$6KM54!|P zcm$8^?=ro+(4J5=RA%_!Qvw4eGiLXqFJm1hrnW(%cWt5uXY24$@)MVSFMnVAcQ-%& za`unbZUBlE2FF4M!IW|XSD>aZAx^ojF!1&cXukibjz@;HEazN@KUD8J^Vf*?7AQ$E zDL;+w9)oCi^4*!6&Q9!%EiH58Qr~@TnshGAkE{Ls%P72_9ZwZGG$3x~Bis?aN}o9b zNL*i^l7Gz`t^CAh_ZLVLf!j)pJ%)Mr0%$w`tpBCP_LZIEeEDd?V3?cilV`?~miX?c zKJP%L-Y>j@JgZ(WPn|L4+WZ}A8~+vUzJB^&i)ZZHIFXk=d+tV)!?oue5JT~v`@MNd z6}us{Xs^!At@^fQ#lqT}K?SwMx&I%sh^G}f(AZkQBHvrtc%`WCW0tQGOJGP!Rf$p# zJH8Q2ATh*84Nm$f!`nxc_^cJfRM~V!er7t8^66=u@`?KL(q#R9+|Ay>J}W&u&tT*{ zsHdQcn0O7xkyWR@v7iKF@^g77PWQx*p7#R+_7s^#oAiqB)6kdR1*6-hsu6(r7bmpO z+CqD0(=sx}n3#A8(us5X3KtPDR!WS@&=KFop zaOY8#!eRU-z^sd1TWiX(GgHd8@aVkBdWA=yo4lTM#f6> z%R^=}h-=JD^p#2#{@FYkR|>Fbh~Zh3Ik*GTm96qIYeR}4ahB*F-Os_att~Bc(%uo+ z??U@B5jbch=9NPdG!D1Hh&{=5?4|!O&|PSvoegJb$cZ(?se{pHVQggNOwhNM;ZARD znF97Wrcnu7GCz(}*PM`Yp_i64#%VGz7Bz9&hdV(hF8eBl!A2>QEC}lu%!KbkHQQ{t zrD7?}Z0yji)Y+wEhtl7NGV!G_?V{Qjs%ZYUo^hf_!flr{W|PUdxI*K&TzP%a$KgkQ znX`K(ZLsNhcZ8VhwRw~Uy5NfbGO+$h$o!?r%ZNBWxqlV)bxyPUQBW-ILe;{$1<3KQ>kFcqOyQbbK_wA3M|G}_xeNH^@j zWLu}#Dio93-UBrgQkIYgiT0*ue8bE4aa9PYc2^ocXy@2jTW0|#PR{=fZ(rU1=d;Kx z{SDD=`GV}q$KUu{SE$kHZt_T;V?6NOdc8UWOg+KtWy>&3*z@^)#l@RxI&^GC#jH(k zERo*PRW<`n77b}!DNC^?yfd#AMxG0CT+3nw3t#6^4Q-1^WAMW+HTS#rGBOJ4Y zox_?-sM*mm6AD5OOJvkse_)Uo8D8ckqkEvzcYbF3HEK&gDcBDoPrbx(f1BR6^<2@E(6Z?t?pQQEY9CFlYAsP_Kmywbdg04e z)m85ug}V9%E;opv1b{CJIo`O-IB(c zr}>4R2K^ScP6`hONXRWMkfnMnLOGe?4ZnZfWIiVtbxDgnZ_wy*)PoKlz$W40;TCZT zpbhEz6l|HHhiEGc8yaEmz2C+Y=UOTde^!XN zdtE}2NeQVT+;IkB9YKMYtJCO& z92h?UNJ*$G2eEI6D)$cArzg~5_Nv#6G3WYv94Ube?acJt^j{_QLZm#q-#q^g<`|XG z)%RAZ>2CXnws-qI9dtlLo)<3cUSs{_th^{=g>T^E=YK$FOK1zm?Z+zCRvmk6>grt* zGDrwHFsDV`!_D-31M6yfE7l2aTnU&-VHG-t7>!a`KOgv5F;gRgNkwo1|@C9=G zo=w)T8{D|ux44`Vd)zJF#uD;6FpvMyg4Zn-~9u8?91|pd)EUfbK z^1{UOxnEGRBdC;cmMqbJ-_5sJ?|7IxGjW8v`AndmN~oQ9CHa2ivL(aX{|=q>9+`j z#Y3}i+cG~0-CmecK9Uhintk3UCTkiT-1I17luYAWk&@_}s z)*_4yHW(OY(-TZF$M>&adb>oO)GZL%XNVgshY>C(_RfC2`$-tSC)MLo_x5L;{J6r* zs@l)C!tC>EVr$t&n6&$OFk$m~zxKhwL6ORb#3J71mX-7zO6Z}P{$@(1Z4VmYwK zBZ8x(6NAFzVbfQapk&5N@3i%P=dG!S1gK?1C}=Is^xT}R5R;QaDMg=|$FFiFEd14I zde~4qH{TeOzfa@_<;An~FAPhcY0l4l!P83k?oU^eFp;`g zLFieSK85THhv-NYENSF1bix5?W%Gn*@CM4?k1^=r(C9$FIA@W`Ll~glHXU?z_Cv5W zOIw>FO}6-D&I8C^97wIfC;Xd)syGD)S)uo6MzWP=T6X?o9JI*Fb!uTQis}oil9LzV z3Av9n`OY4`Y4jl9M_djBnG8n{`!La`o><^UZ0|gKy6M>M5q-R@t8@NZG7pRpdsEvl zsBYV?ZRg7lc6#IUfu!qF>y5U+`36^r_OgK23!MJrcw>ot^yTH57t-U6ojB9b^eA3+ z%C1^Ye?LufGfR&gzGP8~`_;l8uBYuMwu;%r+uNJLoammZOLGX_%t@)# zzbk-~9K%KvESII$doP^a%PAllIZkM9b=ujI)E^Sk861xbCF4`j(qX#1Q&n>McdW&( zL$-Br?#uE`eEUN;N)-K0fqPbY0_%QonDHlj2lKtV+2dhg{R;zn&j0YI#{awiwg3P6 zw>n`zn-Q9swaB9zY4Or*v!u5p^Ge@3*HZs*_Oq}$@wB47v~jQ>lyxmXA%EFMDcnUG z8Z)^*KfKxZ*|fO$Bj4RpHWvSco>&1*8E=6FhCkW|wQ1_YFL_~+i1W5O6IQXJ{qd<3 zX5V3Cye#G?ho{zir(PSwE=ZV;|0G0n5JJUJke$2|50TAafbp8}wKI6b;)vX$}z-Mu%_QLG`iOZ%=HAx)5O4ADVj0PjhrPPB6Zy03%U~6EF z;J_>hUeA}_P;;*5V@sFB4F{sSOoN)HosN>nGDgKv70962$d~{g70GvBeARbAmyJ!m z3FMAr$0i%XCS`6J2o~wrdJjIS{#8!Bf0}vYu=WC9=TZseB2ro>hwM}I1A*4owo)Z= z&&Z-1%KEyc>K^Cy;(&bkejzIM+NlQv>Av&PHwB#MU+HtkEOOb*;dGnbSnD{)(tbB) z=Wv$oHodw!6j|9ip8oQlr>@Ta-{_lL(YtTJ@11fO_Brzw8do#duk~LVrfE?rY@U_2 zF^s=hg?p|So*)w(I=BNhw{E7aU|pbzKH`Khrn+w)ZO|w{QF6Wn)5JQl;EA~h<5OGh z-~v+ZUrbUN5Sqg-Qb$?CnWXcruLOkq9yiU!nvJf2lzuTw@@wxZI9>Ff!>`+_vSWP6 z*bL-nLG>h`)i)GHaaNlFN15?&x85gyj<0@BIyMiHGo6pXhI(H;_;}~n=zdJ+Y ze>+10g*wQoK~3&>ZCsti881>=>dM)5W?5(Zo=~rg4KOp`LP%s!%<+vs0A|~wA~W~X zbg0L3I%OQg47yIs=-sY!)uelDVw}T#r~gOh5*b*(aqWsVbGIS>Au&mIL4I502d^8) z<3$I-<;Ye09zBt(8OrUpGapf;8_I(G+R#*eQQ7*|AN5OeHU><+0ty)nva_@&14yWyC4dyR^^!IHNBLWWU z5m;FVIhX*I8IPfqOI_oibKws*k6#4?nds&x_>e<`-zwBrKP6J8aDJdJVQ?U>lajr# zX!OV_SYk}Cbl%4SLheD%Ea~_EqUqV68ppRJNU}8hO_b%3H0?3XbbrV2rG)G=0OkMK z-}Pq-io0!oVq(g@XVH6GU?VpR3kD@oPi&)n>z)^~PS|8Y!5I5^=C|RsRDJYj?86D( z#aL1VJpnZI@c6*c^ngo63Xc@>l|^$rN`X0*)%*HrWAFBL?M#`i;Ay$?mEo-IED+Fi zw!`Wf@2=o;%?zK|j8%qW9?y^F2}1i>5Lth+iF;NR3ZeDSlYWeoK9dbJ_Qae8=z}cF`_B(H+ zEEe{8t0P+o5#NfRMg+IHNt>WN3RV$8R+cR+Yz+-vbC_=ME&v*uFp%#)j3$=`Nj^1M zLyty}=SVSUfG?VcrW~NWehT|TF(o6v9mE)53)Q|md36T*V9bMppU7q;tOXe z3gO3y#%Q$NXgNvt7SX2!|JPe3^*_n;{;);4RFIk(!YN-X>l+md1-mnri~BS?VLlGP>AHM-f^@VP{##lf2mAK@R>_lFkL#PI!1+ zFLK=4VkP)57W{4<7&x-P0)#c({rOXQA7q*0;0n9#sSA2#QtM-b_nFSf=EY%!Z>P;x z;thcKt~@$TXdF01AsyY7jvjx#*gZEHEv#zDo_#k4&QfXTgXZV?c>-%8u%|LLj2(uY zJ@KRT7eJ z`QfW88o!rnC79bQEY;bS=e+dwn7?`JVFl!J%BBBw!+-z4-!5G$8*bFM*A=OglVuD& zU8`$w+z|%`TuaH5*dS|zEf|FNZ$f_qY zOBYuyi;8mKX_(`gg@41BF;?W7B=_mKcoMDW%7xc{q${u$`spk$gAIs*^jG2H2`oW2 z>k4Bli#4z|4G0Md^Lys-%f#~DG+Xl9q`FsuF9xD{Z4FbZt7TZ~Ns1M-_PjP8+5K*@ zUOVH(2Zjcs-Saww!DvTt-m`xVhVZ&+3f`K0l|`Ttra1fKefNBZLwUD3A-VC;&)iOukQII0Rbq@CYl8Ow2>v3~}479p$$BB$e2*6`6Bo^PXuubE*eqHfWr zAs->21Z-^?GVJd!)k8@Xb34Kk5&!@&rx5qZwn{QYrH6S8s9r+X-IE*FpVfh{ajtI? z-4)iaecyH4J~6vW=jC=P$t}7-JI~+W$iSvelN?c4k;&`F3Q?6T592v~$->WqVq>b#z-jFg6#hoBC zgMW}A%~K~y&`fc`$q&A}FU!#g$}Js;7fkOH)>*Xvf=ENY)!OOlPsbx4JQj)h)|r?V zQQ8b!FFzU6kepFWx}~MX{Z{D-fwb{-%TDB$bK=vrOP!v?fPfyzImo1~bg{vTKQWP8 zK3aj=W^r=!lVov$n6{UY&xi)@9*-c4GD|WO0qNm^&S$e*mX^o)$>lkCrv9R00oMz3 zKN!+$%zz)vrok4{gCq)bI$rhp;Y6$IeQ}9pe_9V+Z2gsaveGy`R~>a8Z^#hxj(H;4 zV?ldkIQ>1;<0U!26>4KwSXrByFBOyDYT}_!O8KxE+GM)mf+uSeg{gFT<;3A&YY@iW zgQf$iLr#~n@}EKEJ8MZ{)Ds%+(SH!cIE3S>ysO{1`*5S@#;Ul#RBa_X(RwFnk?}K$ z@f?%dsK7 zp+&XF%DfE+)UkOu^O+j*A6STc$^T#>AyFz10csZ*)P2zw5DRsc5vK8(wV8qAV>-eK ztdI4|ruN?>BE$jIayB9Q(yRKZ?d4Yb(P-Y$; zgKXom3|{9tS1w*aLf7y^nrwU?bkUFVpp+w)W`Rl3n&WlW92@JiPi-19eqPbI*2nQY zU1@)&Ygb%Y5^c;Fvm+6K7suLL!1qP)E#xP+ehX3-?=Bh+uVvg)Z&Dbwm6ju@m3DPH z5x>xM%bwVywO-l~XZj0tcElRWN8X8{n{spSbt+*xv^_*7Yt~} z+EZkWEY~2QezCN?v%Y&zqlO@72tPy-eY^GJNcWByMVJMRo|U?a$T42RTt=ldWb7Ta zXgUi?XFE{~pGeTGu%ifa)Gy>%TzrMIvkBD-&-VkvO}? z_MAp6Ec11{(H-_O0pM1;6!_N%rF>8LiPKBY8*}gBVtrqQ(hfi09IuYrz4Y5v+xD^C z=>1K7@psZ`0d)=zA~aw7%+2%<;XBmCp?4e$+NzGTWg1z>- zN!aiqy)eWkv!R`Ap!whb-$!@<2i=K@!n>%611jT<-Czp>6_j$?2Aie+>25qT#azil zFlm%>^71D;%6kP&N`a9DiWgL*oANDj(c6*#3jHpsYgeCBgf#zj18s)Z zOCCM~P8keiaCt=ns<8q{7%e=8MxOVJro$Y~cY6>Hn+QQHSJ#QH1aehD(3^VBcPEGv zIG99at)1&@UWccU{=KQsNde;(45s^xC2Vt5dQ@t?C6{I}WZSkwh7hR`b93u{Po=X9 zksR*_l-9)K#dbuq5B0qWr15cV-%5ciI|CraaqA?{#Bg^SS-|Y=(BuJ=!{=%zC_76sSL3=PlB)3xIwlsE zu)TjwjNZB<^n>tow^f#aUyR#^7hxfowzBnwg;6Pcw_)Y7u6Sp+| z)K^ToevxXbGAWC}F9Aj$O>L{YPszQSeQy34mktUb6q4)@rj6~_V-4dUq{I1nf2 z?%s*&LkW$;rOmUnl86VW>9!KT4H})sKk|#nG80nMj{Tdn`eNnu(Q|+3%vvcLpg>xC zeu((B{QozR`~PjClrmrweLQToEPTK;o6&^wKnNFW9NvG3js`kX89XC42y$)Xn5C$N zbPT*(@_&9R&pusl+z|r!7S)mzfP-eb6LNipm1S&e8lynU_mPjUs~HX6*{$Jg`6z8r zzK)ETc>(*>>}t0Lg>PK0@5ZOr+cr@JZ7U=t(M#c2zoQi(9S8ReF<+e4JyV%w|2KQ^ zyE197Iy@p3vUi6)ZwIz20;Xzexw}yu{?(~xs0e25E8_389AE=8Ho(cObE+p zdm#Z5^ZW)ilWLW&ttQhWNkBd~o+n;;5#I5N1i*mi_ZcpN;pCFJ<{-gL!&8g1o!ctW z=Tj&E`=Mu>%>jMnaoNH;T;{!0-sJH0!bWd}RYlKX+Us5JYs3J>D?_!W7$NF`Ccw{@ zmaY0RLv0?@YZRC*BdJBDO{KQz%$&{}=@B?fBZf32=-7t1RkP_4nQ9jsaJZ($N55=7EJLg(BUhC-wr)%hY#GiSed1ZA>PNY)a10^lD`C0Qz2ZUB~%^$A~u2AXw&oS{o1@n|g^nZo47L@wi9udm8ZT)IRk< zo3k7~3e~4iK>dtkhOe^Md{WT}y8(QsO={nFT3qPBm(W~~A9AS=Q|!UgG-{iF+z-Xu z>>55Kv%r*BlW%{ba>|wPrX~HlX?-4Vtn$5v>=zX+HoFKxy8m4tl_ZYP)XQ@*zjNV=vhMG2i)K{U6gsXpxHtyr$dX!E+n5|&n2^YMkVJejH6!Gl4<-vt$P#i( z0rEuR3qrz&P#_tZCF-Te>urfhB7UN!>J{JTTIxr~#%gUY1qB8Fx}Wx?dK|Fo7yT_x zE>ejBQ5sI8^5Glg%}ydSjbrKbLSO~RTZ8zHW%@ILNhlVUlY$fD*$Xwd%Yjh}qvwx) zFvhFgPf@P#3L}y(5{%mY+t>A2l1WPH3y4q)(|%)P&O!#v@$Xoxhxuq}Ncphe?icgQ zO1M)+7-wB+LaRg;yW*(hZEfbg@WjZFiB0^kJ9Dwq>sf;mQM7TeC_a0XbOW!Z{KP~y z?fQ(A8}^3@eRK>Rn%w{iNm9ab+P0t6;jglT-W$)@QrVXFmLln7Q8_EXZOph>1&ntFdJL z7(-*GR3fBV=M1zE z64Z>ci-Dd6Ad~_*-w`Q^KGQ)w=&(_Mhm4ekr6u(AukGIXK#rlkd79r1nrIJfl8Nwz zi&yaKqP<6`I#uhWiKUkbk`pV?&qQQ&K|6=tk}_vL9dRJ7lld;1W&VRVGA zQROor+5XyNS7rP-SEgT`_9gHc9i3x;WaAMBt+w{}pg->qT7{!0STLcx)ho`QTH?x6 zkYbC+?-Rk^p3NfaeCNtby^V#AyVtf`{>B4W(hREntnkH6?o*x=(GHWc{np>4O5 z@}vjgZonA2=ygYh{H5GNjJf6S@TdlhwdP+vfWIm1abHMSaY#v&rQ6`V^ts&SX6FU_ zNC!EKeEM?RW%8!N&PVoG^PPtWX6 zODezvCWckxTLrWu!gi;giJ7)7>FI}&YF6B@Gzq=a)I|8dgDMwqB@zpMLwf=B0#7pVy)heB0UF8ln+A*ntga-Gt+&DeS?T zhJ<}@MMUL}{JD0jyY5dNi3?wu?%2U3&3KN8c!nwRnLQs?Kib5m0cGQ=1Bcwa&HjC= z>v{f}Uo<=K$RnjsKxRdAaBwh7y=OAhG~PA>F*BDjkm=R;m{bcLPptn3@aWPSG|B*e zaAL7i0#687MKNaUu$5igD7@RoK!3FM-Hqx*_1>S-u!jf0tlQqdByRV$7vX0V@-con zZ?~5vT5VQ`ebD&~Qi+CX-1dbet0oio)<-}!OT*C(PkHP)j#d_D{vT~&{1~~NqdN?|Kp!leKE}@hXIs37Y_rLxZ z|E+WrV>wKhkhmCN7rkZ+!b?k$KO+na=z|1A&e7fz7Qb7zkYm?sMK&V`GdN%0)*7A& zx}L0kDP8Xt3cmEO#tz8Gq~^7mF`fHoqT_TDjTiZ)E+#CWD1M=$|7-67j7nGclf0rH zjg=NAxnTcppNz^3gAE_f`rDj-aB_v?e<)LtpS-YUZ0GGEL6*7*ikfu(#6M}tYu-uQ z|J-<+B>>~&;S4u;w4bM9uNBSeK@Lpd3Yre?^ptiQ3`^YV%nAcRHG+UMKMvA!J~PmC z6!UkGPF_)AMweYxJ_4}XZp#1e9;-=ue#ELWe1_OI-}3>d{Jr}-2x)CZLoY9uL`p>wdBvV%2`ee$z?vGBPKjKHZ_(_?{&T1 zOC5(dPXg31fhrus3o}MU!=cupt$+k3_MqrQEFR|*6GcL-%JQU$(IA?)u>%m9f5Lil zD&0lBD6!6|M+tdzH9Xk`%holPYb2hbAs`>qtOo8nYf@@_W4ToOg})Se!mSC#xoble z8o8#{pzSs+;n9@n6??dr;Wg*$ltX5>sg;>PnGb-uDWS?}$uXmzAu*MmrqIySG2yRm zTQ+N>Ep)Q0M{}kh`bL79eoQ^P5$kkoa0`BsXAG%3E!O8Mb+O@D(D!vle`~TmmH6~# z)di|srqz~W1>nMHy>7V#gnBMaMw(6^tUONdQ$avV&q{EJ`3Q%K|gOX<3*;;Qu$A{!<~6N zwMDU$lUzD|TVKBB zOH5_3DEyEmW5KI!4mYe#)HTE{wd4nTbIF~G-L0yI6Ju})qv<@2!Vp(3;BCTo#~f4N z`f-55e*gxxDtjPSevv{wllPUzTq1C3E*T1CU@W=FLc_&J396=&sLB@j{8tMKt5#ig zg8C3~n9o_UL3qTP)l6+o37{Y1XJ`Moj4R1keJ`UtDy3VmHJ`#IDMy6VljH}AAFn^Y zE5XRyGHM2N-dUtCtI^2H<;Z zqZ__EnciDYxjklRcr-G&sWOvHh=nRt-$)Y!?4?m0@_xi6oT?CxnR1(%BMdiTbKNTK zRYt-D%zN^_;c*esbmQQ_9ZMmS0(pQm-%lb3H^e z7p#$koDjR+>!N1p*%iN9@h$pYaW(=-g^`7Fv$HMn zMYb>QaR4YN_$ER+sG%z7g{$M{sH3apTKkT}?}ixj%qx(3ZNJE>@>g-AgsI_o^Pp%_ ze*4311OVW)gQO%fHoD5wEl`!9qO$#;I8J_DCwSdG_KLO_Nj=Xk{6EQp9BnTInS9op z`$ulDJ&xy31Y`ZI6-9@5URdN?Gr7;`UlwR0HvN&#_Nt{e#-;%Jq|bLk_%)!YU&B%@ z;RpGg62&L2das-aKOd70)`96hOGj(q=6ckNRhx)w7T{sMJsCp$hxg-G|YY4P;`$`b)veX_M*vBW@F=|fCO z9~M@t0Oh;cQG?YKWb22tl>3=QLk2a+PrO7z4*SzpkC<%1AvKp6_52WV1TxCmXGNGYUv*=cirdp;`UPh6c3L8xzyieW(z4ZJ)f z{^_o=J@8|K1Xa=-#tT#}6n1-TIEfFKZ!K`Zi{?XDPXLTHdnaba)_A-73&{y;n~yGD zLRxb=Vid|vg=~F)bFG<{KugekH&1z4cr1;2xt84Y3}I(fGJz_$)9AQH7mDP&5QllE z<3ZqV>=#5D=j2(O82%=w)$%YG7{bp*t1Zlroql7)%`6O%BO;*!I(4c~; z>S<(ALB-~c7+|JfOuuwav67qCRoPvqY)J}|h=k2?-o5b>$bSpon-ndt3cC4YkOxmGDD5>|EC5@723UM)iK@HBOSn5?p%ayi@2 zFY+rMeAep{&7~6hO5wo6F*s6HVcq@43RRU^~~qY@V6gP2|ic`GEbFUpd4{1 z8=+QOt7d9;KuOdI@vkKo4A-porg!4z2L8n=>A72*c{{5<3xLYIKIPNj+v%Hkc4ADy z2|r!X*FOrkgt>J*nhAJbA^5#E<`z{RFI8W&S3Y;EHuKaf=q{#O6@J-ut02f;b` z4P3DHmk6U~G(^Q`KLr^ z(lh0KmQDcU06v5vY?ZA-I(E8VL28@&IAp+PSFZm4yLk^T99hULVnFlY(B?X8D;^U) zn7uc2VQK|ENSqlw5|5SV0#z7v14X{)Lg%Fb7}4M&sS<-=H0@Y}u>?Ldf6dU*p<^)e zpJ*0#E5oR*Kdcp|hkv5UM0mT7Dn*pa9aAt^AKkCELJtp*5V6pb5eYIdS{@$`m~Z2V zBfIj{v3fa{DP|XsZ~VTf9E(?zHfhjFvGr*)&e? z_aK&e59O^-TK^*SfZCAAFCT4J=Hm)kk*PWpy~hAg(( zad6MEq&pxV9UL9vJJnwHiA!N^)EV6m_e4rcDakSa-+L|Q{}(-8mHUJQd^v*LzJJ{g zq-AKd47R5cA_*{5|FO^__B!+~ZkzNDJKlBrwx){pw#@Zd>o(?)+Id8&xG4>4AuE+; z)0p)CipRk%oRWoI$W1tWe`2ehW9jyqc9qOu?{9ia(Pc@BzyZIDOP>V&ocm*3-X$QO zr+rz0L}_TfC+K^-@uEGhFb+GFqS#*T#Y-(>4Z?s+s@%?@M}m2fz!WH5Lz-xznM;!VC*$9 zfF9d@Agw4`|Ko7Fjc96GECBQ@uSqL@`8o6Yy)<*!A0EpnQ z%L_1o;-K0g%7)x(Vc)T#W(&2!<%xJVcgo<L zG8?yqOz(q>RkOWeL~}Yx^glQ#BZJ3o^+3Es_%jk_0G2#1HJhv@s*2-zw}3Jth2Q^U z=`6#dY}>AlbazXKG)NCfNe&^+(B0i#0z-F8ON)TCNOyOG119GuWSsVuO|)OKwFZocsI(qs?=m~9TJt=;Vu!G8bzaDTb z3Yn47mP)oJJzrqslI7GacXPdL*SL&Pdh>!>p@DLVs?M6{qqMpGrf=McPGGAkOJiVgg?dDoRS^D7V)a8wu;o!KUf6xR`9yatSY>k8xt>c_(AR>m z4(8c;|IXaUMtXc|G9CL=+~@drQ{@H~IXQWz`futxYy1Bip47rgxLGwh@vM|4JM*1n zdM4_mUc0nj`^dV4;_`$#(+OcZO4?G1Z}7*0P8NlFd);-#J|+V?ILAv>mJ9zX)r6Cp z=qd4r00fLhMUQYKcY<@!u`L}}R(2Mh0)E-Sf$IroyKlK88oN3?G^wqLC5xMx;q6a{ zE$^TMW7mQ7B^v1Nhbgfk*mK*6o~P2HncF2iYB)&`nwcR;f?i}%H}0I27T1-^<_^68 zjpyJJ!j$D~B1u^lL)XqvdT=30lPiq}ibzX2xhmxfjFx6iyIu=;ZhE?`d2;{hwA#x%^@18p7K!oi*s<&=uvtSbBO&5x%+%^$=o>Y9=+H_q zvpX~R*KKy?!*rzhqI8oe#x^gJP&Eger_UBmNK7Iw_#zXtNtbnL_LIs(6 zzG6tuK@3}s#l@_pCYvV|lGZjxtIfc$p%1+>_|iTcEAAKZua_Or8Jd{2CwRn2Rw0Ce zg#$9oKFK<(bbZOLOv9lN4!HW)WbciGd0mjH-b#HJ`F}@fN81_>=!XiFM))Q&&em=g zi(M%O^jP51X6IQs0H)N$tfe9gAwdynEyii3HW?C_5EhAzN5m+&=0RYtxH!GA0MwAu z*;XaCsDAqP++`E<*O*Mo@$Q%X@<&bYt~4^i$DSoFsHKrcoA-{Ek^g{T(wbKOL) zfr}!c`k?CtRxYp6^K{K#CN{OU#%`TR-DgFXoMr<{2DcOW(6UIgI|h- z5z}^$s_u~|SkRKt;n5h@mfnw*xMT$v5J!ff=JMwX`y*?PpEPfbu3a-=EZF{ZSRNiP zwIy#N1vQ`;aP>oZ{N-U96F!Q$9*CDH=E1}U ziR1pDy?5R3%lS#=y_kPKki(pKdWpXg;7+p8!ct|AOQI+QH)&o?ADx=ik&Ff}&&`6% z#QhHAF99W!#o!zCPjQ;uy4m4N!YJs%(%)DzOnq<_ijdA~KQz*59tp>0!k;nxYOfWd zCgyb4;q2;pgUO<*7v`dK=4K~AyUZ>ECL$k4H6Y^Zi4E{khqo9`(+0WN^$BD~Y! zEz>ks8vJn2X$JwFCO543Q3~CRIva<$LYUfQfw-IjGjf}1&@@MeBHwp+W+1(lyezLw z$NbOHso7OFu)O!r@ayOq$chEJ8P}!2JGZ0147?ht((;(7>L^HzE+@oti4-3z-~o2T zV^)rR!`Vp~-&?H|V7}Pr(Qf<9`tRSPZoLJIVkW2QlD>1j?G>`vc|OkN2~z+8W(HQPeFK5r*NvU93a0Brjpg#q2zpN)lxn+?vc|?|{(vJmQg0|sF zIO7}K9^6|0$vr%)1ZFf?-_dHtXi&9(9PAk+v`c3k^lwiB6BUUMS~0_tlg;K5*nFQv z#mBsZ?vbZD?%7|T%+D;>v-#r^5@uI7$Li=GhxIt(+)+gq^=bGP(JHQP`DCm_(vL&} zOL^oAySukcmZ!g=((+GQ&=6V=G2Qox-FaP0~*ykY)nig4*^tw2m8?BK#Mr1eJ^`+Vx6O3pPwa3jRkP?`q?bVsE$UVn<#rHO2ulQNSWz!K88_V@&7HLvN+0D-{ zRF7jXWOZX`K)!D?U>`%NKzyK{(fs=Qde%X+4q)c7a7AsSa`fF8=(^OB1rS zdsx`!fMtAWlV($O6O*Vo2uCsaLay-Mea1z_5%|WAi52RNjM~395spAj@MPB$Q&Z9l zli#MB46lcSGk=3g*Pa$q;sj4R`zXPEy*xc_fd=)*=?!6?OL2?V zV$*j0b8l+5z}n!>`*gmyoA?vC?FpU2=evA%`#K*7M#W4n>#@a3-;)VZOw8+gw>_TL*0HDaho!@}r2C2h z=HMXVv{-Xk)u^aS>hOJuxmIWCedOKDekuG0vj2+blEIKawLdl2iAcYO_&O`a0IL@mcQqgw1iwt&e|G@(r3lvN0WcU4n8CGXZ%%pjYLS9$MxOX1Et$6WdV ztl}sBj?1(+>ztkQH0#Porcu#eoqH2Ijf|k4d_XOkGx(BaYI0}>sWKWkefHN8S?&Wq z^!}-rzbL+cLYRKN{L?3;FaUfH510cC7UHhKV2kdTQ5d*IKYuo|IIZKXve^=a@S;(jk&8__M6)NN1 z;mL-^C$vFcPox+N=mU~?XCk^8t^!(fP-S{~z<3C) z+A39{L6TM>NqCS%@Y#`~H(JYZLldX3h3sj+2?k2&n>_ zS;a3G*OgOPvsToR3uQjwYdSlmA>FR(mXL(9G)^FUN5mcsjtaSn!A8f9^8 z){Udp%t&rSOV>7sq;Nz=JG?ihth+8h<@+7ArO`=c^MA?7+Iu?eGXVLg%?%~EK301- zxB=n8C*sohOg`*`0%|@n(fh^JkElTL$W?3EXQcqBZRSXpn}fyY=G+Zh0#U-v&{D}K zbMv+ojUNU4H+;fJdkH}yi>^kju=mJNi~-!9E5`R0sJ6A7NanRa3isLOL?f|J+I;5* zC)ytW{bLgTZ`<=cr}e+9M-`3Mph74A+d}=@!67aV4OVq^bP9lKWbuhpS=sG!H^}Sn zF994g6rc6cCi{mT-kS5-w`~_z3HkNqGY;ImLh_bJeAbg^uZqbl}=^w?czotI9?|I4i7omS{jOLT1nZE5U#`q+xM3yy%j`_>=Vs#%ej(;*OW*_9F9m*KuLP-pzA*G<2HacbvQW=0_RpQ#>N(=m(?UUT z1c98l`&^TL%j3@+mLVBz>h;Kr!oP(ZRjx7r3#W>=leK;Z|Mt-L)8y)_4>%VNTG6WwVAGy$I z|95~0H2-&iOjsD_l9PMpG1iGHj-@DHZ7O2J;WDA&b5`x*e&=X^eUj3U(d%2#F?<%xGpF)5!GGs8-IJ{88V zz!H+F8fE6xdZ($U8aDm@pqdk1d*q^eLNZBX5I;|yp=Rtd8x1r!c|Mnyxd5F3- zC(ACZ>+#80BT54q#jkEK2|baBn2nK``rDeCn3lmLBQza{8{b+qN7d)PH0GyCaOC`6CTZC&^0I^w{%R~M?#odc5n9rB$c3_`#rX-z|gp<{xt@ z9X>uIz(j#{?|-zFZ&B?wIiF0~BQBFvmyV8NZ#p|ytu@66&qOW6RgRGQit0;h-DjVy z8(BvN4k3h(9BE-AQ$X;IT1Sn9kXyQ2fvK+VsD_()GaJMtBR;p2;Fln?U17$IRlCIe z_`!)=2E? zo*8`q=&^#7@AKC*p&-Az#4(MK`Rsfnf`eM1MiK&hxHXAmR1g8oLP%%6Q~uG4flmjo zw{l9#1zVjToGcfz)30x@&+pqd`|j__0LmVBMPa3CkzTdi_FtqQ9s9`bkX-Q~_Rr#; zP?CJd)n<2-*EdE14=4cJDVb0qS2!p|`Xd98fFi)(U}s=xSywf`1O+`4EWg-~Dyq>T!`QVa{~jyQTg2~+fYKe;_4t(MzIe5Eim#x$2}PFspD z(f33r9)s|ATIenIxPp1TfLsElHGtFv01)X7Oe*i^jm@5aYZ?4B1jR9n}KkC|eU1Ze+WW_QiCV^#Wm3ys1;A*cpr?*NyeGtPL zKC*o*L9$6qU??q#>NabL8~05kbXfb9(4vrT)sfX8qKTS{5t%}Fe~(AwFpOf744*r; zVJZs7tedqdWs#=Eb;zY1ZGI;SeWNJU+mq>HeiFEx!VEZdT-EAsa;j(?c$)oWp5V{`L~jF&2=uK68vK{@2a%$OH&Kh<5O$OG)bTS=*|oY| zWw06lJvzBpe&My+5(Z&5-Nw`EG zF>yMM1vc&)s9|H90SO2Bs{?&Fn~`xbxxzlERWij=3*R(#V6MJieSpE5K7CLq7N2I< z^4fh%)&gRJ1hS|N(NXNA`DmXPhC%c|{w8+k92N#>K|>fTA;6H9J0g;95zuJX5tQq+ zJ47W0?4o6G8IR9jBMoxJ@%p-E^IBW~I{7&Say5(L3Vb-TfpF60$`tkz58uOGU}(S< z3es??YN4|*DzFrR&?P_)P8jOUEK!=hPXXaolmZBuJ)hMT(lmXje-cjWrJ>)ng{od* z^wcw2(o_Sc6i>V%?r_NvueSK}2iOHAzE|xNh$up+Aoy7McT!d+o%14)yc{x2&sZ43 zmav_xLgzA>L>_X7&t>ToP)kd_Es|9SP#l3tf{RO%BsbctGAnufyJQF^X2N^dL(CJe z*gZB#eei40_jK0MUvZj8c_GXR^!p@Mq<^Vp!5=Hvdwr+22V&)8xS3R_KHB%ZNTC4X zFKgaQq7mJ;1=nP%7xz2Pe7SH$FT^;m688NuC!XR8UGvA_Pts;`!BWa zvN`zfQ|Iji*LyA7_e(Yx+xCz5k6eLdtAOi|ntV-qd66XxG5Z6$X&9gx)!FLnI*)Z| zJMt5I%%i?MISZoH7aarY#NMCPt24=Ege3C%j>P-rIxS}W$4ky;Kw2Vj_puiy%^$m4 z*ro!iBW`Z~J|M!Qr;R!&SIeBOPV!>B(%+_uWLh2n&;-UaN$)AmKreYBVYJRhBnd8w z!u3^UQ=}BeFH~55I~u(Ui=_U_)7AZbfla5&kFq)(2^l3~T3sV5X3cNa@#yJ+pqQ)k zWtQmelA~`^Wu^a*|BV`i|2JyTprM5-rdZgGEN?GaTOTw}PI1MRWzAGu5!i>87A2*D zgo0AE*ak_dNI(8D31jvoTCTOis_D2#U#xr*&=0?5sKKL?jUhF#Q3>6;@!qKOydn?U zGkzkcr)SftvqLg8T&EEBL&dtjy=zdl1qPe=eF%X*XBDNNFtNEX*vI+r0npjNRPdJT z#vLzpNo9E^_0txMQQ(E`WS+QOsp%IHL1hM_K@>Js5V74k_OViJF&Ow+VvvzQrQqL9 z(deA@5;L)rz(r1=uv;@K$bxPAdJMrOX%@OU1WXBafvaA~k(qAS!`#G)*t4svV~ZTC zx=mI{?(V7MN`@9zos<0@@lEzW0c0aL;1@*c{~7Lr9RQt2FGUTxSd%SnEK^mc$*?K> z7{2(PEV4b;6F>FimsGfd%kN25Xe=KkxR%u5 z1cVQ4_;bLeI!#{u6F*B=98hvH`E*S2TH`TaAJ)ianMZo*uk?(VWJn>Fq_-{!U^&8A zBnRT|D77lEMl9ehN|5)EOu>npt$-VoGEoN>0eor{+^sfH2F{2crH_>>49YRrH@E6F z6I%v@8P%&0@X3Shtq zEAMOaS&ljgDmA3i@LpVz0*zh3!K1z3ip7~4G+y1jCOsuVjdJ_9tdjYD!uS#EM;nZ@ z^LbbK<*1>cnC1YXWy3lE2-ceF2}F6&ew}k}uzSG8S@)){>G&C2aVQjY+o9sJwC;^3 zXW0qlOqs1ykW5k>oEI97D^Z}#$sVDyAnJvV5h_HB=;N^_@UnNTuLoS4Q(L+?@E1If zHv3$qTmPA(N-ZO;)cF~}(qU-Xsvx6RjXb9P!>kZudiO*0?`H64$m-WLBwn-PASgFW@NKiP#pxP1emZSCB1>4hn$31VEU6bCY~|M)_(0|xrx!#r z*IO1Oh2OISs8#`lP(Scs{pqlxP=b#vN9_JI&jMX+5A>lv`H8n$)2eV1aD2mvf=#*B z7_`1G*xK55AU!$s_dm^?YvunmbJ3hQwC3iDM)`T!ZEkk|dW&QmexwtU9!#qP`yi=O zbxRKm?v8a}2`aDBQW;zFb>-$(tYqGX4CVkTVdKCv`s@apn{-~ns?^51ir#$6jEm#k zt6p!@1>{#U#l_cYt-3s|QL!2g0eh?BCF+j#77l1qQh_BErJd8=r7Q=7DsDIF`VY%P z!O>mM`-xw2v!rA!v8lyI|IULl2UYe?x_^>)57DJQx-Vqa2 zS5AiyW(A1gd{ySGU0synb_6cfWNdCP>#%Atm^>a?E`j?p{&Zlvcv9-p0Yy^(d+FDuCTPrx(r=6O0 zyG(g)7fag8l}ZJ0jHYcgqhry8Q~30-BIJk*OBo!SlhkV+4%J5oqME%rU@!26BNQJ z7PUK&|e^z!&|4U%oz2NI@u;t44PiuigCjn<8)JbW`Sryh#GX>9NH!acK zT{ATF@fvvVoNahPRZBW}U&FG7YjsM-b-Jt=sbBYkKd$kQQwQF;Ey$nZeXbIMmn zF;g`(fcov^`u5foE{mc4a=S9%_`_zonmwXe+%;WM$6@5YLj5qj`aW-})84tLeL9Uk|z#m5^FNrK6 z$IS+*E@@^meeLY%$tScexs_(FYWhWpEB5{!qR78{a|8e9Picyl8Jv`T!f&e#Ct+3Q zR!$j>x_}ZO1}rCZUfX@Y;;ut*q^FVNde(7w`TNJx! z3;0IzW9cm*?8-j=(Gs1UY&oBO1$_E-ss)3;1d8e3;+cIe&-cq;_rLvWE>rotyDjNN z)fFmb!lPJq`PQ6e+BGgA=F9lL7g6HK72CT{J-UsvKIXN9G#yxB8K}gxY;FQES74&3 zeSk%PqFFl(>Ybv&CEdX@Qa$CE`?l04EAeYu$&v$@iW4bj@bU`E{T`h*3cd2-qTQlR z_C5T3_cbc1m!L2@jUk#IKOKs0NO1pNZ$Mh@O(~(QkNTYKKsLl`xC%{~j}g905>y2r zR=o0^_XDrIw|24&{n#|?@@|~V{C6$C$A8hq(3TOFGAm91XGQ)GIRfN)i5U)(W#Zn5 zjEjfhW!cWHFNAR?%$IC&0AC#aESfX5FjO1wgZHV`^I*J)&*pP`=Ob>sEP>p;E|>FX zAm3u8<&OEd*)Rl;G3ZsLb3BJDDAH}#WF*D(wB^8P8(dt(1H^S=(IdqA+&(n>oTLl- z?5{9AY(0ug5Z;{|2c30Y?%Pj=Ruq}bmobdmK{X#_x!S2F{Y5gqBpuLVygFU&PXzoW z3C=obPd<`8#4;k{0 zO~Yl(=Ch|QwH`Qn0}M7?GZHw;4Nl9-D|326j1)?Fn5N>~PuGMZfH)UvH1v@o8Twoy zZ@t_+P_=S?XRX8b_WXYQTY>i31+Dy7*Wg93c{RCL^Z!}v%9SKhjhXv-0YCQhBtSdc z)DijJr8>JZn9r%L)8K%a`*l4dSIj%ta!k9hi6J3|xk9JihFg(1-eq_B4f#7~_7rSu zbzDvg7o@m^TemyWyLuZBG_^EUR$@SGQUL%u(}2;4hNI@;*$M2=OdsDYt32J|$?@KD zbgB;<-o~th)isA+FP8S^aQ-^V`xA0FWrT0teYNmsJdN|rEPb?N{xRW*TofD8s$Fc9 z_>uU9mqaM|iKC7RlF+~KqdQPJ8Tfz*_jk~yCRy9~37lj25aJkF$B^ieD}&&^YM)G1 zdu^R><8^iq3lw4oJAjNHzycF6pV(^J^;{CO6-m=~&`j{egu@F*<0{}+z=!{e6GU5F zR<&i5eE-&dMwm86(V}9&C(;G*$-5Te3FzeKVj@J`@KC^6errpA*q2kN?G2fz*67_S zEnZi?n4DeLddEw~nh>oyzP1K$n^A8!fDRDPz=pNnzOdd+ckHNhIzBDhX*!+l6v;S} zP_GaE*8ccEkxNr=lw*{X_P79=Wv*_kNr{ylBP2{bCz)Pdyn1 z!;2Y!@;UA>&f9;Ah=_>ZhOgGkgZ!3d`NZLmQhTLAj;p$9Lndpuhr0Xb!wGz(MH>@)Ej%Ffqa zK^vul(n`3czrQk!AJSE7ZC8O*(jBpqgomT%d?0-RSQ*X0*)Or1t!7kX#>Jh-mly2K zmZo};5JfMd(oaL6OOObd;PQ1Z?%&+f%IUC0^qnIE--UN#*H_fmXCr99gjr0=@`+iU zoDaXG+v1%AGaVq+ZOLMt62GI1_sh{X@}cBle0~o6B@&iKXy%Y%S|wwTrZ8JIVfvka z)+;BH%I~v#xpG78`$&BF3WQZT8=}7^5AMlfr&1sDP^ID#V&ns4 z8Obx;_>{bSB1&~_Iir&4z-$=EJCCh0>WJZU{I9J2ZJVR0kqV3_Amigp^W(dvr2v|= zve{wfQoT;6>gAWX{fDD(#jmdazt3T&g(fySVFURKdUa+C`an7Cd)B&8`6wqVyLF7aqegR+SDNR>sj5lKg4!{vOe}~^vLQ3`^T+KAPR%c}YD!j^9Po`QQAwL% zkABM(pC|*U5eD0qv00 z=z-XyjFHca9AMQs+aIM|n&oYTQg@yss|1}r5>}z*2-4R14jcFpKsdxOed(rj!4&I; zjJZwhh8_9F_kXx}jBPKCgI`~}1+7)-FgJ*6C3pQ<<*g`;Bp4_rAYpUmDqk_sqrW;e zs1E(@E{r0GZ>B2bcP)wblq^);{d=#w|DAv1H3X;jb(!0)Nq9Kvt%kyW6M_&W7+L4f zUcnnY9y7x|x@rgpWuMC{uJ@+5xS}kH1}mX$nIpQZbccG6@X*E15a1O?LO`Ggx`-k* z`&oy^tn6HX=+M!4EbC)_13-DT=Z|h=0IO2~i+svp;$y?lVxT6YF8*IlHh?b)Vu3md z*i$$C6xwyvnAHA0uFadqu3lL_J~`D8@W2y*?V+K-4SL^QUnkRky^Ud`K*K&6Qk!63 zV>D!<=H3_YJvS#PU8l+bQQH_S5%M{w5f8Yu6{ymWoce0XJL@%izV&`X7n@on?h1dW zA<39HrcoEe!wnCak`~Pund>sCeiUH@Z;;P*LnDr$%GF{JNd1H*BgVA$7tvu2Zj~ZY z+I^NP)jnTN4ZADSF{@>ER$WYDKucED!5rkP8#Kw?n;k$S{;nlWag{X{oY(9ns**8b zYA8F`IHDw*(mxDN6_P3;C}J+tWR3W(ULn7Y|IXb)Y(O`W@N3%O&a`}76w#zGBEBsx zT}?~6Z(sV@xtP?q_ZG~1eaE5FHfW0x2Cq79B_Ttzo>@ z?IfNvP9or+*f!&-Nvjx(FNBkCMD)n8eR{{IZWFUdhaIU*h?P1cK+I-QJJhra$T|O@ zCLcfu(aS|9BYsqY!{4{py-~2{Nld|007G4T@W6*#6%dkN?*;q1hu`o0_+ipTk9fLj z8(Y}(k;l9RnU7+ls~?iCd@>@>+tYFgXj>N{=w4` zL1sZLRZrGy`{>;=zRxC5@A2RUOhY6pqnM+a2^9#@Wq^WfEQ7;*<`2G}t}LPbWUeS6 zni?kI2r+^7#83Qk`FPf_PDA#@gO^PdpVDMT&10ZFadA<4H^)bhJwgaiW z)%pFMBVF>_L%8r9FA+2aO#3A}kKUf2Ot(G?Y)?nD6JAu=mYMg#*t&305N5aBj zIN$_Lq`m4_lPsc_d`Oe3L?yFTvIBElOh%kYPwoRB;2&x8PZ4AAmIfnZJx(rSy*o+5 zjehbRQj`4=2;89A@%xsT!{e$tGD#Fh~%H-!fAIKY!v&mo5f=DmEHr{MMMj z#`r?rO4GPfQYH#q0kORQVFV-td2R1^Oh_Nj|{4%(7~m zPz|QO+Xx~V%c!yNm@%tw{FK(<4NV)y71|z7?i>GP^tEz2+&kjxK>2(zUvzw8q3_BP zDcmd*H|5Xrg?Wy8>P?k#^XbGSF5n}0z5kz~t=!0{S??sL0piFuS?Sj?vb&2(F3%oD z66ofZB3s!z{D)@aLs|-93Z1q?S4>#s9dDaz&kjo(tmpC6Y;I8>SNNT>8M<2NbTN`hZsCO_aT0Byw8bz%=P3(&nAAflglccMW z`nddjC%;F(F9lf`pLB?!1YgEswOe0xm~rLs>VV7!C@8_zHe%whIA*%!$M@m1p3)hm z5}@<4mh`dGEe9I}cLf?Pn_+yq&u^{E_I19o*V^5%Dh%LfeL{GYRsbN4Qenk^m?g*} zBjm`)jFgHuO#W>PDGWq;+BX+@NLMbD899gIeqopL8*%6A=oRdI7H#)*FsS>oc|WlU zTadDTI4gMlAPp%sp&VW#-;)^*L#0M1fevDT#9cG!hg51kSFJ{6db(b;Ut`WhAIW!8 zNh&5(iffr!riHN=g$^%R&mkpAHVlj5)_ou3_9=nlo&R+V`18NNE@gwx=h*^oxx@z& zDl^<3tDCR>Na4&HvbvdUzA+=(SrxFZ99CV*LE(XV)4mq-Xr{Rb8jxN$CJpCi&Ka`L zYOre5Xn$M!?qko)h}7Dq*qGyaOD)v@o&T*bpgZ+_ju*7Gx=Bh_f1^`@>$AgEZ0iD8 zIA}Nr8}%INs+lulCizPM9ks9U7mzT#iF1x!y$_4p| z)ChnXKif9%^ptAGuBn)yT-k|V_jl6|UMS#@78mwJ{%?qNs6B7TcQy*xaMC0==2;EC zc5pBDjc3M1SkzETsuD-_M*qOgaET)%Y z2&bcKegYkQTY9TW%-a5Pblhl1)L5%Dq2#uE{)W8T>rYoW98M#E8PvgZklxrD#@z@H zi;f9nRK$R4hKxHhKc3Qx0KPw;{U-lCJbx%Fv^qT^a5@2d%6BI3OMZO1tv`U|+aR+&Tt4Wd_GH84Gt? zcb*G*2!F~<0iEHp_FCC~`v?hTPPhnt>LBS)HZ!$LdD##YaXv_W)6baukJv5|R}V{R?BbGoDsF(_#Y&x8WD;@)SD4 zuM^BFqUJ;O8kENx4;AP(g8aqV1ReKZ{7?681ikD1_UwwjNmQyKC=ElSl8mEE-Yw=A z#c;o)cWegvzYr#hoFj$>A^<-^b@^N@4wqj4Tu+ai>+@ZWsjJyaF89M;p~?6ue5Q3! z>Z^koJX$qGA=tUVhF^asnt-XfY1Zp5!t;1DYUkI@&P(lo4(OMf|F8cKlCf>`tdY0> z(9S#RKQa(amK!BypAuKMQ6$}8SS(keNutvdz@nD>HQWLy=VFO(E=Jj$)w5Jqet8j{ z@R`4!hB5r+1qmzQ54k+R(IJ*A8=D-AwI%(W%xc)75b{kKC#`DoDV3aHE_{|p%~_3R z=QQDVk;G*QAAjTU>wWF+9HO${Xel)KqOxo7yH=&|adn4}alcJG33e&t;A8N8ehG$F z@e8$scJG1l+h}~WQU59z>7#nALFBKkkOwflf*c5~V#KZ6hqN8t70+1<8xPYUfg$Go zMv7lzn}O#Mg%PMR3J5!>8uAOn#al#jYH3Q4#7D7@CjoOId@_`^so_>K0)Rvf9qciO;=Uyr9Mu@u!9<*X{0Ob~5(!)q;BtWMsb$v@^ECs2%v^v~jKP z7L!|-UBJmOFOE&>)u>#$#Ee0Ii)edp1neUeDSy3Blb2vol}uqkTi@fXXCKf>OoP^T zDBv2++BLc=Z?z8`RGX{YD9B4w3^Y1McWAG8Y&ZnTYL?}c$huHnx7 zUnB3gH@n8~3ZCd>w7PP?beqBN&Y~BA@oeMkun!Ds`E8>W2rDL*n}WrM67sfZOBF*N zC12Wsi{a~4bwUbuMPMzGoytDeU=vFkpMK5qB#QX;M+&@GSXV$ww7Ij(Yu=LkLb|pZ zt0y;)aNL-E3Q2r|+wLE{?@h=GW8Jwkh1CjRk|1M;t=|?|efn~RxT!7YPhNLk1c%U- zaG|3nWObj>JtJ~kg{H+pvXGnXar;)YiLsi_k?f}9mglk$_lw>^5+ACQTj1I~9*!B? zCFRh3&`@K9d#o~G8*hS6rNrf&jm1GEw)(A%Y|6K%EUeT>Yic*83l!`Phx3_LfhIgv=iy;3~htqIvW-e78XntM; z7~WorIiw$26|D|?#QQAR(+Nd=O)V@0`}scfle*#be!Uu`&I((O8K5hbjD}>VAnTyZ zYxe8f<;l+WsQQL9OB?{#`dW2kJ0=}W;|1+^bZ~iTbn3LsENKArf6Qhip z26rwk`PshS#sa!|-xMrgY`8u3df71kiGn7X2#9YEiUe#ua7hic&3Kn6oXhLECP6_7 z?20qO(89Oz!cu*GI`+0rzjfY52oy3b`c!#;2IjE?T$T}$CQgw*`>5kT!`4U zgJw$0D5w+)=;(&>K2w1)i`)}d1m>SMFp(r9#6JjX6l+!2IX#naGt)U*1AO9?=eA9= zlkW>vx((SAIX{bH8Py4TUott3Bw5Ii(=J?JE}g~3fDFNp)&bXjuW|lo!J$(@d;aa` zKJg*o``IQ3?p#^xK4kYGNje;>`_0tsq?to(otjw){^*fieH83a9tg2 z>c-BShJ}s&df3;$U*CKvXxW);TM7OL|GJm>lI8*9leK>O`xr#bNROGYkuSCl8r&hJ z`aAStXk^Y>k`wHQUvYSPgpTs01ADT}F^$tyjf&ku+H>R5W3}2Z1FvGGX?mplSMdMV zv~&M6j4w}_Jxv$gkgs0ld(+h1av5{7=6zP(e*MJ8e1svwxi^NV03^q%{qt*8RR@$wWSvhp&KLiVYt-#0X6zdK&gzqV^YpPn(x#%I z0=gGEW{J>TTQE=S{LruNgKPiy-s;wfW2csU&$o*gr{3Z{O@I$*d%)ab^=F>8@v2m%8kX_chgz08bd(NBLfQ_w z2NN`f4$M^&3W#qBgf!q+(+w2T>w6-z2QQ{aC)+@jufn+$WU^3$1vz~heB66B( z(gYQ3=b1j7cz8ZweZ3GIQ`AW4Y{NokVf>+hM-q7 zW^zuQ-3VHZ9=71&G zFkb}^Ub;3_h$tj%+%ig1vSGb98#8{`c~Nv04H3_F(aOs-!>+n_RIBn!c6)zkvv-}> z1G<32TK}JAw?+jUem%`&&$6;|@G8e|j=svayUUiTzz`srYfpWg2{^jTwKsk*tL2>l zx+$PQnmlcuhChMu3;~64k(@|guc8kZNTQ;PDyHLfUuMT>n&7M{O2AilC*&Rn%C@+iyek!L^|>b;w6I)ghcbhSw=9s zZNoqd?}6{(f_4iZ?iuz#;z@apOUiU zpuC&_nrrYI-`rln%H>hZ26`*x>>CrYy zGQa(t(|h2JK^DG^*4B1DNUJqo zhINcLdvy@}a5sNMl#y^_))ha z$rNEqI}f~HA}T3_W}1X}is5yf4m?R<66`;&_&=ouKH>e0m;HQKVvDgu$xXXN7tWxL zr@-V>Kv370i0`1iIJ>#2XsiN6kRgS4n+!`2VhI`zMT%cf`J7gp|7T}{KlEL!Cf{kD zV0-u@{)mY1945^Qm~*lrtAN1c0%9^7_YfUBEdYG|fOBr1lnzP$zi2u|4G5RM{Ni^t zTfX;`5q>6EgO)zDBRn73Fvtod=i^gSycW@&C|Kl2(InACdN#ZsKA%-H%@kt)T(F^y z8_1%dV4=AxY*O-x)l8Y!u_DiBXsbv&XJ#FcA!51BZc{quQ*B53zPi6yMV?YGt?iGd16-$}Cd=4!tgrGqP zLZHGNM3`<8Hon3=SQ?u_;Jk`334>=zY9=+~vCHQus3jwP#LNe=%7G~;yH7z@EkH5r z?QrYWV&L5&PjG?E{XdyvNR{W&%OxU`1ZtU(aAQms9!=eY1BV}3T#0zepGsmch=@9G z55Rw=TB$hYGok*v5&wA97)*r|!IsLHyX+Z+?V}D%g@%pM&W?%@T{a*NJ(ZfvqAq4n ztf$c~4~;mrrq?Ab60a6uQi}tADMocybQ>UJP?gHxPVU8iEF%XnZzz=~y?5b5homp;p z3zSYHM*%*or7%R2Oy@+C z>=vrzz-;ATrn7$}DZ!1F^b<_+$e1xum~stlKK$+u4Ubm5cR`{SD4pEYjGpB?Ty(d# z3CVLT3XU*Z_fH3s_-B`m>pL!1{{n$*po+PqOdLGz&7wS;CNYV8dZqvy#WMb)1O3B> zz$s~r&EWZ9&^9A&Nyo?f(C61oS*oa{vA%dVsIR2%$-Ofvd!BoqRj#}4ksmBW@)RB{ z|BP4u^It-)`>y}pgq+rkmIHR`&%cGQrIQF$FZQj{M+|cI-Xf5!)ROR1%JC$Lw<1AT zV&CYu!9g9l0$}+gCwrlv$3>c=)$R!-}J;U+VGR0u2i2^?0Bm5N+Iymxef z2&fnSY#i%cc1`oDldRa?_-&X`-n%zW9o9IUOld^{>lm%ieK)6r9x}kg_f#Y!DC$Su zugT9qIDAy-u=qKH@PKzZp6}uLIIENeGSf<9Vnh3M2Kg{; zKO|sQ!!IhXk>}84=5|hj&4X&${!#oSb&_y!+O>IvKOw7+PdH1EJn(Vx=8uv%^%}$Z@4CulZsQNM=dM{pphwQrj21E zxC_b=9@2NjQ&P{=EqudYNycuEv>%0=t9wK5B4qlxKPua)5f|sJR5(!-`)U;HV3NSO z5`6G@q|^ufUzxnsmDWGUMh5APq@`4X?+fdS`7$w8obhM=%6o?T;LA$H;0BQ0IRdn3ve_z|=9F>uftj0F zhZ{H66kJMZZ=%kGx>K^bAadjVQ*)`&X@wl)=D6aMD|vV1wxjeTy*}j6g2;7){k|8B zMm%xKG-DKPw2Z$H_>5%g#QGT`{rivnyJ{wD_nf${InXeTGKwxsP3*X;pR01h`Mq{{H~aeSGZ^s1hms{FAgPkFS-S z3tN?fBS0$67_BP#6qyyl1^t5vli%xvV+>y{{r%nNC)K;ROb8U2%S*ZOhTId6wx=ZF zTbDWbxKaSYvR8)0fXPd3ic`Ayg>8OYo%zDL3-xoqvciDq&Z#PKxN%H>(>G~P3VX~5 z7kYflk_mr^)28N^QhYE9Ui0Y`QWK^lDp*G6xlyT=Pkqr()MTlKz zf5(euBK{J5mxd;#1C9DDOl?RkRG3lo2OCdp32J)O(JRZ6NLl|P0Z|C$5exs=9?T9% zK|CkA8U5^~4ZY^=J@{1 z-3M06TG25A85Ew>BQ>!FVIBs`lMabBj8D7oIx5wj_Z@mkP;R_gvv_?kKUnWvF+Rn^ zD<}v6QUO~QyGbi$cIK^cZl1|+;3*|QEq*H8Vz4_zRrkjzWJhE-BbU0LfJ`bB$ zhGKW)5B>lah+OXN%gRPkI~~hZMGl?-^j+Mcm?czMmpHl%BvsU34s5}>j$5hf;Q%Lm z2Cf@&C?eC>;81n@@A*3W@pp%n?U%X_+Ik09q*LAS1g?A$@534q;GHh_6^Eqr=A)<= zuA@|hg4ADtn2K?IQie|ke5BPH++DO;m8M3}JfT^#H_TSw*58xO7`d4tj>N(uZT)WG zq~2kUrTh7F#mpeTI6IwwWEz&GY6fN$CT8-4q&jdH`kin zX6+^a7ojhb|DOn~Lbst?^ZqLPqZ$rj%mf5LmS>b!)O|P&SN^#4 z0-8Srm%H60Cd(AXSs>w>R4u2AwHAQ?qPmG}dWcUsDS%~qKrLL0ul_qIOF|J>KB_-Y zQ{c7#Z)x}L9YaMz-B@g59IPdaV5#7L5gJ_tZ1Eoc%E;oedK{V{6qh>+?)=o ziaapfMfp34-GpzA3Nenn_@c6K%qB7~0HWfiWby z5Fss=pDfE_@3=!;JSPd12#%`5>RE7&Qf1kJE;%XLIQPH8%k;%}dw6F8( z@5f=&A|t|xc-zj#wNpxjYPueo*3(@P!LMDt4y=Lu?6hS*?51bkiK~ z0M^;731{RpEotQ5K#FtJZH1Uu0c1Nuvr!xlrA&?N3(5teu>Hd$0H;On0wN+SzfI_Q z5=`HnqEFm7mhkw)*mKHryOH2=kqi8@gNcHQcs=iF-}M%kyn1|@4g+0qqMFnwID?cN zXUNfBYm>{L>TN(~S{MbtxT z$XW=QC5w5xzRm6r426}5%-`v~QfKk==r79j2_0R(=rZbGT25L!a2qoSEZP2Szj9q^ zPZDwwZhSMLJegEvw+~jt zELtJNmlj-`pW65)2nCT*r_p325RgQ{Bjp5T3C2dZx6P(bR)mGN5c^%K4wJUGBw*5H z8#jQnUFIdSWa0g?2iky7FynEEIVq8gOA56DOn|SzeKY z<3!@${U8`&YcedOfGC)AM62sp&J2+6o&pG0);K{^Fm@Ef#2b`OMncL;;$I{6nMkD> zin0qVg9Yq zte_IW&rDd9k1`lDns%D+bu2z(ud{0wjnrWpL_OhJr069iBLbX6eD~(e_VF?!Q8Lvl zYl1H+egxYJm>&in>cdV)qiSF5pG~HhWvQ3pag^(;ioQDs6+Qjk&CSo1Cqq36J$VS& zOTD?st&<)!>V679_kDrVF3Dkko`~*08fA+q;)w1dIf}K(gtY+YCg$>YA($+&OCBwb zGbZy=LZG#OI}LN?e!&c90a!7|zqfjBp+2*N&)2liL<=hykH;R*96v-n9NxW+cW@E* z+}Na6c~$hu01UK*F99j8(Fu|Dfhcds%EeusMcx3wig{B|_+-gMnC~zUr|hiOVWQ%q zlUiD_tO+-!i?hAIe@`$uTf2}`kh>K@`^f7o;o#(y<7Jfk)8lAh739I0j#;d$KJ&K1 zDN{#v6p3M9ZX?B#(QPz~D?i{d^#*{&4sXKCsKuap9wE={h41%YcHdrA+@1S{d|&Fh zqj`6EmEEVYFKmpk4%0R}kJgZ%aDGE41#x$hL_r?BGBvDH8EG8dW;Ukva#tAEIm5B890*DRBASpkc_BQD{Qr1$)o)aAbLD0)e=EXqMBjJU&>8Ufi)Of6t z0Q__uJzDWCWY#dkVJu6pN?)y!RDFj|?gV8{NtQlNp+(t614z?<)?p*uC*P&kB5cvf zeVIi?;Oes&-B_Z7jZ-XXg6(4&_t*7{$UET|gnD!33t#zUM27WbZt0!7MyIWLWS&z) zhgLO>&H{UGDyY{kBrTxJA2BQ80fUVxly$^v#j$>bj>t1+PD;cs{Gds+UvXr@p^Lcc zF-2UGE@C0C!=UKQeYf?_3Y?o>ul_UNmjnf-c%JX;w(@*`UED@gn{-6SB@ls3+CS3% z+oO=axtrSZWP%bnzKnTAYrpcH-@W^Y^twAZ=UtVOM6=)=ag=?1PmvCY;7J4URpXe{ z2!XxCn%VM|w{x{Z&O*3z7ebSombQ2Cd@XKW$R|>tfra+Qw?Y+Dg|;oGSdTPlmZGJQ zrp9-4zlI5NJ<3t^ToQ~@X5@Ske_-C2Ujc3ZqPLy_J(m@sSIDhxFFGM{7l#dF6%;>(f? zaYwt;58;X_*ne3?O29%($gY3CKzRo2!`HQXJQoA&z7~PjPELDG8M8oAIQjpQ!c+e< zX_95-F)JnW&EE(I&VF}v`-sBD#11n^Macil7f|h5wiK|nSuO$gT ziv(=w>HiE>&cX#?YcXWV#Y_?ZP^yg=0q~zF8P5d3&nG}TOhVa_d#_EbHj5jtI~2X6 z05mxQ-{4!OuZzgskM#sYg7t@AufDrRXBN(FIp$h@0V181OJ70bQv&N>y7baHqXs%& zNT7TVqd=nJ2BqRt|^gj3)(Ox!rV7TYL6U&58C(9IpH6*%mwtTVrdMfb<>Bom8q`>;V4=>3< z_;kgngphBh2Om4Cs;U%xcc|aJN0=T4`M2a8itl!wv^^GzMI=`~fJ1fEjIMr7{W86| ze?EC2%Z^JzxACM=qmGbcvG<~%QDzw@tRYet;}gb{W%ns-S5s9Yj~;+h7-5<3muP;U zU&Eb^qT^uHpB;CoMz7?&^d$Ve-97+Klw(vRj3vW-chZ*mP38$K`Ebwvbes?xVbnVG zE8oL@Zqdzkr8@!VX9YBf)&))1!8EGbe?Rgvr0fP8*bge%MHo=#yI^g-SodCTg))-y z+~}}nz{w8|4s-JJOL+5HjSLd1f*||2Q3z@nF*zq&CYZd~$;E2mQh(o(2tRVrIINyh zvy6Y?{XnXcIz}8lu0jc$d=BQY?~5otC_-s?h zi+UdtuTUz4#XHM#qRU^Vevpu`cu~XXvvIhYlWNtyu?bV}q}K z%Fp|8PnQ&AEGwS9vw%`}I<@{lmXXoQz^4M+rMKNX>QFRWVp#N8{(k3O!M@|jaiKgB zu4K_#sE&AmDr&k3xfs?dnf0Aci`p0~4im8TFJFo_4ziPiTuXQ*`fDvZzQ3sgFjb2y z(TA!qYME#lW6VnfJZtwq8kV8^<;DjVbDm*@ z5;!-Hi$AD_CrnR0js?kSQ#C{NL$Rr9BEAf#e?4pv6AVh*Wjm^vvB53ZFffFBFKLNO zh^sj?Wb`8+xzXUlk_a-8%ZFIMRMybvPvWCGeEsV3rLq}7WWp{!FbmKXOui=9ZhOPx=_Y+33w-(s7^@ksYt{|@M44f{eRr^*|J(wjAL zLcf)_Y;=ILL6oM;i!I(Gn|OW`@$Y;Ovy%QUH;^*Fg!_mF--9eH5=P4PMv$!Tnwmhi zGn>qv@2zDZrIod{B|4xm;sJQyO>l`$nir#RoyTrgzF)(;tt7#3Ei=>0k!kU{kGNAk zr;_4}K=BQ5hAC*M%e>{tvg<4u<59{h98(spqk1uO@zc0S(gGa}hSgIJLXj^zam&~$ zU%v~+sQPSwHI&0-{0gg@3y%P?Sw0sj7n`&hX;_OY4udPQIjD`4o~e?DHB%C^Y1*%;A>Xj6VFDeNUK=wJdl1EA|N9BatU_p4%&;JCW>J-i4!3nckqLCR zH#HIgbBxJn6DR*7X@edP=Wo4%r7WqxZC6?>F{~zCUP9Tmmz!eJceWoO-15fZY$jA= z4i+sZ%VAz5JG{wpc0fVh_i}IIgaA?=)6o_0-8d8lI61ybmVDcX<}6p1h!Zik;R=0h z-O)ZUIFf4vQ%S`IXN!nP(I$}u8;Iy*`nbl~B{lKMW14FdW~ryp-PaqkY`X$bwZz3Z zdIcsrjoci?DlS7NNm9nXw{Z|AJz~KI{$PZ0L+)F{YSaIKz~ferD-~Gf2^nB!>UC}T z&CInJ$aCYp=sZ%U6o{H9iI2edc0tjuU{Q#Uw@=YC@Dvi8TEoMz)={ z<-jq6nHebo=x`$L3FD&l4*O5RimKIt)8Jxz{W)Y*;ssZz6Bv64Nc9I^B~LB z8-6eukCG}m1qDk!I6{b8yuFAs`(bDMR{wZ(XH2BlyzSiB&FyHq6YIaT<>vD1!?=s( zvldh2ckm9iT>Zix1gyi&x$_{LUqv-01bXb!C_m_sAC>1Q5L=p_7o471%&Jri#5tsD z;MfTq*MRAL6!>i~=KDyDL+X<<@}^#%v5YRi65+?C@~Rs)s&5lduY6ea6T<1-7JOq0 z$t4zXZOe}y5~e)N|Ne&G7^!j2yYq6(NQXV942KN7q7Im=H zbV0kr$tA9aevxumT+Mn7o0=U8d<e);>ABVEuvo*C9B5zphxiFPl%!=XQ%qn|05!VqV)`WEG6> z;6%!WmH#2lqs*&!`g1NYqKK(fDXGH2-1c-oAt>DRyN#XFg_4}MGa5FUsHw>>WoElR zR>vpm^YV~fo?#Pvszhfz0;cBZ)$~m`{3TQ>J7dcxQK8gsEfK64Ofok&r>6NfZBdqk zL$t3{Zh|st$QsqSI9)Pkk(`J=QWggV^2rT3HbdQ7$(9gJ*jcO*otGRVL*4MFq)O`8 z_LsUk$Dp9dIY%wH&BYb9sAmo@8%w0S4R1NWa~k0k*y+a(ud*^$KBLK5yezAm9Una; z54(qHq=xN~E=t}wjs%@Ceblj%c!;H~VtL4zfZhQY^81e6$5qtlFPqDv$M1Gumt0EP zUHO{;pmVN>$9RKG8cZJ4;#o$y-jq@A&7${4M6z))sEEcKzW{ep|q>mSy0T&|3A_ z!>=1TYS#V{J65PZVvY}?10p@0m0l$u0y;G?kVc_#NjBEjkyPJKK6Mwv;4}2RQh-!9Pw5ElZRi!PSU^so)JBs#?{UJGERbxqRPFt z;NB$C;nsk*g?{Wf=`Pq0Dollk+1qm97H+YI1r>Cz*S^4rBIal3=Ov9A0JCq3BEIlT z`2GC8`Z8a&?RD+R#khd>*>wKv(%SZ{ta4?_Jj%QKrS2gZ%?|+lN4#L*{MB1J*AJ!T-Swf_zjqJk+D)!5>@6mict4QC{=c_oo#%hH?DTJCk@#SrdE*{*u_Oa zXkp<+=^TalkB;w)okconUfzZAN<<5IRMvES_(7kw`tt%A-rj%JNoh|jh|*NjF_Adl~IfsVtStAm+< zPtcu)3Z>u#IkP75p(n^wCGfSU{YX)@^Nd7X1Y@Tv;b@ND%rFW1s6^n89K6c3NthWK zO=;%CO#fR8PN>)NI&>kzEdH|1f%{>LDezcTvFt6Wps5q0K9Tp6Cz- z44cWT9LdG5?k9}l%hia!zZV~>VCmf}eQUyEj!VykoIm}Wlitn+jX}%O$PQPYBhuG@ zi@6077MtFHYK9faYGF&BOHQSS6}q$}0I4`NXMLYWSlCT?-NB0xu-j@rk?<`AcuhDDeO zjVB1#XGv-f@1;c80$_FjtO+V%&-Gxxx!@BQX&>X7=g*hhVEX>8&#ka@a#@s+RXhJ6 z;9<73ki>s?pmbC0sj5o}jWt8bKzsc17f_?L?qVmR-P-K(a(0egEK1-W7=l^ne?PiF_ zknHBrnlu+ZGY+9=wjv2+T*DXCwlo_ZVx&IYgM56BQ-%HQua(1LVAmfFi3W#DaMvTl zh6Uf!S+P!i?5PXjm}HGZWzjzt+}uoQF2q7 z93VDT_Q;KT2z}&n$~ctKzDPd8gk5HQfvT5INyKR z`XJD`L^O~)fjsQcUr~2JBP1{HE64eq9>}a4 z2Ja&PFx&v?T+EHDAY+sOSZ}s%OROLk5b*vh;}u>PdPs$9aX9Qv-K4e{gUY{=`pJ_c z#)OBf?P9V^5nf)|9LL7SCngc4AGd-#io`CWY0wg%yCS*h1Y)W54UYK3O*k2UD5^Hd zp%$XBj4GI8ZwXpfA5y6rB~pVd+z)-VK#u8y0+kT?X(PjzOpSN@_U${W=nu6JBeMx0 zchEP(r~)q@@}=p_NQURtQy0hS*2=zrUEDmNOtil}C2}sR#v)#cGn6+lAX%*~bPImT+7Sq}wU9V$cwLY4(QR&@39JQ9{Sy?@ zKb!p4U68dXTzUvSMxX)PWHEx#=@nXfcw8PKw@8l}Q&n|6qx%;>C2xDX=I7t!6i_G+ z^X+)Wxw1@{7t6Bb_vsR1ykZVAA1?E-&e7*kGSGa<)76mdMZVGYx_eg_6diPBwr*?h zg#0RkbE6=+hw5P? zP9qC#mofg2`jj#SecE?)uCpJQxWHK;W;4CP%X#98$-+OsQ;oh<+Q^<5Mu(T)69K`@eKB5|d0WY}mzX&Km8TmfGERF86V7v8WS(ZG z&ecDCivlGMPj52YV7VGleGoV;tfp(P(NaCZO5m&Y)B!D;Ql~aau~*_RvecMhHo?{G z>Eg&fkoa3he;@h?^aO3HN`7R20p{=EbG09vPi0?2J*a27ZHQAPdgCr$pNoV?u6 zI+Kk77o=I-rW%1u@^3ECN+5A;@%0FxRea@JD6Q4qs7y*xuG(TjiZvP}Z(z+N45nb3 zM|nHo@gy$s?x^=lGFC1IX@X0W7zc?cJ$=vkb91>qH^j&Y%(0VJQ~<_}P&*A?BLk%K231vIc08(_JM(0e+UXF zJ^xCBMRPr~O7ihk0c6<_%^0KgyAt!WQdxEHCwu;vd~hvG7o^$nElhKj4bkVukQIE^ zumCi<91V&{A^%#%d`y~2ujk;K)4k6g6`$?ccLVD_X=<=!GGH=Rzc5ng-^cZ~>;L<_ zAM$>xfMJoD7*BclqoiN>!*OuR!78=y)s=stwuOR_E;-PW6~~QX-s+#GFWevO_j7RE zrx0KVc>NjYlRoW!Rd0Kx45N`4Ug$=`j-qJjewC(PQA9h zJI`!t_Vqeib@-zmp!53yZ&q1j+p*2z#PS{kBWFyTRe4^M#WdG7&#!BXCg}G++KtJM znX5fcrG(`&M2PA@mh zWHqssU_NB+> zw=p@5Y7u$cyfS(@gWxhxY9(OkGkE!OTyuB-s7p0CSZc_Lg_Y&*EIAah{`7O5V4w^& zkClVMm3>;-F0BVSI%oZPDpa+-ozg9BX_7LDAd4;0`LC0WZP3TI75OMMTlTDYK|#SZ zwcVVLRE%Hi`P0li(lx3T6NM;MnCp^*KYJLb;Gc42b}t&r?|D3SU{}}QQY8QRBMh;O zw`0}fla@--$1avtRWlG*a4XOAqV{aqWw`kTRPTz^?y}Y$_wSJ_AxxpvWHi_eM0C}f z=a?KOn1rGurDe#P8ITmMfQ$%!I9@%!)-niI+TH>iUcV9rUX}QbgRw$XBE0;<>L)v| z8w?CGHZiNvMzN`jV{2F%96j$2TiZLZYc*p z;VOFrRYAwgfvjdNZuHZ6Tdc5)&yGbq6+GRe^WW*%wQYXdFKEAw!pB248JTv;@tq&hGAKv|u3CT|l0}Bf7EO+?v?0E6< z{o*g_YK!vWh^UfmSTF!kkPNQjR!lHev3U6v&l3wjK1tEO%W**j6EpHj$gae4=hd5# z$GM2do!xF#a`euBGv90p%)5hfWwV{#+y}G+)}Rjs^ZH9^+X=F&QE6#k4=A&^Eqf7B z314bz?EL)`Swn77N@P>V=2@ooD)E6eT9w;c`L;qzDvFve;kD5IgG|mF0|Nui*llGy z%l|Gbr2l_e)ji2PPAz`@LR`B5wQ0m(j7!`w4VBqL)p_IQ;0tW3cYEa);_SA%Z(XU` z!D1_GD($Y~GZQTj{&NbO>Wtw&ScU1uEiFjHXK4rydd@lAzROGM(DRBS`_{Uc$$Ji# z@(K!yf+0$!YN1bY_OqGk6ZfdPsBEaDRq5kVdSYz0sIa1@BPY9hak1)ZRl@SU*fJc`apQe48IuTsX2=m0Ok8^48rnSWIALsg{o|XvgX>?)9o3SIK}CWX z7&T*l&7VGulj3hT*j-&@XVfEUWnj-zF!c~I*nwq;wQbrvx3ZF=q*X&WpFSRWXo&T8 zZ5=3@x$V2*q(+a~o_|75U9+}L@WgGtVs~F@&I~*Wj$MHuoejAp%8N=7sX3pGQ!ezJaPL%!ociZ4QRVo4Pf7)P@(X0zF#ch1;%{0KIPd)DN&Ry7<5`)58JcPH0{ z{F4Z}=XuJBYeV)3zMVjA{Lfz`nsY!!PT0aM`J_RtL`Pz194=bk&VkXc*qy=(%2;XK zeb=x;S?;)d`x#gYZ<`Ipasy+kobL4}H~awrkC!juSJ4w658EQKg!UwB89k*~1G+QN zRG8k#R@%RJLK6>REV2tYyE0OBoDI5(V-2{EnX-;5Zfi_R4!Je@Qt7f$^?XUA^-(gM zgb!+5-dq_sd5zZOC!BsR`SvX(ML{0(Y;-!SmcX>k2V!pZJ15jT1SoYu-)IRQd`QZD z^AZA@(6KNZGouY=mGM6odfGo+r^76718m{IleT==qM>DoFYV4Ib;mpRimx2tlfkju zLIq6=8W?0iHzh+s6c2JQI=Z#uShUet^dzYa=C2flh#7-s$um@+62nEEWzyA?@L228IL`rIjb`@4x+Qh@7l^NepSXyp(VAlNtg;034txdgfS7*mABgC+h z7?3@oIQVMLef3I!pD%Npaq~;VXVh7yfG`~uV?BBYv#>9b2?W?SB%e+@iTOs3+82?k z3_-j9dLC^$eX<yy`R=J{!D<0OvZh-YQKQixi6xJm-=@)FWK5IFOQbvFq zB!snM)-&_hCEb_7ne&-?R2Ny{(wvrtWzAo47M;0t@XGwSd-wIPv&oy{Gymh2?B(`g zPLIHcAFcE2Q_H`rO4yEZM#z zeP1c-Z5;4RA%ojt|qxrq^6{06=MYf@gW+y;2Iq}k7p!$rj>2L{A+1dpRCGLuOi?=HxS z9+ltZpKV!@cZFxLhQ<;kfV;W(!YC!_me*OT%zpQizaJHEX8P#2$-B-n|gj&n| z+?_1W7+8*^tn;-6MaUP{Q>WE@-5qi>qsY%2=-(Qmk+}V9^~~H|P*w%cTE8FgpwAeq zkh#bPQ01xeeB0_CJZ8ckTc*zjPfs3Cur}McAoh~-TH(s6EWFU0vQXf3pVB#NR-V`+kOsYNr;T~q^J>$*;_{x0)+9IXqA)v&+`y<`m?nv)4A6sj`P z)m#6byA`9$GITS?Hq1Orj|kuG7zjh>(vk1f4ML4A4KcvnR999QMa{Wsq_lP+Kn(8L z=ME2H`3+o1hPN7rUFDV{S~-R%3nZ3XffsIfeUXREnH%;UpO%$qf8K&i>s`5pd6&5A z^KV|E1+iI^Wbffujb4NN?mb)YETy~>$AXPc=kRFUj!J{b%F;B{b?|at7nFKfM|yZ+7*EfPz^FWIkD_Z@YvnnjV0P1_RYF8tMCM|? zz;^Y(O9{VOzc$(?#Q}y&y({VxS-qTmJDXkPL_GFM5>-MGN`qn>s`P4+!OV|Q)u#-< zoP_is#YxKV)AS8UuH23^lC}B8_|zj=YRTo-(@W>@R=$E%zwbI?B3@JqTAI?+jE(;# zzWM1*W?*pD+3+l+gKX2AgI`Px5hckfVQL}WXcw)G@Uk!$;cGW#74+eh@651YI_~<| zB{**MyhGdOdG2ePFF<@AVD50c&sq1|NaValL`LyuAFQFFwOK(({sup4Z<-F83QHhK z^J#&7>)e^hP|rH9GTNj1yER?RNIWJWs-CWP7qr*kgD4q1yaVF1Q!CyWcS-BFN;O1I-|DV}T5SNzf3kdu zIwr-iF4#CPIA6HfrKwM`5kGT(zb!m{VndXBG}Xy2XM#-4F_`eBS6MFF+74pY|6tGZHwz;0DXR^EZcJXbj1D5DBp69Xkz*THB#!r zNNJzW22*TghumW$DKot+#JM_+TU`uj0S)|hrF9(en*g9aX)bEd%z5YbfwO^<6$kE* zVru$%{ZPr-eNb&W11$ZT!$>Srd}x&EM;d+?8e#t5o_u>H)yhb`q!d*uBl+=>J__A7 zF%0Tr)xdrGueP$*&b4(w`I>=GvxuHSx{a4>N>!KCwwD;T-P}j9rT+G-LleJ$=y-+V zIM7IbbTAiaoB%@f%RQHOphqjim$8Yd~tKl?;U)4CHbf& z0zgpO`4)QU7uUR<9(oPfIWw zRLS|3#Xm}UN1wr=zwVBQV;SY9+Q6-*pLpkmnog;Do(|{deNT%*o^RO4Ew}taPDJ+K znhnuD&Q#p~5$RDM4v&%qYCmw3Gogl0Y%(h;#E;hjAAa2Y{c~FU`Ejq3*7Nz_ z4Lo3uB_jhEo}UR1Rk5Q8V=N`cT`*pGKaNuXqWgDk%U@I4g`r_pOX$3-ed(X7mGjgK zJlN8jVm+bN>4M7?VVr1CS$_6rf)4jJ=7!wri~GYEGT?7ktx5CSov^k4(>_9K^F-)? zdyl6UB>%l_CG|$tj$hshI||F3LO?`h^7K1-NG+ZVnjskb?n5i}<|qg#zA7#*hFxco zRwt&kZht-eZ;_~uM!ff?Xk|+K`e^IN`U9SJ*Ewokfqy*NP0!@1jv`+yfhh|~Z9`gR zubc{cF_Szqu{S#h(}AjI|5eqp|3CFfOVQ*SK?p^9PWWiRn6BeL<3=Q@zlbelvHLb#z0ehrZ$FWDj#oK%h zk;~93Gk`2bWD1*zk{Fv!Sy^ReT+N~3bedYRtE#U7tj4URVfW9^wR#(rm}FY}w{LUo zcD3OC``GTQ@T9HbDL^z-EejfAMQ;=49gy-{Q}ETJ0sik5JtqtczP?R@-xy0vJ9e?3 zZ?8P?qv=CNRXCzZ=4=dBO<-(dZ4f-O0ewU5DaChQZ-cK!m(!HLu?5e zV@$)gLbX1rt;Ayv3?QHiZ_4}2XgL8ku-}D971fe&l<{kc$;*1v;{Nmd((_J0$mKZa zTD>!hN65D3fXveiH;smybHZFr^(bKg9&sw-f7&s~^kV!5ytWXW`y^x5bk)XEQ+7v05r+ z?9ZE!Usj0!4&c}SO`bTlwjqBaqS;t82%&9}x&$>`T#yh{ z0e3q_#tr@iFO!nKtC!UjU6@R_eQ+!aMVgwRgVr;vIj{8(QGhaOd~t@DUP`ki!Ld@! zOd=G2s~7R&8pB=rfZxu6;2UX0??AGpnswEi5j|AkN2R$&E#?8m4i{m=uNB_E2AXbh z8@>CDiC9t{{uVH0y4dfkvYjbg}-l)gI=wL@(B4(P>cJ7hjmwhjHd^8x?LW(zV&F1 zsu>m_6X^;=k!=#WSV;Y0n?O~^o2?-sz)ee(=hHTDlM-sa$^a|9!3n5to}Zs5jHK5N zI$>{EA+Dp90qB_;zZ2An(DQh4E2}0p{M8x_*g*tullXK%8M&OOKEB+a%t1QbS?QT# z^qdcOYC^8nTo8Zq)am|1%EJ-;1+U7`4_?OTHE;&Rjm4_Ccq+oi-977UMonE#QPbdM z!Gz|v<9X|-%`Vrs#*qGZh3_{_xC=vQK1YO5EC1#=($}or+H0( zR9X+0Gl|=3Bd7V?tVWj}YhR}Mo(@-@T~d3-`xx~uDC}F$-NahxN${HYy29ga#qjNX z=(D#W$bI|yR_5u|#z})x_s~Ggs*S*J0L}a}w0ZdlMC%9HL zublpYu1wRAqx9H1a%ljkWgZ`CrOyQOMQVpeb8OiMeAlomEf^vbG6?BO zgh?^=Hk#OC%X&?dJY8*v)R{A2dk0@Oex3l7KGK?s;@U6`@xd&vABteR&))ZYPiPSe z|8SP7+uW_h3nrgCdm?s)>Z}z1Cs~r2xl?DJEb3O$B+lxh!qFX^zf92~Qf%p(Qy}PN zlBwJT`TPjeuX2%$(=j!cYlQ2vORJ!3(qp} zA048%EWv2y-4-6DnS`kCUvfxTMzo7j-HgcE)DPMK0Yi2et(fvul)y(ZZ@i_m*czn- zU@x~GJ_Hw5vyDx`IPOS4l1Sq{8@LoLEGlVf!BY{}n9=~Qp|R6bAz(}&-@X<7hhjuQ z{hCEaL?NU_7N3e*CQ2|m2pY|XS6NpxoXrh8%_-nuvR1|^=GNsV0sJKjZ|}xPxg2|! zUryZMXhKYt%?@_c{2w|HK3;xh;^<8C)bf_@u&)|ig_k+GBLd>WT2At)e68+sKnBmzKYvCWx&qV9AxLP5= ziwRS$&D{E|Br0+zg%_8N1Umy;36hJuqMucnD|X(f1o(x}YO(j{xMsp`Z>AkPq!Dtyz?!3 zO&64YO&}y4ym0YvbLt_%9|(&m&HYcYN z+eTyCHX63E+1O}oW5;N0-F41)?qAr?UTe)c@D4KQK2nZh^|fO0RQO3<>=-$9ix&Hm0fgf+;MB;htu_$Cw#-`XSq+f zNv|=nO5|4OXqN7qt+}ThmA^U*QfoDd*;(3U=8S2eT*BL6HZ(x>5f+mt7gFcS|IJ}LqU?i50^%xIS`A)oPi?%RwIK=c z!D4EwrS&VURk?Npv(9#=D0qO|!3}?<8^8K2?$aH06^RoTCK2I^qd^Ih*zrQvp9G5# zJTWdAbm#g%4--uLJ~K*(iaLeVnSo%Eq(4WK89Dxzeo3vxC1UGJ@8EC(p$#)Rc;Di? z(rNV?_`K8jJn$G$6Cx5+B~j^0hDq%WDnFbfqTK%VV6>(QY%Ml5xhScPSea^C*SPQNQ6xpH<2Bpn)$-fxY&id4fw!9nkL&!8 zNF9gGA-$G!BU{^uQx3a=3L8{lY4Kn+wPKm_;OxoX`XtNasMnk8#}%~-i;IV_A)V?H z$K@m7!ZqV_T;BqU4KROSC-!$dO*jnRu)HoDc8@&dKO%QuWq0@OlF>YEO9%`B*punS#mNE@38_D5 zI%RIn!i1qjwWAg|R)lSVKvuuU z*iay|H0}usJBu=rve|*4>0iYUl+JH8+uZifurPuovL&JLnE?nTlIk_4F^jl%Bp91h z9^d<5d8wQ>Omn5klu!{-(E?Sm$Y^0>ok`i{PZa71n+C58#U$8tu-H^I&I^5Dd{R;7 zOM(?qOZpJoO3A|{fS0I)xur)!*SJROMIc9Fb@jn*q>C;dPVuh?w3ZD&io?k}rHss> zL}Y1g;I=9up~2(*@UP@y>{F452&}QK>6IRge%QVeJbxGY@dj^p<=tIBaFz#MOsy}57c3T`iT*MB@7mn6C@ z29VwP?pLW2C_}B%JKo>f8eR))1H;PU>j>apyC5x)!+lt1{(y z|JRARx=(>^TVvrW*WneR<$QCn9cTt$k6t8Qy%l$578}V+VA0S7D1Xr=pVF(-6{j8_ zOO*lYyDi)0)Pp zyLFo~!ZowfL94q1$N}9?FV}@M-@E$=$l2L_QQ*BI#TuECSE5hTTJB0vC71J-06frV zD`u*E&EWwfNOB`W$|7nNguq(+k}UNArk_aM$Y}cEXp&|Tb+G$HF_o7@NoNst?P#v4 zm|4w&Ng;+Mu8u0Tek;Q24A!OXt0HEdkbfTzLV_*W+F3=sZSaoEp(hR6N2VVs z&k?ZDpn?#-wNp*XG4k^Z^T!-tbjxB)8a2too^kJhMcvytR0YXxtI?*y!Vht5J?$kbQ84U49zpNB+Ftm+H79Jke zSddh|&FWOIu4*SJ#Nh0wuzNZW^jyYxfOT5`vee zExt6sq@WY2y6P6$HPU z3vvZsZquD1UiN|j&%UKaZuq2BZyfU-g&`IRGo#LN6hp~rRw7`?Y{EJ-T)~T zgBVB(BvD8*F{5(WdN|q1%Eoq?oZr!N@w!;U#FKs~F(oiqP&BN$tUtxGb+6v1417pm z>HWxKnaH*1k_qv9L`O>?!ctCEXt7rOHn^Mhy2CpEIFKcm?awao17{u*5-=-AGb0xjnF7zvz4}$J`znlPjosn*M!mh(p@$)X`Ru?C?FByfnwj(e22TR7`s8;SU_c?)r0CO9)zQ+LtC$$(zOzIDo zAxUg%syd;lu<5taUNRz6(lbaK!u?VvVe+P2aw96u%!GxiMM@w}Bnzi(ENg5EIX$a7 zp4L>M)#VCxt~WlT9zeBo0t>@1>P@IPv`sCdqVuhxAO29plfI$ zP>4BiSg&Pk@a@Oecw&*o(G@dx;>4s($w4?Il%>jNa<9oLzVr)RJB(9QLh5WioddZ9_&;#wCxbnK>!~vAm$gG^|pK8`z4-zKq6;2G?U| z-YJUg>JopCpyRgVVs#u53_Qp%UHahsYBNj6q|8XGVrLX#VlqmjHgMdU=f#V_*f@;W z)8AkG;Zehqo`iPJ==mWVYR)VSWZF2aSf>ftoHjk=3tj4(#mvAsZueLrl+2?-_e(h9 zZLaxK)ZkgW6Ga?d!~S#C@4Dt7MEIh2-`WvcvAFl>^Sywx^gELJHi&ZU9(Jbp?))~!u|xo8gt z4+GUW?x9hZL#=vOII5+hm%nWTnp&Uh#E-DI+~9(6Chzojn%CSLd|$}3@J=#u2o6Un zy2OSsRex11cbL(PsUgPe_c|Fnui#eSAt_N0w=No4J3|*kl}&5LL;~6WKuMHgDLZHG zWFgKZVeIYJsPYrgkf^MzTu|hd3V-z&8g$rCjO2S2$|WJ0Xka>&^5CG9%eOfkPza(^ zD;8&07Y2b9VXfsEc?%g5ATRJzR#v^gw)KRZ4pY6u4KG1{*A-E0yrdmimoVvt5#?e? ztX`=<)cLTbP>Gb6U(nSYMj11DXi)~7F-;wF`qo)#G#D&;gP@A%GT|L09k(xul<0A4 zx<6Lk)YtybmfVp4r-QIn@IP}=CSuxYy@BNMs<`BR3(sMm1HS)UVIZ)l^j`X zj^cK#d`!&e5XtxK#05*ER;MK_`!-LSiK>NpRSO`8D>Q=9m0y}MMM6utM5rg$PA#VA z{mo=93?Y5^m>_%4dW#KE=_|s&x|BXZWL9pcZE)Ni6Io66{SYmzevZ6IhR)5=xT{H6IE z5%C^940Wu|cBMHvbX)_-rLOKiQN=9kwmFBs?+|s}rq(z&w@?&V<3*!<*Cr*p&d6A{ zyncen!(8|O$OSOKA#HuMBt;|xmNB&{K>@bpA}-!E77F?1&5W@N&{b?>+T|`dt30ce z5@9=uPC?3_P3y^_A%??W2s+YR`0w?*?)vjD7ixT<6y%ex5h1>YKxJY;TNWuPliKi* zi)$g&4T>_w$r>h+!;uy=na$K=0vg=)T)Mw-n<61H(s|W{E1hQFMQ+Ya4-t-7qbi^8|Mbz0wFO%7x`}@8Fl+}R!T~eXp@roZmv)-OS z(A`0>PmXWx$1PHc$<3Z>q3C$DhYAdgPXUrb@A%7oGJ~Ac>!lR1fh(>f0RuQm!f=;9 zgGhKw*E7NF&C zk*^=NJd)B4JTuExap79W$Ze9zAtVe#hBRf^b4wUG#wX>nJ#Qx*`mqD^M-wZ?W)^41 zfEIisD~FPf4q&|_yPOSJF}Go~Wg$KZC%SU?FAosbH%T7T$EX@X4hk- zCAY)>)`mVr{(HQ&(I*s@;`&FlG{yF`QrazLQSSGt{_*44r0-;z_1hu&ru8n@l(tBn zs;LKapS2Kos+or?tlbzZ2P>g!y_c$<-uP?@0@u?jsSN4GV5}oN23GAq*To_hL30F&okR)o8HFc;H zn&mjk5chBD{J5DM-i#d}%9crXS8i;gEiGw?mV}kwC$=(5h!f$?CDB>xOg$9IZP8=!~m#xeMWs8ZTk*Vw*!rvO;8b@XwFY>2upCMja(j7z;r%Ns2P1at!^1uB4(e zUY*Nhd2wcJY#hZ%UBm?YWzia$fKN(92K~pTC(p)4XG|QD^V5kLZg!T(PTS#e_iFqp zC+wGMWy#@$(LFR{A6jf2eAAs-G22#q7C-Lb{88fKegpyENJX6xgt=re?`>Hn8x z-in4}Dp~3Ts2-!t4JHm9P=Ze|om)6k1WQJ;K~yDY79=2dr4K4tjHDxkDB(zGfrblI z7xye~B#D5$;G;hDupBdUj4JQ3wJ6JkeqepkkraRY)wr$ zd}|XbQ@j&=5C4oN%Gp%amXdDf4CxpMJR(^RCspW0R78p>_r^E(Z8X?ReFZdIEqCCS zoci-0G;V;<&V|~4JAPT;J_$#3s7^*#ALc?n`Fp)kq%yjw6kW75r+gN|PQ}ipHmr&k z1CJn*6p5IY^PX6r2x1qz0twvW&Wg-*{U<627#gV66eW8=l0!k&5EVLMMz{st`jn& zNoQ&Odq?2y-Txqs?*|K$25CM+!_5I6muFr2>|fSA1}10}WN8H5DXE}wAPOi**>B?D zkMNc6nmy0&pW5}@Tw^nP;;4C#(q1$ay{o~`vSw7F!16FJ5X1Nt3txvQrPb&TRdM{=-pjn%v#^l* z6V7$X{@Na<}?#I;^X$qR)5u>X0W7` zt%>x0KrN`=aa7n9#Kg-SR~t2g+t`dD{n;t!)}1RZ7?@ccBP+EqpH?R+7WBdrm9?=U zA$VJ^nOkiN>VD65nD)N^MD?xGM6h)Lx=^#gH0g#(vl4nqt=NTMj_#bb`A6+l7y$HW zioQFo0gsF}q)0!7q!aPchOq#c;nsIA`}MZqCFJiWwjME&iA?TW_1QjkJ!gBY>OkCj zqK);(Rx_T27PQ1Ltnv8X5#(CSMR9X!R#%sh-^bUFh^~saM`^`eshe$*_}Q7dkQ%=S zo|vz?y;EddC`BZ;wu#~avB~1>CXt0`;mG(FPqQT{(k{0T4@Ol7M>8Vp-dn!5nk{La z-v0)`=VwT-8>w8?1f)=pu3uWC zvs0((IeaFga}1Q7tC<{fiZm{`cp9VBymi?-w598fu91yn#`hju9(X-6Ygvf=WYSEW zm*!MfmnJ}*C7qHN(PL{__o7k9v$nyFD8$~n8QCuvgcTPj=k)Iir^8!n@H*!XgBD+T zxTb0C5~<5MY&*;|@+l5DEKZnJG|(WC9t>LYuKVGlR&8EbQE?Lk=A4;&`Q!PY_U-Tg zo_r@xEzpERNN46gRB&uI`quxx$m;$UheH)-5)o;j+%akrE4V5i23(U9Ts%O&{S24q zYH4R{Hd?sRZG}!=4d2E?N`YpP?R)5%VZU)fN)ue*rCfF4ER8Y-OyVl&q=e-b8%u{*cb&_>_O@ z)Z3sz{lz{(0dG8%j0WSfK)^hcwAXJ=*$e{g)z#IEoUC3$kBdLRK(5}`%l(VazZzYy zWGUYW1BOb0T$E`87cO3Q0=uv$nhhz8fxuwqjRrPuevvLbRXQXvbwVTLZNi49(Kx-Z zD%@P~eZSZWP!N5gwP z^5(J7bgSDjaCS>Ms2mA}e=c?VIU_IUz}i4S2{b#uEQ>7>Vw7pjL@K~BzLM7f;&uuG zNN5g*<7O$YjwQgP0uXqIHipENQya1XpJ4LdPyPVX1x{Dmz2vwP6gOng)%0_*8jC?{uEQ}%bfFSdcB;7X(0HwB*uDP{Y( zHs!ou`JP!~GHKT6hs6;5D-;t zu)n1(96_PZpk2bfyQQzp%-kUu+a7QoH+R7>9^1X)k+CHuC8@e<(8HMji8xLPd?4ms zF!A$CU4%C9zE`)@dnmy$;IGGnNmt@FyJ!%SwELd?x$ zMU^#@(X5yEl1{Xm}nhBB0IcpEM#s#a= zV*T10ATN zwq-#31PBgs2hHM;SX&QFSUy`60zCbf(~P+Yf3S10ch1_9ZC5)232CqQ9`Xwxj0IrB zb;+X#Nsw9D7TAdM8J-WPemL0J+T;GSbU6K=n(OtyVrECgVJI;wiS#uhmJg5HIlr1 z;cU{J(Ps7-#4fwk2`JFxrK!{fR`*u8FW3CB4jA zkY3DuITQazKK1s<2+Z&5%$w3yELI-?VX+n*?5ypxV;0zNJw)@ku|$kaW2giB3GpA# z!z;B`c==Bi{s&J4{6ZG^>;A*|u1zf}v=~w)${|Xbzgc1G2X5CvFmXBix*wmwDxOg# z35?CA&Q{a41x0yw(K^4cA=P0_nb{DL5ta4UQW`nn`jI%+d)|F(P{f$NP5x+bKgR{~ zs|*rTdV~Uep+z8Q37F&ab8z~1ZyvRU*w;r21{NMRAqx$PCO0;qX=xs`knR1!vD*kf$0AC2`c8`^%y!QH~# z8gg7Qa3s-<+fq=ohOuV$#%TrbM5PA@3A4t=a&3$9n%E_8Eei{3myZ3dm z%3#WS^X9X@z~aPz>W{*nxFw{T;mae%N!Y=0CdDb(M2w4u#Gfg5DUGyKZlHi&nGD#i z(Doto=ND)k{O`rh)Uk1NgS)gVy3kuJAYQMGwTJadT_uFt4)pj^^yzi|q z`apu0<8A^WBaiBGR)&GNazLg84xE5+=$!$|CTGu@ghKFqcp(^;%>Q`w_8$mUshLqX zkO65|I>PS4CJ1~XE9Hej5G752<@~NpzT-trD525LIa`F0vRrG#7yXT1zMe;YmV#@bAL>)EJ&%C&`>Dk4@R2!NI0JS)w*_pD&!=LG0~m+MV(AyK)K5; z#TQH@j-4>pd#7SLhr^u78rL{rH1PHyFe36*K$tqYq_jOS{hK>>X`0&Ghb`D>FmZAM&L$0wod=P)4K5zu=$>*65|Rrrl6??0CrRdcO!30CwGlg$ zC0h!w;Q5oT4k-ehq3b4&fzWWA7yZrN*4p}?13+BL{69xU`~N?K+*+qlgRl5TPUflX z1^wI`8@xBP|z>*v#Xmu?MONvClU12U6MR%2l)I#gzaY8G1Uu3R+) zT%wv$oUXSRYd`)OzBJ>5xST_N>yqX=VdD}MVL-0?KH$qvVsid?$53kfo5fZkgk7IW zn|G?Dq6ed%EaxdZC65|LwB@-Ar|)s>DQHwI_Oq_9Fhz_j?5A#NDRqB&iOh1n89H9G zt@-JFcCC}BBE5;Ls40mea*6WD`d`Fw10F$sg8}W}Lz-R29%4uQd>^G`hO_|E1|r)S zDEl=Rm<#_8iO0>kmnR@iB_bX2IJ;YzB*=_rhHm`B6jGadS96)LjGNibRgxWcxs3Z#w^&$1=*i>N?peIBWC3CCSHr8bGX1mrEY)d~J_(kGr zFW)!I7y~6`yi&g|LE-hD;;56i?_1Zkoc(57=)O$4)6q6l2>SrHp|ej;)-yMvB6T<= z)o5Fkaa#tXQ{{jQ{;O;lb}SeOHc|&oD^d>v7TCEfy{4p{8k?jH7qv@OO};Z#5Al_# zu-ww(uBX+mCdwf0lAQXV;)rSXLJSN`8~fdNj*Y3*E+)U%zVT6v!Jrf@G2z(ZpvA1A z11$TM&Tz~Mjh}J@kK3G2K7uwfEL2Mt=c`RX(YCMGO%EkVmU?1vGy3+y06e=Nox|-G z*G2Qi5GpPkD5A|u`C%ny*yC%JpW+Stz12MsR=AjKUtJBnzi<9O8WY3(e}g{-Iu2>-Nd#y-{588E3mIDU48qt;etY- z_s+InpA=(OhJ`uP!oGT>_sdkBsS#cG{guIC7+&+V;#Lm;qEvH3dh$t>bz}2QXFv-L zYxvcE%(osj8NG$17$1)gQ107=5^tIb2Z6_1;VJlR4)*x)*T3DuUK}6Sftm zx`dP>XR?q4ZVIq7^6Dm^cOtL-t5HllvI$~IE)XRp+N^zbZRO9Q`XX>%kV*IUeC!Pe zFhazsle?buC6tonAeYbRCMLX3xACp)tny5(x~F&mvCgFAry?>Hq*-6B|&R3jBd!(N;82rlLk=lVwq|I~$QwoRD?)r(yc+G_w%;QmhN*VWPGkE|F>X;BzGCkp#W5mG7O^?!x*9{ z;S`8{u9TnzNt;5-9$3L)DSP-_(~=OfI1;}@fp>P`EIj1IC!fnddS$W^gA{*r=l=|i zEvGu>(m&+(I#lBy)MZoTbKU)c1AepMblT;8*zo^Goq8}Zihe|xsX2jpy;sjw%$9=S zxvq*lbrV?xYrv&y=7Mo>9U_E-57}xTwc3moMlR0jd(G(mYjzBZ+gxqwMhg51azaa9m|*mko$(cmR^Yxg=8?tLxa4~^{55tNi=oZUF1 zMKaTemhxp20JPP4fst~!f24+g_ekhXl&ZehJCOb$TddMi@P2`aDnYTK%R5Y%PzQ2< z8{g=iuKTR$@AM0Fslk*mR8Uslw&+@-CjGN~r>0?e^jY)+~@=CYLgn<&PgKM+KRLjrGS){6GutAiD z9*$8Y!^jO+?QW*bRHRr-SC+pWipv-G0b8M`-3{R~#>~E2P|pNGn5$L3{=$GZ{c(py z!1QR9D=x1~u+5ZlNV&T4YM>6f0#&$>X21qgGxPFGND)ePANqHaq9R(Y)|}Jot)9pR zjg0KPoi6WxeR2yxhTH#5BfqGNy+8M1ee@W8Lz3!BcQgxg97s*m-xGM``Vt^Mkd=d5i9`Qvu(=M)<1|QTX6S=0J*7 z(&F4{5yU!F%It&*J&D~%oSx9+zvGhFc>qW7uO2|mqTcER!8%6egM=VcX~a% zZ5RLdt(Dp*?!_9tiFbnTAY|6VDL0c{*0*32zzoB(AuVg1TBulhOjhuXN(>}2u2O>4 zUFvtzO}VDFvBe_VdVHf@3~6+CWz3#JKh?wtc0QOL9Ou!|(WY-|YPzQ``9HkcN6CMK z25dF{sUawRmU#`~GU%xB(UcAJ}%QI;$W^j@s zMga-VIM$$$q8_|h4Q2pK$;Bx@n^#o%nN>I(K<5YfGF(_(^@ZBD`tkX{wHSQCAp#8! zJi=c1zA{0aUS3zgToy;CMD=KX_q+Vujzwp&)e8ps-eE3QYl&z`d;^{ifUBUKH4X&E z#kx=c9GGXA#8Bp>0y@mJw$4QCsruZist9+o6tdX>HssLI$ev}0a>97Yr84rPnyItf zZ&yq?I=#PGUjWqu%1Kg94zpzoaM}S5(3(0oPrBpD097C7?onoPrG7(LCorG(E@E+f zabaTV6HyY4m2{73XNS-GkxXzCeDRJ_0_q_aLnD0fk@_hjtXEn(1Ozf4>dhCN%`L7? z>(wx#pa7|GqHj<}vP9V4G1i7jiqK0h~Q6)qf2-_<1r`%FW5{nrI zl-U4mll8MiI8J89_EA9*kRuBNhNujH#{G*_8@xdJK3{xyIzGqw&QYB`|HC(bIcbGN znKsHTfVOIA98?=qm*q+wTjbMNXKB+rWM~pX0=Q%nco8L}SZULt51k*uXPs}~-*+N^ zJ*`do=8f|m0$EbC)8=!K-y5NjQ`!$e>EyjmlX%)x(H6Qp`}8T`la#2Cs=yA7!HWbh zPEm^3cz~>0nse7cuL_07k=$2BMB?hZyMoyLs~?@&c54pBEiLK0XS5}?vTEcqOa?$7 z4>!7?y*+K{z}<`Co>3#CxTG%8;O(-e-t%U0&o>e&8H_$ZzgTa6hwGdPssRvhm8T^5 zk-v3eC2i4&IkGqeu3^7!zA%1V?~VI_@wSM;>56&rG)d4rYHflE?B+rmcmyAh4%^Rc zh;eas&V$14>#e~H;~LByDhE%84?7-FZH(J{$Nj)RJjRD;Dw?5t;9K`2+4~dEM@-P( z3JO|gOdexEDnv!n7AgjG1hG_rv9U8ep4FI907@Nfu<-#v5XuEULVPRJnp+el^B)i0 zVnE5n^Z(yBwc(=6sQ$(X#6|K&lfjoN7Rs)+$jU)#9v59kRu*uk|H@$4ZR39`!wCx) z*J?1AGe#^XPOdUu7*hiYIOP!Vz2JsV<(eDT#-mGoy?pNd!u#DL^bz@U1K0f_3BvaElwtPz|gi+Vpkb1{aS>&< zlccSj+BxcOpq^m_wlLveo;{E^jqP>38&hldrgwf`_cX>= znM^OMF7GvF5+^BvfRx6qbYm2sn_cc<@V^x?wbp)|)#w_W(a7s{Gbu)+ger5zZ6sq1 z>w%O)!H--d8i1RpPrkk?md#**s8meV^Ai%W10b9&>!Ucpy^hG^c=-KH4W`)G}Hs3Z{nYUy6O7cMR>E zwNP~!aY?akAT7g}#Zz1ZOiY;LjK-1hJhr=DGQZ=Z2W!-ry;R?w>$dwG?*RUT(0}Ro z|H;FDe3bvsOEI7eObE?f`9W2fQ&-1G4sCM<`f3Gn?HSt)A59Evd>smb3^9Dy>RuIJ z7x@`DoyRwhk{Pc~)tcWCPv&v=-pcme#*|)+aTbxN?2V%e*(!~RNQ;>w?$^e!5tj5B zCvT0CS8!%F#xs7F94(E-185wv>)uOzwj1@SC%TyF)%pWR*yucnx^04<_CY^7z;?D9 z?Wx9EH|fBjV)B=7Pt)Okna>CAS=P9~pM_ih{a68j`_&FNNN^0U%fgZ^I5u(;N|TBLCV?>F>{$B{k?}EOfpRpQ-@tAhj>Ox~K|NDGRM# zq#8OBfTY)Z%$rOWduPq%@{gCVvlHZT?iMvj#m%z@{LA=<_F{JM4BogiXiz4BC2vgo z)u!lF8V#qD0i3ZX2nvO~-LMIrm98gfXz1rQ_b2L?`}4!ueHznQs}M!X<6X&U*8&j6 zC2#Ma%`49AX4`_!qTHE8p>@@$u%WQxOesm_GK@FCV230Fj&GN{(G0UQGx9Pf=tceD zn3(t^hO`kg7EN>&U|;}klskt8szQT)x8=Rx-~mk-ho6^0dyAZNxcKx+WJpz*z1)-U~FNU~rLk_=lqRQeL- zz|vB6ECyX!hYQRYCerj(B55+W8Ze28Y&z@1x*vrM7Q@~^W-Z$Lsa5z+^ky z(#`GMl;hbne+r;9RLZlvl0uM?^>G&S5)kqBEgO=EXwriv6T(RGjCwSsRH=8{lD0mA zw~A~=o%!z${U>_U^UaRO!~oGv4^j7|e~xGvIe$Bj$Kmi9kKO5hU90Q*!Qdx#mEx>% zqYycPsxkggFsUU!6O-7-2>VQ(Fk5!!5xO(9R zV%#rmP!RdL~W{)@a)XUQ33KA|wDG(K97=XpXq>BS2Sg~j3ld=FVw>Yt#mOG*IFX8(zDpVZDnS-p!P37^9X3SgZ( z(?Cg5rXT#4>qi>T0$OwO_8p!KcSsYqTXnf7)*AXMu2%_JIFJ!OMhp%` zS~+!Mc4c*dB%XIfuH|28o7-ol91uOQ-0*i(=YE!SymbdVcn->#r1h^``KV%ZLpu?EKsPv*iuHRd=gKuDGOVL#_0I{9!)-%9mqKNZh=$vwk}^$Wdul^S2t?AS zL?-sQlnM!e#RBccmW)JR!|{?P!#1RX-u%wz%v14=h~=;u~b zo1c2h#T0gEhdi@OFntzlscT1ncx4#{BurFDy01^WrP@n_ffDJ(^4kFd>!L+OvNRek zZk1Zn?>$hPEi#yuU6R5*`mCjVbSVou%RZ7&FrMxMFKWkoq+@s#u00Ul#fgiE$Bi7@ii` zwLs+=75U0Pa(RhO5tnc5Y#QZ#(H#%8cMr)$!}GH3t{Nhwrmpq^XO*K$Bgi=AXRM zcJtM>RW8RzNM-GmOC?xBDB;hehSs{*)t4cn(!q`p!1{p%O4{gC&}p@{h{>U}Hn%$1 zLV13kJ)x$o=+6(XrGLvMrQ|~=`rhYN_~YudYZ?X`0?nKuwDlt&oY7xKh@)w*1>#)v zF`!z)2HVWGQ%L$&K2iDbo-55w_T zuiUCl{OZ5=&BJVps_V6F%4K1debe(I)>eOGoNcXHg+4ro(K+_2Qw~VMr69vj4uM~W7naUC$p&VmBojSguG>Ie(q#L-nrKAby;_N& zUA?4?FgY)&Vr9vFk`NJCM*1P_U`+RdGkMfdrm`3X^6Ua-s-L8ktjd9yXo35EgL65Y zZfRR@RR)J~fBqeWWjmNTHurUZG)ysZxkj~DLjHn{5hG3_r8v9{AL27%8TWftf$bQqfx?ezFSypdv8B&JsGQb zd{0)`{dJ=n&BBS7G;ThljS{M6Y$4Ux1BoUk8bTsltUu=Xyenn=%VP-~?__0~Kth4c z!p7GtA@KM)tx9{GWvX)^5nW=$3*HE{DpO!vzf%i~i;Fic?R5X@d4hXw+Cb&p##=>K z1>*Ax>VAAZge^iF!d8A_z3|>Wyu7jV`FCSb$n6WKpxQ$@WuO{k&RoF9!$g=A5P!}K=#?M7HR|rHQo;h7<=|^F}{xuiH(Wc zn}zgP_rPH}Q=t&Aa9ZV(+Hsj&@%2~Jus58q>O5|`Oqs-(O=MxRax5xoY{{0OB}^O~ z{X0|sCQo4PaTnX-4$S{p`-_OY9qppjj}U*D&>|B?|K}-1T*YZ9!&R>i5?mWW%Z3dX zJ8{)roASy{%2(DmGy)FmN8X2lajjL zYeHK-pKt14r-Y@Ao!MO$((7d#!OZmR$n+5;yEE_xxc2^d-kP47>8Am1wb4_4`4ue= z2a|s;%$(bMShha+t8RWRCS`gOVdfDH%TlaeZYv#kEw@@kBfCkJ2WV;5(g{D73qu|DPj{Ii}KzJW$ZG6Y9kQ`al07O}1Q=GqMwu#K8iOnw<nE;ytJh&HtxkJN&D)$nl6uy^IQ!Kr4x(M;Zu6(x*X z`9AUFP;q1U;^=UpWTBmrQEQ*Yr7=O9Yu1l-@2?hF#2s?wwmt!pQpwx^Yv?K^|WHZ~9u<8DS3-ffhn6UR%f?8^Zk|D6XB zIsIv^`-!=bJ0^TkGaBo1^Pwv}-fyochyO=js1k+GKO1Pj=4pHiT-Q?~s z-}*bQ?>Q#CGMEvd>PP=1{Py3kU7FS~g3IySkHq4}9C{YPnAGf1g2nr=!p87K9 zF*YisuG7A_`??Q|!v((}u)`s>q(lY7y1>E0!ZR%3cPh2%1;(^*yTh`+_PiUyW8lc) z`*HQGRY`2>5P(kp2G;Xbegp{QiU`(M3#|jCFGH1Unnt5-rvUBu_jK1k5B~O z>&X|bCVM&ueBKy^m|Hf2muZRPlQZJnF=hJnGWBuQF|t+dHO($#DBtv#OWwd5zCOl6 z_H6V0D7NBy&)wx9^Z}>8^Lvm+*!A8YPF;8B7wF++ArViP;r@A5OJ}<*22bQQd~X<5 zYNFP1t2IJa1XOJLVSUZoJR?^?E)ZkNf@ZNP>wQW1Lig zXb;B)GGpCP9A9ZE9hSRf6AB6Q>QpmF-4@~`vVZ8`uzuxWFFnnip`o8t0+f_h)Hd|G zl`3LR8Jz`L6w_zl5US}4h=2zFE?G}60&S9zX-~d3Y=DcY^8$RFLWwXcQ(V?Q6C=n9>0Sl<(i)&!-?y?EmUeqh;3pJ@16Y7*iD|TcHJ5O&eErOq_Q-xi<7GB3Y)#ASp9TYI*I61KpR3?XgwU{2nOymSQ$29wcG9x=ggf(qe=WudEj0EJJ(Dy9VC-d3D9(h`b=Z zEsXO$`{Q1luI)IwBW&4zjOD~uX4?D?cVM72UpnZ6T?Lfn6mv4Bls(9Q+SV7DLy;{Xw2oD;UU34tgAj8@0h6I$dHc{O$zBhHs1 zqKkqixn)G862T`dr=6#=!6BKxw`b}lK9FXh%(%9eIG^SrmQ+pxkQ=t$edZTMXMX$` z*ncIr%tiZ?*6;6CT4jZOaB%L*io`<`K0pn}zjzq;y6DH|Cwe{R;7b{Po+aDYKuV1~ zvU!jp&eCD9%s?w9Li*)$e6>qL+rt=teIbf#^Z_G|A#Zwit}9wI>rRkO(1iIF(8CC) z&i8fUO>5|Ppps___rdmrTAV4GG9bU9!Onoh%&sf9Ucc=C)`}$+w}J*-sNDlSicJWe zRYbwm!$l35n|MmBOqdGMGiPx+?M+h$Xhxh|I}9rcpmbCL42S`Qg+qmindkr?g;hE_ z1H@QC@)6*1C5D`|e{4P!JKHTR&6o2}&RxYhTzdPv_GwoWWX1+CS~0aLhA5o97YT4TyT_ono?j0rVf zK*amap7Z4_rP050K})7^ru{3LWW+_7p%BA>@vQG+q4IXY<`ET0sj7DVUHqsAur}i| zIrEzzF8CjX0J<;z`orSQO6NP?AGNC^qg%rqCK?pvk!c*9f)rH{LB8G;RE9PRHg;zU z3YxwB)U76QQR3H%AAB;dS!uIDWu`c1P=%DM6t#n`s@}~y7R8K3I(buNi2+~;yYgi)%u%aTGG$ictQn7<9V#o=_5W_7qW||I{iv^ji&f2@Px?*hz@xaOcrVLfWtINJm&aRnbxt4>CZ3x1 z2akN3{}QTi&h^13=X{iDY+OK47O<&>U0w4HYqG`xA&GK#(Ng1zzOY>`g9N?~PTqHU^E8y*vFiKDhtvGDc$834OW46Vug- zl|$7CcMuGKo!l#wl8Y)?Y;@1f#nZzsG&mMG-RN8VP@{;o>|TrW6>QhS9oEU;eyRJE z(gldpxJX?*#x5&+9^AL{z99o5?usbrB{j7XsuGdH5DCeI7fjTVDN10bmyLXbV-&@x zI$T(ntaikank|&(?J?9rMD4FHQg}xy)13S)nXUrf`;2bbn8x`q6bw>ff}-mnI9Tm^ zelEZvaa!h-A!AffP%=G`NNcvrvvgY`wY!80Q{g3E5-`Ex;H)sVvm>{)i-S^a zi0rfQEf1nAMhlY815p}3GRAZ|EMD7S&&+}0Dv`-?eY;@iUCXT^#}Um5enJhn4{6h|)01vxh%-}zX4%-dAs1SmniR9J2y zse9XT%MS_vN9oJU^uT_W=V)@jgw%=Rx-?_S-!~Pp3Fr&)WMdEyS%w|I4*ji2zghiL z^>zcBzr-O!OH!F6j>E<_!>NPfV(dim=vP;-3g-*&O`_}zR06LEy##Td3K&|h%q_) zx&ytY%Sp=I)u$N%ie=$22yyb}=j3Vdsd!8%;&-Pna2p$PWdh)%_Rwn{MMYwz;srQT z;qZ2FxkI#asWWGM$0=fwe@~eVnKiZf40v09e5fVhu9((1&N9e}jkst;I!FF_+SB#@ zYFcCI%oW3%t*5?$QNqP6e2E&#YGOFB=8@y;JXII`lZs`ucv#cfw8xWnYisN32A@f9 z^mUb*-$r+p_m5@()o23<=d$+-q01F-@gT?Z0O#2xFxSZh~#e0 zKg}(#PC7qcX&y;k3AsAf>G!TQmbW1@Er2zslS^p+=(#$|7Dnu_**8}iFi5qSXm+L< z3eRgX{IS;8t*Dxvn-6nFa{U6I%2>96Mh0&|TZRKb$}=JEr03J!F4;A$+%YXPI z?Y>yOEgo@bm`|It)d;MBHxI&RT_IrfigZ7=>ACE>1dU8GQ<_xVx~V$H0XCsRUARG? z$>=WyJ{Y-t$x4>Odjn82Lo*SB6;^8spJQULMAih8X|(C`JGC?gMY$ChQ2Ik~&UU4( zecz5IxjK>(`0)s^UwYZ%bl2(|MAn-sZm!qianiQ?k+HHaDv09Mrz&cs4)y`>=-sNm z!RNf%lbtv90ga&tZaM{>@0nCK^%VG&NHsO)8uMv8C#(W~4S8_x+C4p6H6Go&paA$1 zDXX2k*FU_R?q8eC{%nrkQq?iEF_|tdRbB4%r*8e}BXy5QS0-u0m^Zq4PsK^ZS=vm- zibe#{OZzvRT=(uDx@U(id&o8YAc9dArD^ao6vaM1S_va2ooIsvEQ+91q)<|`4LYlT zxe_!t2@EXA|J!=&8wu*a2a|EK-pHMCR8P{<$ONXeLkKUrx36*<fvJ$>MD?0@5LRM?~6_LXdk$mj)I*&c^U`tqcaq_Sw0fVl8vgX1`O zakHxLMrN_bd??13ogz28-wk4zylh@$`a@ZayX{ZzxBU|<9qk&jX@ehBZacTjL-+H{~Hr}^vfEvAJ)?7OIT>ln#9l0p}Jvg zCGp%Pz^M`zmzs*S9}YS##W#fTI8WnyZ}g)rR+}Z2hXTBhii+x;`3l2meJ!!9QcFH! zGfi-}8cB>1*K6zGzqr;BTckQg(kgn%ZFYxF;mE9r^rdy_A(Ng5$Jy^BtD0LLY36W} z_!tpkx#RT3Tn{m2$({5?SzQ05_l`c25)atiuehKDBCR6n<2#V8cu)e7Vmpc2ct5%l zYwJ$`a4L+3wXcThJQkEj9lA#_6=@+*!~IbZoi*&$ZvvwzAx;}xtyiYiDLQ*I3IwW< zm9o)O`?TLvC%w!t z1H89KFiSpvP+-WgXMBZSEIO;Mgvy4zW-qu7Tq-?v+R8ix5+XfQ-~ZL>TjVM5dSLnH zkn~);_sE+#i?82arz@336EHHQi0$szN0EGF6bEjX!uIJ}T1mzJk}KxRgZM;oWbRB2 z2RP%I?`HLi&^U7nbDZ9J(rIeFmDL5mD+FwMvlTe$!oq|74AH#^6jo9Nj9JNn&~_!) z?%tm_KNaBys0X%*%<0;OHin;2|4>s?p7cz7&8TcYNBmGjnkCcA4M2$5;|GH9Xr&b4 zf9i}=Y9}Gf%E5rKFaUs5{Y@YpU!U5$@ReJc<^Ato$^U<2T7J_J<$tG4)y?Bk$efVs ziooCTZ%6j^o;#2+D;s!cX$#9r4&5$ua2r>lxC-j4X=^7Z6Qwi(NuoX=3(OzZ6Y z$tNczYPxrI8bq6cbyD;^2W$Oe>g0}#m%IH|tUsXk%WYplNy5bi<}@h>qnH4qdlAGU zo4LIdSootS8XmALd>WTv&G` zzME%O?;~2<)$)ls?z-M1h(8He+vV8M(B{(sFg|B33_9UNlp_QX;5lA#pC8o$mw<^= zx<;f|^hfJVBP?%$JF~%c03GIiw9@m*a2W8_OrOnw_;4x)2?u;HNvgI_UdpL4_ySk` zJdf3PtOc|`kJba8>Gs!0g)BFLnFH2>si(Wn*jA&VPR=RT$v4uE9QMME`Eo(IpQWcW zc`XE(n0DZ)=H8F}5_R6*)7B*ny@QzoSSzhh&m#W9pZa@ygGxZ#h&<2VFX)jVUD->j zbwC4`@>;oRag?p!7oB4b;*A+KM#J9mi54JwPT_nW4Xdb!_%v&H z(BMT5Fc6q>zdDG)jWZK~4|8mc?1^yNFgx1W2~623G40hOn3RP=O`UraSc)}RehQ@$ z!b1CiZMIs4L76EBkt*1Z&ICMrR>PWOL>9-4^}^C4Z4WVskqVX4VEAGT?yq;fL=Qh8 zkASp){hbwYPCSvxwRYbt6TJw&2C#BqhCYV)DrH3M&bTCU$mW5!>fW1I)dG;X1S}eh=a<`AdG*TV(Hc}VuREa4{Vy?|aIYnh%^%-COP*6}P zfgN58(QnQ;ep0Zg!%CX90I30;h=}MLkN0~> zqXDkf7dyS0t{>bo1ioIJ4d4rk3nwYhh>P^kI(E%(AC4?7r0Y1Zw7CkqFIG7^IOI3( zO`XrDulJH0T1tl$LLfx-zPILfiOdC)@d62d&u$&OA|jr?0^*<3nu-duwg1^^V*c+< zaypp+WzXYnv-FL%1#ckU$GWtQRDGsY6_@8^n;@pVaUn@j#O*BucP8%(+gIv7?UI=_ z`x}!cHgTp*`L;tBo;BY*Uyf&avF44J%FuJNF1Tg*RNyGg%+G2`W&n~TU=zrI>U9*9 zH(H_I&tR&i;A5J#mT}MdX(W13OhuD^C&aX4mqEt0z{xa zLxlhln+l;s=d*SSbb&4$8vn;~9wQy6pry1A^?_Ql0p~9E3>h%uMb5a;_R@11f|$nOP+k@ujxX*};KC0D?NhCL}GFJ|q#9 zM8l>thE~sz5eMZgnIS?DYV=Q8c>UgsII%bS3M>XcP74Z)_YGk?V}514>Di)72*kPi z%WS8(&4Vy|chnJEbRYA{(86$-K5SPvhvv`lGM0e`-_`#xb{Sb;0Q7HdNyC8(Lw1Rv zI|_M+FN1R#733M()=I2Q7ofduzxUa^qNKc(|~-^+-tw( zR@QVRguP6*)r#lWW@2YP*wk$_rX5{RBS!dE+~vEhQ09Uo<|fJ@?pY4Vk+JBIWJW4^s0ft2NXwX zijhQ(vA%wQLet(CdzKR*%jJfW!9Q2SlU74@z@L&M^XvAdf4_>cZqlcltG`y}-JbtCS}&0g57T$Foxpo@)|BQI8E~#GLhs*j z+ry5zkup)k##9?!9${hKvMo?jOJ_M&Q`c~o@VljWdweV+#+F9IX&^Gc*l4$6@Q!|2 zlLk9CPw1%aBzSg3MVdcmUVW?CIAK}Ivdu3!RGW87f-3`Sy7QJxF8Gr7j^Bz6PoWO7 zhR*9<|NM9(B$uOZ5K#hW$hc51cfUQG4ueXabbbt2yJ0Aua|}Pdd6XGySBGJo`KBeG z;K4A7Pe&)D|3xWEpD#%BosuV#|e|1U+8(J`q-vY7B>Nm(s(_ooOSk zSDq#&t_aLuT1II52w1Gl^;NVMI=|aSadjLG&YYSOo4VE|vQO11A-Js&NsYXV4PLCV z0-z_A%MCjkp>mVAgCxVB3gk7Eo293Bc})aO_ATO#%Z1lIF)0kL1>F4Xyn)h zl(39hB2ZTPE$h?MSgn9G@x@Bd1By^KV}XI%hQQ#wXzR@C_t<7qfXkEwbS{ug|jSrOxW&D~Y;6Wv?XD z8AaX{z|DDyUowK5wcygaw&4lxtzJ82)Skb4`U5YxXnQ#b<;+gsvHtgTrv3jUGt&pax2LRTJ@|`-zB6+8f#4(Bf0*O8G#puThg~P|Dasn zS0nlW4M=|d6}<*m1LY^1CzGD>)UB}44Y`Qq?>I6={!;do0rW|%G zT3d&iLfv0c-QR;|=#C3$oA}N8ZwEmNn7_bJQNV`^L^$gXxtp$gIe8jNopEj26^coJ zf6KoCcRM&b`dnR~X+Nx6Dig_1^WsIAW#g9lyQ8+qrS-M(Jg-ijdV`YYF0>d1F-D*Z zph?aTw2Q*?#ynCj7x$K)7QE6uj{uL!zak;wz~n^ydIELA&)O_TQ;-Kw~2eY4RN;1J$nFZwl$G{X8 zy}PLL(8PrI_14^$)w07o5(43LDle}&I5pZ=N#rPcb$OJi`xi;isSWr6Q88#69f1 zKY!X>lSTwdKknPpEQh3-*o1ua&`v&$xS=$lEJ7MkQX9LveJQW(%D7wQ$&6=yIbG-T zm&#y8WFRc6?TZFQI`oyKvcdM-G^cmC`mDcuzuT{c|KPpiId*)Cw8y9ru${R3>yB*J zec&qRPrPX74~6jf!lL_$m}9mJ@TGgVPJ=#(Qn&j275xSZy%Qze%G)io0NGlY^( zT2(K5w=B=o&cW`#&z<6Eo$h2V#B&4!M11)>>Sl}J3iqn<-`BVEOY^=93rpV@x)PBZ zufnWe@J<4?@?&^?b;izkuvyPL(L>{!vg+bg(s5&O;JO8Hd&^W^|I0@gyiM5R(fuKF zQ4GP3prku0HOgkkz%?Yk+!k^*|6x9|v|G$}_bb zD63?av|>Nj*B!13Bb8|IXZCXTEK(0Yvc`*c=c6Z2&HtyH&`NV3NQh$qdXEN~UeCYdK z2dp>77Kl*V-^^$;@ZkXubcdMb_PcckCy$JZ@MoFU>BkQO)Og6 zIw*(Ls(@zYzeLwN!@Ozm(%aUHn&G0~lU?Pvf3hAUb0Ca#VOR3f{6iJQ>|i20oR@gV z0M^{g?x4XsnNF^Er}!fYmT;9-cfKXxaADL-@GOiB3nzDxo=%Dxobr z-_P`!zMf;C51>v3*auxO#_}lL{v|(U~XYC-5#l_MFup>JedRpePd8GkQ}_2 zC0w>7ggj6*jdq6h*@O|ve6S1LTaD)fM{9Ns9XHdW$P55fL zQ3U}SX(qqTSPk_%@W1Az^VLc(A|_5_t|JM*>;Rc79i0Lh#h~tI^@`)LQ^htGTrG7> zEGFCd0j}~-MH|UKJlRe1cD5@@EyISy!cXk!w=!C<&zpPhEqu6G;D2?|r>cL{Zd!fn z%JL=WyEusWo3{pDI$j>}KJPa(7#mjKH(MOvIt}@-tk!+G9ZcJ=aPg|ljF|MmE` ziB;2mB55v}DIlu9i4U~nTwG2!H(s9ZWsqAlaZIx-)@EwyYI|Suw(40}#OXK&p2sW! zsDdSo&G#A<@BJ{G_1~vZIpdgDY$qr`OJ!{tMQ6`YhxkP&H{(SQzX3iD*7Qk2YDGO<%A;=+D_buEk*d=^ zM^|Y1b1ntw30qECs3$TnD3(?R6KKM0Z>OCnN=yTkLVg~Vke8a0`5%uBj3(-3e<_v_zT=@p;Fcy|@FXV!Ji`pE$6QJs*j>5tfr0ojR;3t*OWn4>;ZF-C(XV z>q-4gWRRVs$glQUqj65na6^&)K_FaGTcXP6r>F@)_%^sc{yC|)&M;&LiK7e3ZdXW6 zeU!C4GVSog1U{6x4Uk7|;pCNz)w_fBThP66404}`<>zdwD)kBsFa-_#ICPfcq(1dT zRA*Yc-1c^}8N&B=)2@;EDR1vR_FF(Y_iTnFDj@Ex~D_y`*$|<0VJ#e7m16S<`;b>DBls&4r~3x(+wZTXTwHDX zPsFc%t~UkI`3koTdoJ@V=_rZ~_`splvK<{#LAS+mrtP-aPdgvicef!joi{Q!=^A^K z)Rd0@?p}X>bGycvIlm|<0#X>__`qQ25?W|kmU%373hTC)Sik*cnBVOkyTct!NkO&Q zkCgTCpFHX~N8jzw7T%kl`Ob13-hV?X3!HIG7;VE~BU_3hM-q7L^%i^)n;z2}p-tC}Qcv_aV#DrY$r~X!A6Qv#Ip5J2Y9r#9Rev#^hN%B&)0}P0Zw75-b54PG9{{k#Kb@2AJz2KhF-w}9-?4`+ zzH`ZkV1tV&dg*~e885=u*z?;BgHyJsK%20dN@Ib^)^r1+x~@E>y8(4@a!RJ}dSI*Y z$n=x^WJHG-r&t1i=C03`zAZhR3`&p)Ibo_?sxC3FnVnsom{>!dQnmySWdM-~a(kv+ zs>>$77NBL`Yc9{W1#UkTio-i`wzGqJl#y|wPGO-^v5NAgsc$!`E97Yo1?7MI-px>; zQSbTF?Q0Arv}qoOc3_$GpGQ$*aSBXGfDtXT&W zuRl&*5}?9f=Yp`>&ts{PmD3T)bE-G9(98DI?w1tZfjOe?nYOzKP~$0@TjTS$NkOx- z&VGIg1d8yZed+=`{c-?*V&o%+r(*;8_F78_Rmd>m`WPvtG zL_{2jg%%5$C8qhk3#fD5LI-FOk;0CM;rmp{N#;+#renIt0gPPgh3MQI0E_YmiZ>xp zkGH({__Pc-Se>Vk;h@bf`t72}!@1C#QLof#=(!)+fpot1*b^|A!$gz!NJj+Q5U9Lf ztombnnaO*Fi}%47bofjTVxE!fXWr;AN|fji<&N#w!gNNf=1n5`sO)ypJTXa0iBUIPc?$s-?bVY9McGJNe zjKm>B^^i8^mAW^qT$}=o?_y^VRaW01&>|pn$OWNnQUBI9OLw4^d0qkF5ntD=bz~eM zCD;%u6tpxj=TV{EJ#hm&O4^-qpUz*0tW=84MsaEPcJd^&eb89uu+`5_;^u{>H82RpN8! zbD1Q6bavV#Tu~@DX;V2cCmVx-EmyZgv^abF)*et_UIP(naTT_L+sZ^-Fh(GZHUvLB-ctKTR9F_~S74M42!0Tk(xEmR(Swk|%I$mw zO?*bJhU(|}nhwDht)BKycDaSDU2DkRpKJG1ai(2PwD_`T1iX{gcJJJT{$8K7wn|oX zzUDUJ1yb}6>$yYEfp`NM(zSS#!<>@DdEM4()KDP`(;L))MAX?IWXe@ldL2+xQ(3#m zTqXHWOiaAVM|D2yA_2e)gXoJ@=4gBh#iP5IJXVW}HEiRf%;lqBXgK-PvvXd2o9X9C zk#wz3j(JWd{Sv_{gvEN^#1zlvK+<{Ib;@pHsLEFa(54;pB_a}j71CAtE9s*ydT&gi zvF#;T2JAFXWZ)D%ZLaI*(mDQ2APqf>qTf{I?;0EDm(es)m4P+l{KW?!7PM{#QR2~q zKE$(bHTpWZ8SEQGnhQeS8A4>%Rr~_P?42rcv`FijI8E~N3+xVNJ%h8ZX7mh)MVC(O zb`o|vk$07WuAk=ibiU{7ZoEvtZJ4;4pz!zChCKj=4I=$27T{kumU&p0DSzj7gIPq( z?_zlXAG~=hp)y>47WxTUPsx|0bC!xP-G{q$YPaxa)8rZqy+((y^mRS zS*W~h7F)rnfT*Z$h2?V+9m%h7F0f1d+cflDcVLaA>2m5~?-5F4G`o46UusZY0#j0t zxe8N~RDOfIWA~n)#XQ)BH;0>yz&b631+L-QU2h5?%s>UE2Qef7+|*86%}5kgA9@x4 zn-R{CK1zW8+*yaF+>{5rR}dg1BQ`Ly5Bd-GY1)$vEV;ao=56!Y>l9Mb(%@Y(B1>X| zQW8=8b4Ce_aRdUZ9Gn1u5rum3t=(`<9`eGZyKkn~ zG5pb<9v)!E|Fi+Xv>W&M-;2EA3D@}Cgpg2FH6bs$yXs-fq@1!kdU=qt$dvdj%_5u; ztu+SNgz%*3@A<x(d+>ag0c#;9mw>*dO~dv<@M>yDurngrCQ|&b|@Jr zLLjN;&!~9ORH)En$Fd3!Nw6%6NC4= zIb)1Q=o`M3*$p+8*fB<>SyxxfXvm9xjhI!-1UK6RtJb5E?qUei4ua^Q0*)|wVsCAS zlM9&AflR#wf`Gv&_!d6CN>x`aD5D$GMdAS9}rS7 z?et?CTk;EUbsW9mH*@{Le|=M}0O|qRFeczCxK$BvHw5X>N@?rr;vW}SnGzQ_eYz4B z5nlk`4FVwtr}JhOF+z@*47>^!^FRzn#s(KvqMkp`b_f9U6=Q}^j_%`0dHf~;ggJeD zW_AtHY+^H>VPZ4+`bQ0{Ol zVIE*UT5eD8Ekpj3yG0ooaCY?^*{WiVN3k>1Ssg4G!1!2)&i>XQ?|2iIsEZ9V2268_ z>U0?FU_`x#t9ZfBW1M6hVHpWkQLgmro0)EwDkA~#W+R|mgI(_fpL-!8-06mMO8P#x zQ1kC=rY{v{m*ig23~{7Fam}4Ex46oPKEqWt+&xH`3*H2~Q5BOSR{`>)FRFY@$7)AR zra#1&1uc%{LS_ebOoN1OHWI=->sl1bH*RU0Yc$4uKKqR&ZDHuYUkJbJCd|_J=WFSw z*~*EjX`iz*LdkDgbsm4Yrfk|?A=1|Zcf@4R3WwWwlBJfzT;${l?3)-caGj^DoxDBr zYs3GZdUHjICfGH;um31h4DX*;}YNp7CyZ128=0cIGod}*!!+twvM{^+)FhuU_$3it50BS zmF63AH|UD8S4x(KfRYV@(`wiXtT=MC_{bE9OS_a}ouBQ97~D_jkbkM3+>AH<=7y`F zRAtqZf%~K7a$C6eY;8{NL!FXsI29u+*A8=&f@_kI5HeS?_X~_c^c{$t@jWQHo@~); z`IW90xk7Nhlz&1~!YHg!M6{J?h_G3-+3y_>;fm2%#PvaW%iTd}MQiy@_M+s2Sx*tU z*>?Hl|4ww9ycI^&BwG;raB}yiUPkG4#|D2#{`G4=Hj^G8BN7%6_V(xONAhW2e(0Wz zEgFg@fsvm1%-YN#!0K2;^YiCt6nhPPAHU3Icaz4OUTP>8SyYw>k2k1T50uu!WAIFe zsp-XzcZ-6e*mw&sbeYVWxDUG;GM5LT-tU%}#4|gmRxA&% z{{nld=nm6H$B+5cs~Jp82IH#FP#??IgK|GN?VHddWF@tFOB<*$msV@<<3r}0uHwON z*N_ABS}D=v&@qAjrFx<_%+U4Eq1%7j9F*~_zcb$#luuuwE5_vBdxE2H$;&EdX zBHMj{p3Y}Bn-@%+(}zb#FuiQnIr}eYQFI`I;pu ziLW?;Gd1tel|IJg0_lOjQZ-Iap0Vxy(ttS0b~0gy=hUtITXPb-?3Hb&Wg-3JzA_s- zBBvlvg)?#yB3E`g>zJt3U1O_PQZGCF0$-*#Wc?C#s9*ZU3v!9TeN^%FK<>)Ls@?r! zVyGr7ECqwcT(Sz%wwa)9+4D~lxEmxJ%kJqGsO&XJ-}Xvn^G*nh%zTP=pf2gn!Qkdq zL4Y>u`Zr+%l=TGn+XO5>2#bl+TcGNLqB;Vy-Vl3se8Sh<*cND?H1t?ok}cT=%KQ({ zLSwE&`K+a<0aa-_h?h+I*KGaMZ$j8q2~>wg7rki~<2XfOBeAy~qr$;JfRf)Y&;?E5 zw}K|zfT>F5)*A1?9Z1@|a(92Zep~JZK3KE;3I{uVRGtk_0I4zc8Cv_eZa5I}{LX)2 zi}|yEuV1}nhG3YHTCB=`0FmT(b9FI~AKp813tBquNUbk^9vqzceR(a`n66$>L`3W( zcGjKYurA$7VeRCn0Dr%NS#wpnL-H#inJZ%UzYzv1h4`=62KP-fCX$98pQ;HD{901n z_y75nwfsGe(L;m#)fX3oy|{L&e_Sr+bu|LpLF_NJe+8I6m+@&khmgnN)3Rn<9Gv`N z6Js>s@@c19thJsVjq(zvSHh?`_vUa0_dg?RBq;jYtf(1t3U{fUtamlzAJ3|V!7KA> zYCO$za|tjI?8BTBWVcfRJ(I_+>ndD;%&0Q&H0(6wRH3Ak10jaohnN@QO$|CEO zRMK6+)PZ7hb6FZdQKU7krO!bYU!csX>~8gim)Ai^HhpVuuwEOlR{dDQnB|Fd zFYRE!{M+ZgdK&3K0stILN`l8I0(dhm)U*MEti8*b(DB>1O=2RARh3zf<5}(V5s{Ms zh3K#74_8-D+qx$qz+>$YbV`KP=nKp;dv$|uHJA!snSV@F%=Bxz7$iO|Yi!KZVw;>Q z5cj@5qC~&rZ`}JW*lCo!Q7_+ArDR!iSzKV}YiW7Z9 z(_J1PPQ%8?qQS;m(r*SM9=&9z)!>Ac6Y8XDa!c=wI2#=OxED(|6n;NQoX}Lngrx}k z0L|)er`TYr*H9p{BWKi~-*Mx}&;W7Ha1I@}{?xIsAT}i4YHDu%zVLJCf)of2@YlHw zQC+l4*9$_&m3@#@`SFA9wLK|xG!)$}_4O4!UDf~c7bPFfdP@I$Jr4cf!jsToN}a#i z#`TE`{#s(a=_o)*^f-bSUTDkcuEF`*#ntsk>)XTKNsFboM{7+^?bba_=~hc`oz*pS zLGdXSG|p4`ELoKRS?h&6&#Go>WwoQa7diVUdZq+iz7}lp2EKOvnC(~P(n1F!1(UhF z)Fuu7!%3)%8*l@T>Ms>I?$e+p=D-}u#{uVVM6pRkbP?X@uCK_urj2M8Jl>Z#$E7q_nY=cAkVfY^a1Jn? z;L<7a!!!{tS5jFCvZbag%1Udw?^N~ezsfR=S_of1xxB|W=5u|>N-)4cX(v7$Cm zhY_h|_!$PyZm55G>&dPoIET+K+`@V!7YOy;n|hDInek#Z*raZ+S$t$~7UY~_ zz;;1vtEccA8-n{HAIzbSBWm;7$pJq6EvLt9saTWel?X`UcDL;L{|rzyeGUZWy3H?uY8m!rPY; z2{BAVo6@*R&94##!D)WGoVj^28M5X>jjip-CSA+*E#ukLVaqGTw>Dm&(&q7caTm`TwvbPcr`( z91_#f5M}ni`|HeSk^6uKz23V@iM#Tc;dWmSr zTq?k*E$?nY-P~*jP2)KDzP6_2tSWVXL&ug#BoQ}r!5&8@mr-V#>lox*2;^!q{i$nN z41Y`w4s!7FR%b77=5JJs18hr@QRg`dTY#WbQe2;7*FJb|&rU&GG|2P?OOqz9v-t)z z$2ws0cwm83xE{BM35&T4ML(9-(i<9lZlK0jC^NZ29CuzNKQ4l&Sz*a$Xff?kKa%zf ze#K|?@zwYF*$-)S09&zN7fzrvvkbLA+-kA1=X`&*`xfZxC z;V73eD4>zWZL?-4Qp6w-kFX<7AKgFg_1uvu();^%yMEaj))0xMdv_dt%4S#?^N9-327V0*dC-FDJJ z?eg|udlL?R+$svgBaU<7huDdk;$$+!gM1zU!I_uC!0PMHi_K4ZTmzSK!MVcZQ=1{` zJyXetH9Lj(Cp&}Rg|i8AEpqq&SoL|>;#G*Qcw|CGIjzIbMFFsg6Mq(CBmOxrja#3oH3t-PE8bEpYBqtpwk`MLo{oNY3e50u?e^Bs1BDYvJQ!i(YH;E!{83RjW*!fqJlU+Vmd8e*7dXqz*iRD}Ds)>Z0Y( zuyc8n;%4f2^TSJ@V}k7^n5Gb_)Q7XDONYo{b9r0Enx#Q#%!QF-*KNu8<^QAVEyJSx z|L9Ley1To(!J)f`9*{=5yBkD?l4j@>VL-Y|1f)BpOF9HWx)JvN?*9IJ?LLBsTsPOJ z&ikC#iP9~mx6sw7*nsvrBoNSgLw?xjZ;o=b=$NhcRx~>~xcy;FpY+(eKm|B#z4-Nk zzZ_lL_x7!69bJ%4w#GOu>SZbQWunZHR$zkGAx5hmF@5M!nCZiIzNN$Wmm~py+iB=a ztoAObC9lh+XiXPKyC26lv~tK4+T6c z#9GO*!(sMoO_~Pf+saWybU)D2ufjg_^?r!=7`2EXb-(Mf1zgBx=H9`i<(La?j7AIc zs6+(XOoDi|omb5Hsu>=A>aCY^0z6*FyDC))v6VJ|+y1ypo)s1D+?8Vhc%4K?O85P3 zq`+?-Sy|Z!y#t|Y&Udp@Pa+Q0F|kXb6GCf#r(*sOk#F1FpE-@t7_kLM%#->I;tZBP zEz1{0NpG{s2zi?$EuaZfm!~m*!kk2drpA!Ec0LCJF_xYJiAPlDVIZnNN=w=XU67;Pf&AzUSnFx5j*>b>0vIz#Mc1#F@OWa-drhJgLa0R45w{Y zVus?Ke)i}ld^k}KW+r#O-LD5MWv1yaWI?X#iMe@rz@L-1DWY+_0OU#d({g>to7`4c zINXV;-Maw5wTOy}{S;Lgox&Z$tL?f%z>)Nqx;Me%(Bo8ho&Dp;Ha>YCQC6VxX(ZV| zHa-?twx~Ip7+v$A9$OXzS&49brlTYu$oeM@ZTzFI`Be|=O7UPWv(-V_V&CS-HpO(wRFCsHcI zWbXEu{V2?87Z){6z%N6NZZq`5IvZv;<#9D<`0?{7AUy2&g+9(+VU3@cgRAE8T!_E2dZAJVK&`$1Zo1@GW5rg%y zU(SN4mzl2$HR6JC^rP}VIW!r_zX8A(U*8NMOzGzKwqQY*L!kmAwGvPYwahl8+0$*U z?V+s57Mu=K#g&cu_4OWuib`ymszAvi05!98&erudSi)+{=W~$fF{qEh3b3cntgHZ8r7z9(=`9O-kZjISW);KS-0ZF1d)3`b zAwb%|r-*LEXW{H6QGVQbFsV{6F$8n0CB5YZTlSJxo2Gs!kKclovH+hCvW-IW4KSNGq#{Ak{=TfiPof5Mb^txS7a>SV?ekU3)is|D0PI zzt|g7DU$%M9bYFFfgTI)TZ3-v3UxZhI)MUQlQcq&>jbvxJ0eeoZaK^Q#s))a$OxHnb}S_tRvJ z2Kyd87!5kp9^M?a>ei96ZbPA5Mxp%3MxH~iV%LE2vyxZr?a;ky zX50B-E|Aj(m8+BqkZ#7Ay)aw#Ss9eqaU(PKI+n~Sm;GR4w}_OBp< zm~Cp|v6(99Ghp%G4EN&~G`4K(E>xlkOY@U>rk=#X_S%|rC=flr6rHQ@$i1XWmhiX*iIpXkgnG8RlFj#iP*FILlC05sY0cE@{5eHq|q!XQk?_vr#_`(jA%^CePXoKyVw!-uA5{+)B2$JW$mMO zNDsrdLz1(wDz1D}vmbzcNHDc0*JMzmcP$L>eK zF#Mv@`&HIU3Fr2gpH$`}3n?}A!SVeiU^4p1T4O2EBXKMKqxyDj==S~6*ha|xSe83G z8lLorGY<`ByzlfWZ^_>%XFCg38Mn=&aBvpX;_(lHB6f#bF`^y@6*F$Qi|fl%z|Et3 zU6*Q_6Z~csskI|NXXjObB5^wh9vOrGkp75tKn|HwBIMJzDABwGdlv_|Q7oQ8+6Avi zL%xTwhS6^Y{LJG#)zqdY<1=^0Q?x31(PX3WI`3QWr_|rz)zCaCXsVKb+ zR`y2UJ@%UKo)ku4a5_CG6Dk446LOGQxHMRw?a7&U8lK;iR(bM9)+`%7aH?lMtau%M zaE~Z640Pf7A6{p+fk4Vks0N*mOoIkMFYeO!qDANRz+d`l7o}kfr|bWp1MYcm$HXzz z@i^kL(drk7P8I&aa-c{YhrqZh_B0AC|+_(WraX#$7t4YkV z=y3$(aEW;3zvJ*%u`;O9gvb_15Y^CIokGi+ZGejtRw(DzJqkSdhOaw(8*Kg|zxV%Z zqfsa_QvG(Lm#f3q++<^o15;;BpR>>XsT*TUyDvgh;Fq*q^|_W!VM!Ea;q*M!NK$ zWjUWzNp5_`DEr=s)Nk|qf1bnK7} ztIRGXSoJA5=Vy`j1G3^$T_{)OVht0foJJuCfY0U}d5ODEom3ev$T_JJI4#sz`MO3O z6b8IL6r5q~t`$J2mhfE<=AdXXnJ^1EJYBxLp_sD{lzhKR&Y#k==|Oy{FBbV8(d+Irh1>cWh& z7AEvRWf==~tYBAFhrQy_iPW_EnO1#KKEW@Cc6>6*YHA)e(q3|J60Wi44j?h0L49gw z?DD}3*uf-3XZAzF=dPj*c&BPsR$h-`$EHZ^4`ryW3__N7H*2}a&5%MW|Gj?*4IO8f zC)7htj$28cJ0eD|NeIe}I91kOolpQ^FI!sApKrs`Y$_M(16GMlyiPQthA_s}H0aeo z%;dxYhJ+4J3RS(D-do77fJpEOPf4pvRU94$n!60V_fVj0sWFI0_8wY97eD4L+)6-v zP(B`i@!LuhF+u&8St>;RUzJ%0FlL_``JZ4JHzbnDrH&QWtMU^%W9e_5@kIqcumnPi zBI^)5buhif@Si5SHm6LQe%^`6`n7UQK%X5zS1{$_nE=3x&F$eTqi^U#=vY>We) zq(5k$&+W30yAgZc7xP;itq!;g9@cd*vCVo_dwTvw0~D#CB|yYJUiC`5?-gwJ@d*YN zhN8j5*|O9>&84~|j@H_PpF`9vaL9k13u#AiBEVYBlMH*UpC{wgW5TqXuJbRC zrl80u(W8E^UWsO}RO}Q;GCv?|hTR%le@CBDO^t-!0Ctp?k-`a)%r*Aaezhu{Z0j*x z3ZOoWRj)#2G({C3s%AYcs=)bKH~-*jU{?I%ub;6tKxWJjAGX*ac*67?DLzfk!Ad3FZ?v9WR^M` z*lnF^x*pgUYL|f?JUhHzdLT0EQQumpjtflx;y#!(~oqI);IP-$Vi~Ksq`| zM}KCkjDBh`&wfl!%?ZYq+T-$;VyqsrfcM_b5wavwZ=Jj~JMetro!tvan=wb497bx7 zHfX!{!9Y2euVH}p;YHv8SFRM2_jh=WjeXx=fS74l5Y2XN_uaeFA>{k3GAWf17lGRD z2WC4SlkLA^r@IwY`Z}ni-~ZGrkx~}!Nxd9&m)0y?48Li;3rxWYHKQCb-8kYE-#DdGdJY_veb&c3H z(==WHxyVY3ShEz>h2BBC_e;|kt!mn;zIM_>k&-i94d5K(5*%0-;WqnS)>xe#m&u*1 z{s;*5mYnmfukyXaQL{_bnA#0!DNzvz(b)$+(0)qMu%cvze9X}vDU1ULin zBjwAC?JBI$2-c?Y@kyNoQ%D92q8_v@Qc=Zl!OQP0e`(Jdi`A8nBrHun?{&4<-xcR3=u0IATrZ3DfH*>1`UY>QiLQRp3mG zFahg7j_nqU6KVV4@Bj9xE7H-Izlj5d>GWZbdu~7tN(ss&6tuTJqp8&;7shn1Yg@8QnM;q=Thaj?* zTvP3GoiEiN{TeIBQfW#ha^9` z$+z#h&#OSMA+#pYG;%A>g^x4z%ZaSH!}Vz;_3f{#3CpKX)!e5Sutzq$?om-gU41keD*&CJ44te;3J zsVz^}Lx9XvqqUbLgB3#>2cG(bI^h_RXkeyRR-v`4XUro_aI}+?nQ-CA+)FdA=g&8Q zw!iRyUSj@L0zQ`na^1hx(o)c^bs16RzyrJ@cVoLzEAq%wvuYX>9?#o0MyuowRc^E` zcnHJ$4bICAv2u?%?)z74Ev_5VH7!w&^8f`n*;xn?1fzti?(s_nK1AnZZq4($v^E52i#99q5yc~g-|{=U*BwG;_a`&E0fro8f>GS zRZ<$NV&+0Q5GY`qwB5M?LOJ~w)V~_7!6%HTRo-u4cNUBjsbuj@+Q&93k6*c**ir|{ z0OoI0C1VN0LRHDmXVK|jp!?Dfb#;*^MIMncHNZu-BSuC@rSP(Vovkcq8%`EVP0UOx zW(Y0NIag;37C-LO^K-%EqZGDJ2Wk7Nn3Wz5l>+ z5Hvig8(V{1(zJwuEYv-d)MG{&)>hho_!#M{BXoLg@}mrq%!UK3l*n9M%F!@>6|)O* z{sJW+*Z?HU)rPOd{5)^PsP`+)p0RnvUl=aP>g3hp)dkEjaaBr*!OWpBPz$Nm*O7Vm z<9?O*LH~%>Ukdyhtq&o-r&4Mg_i=&?^9`j*kR7#|#P=Ion$7rlitm76 z-+B{~6zNJ^Q-j%;`SH1CH$$;g3gH0Yqo4kW>0V_KTn<4+9Zwj{}S1<;nS#Qje zE*tT_GQ8nGl&-Zu;vPmx>om@GDpgwY$LAipqoa#CLBV2)1i=r@nAi!)qx%GAsZDAc zB=(NgeV0UDjhE((F_8;iufdEF6}q3BO_aO&QL_mN5Cnyq%$v-eEul7@60F8_706eG zH1L+LSXy5HL&6Ebg}#3PsPaNMQct)WcMGr*r%RKte;U{{k{asVeL&f#yq_P>B${|N zE(8~mF5;h@_-&_KyC-^|*LiF7=ea&E@Ry%= z_wAtnj-l(l8a8IU48mr4gicVETZq?WAsZjvX{T`a&yo9g z=Y5zpYd>V0CuyFZX*_4IJN&P>++^&Gva|9JG+*v^oZpM|-UTd= zxh}QmSLeRH*q-I#6A2}vvJVW(oL>K_VQ0s3LggYqNH3A(B%m|Sl}0M!k?|&41H!4t z>!G}fQm4#22`?ww+kdjs4DoA9bk^Id@`O(yYF&(E}Nm7sfECE~T zr>QDjy%_mw$ky4EbNO}lC*fYul%7F6QPh~?tf<(OLqVs-YKGxf&+UG`$vnvs6N_+) zo4;Gzk*Xsf;6l~en5V(3R%^kR)Y!*T{d<-Ar0+X`k!oi?1IrNWR34r@Y3{7BHj_^bdoRYq3@AclJjiw`ea8B3LR=gv9-~N&IM29mCM$8Ye zSs7PH6ns_r-I)u~9D23^+euTCP5pwqjd$8auJ8w+IrevxX5ZwCjAT$gt*^U!Z`Sj+ z{y4ruu$wF_YpjH|ir;dr@h z3zD$dq5?Z`)?|wYggs%#LCwT&_K2H0Z1#=wTH7+bu^LYM>zt$DX6o{#ovyCD^tn~f z>y<+V@JqAmphr_hllw{Mq;v!av z@4uXNUaN~;8kE0|i7k&E==1V?%y$-i#qtxJ5^q9$2HTopl#67l-$iBe;0K(Xa6aMJ zAh5JUHYWT7(TLU|n~JJ&hKXdP4`1ex5*me126oL}kfv0h>f=qy#hVhnIO_)m--1^W zucbL68_gLa>Z54$i{966VI+Ho#)JoJo#nSLSr54 zm%_fsD}5&AKgJ#tEvvWFLr@GGU8!!@eOMUEG;~cA_n6@OU1OtZ<)c0HSACUwUbhl{Fej%iAi)}Z zj!|f5?;vF`REdIpKIhjpxmfswP%HT<}p?30R12ch?Z-r#FMhfaE^9s*@c?^H+JN zg^Rmfnxf9mHzxACi6RsJIHqqK$B-AC zF>-%8n=yR)k+f>GI%s=v;6qAA!xHI}=-IAFNhXfeRVz~W^2$`=ZC#EaC4D5%oaFPR)h%8Wo1= zKiXo{HqXOvUl?;2+;%sgL*^=k>aY**&5_uZ`P#g(UQT8U%eXL-q;6ON2$;>(bqBys zDA>D*oPFBwez9qBUF{j;q1^6W3MeH;7r)t$Mr#0yihOfIc)G_w?TrCJPsZGdO%%4g zMzsm+Nze%pP>r^jv9cl!MI)B{LI8(kP084Hxmk^#w)bcn=AZd*S+67!bo6E7J(t}I=Z zO=yj@z7tC1eZZ$nCUGV_BZhpWjd06uRFEa> zO|1{A?BS8gtcS_c%=x9&jrqZ%Q=30takrS{ejkk0QOeG1Q{zqt3#%(~VwZgyW{!yV zA-2N=b5u3UTkz*09|D`G%rU0J)Xvp19{YUqua1`4_4&R?43g|FUnD21mcL7bfBv@R zCQvM#U-=dG8p?PS^wf1?A#te-KBq@G>qL z0Sp`fltbs48ZS0FF5|A=u1T9Sd6a`eru4J3QJES{8_D3ApUXYw2d|=WXiD_B@Ks`< z(*03gUEJ%p>$fwhr#o&h7c@(^Gnes+1=dfa?_8II7{)Sq_Rh*-gcUZ{n>;PLOsCq% zoZ5t5=c6FGe<9xcV#CNHUyLG`L~GRE%Q+-X9j#_c74HZ8qX^1)%;C`sIl*1&AV;8c zLA~9`=1-z&@E?@N-+%w^xIG`a0m(oy{};{fLIMUBGzz+9HIDE_4do2a36@VpE0^{T zZZb~kyzlbhdbQK*w*G%|sf)^5N#McaJjNOafuR$ZA9bV&WS8cWI&!=G|*P5~? ze&NzCeu_!>L;V56D(&LDnZy^T=HCBh`pioyiE6b-Tne77t18sX+G|ng?;o0DSNQn4 zb&eO=aN9bZU@>hBYWgX{w{#=T~345HthvZdPmw7DZQ_Wh_%9+RJy`QHqR<{?JQ zp{Z}OLF;$Zwp&(Rfh3&`CN>s72sFI8iN9iGlvP-0XJJ9S!$~rk&;04&9-j1s&!Nw$ zwDLjfp|N`~mR#yzm!HSeI8u~;E&Z?!sfc9nfENoY1zwWG1FF}hkK$y$jrA^Xb+w4+ zz4&5{I$)I!1~^{>L*=>XT|9T$IR9wAAJ(^ep7o0Wv4%IogYxL%(J@SnXRD_J{x`eqih8C=Kh7H`Xd!5v$MvV*#_ z)i^zm3|j=@N5E_SKKLA|AmsYp%Bqq7spj|Ga3;BNPC~Te676z41(nAPMIh`-JfJv@?8YiD<5+5aVMUMdcC7~+Fo@Gw zSvphhKzj`Pre{KZkC%Eb-f=7k%~H)BsPww8bO8PU{vWQ)yVKRt|=g-!3 zfd__7wWN&rARyxTZn z>u+W&u!;{yDFIBr1r-``3Ba}94px1EQAwyu&H~jr1!7*7W%!8Nof;D8F!#1sMf7=* zy}gvVZ(SA8;xeea4jR1&zzv22;Stf=qe`Ds#g!Yt_RS3^C_`LWBo2_v7T3d^C=r3^OFMR zyN^?0&u9e?lYYa9WTHTK-msG7=-`Cd-IWvo-R`=>N<)RcS*JId+R}P0Z;|z3r9`7b zFS38@OnhXNNN&w*QC*pWeurGF^|Z9OI{)#sJ2T(d@4vrMVX-nHuBKabik%h zoVrh6|J&FTzl1q)8*1rh32oA4pJx>3fmK*pz-&30V07Ba@&t9Yz!8j#&qm4{&B zsE4|12{Q3#E+1E5OaNn-;5S)c?owBfg}i$8;gyQKjP9if{T^!?NmkDH!MT3Mq|SQ} zAfn;^d)k9|l&Q+2e}T~iFI^E7-S_#7R`|}S&hAm;A?UF@gX2T7p9%}cB@({_jSUtv z`gz(Q+t5`nXCq8!Eo4kRD{5zD2~hy%HCMp|2sVR>TpeT`f<5C`;sAb`vU!-cxle&E z=yn~fdHQN9_{GpfSG`4ah7PKJ0U^bu(_?nAa*B#ZLr`H)x46y`iZ=sA_sqmtlCNlg z6IRkiRe|&0wZDQ&2jztC{Tproik+>T+gz#Kf)+cnv$!q~!tV9QO+}~v)po#6#9BR% zm-sA61Oj~WBAqbSy#Aax8#E?jluc=u6P`bnXitLh1HaeJRSGfNmL8g|Xtpq^a&I7L zB;V+meD^O1Zb8~|BCdG1zi*31fj6dy?X{Dz*ckH1HYz%!&SjNYui8jP)k*9+aQNzq z5w=+KC9R~6cSt?R@3UzO{ArIzq+8Z4<=(M~=3?c3!xj&)*<0^0} zx}lA#hQDI#^sKQNaSMEZgg9}cr1PRUM=71-SWzB!(g3bdfz}uiY?$vTvb*Z0fZLso z-6qC-LdDW2yVe#KeCvcZa@yT*)_f9{?&cNWtXV2kstBjs7U}LC^@9L&xdK=zUS{M& zQP1mSEFf5$poiu>VTb{ti|iGRqdSLDw731k^{n3(l3hY>T@S{fx&O`MvHP13awu59 zV$kX;0h^uOUA+LVx{Zz}Mu9;c0oU{YzWz9f)W5x)=Lt*y+aioEu#+b#1ui!@*saI= z8?@;Q;mQv_A2VYq#MT0zUyK3$wWpg{Zov|E-0wGM?sW*qY`_BuqSIGghr5|TNt45= zVb9R>?^^%8WfnAVs&Z%ip=M$ZnCN>eD!_)wv8CpT>#5>vbMj!}y4+RZeuJPI6f|Pn z@l|iM>BbvC`I7!NlQnyJ_4qz8HcgLGEHus7wIiW3$aVLg1jn)$8NwV797x)|$^ONZ z@)>6L>1Gz@%buaP-Otp~iBvtA)2k_RN7kfY-#JMMg2Q`6!wEbrsb;aQftt%$oH!8- z7D`APG@1LyVTl78n+G~B@dY>A1Otx^k2AFqCaMGn;=J)qU|FQA`JoovxtF*d?$ z0jM0;?==c2x7Og7X<(wN`ry5h+RuVe=3cbv(IFk`QM9IHkX6b`o$EhG;FE=tTMUm7 z4E+QXDB+!Ox%69PIWKM_k95$cc#N-&0|N|zUHZ;pj$*DDSpY*Pcr!#w&dp5fK#AuZ zUK^6ITrNULo;M^Gb`$~>hG%p?KZcomUSUE+q2QbfPCjkQt_6j&zMIPGMHicYNAvNf zpg8$D>jD1lI_3I>&ql7ib>3_P=OSwLid|(`M0cpK3u+IK{tTsGuHAoIZSy}wr+H~i znr##AsgYQ$_x%T?%fursQzGvXJQ#LI`w@pU6Fh${xB$!6%2K3KS6eg_QE!(%83G0f zgI+PaO!efm1jD2>PvbOVQONc zp6w?E`^iWT%^5aWJPfmaT{%1;O?e+L`uA58Byc^fzc}VSOg__tI8^z@?X@>~xH!C56Ry z^7He1LP@(RY9RmMqjFu&Z$jblzP?s#&BoRF__su`VQasQ)|KD1Po=M&bI9?eMx6mvyY@AzA;Vi253g?iIkGVNAperXU`~E zIh+E4e+B788c(+VW!S^@+con; z29MoKQStA##4}8=J^dedVGB=aeNR>lPz-X>TpOBRb3^GCxcPno8#6_<8R7u#*VC$v zmWB>6o@lcN#6s9hZ0b$XagmD{suExmNN70pMNmdnLU-i@CM?@Q^L&#vOSTex5C@4N z9y-AHu@~1&o{`M<&S}HrT=9E3h7~U_vyU1tgU>-5HlePu3PDGw)FZ_Gx}^J2G9)pYt7>}B=|2)cmKxoFT0ouq_2vch7BKi zozFVUx_WY{LkL+or#kNtven4TQ^7~Qy+W=_4QZ{NCjbW^2xz+usC@g`pkfI5w9=GH zLKBT{o94Q>1rS2v|2r06xEP_R%~y$E=0D#ESg)c;=79I47)nh1PZn9>M<*xwwb(qy z!n{lC^@09hS80x%E!sLF^H=qMF0O!o3tm_39Hm!QnKV-#SO#zO-M-PQHtgHILd@h= z2Mo~(lnbJm$V}3pa2CX_g{8JcV!B0_wI7qef<$~S1c8b-`rN5{n=xPRc+--VukMc4 zX-+$t%U%COfha+}#zp&-luYvEN4~i~bifkb2Y{Fd&yRl(ZaPl4*MXnCdt}eQUmnDQ zYom0DBQ=h!B}U?=q=xoSi~$d55NRPh?{`Nen&c%N;v|nGJBVh7Olr zsx3=VYK|d8><$!;Cl-+|yyZmu+jYWysKti!&v5c6yZDABoGz8`jgv6J3Mtv!uNvyp z8DmB1mM0HfCgiyQw=lKwK=bluh?;5G4&?irb%y!OJ=wr1#h(9Aa44y87r^wfGWnm1 zZ43anmiRM);M;7HpYNk+r|rvG^+!>6w|yBb6c{I~pyylPOGrOt^>Z_kI7KNmEaS;; zV}dvgOd@EB`$l99N;IOfhRL-?TKYx9Q>kS(Q^xij`rmPzwU3WKaW1Q6h@F1NkUI0< zk0h}-VCCfeT+%z}i#MEwn4qmyo4YF{@>RbgKEd>hNmVg?kWLv%(&dCJO_iwPI;&=q znjQW?raA6@%KjneC61(1M)XvBO^Y&YVfhnt%qS$Sm(UvUS78rtXdgfE&%c@I<=9>TP@~RxE!=k;d7#j|d@;Y74(ktI3=I9+c~9?9^Xq)v{kat^y3`zs`aczgifg8f zTJtJyR|=veQY(BVbcMrNq>aNyvd`<0fCZoyLRR%kyn&e_ zL28H-MY$RZ5E8}y-cVSlXB+C9aW5PDRSz&`YrC!m2`J%E(p3u4JZBf~!!rx^f~LNY zcM+5=HH2n8o_1scyOk5?IPn=tIP2ita=i-@PWQP5Ktr5Cfhv&>a*n@an_SqQoa|y* zSzR?FlFg#I_WJ)VKNrT5DhDcYnv%Ot$q>x+v= z*Ely@Du8=IQ^eDridRBn@>MRx<^r z4|mFh_@_yoQXp1;qU!Ls?*n8Jfe^hs`%wLklK9r7U{o&Sqdxt6f5^?Yz z*m4kGMS>f&4YF{irR+tRltbqMD!pTU&|V{y<6{&UuVt~yZ3_v+QpJ~i(kq8r);jY? zmx!xN=F;WfE;TqXxCLHKh~FMJ0;f{mO^qv%iX175K&j`qfTJqsv}u7VW36JWBGOcZ z>X>>h*cK~Fyx0)(dks=_yQA z5nRvIyi1RMu)%W~ef_2AmVn@_Bkab*mW6whBSMRP8I>#>^K&hqxw0gV%DaZ1?3h0- zE*7(;30K!X=U1~+bq*8gli%;e?*outvnwm38^K2c{^;(w9a+!s3;jAz zPD&suSi-$5m{?w3L^UP_ML&7B8unDBeyyzd8lnCi4->q0Q~cjhVgoE2lY`sv>WRk< z1D<9xrFqiWQa_@YE|WJq7)5xXI#(>10xOvjDJ?B!%~0huZowpZiz}NtvAf*1C5lZ2 zQuZin@UKg^M}#<)oT2IthqSs`989h*HQfjDXLDu;Ck9Ju0{Q6jIZ$vgRJY|nYMxQ{ z5)||57B}+jc$Nq97K?mxD@~qt4DMBS_w3g_5UyWnceLWr^a)qCxXGxh*ax-99TM*C zZ{+#VkM}<0+NSFrqXr|zEr5)Mcw)mnghROHfbkh!3`a-9@dm8a*EOG8a zDW$GrSbMnxw;4G@zPd$x&mh7UA($gifYge20aCGG$Vz+fxyu)RryBId$ z#CEb2c3Y91LlwC=3Pn%I`dpnWz@S7%d0ZCc9&fTK(4Z+r1Pt|shO2^4N9`-Bb~5`fuENkik&KD^8yej05Wvi4W2mrWC3JJMZBIl zWmTIN`WLq38(QnJOG`<32WQ?+16v}s)QJvT8o+IX*LLRyHcPjg&{j-BY9^+?5{;lp z=IU|ToE*WueOkBJ)Y$cY4@Y=f>UV zPT#M3y-X-O)Qo}44s==0ET**y8qAoJd~3O&KW3k^dVui zb+Gj3o`YG2>Lozs(_lQ`_r`TUoPk?|NDV%sF*F^(ruKktF@cSL>$mu8pJ$*c3Qp?9 z+ICX~HoFapCmnz3Gsj?4*1t~<;c$4QXZ!ftleoZQDe3VcbLKg)E0#4jM(mA6-#<=; zW{l}`6J(=W5UsGM!4S&@L)jA+UV|TF6jrs_sc@t5>UmMk=jsAJOQ|{3;Fdqw{U+q*{9{o54{WTpkg-fFVv4}8mN!(%eWg}Z~9tewR32;zL& z|3;%2(J{sJi)JpxV}jYCyvlTVy<2QFYP~mF;4f*+g%kDGpQ9s3{_9N{J-!0Tap*M$ zT-t&M0!jy2%IDeB&=u0s{J~6ONUs;l2No)ksi+)Q#Abo5_vg=4mdr7HVaK_#cfGto zDb&ou%*V7(OZ}*9DrJm-wbmTy6?XDsa%?8Y4o}g>pCnNMi8%^_d;-&iD&O+zmtX#l z!135$69UFkk`d+On`|9-B3ddDS)L#Y<~KP2@Wf!*#F^LD!^w(sXGbSZ^|H#S{o@G$ z+`7Ukuy9x5=~8tDQ&E{VUHL#9fW&#u7XuD0m${!QOf`C_o@Cye4Cy6}t+4CLMX$eW zpy;H|(RwQ-)JmU{GJ@YWfE{wsxa5}=XC_Y~-*?Nb#b04k>EQG@5^nm})rb(*l2lZd zm`ID@3-W9=X-&Vk*=jjzs>pC6GM<6dN!N!!Q9upPf~#gWdb^`_{>pFiYff<)+X--( zIaF(~K@)$-#00#VgKPbaZUIjdcLn?XBeQDinqCJrE>HWlFZ`p6$6}$-$a3HT3|Pf0 z(*LWlYrVhGnK~Qb2~FUUJZDmzqA6>hXQ{NL?(##qUGw81%m2c}Of+9eq`merMg_&bh`YJ z)Pw9enpqJEEb8pb@jtZ*Ar>$es?x=b>>0HR~C`-V1=%%b>>23D>Ka zLpRR1aDtPKPrt(es`QVtm%pcI;z?S}YP@rHw4N$qUUvd7F$644%2?ybq=(Q(6msoTxJD_{5-;#+Cd!R`w!X~!~Lk`#D2tRKZ8PD6XUE%mYQ6tcsjo& z*>&GiITy!FtC(+yM$;KJxiclWLYN9I>`t~{rGB7?n;m3rGTf`e+@=mJCRYf{}?~U zlvS<*uy6Mnm~YLmqIngIj%tKX24(j}cnaugXYJlLlvDam&2T>E!P^j^*ItEr zXX*B6>`pXV7kQ8D?^;J}QIC3)?-ldg_JZhxM-XM#4J*;8^HNjxeC6U6iUV?V)YrxT z+ZS^1dxSt+B8XBuLjOBnjECG)%<(Fj77wiQFAYR3;* z!;1D;Xem4+V!(~@qe({FPic0UYF*34#Qdk@sV7bho!Kj{k;cGZKHk@yMMjl6tePqF zWl6s2X_z}t1 z`pfst^&moa24%Ll*ub`IYA#*)8+2WKK|hrr;vp&Q-xbAyMoNv9+ISVXCX<$gCN9$w5(yq1+i4= zE_rj3WnpGt=mKr}57d}1SuHJkSz<*TT5G>_cn(OaO>68?1DVN z2&PlHa0V~Y7St`RY~neT2AZppPEK5^jJ_2#GO%QGjhm}0v!8gZPQ3lUn0m{wDBCyc zSCJSxMY@LW?rw%25Gg@I8tDd+?rwyk1q7r!C59A`?(Xi8+V^w3|99{GnGYNcbKlo> zu5+#5;%W2dV{2yRsh#vRl5E#0pqOdq^?n_{$EN7tnv7G{$5ss4Xc{n@Y#noM;^#Z{m-r+Gg(l}~ z?rV7@sgb>H7Fjq>Gl_%e=J%%OP?0L>bsvfhmDu(5_paAhTwm=o4ShuJQ(3n|Xy7_r z+=T^w7c-5by>K=I9DQ&K4f4=*y6qV?=6dtuM~v%xg;m` z|9{jF4HvPvOj5>f%2!Gbc0bZ?*3uOY(GpUuOM;Ra&YoCNZjLSY$Ds?tHHvwP#oWMi zt){Hz0?5xX13l^Siw+BYYikgIkGoG5a_Xg&?J%TZ8`lu40}PIOx{MPusS0RuV}3Vf zqEAP+TuyI;z_CD(B%VTEG1x_MeKSiI4ZGEIuU9bZ6*VpD9IbRzukcnGZ+8Uk*H5O= z_@I3gQiN^atSKti7=3blk)b{$qnCdIXR)_!X{Viz!8R46nbV{t1j?TJpR&y#m*f_F z{*`Ef718zeTNqghh{gPIlXL6szoCC9_SzrUMC)VbZ*X<5KP&6Ju-!6PxF73$GM=yX z4&jcuy|x)-N?@S% zJztko;Dapc@3OEsTzTBmI)(T|*ScG%eo0V(T?d=BLJgM*k!BoNe^Ho`FcL5lU-BL= z9|P3~)QZT+m=V(>1C;s$$%G(k)WR;bu(wn+Qn_L(=1%NzdBVcDc(fozgkvb(jVPXe zTRkc|BB@#S+Q>eSE_FtBMzIDfKA*H&wz$md8dXe*H2s;i?P;O@FDSdn&O0>TZe(Hx z-SjMm?IJ7Vi4YB%`C!*=;v>VM=Qj_fa_>{wNH=!AJN%%_F}uGg0x;OI&{CCpeJ~cO zAU>CqeW1umOAMdw4De?--cP(Qq`enbb#_`ahtm04AJGhlhNfqwn`})n9mF7Cdk1+F zIGL)6;VOT~Nq5v!GvXBRE&1j7l^vw!wYJ!lE?AqG|WXa{0$v z80g$~wtzZ6Ioty0w?p9@@$%r#(wT=F8XY4_1@^XWcMk*|h`e4xTUJQ;VYN zQQqy6^<MylBL=^%wUmnY0SCTuhE3|I7F)E z`1^(^Qo=D2FUB(6w)JIB|M`#J99y%0q}UBfgISnfFkdq^XQ%S#xhbPKS5sWq2TsxQ zABR`SDF@(u;j(K8%{2z91#cx`dy!!1$uf|F5D*f+1_}(t6=a)ha(@j_NJ~Z#b zTCJ@eERQyXf@7-qsbkTLG!|q8Ijet<0cCM_n{DUS9`Q=Mcb9Sgc-y?k$9fB`!s$82 ziZyS#*ANwXQT5dG5Z4IwX-R3z5iFf%=%hYTYeMtt6*}sJ%1?Rbmb<^N{v*=2QiD;f zk3Y)*iIVkU<3|Mk$k%V!d(pmgDvb*shHnztnchQblW$l){8}q7s4aMF%j#raI(;~` zi9Bx?%K2q{W&%>7iBbTvbvvkMPKZJ+5H8cfyae{|jEfESyIT?X!J5gOs=>-#>H7J> zYRFJqE`H*z0~u^2;I z0Bk zo?C#>fx4=0;^bP_SYyA)4zE;oao$2qh;Z!wyVw|5MkJ)^pxdo8=RdW9-N7X@V3P(YXvR`1goDP|-n)PWaBSnY5;AK{Y;`(n@` zIjP{`r8z-gv*?YawdurX@}Afr!p#1DMSz_K#P>o?VyI(Duj(4lcKTOG4k>-(?fCom z`l3+d)fdfq^2xe&lPm8$UQWPEt`FIdgT`XNlX4!&mYb0!?gMgYlOU5N?*|HbfPy-) z_G8z&oxi2uCK<*w%BB)vRCc;p*=-|xu9*7_ljFaZeeQ~k?>(ZkI=W6DZ~V8b1v)cG z9hy_dM9~|;g!VIbTj+>Oq$&wV}PS=R}5EAG-R-}~qrVaWgKDbr+O(I=f{ghxU``3R$1 z_kcfNzk=$mc@S@@3R)>5)W^!0r^yaAY1cx?XPwOD(!~lhLp!uM=WBq2#P!F6dg0Mt z*8S7Xbp?v;xdun!!@{LXp0|LTG zL2&o&o9OEFIYBl#C*Tg6({>Iw_{x?u{L$c18klDO|A&iV2Q>X(ZoTG;9+){qX~H_j zkqdZsD~x-jK81kM%xGBC;BY3wcXL%vVzGTQv}0zMJE|knKz|L zWI+?MPTjR#->Ps$JnXi2{cm;$8a-V8ZM^-`dQ3QAA>`y6T!%yT7A=A=_Ti)@2!+x! zUH$ow#Cbc1U&J=cW!q`-s+_U`Y}!_UQ-~`ho={!sXFVF*M`cDG)5s*3!W3}1fS^Zd z?|Q8k(c4Xw*FjIpcjIG^lw@-r=?oobw~tc~UlYlFZU9f$)#}_!Hs$y%+nmpnyt}>L z&`^=gm751prCgRJj3A!xwBK%i*iD(RTy-{Hi+?fTXX(< zR0=?GhG7}?1}*EaU@4Q|eV;Ig1`vNRB0^|MUxz6%dmNi~SXHzA5kys^)+BmIN8rlh z$c}*5?JJx@zl{_XFCCB+=*u6KgvCU%RA){{$V_BfRQPdXzT+4vzDtX8+FQ! z)u6{3l2GyxZYwAc1BNn`luIWlMW7$KExbD#&E;S5t(X^L?HD^ALa!LLe>`jd!T~hZ zyd-H0iz&F=SskpF{O?M($!rq6&%vSM-vz&p#`%;FQopbBs1un44cE75;zH5T0SobL zt`YhmGBLYRldL(74rb*KBV$P=srVtzHg|F$qP@O$8D=#YIwdV*Yw$t3hd87 z^6n(9b0lI@A%o>z(xRqictxKnp27RT&$=q<{YuEPbnY~z7!cHQPDZAL(L_Xwt|4U7 z*~;w#iCbkWiD3o*{dZmmhpVRZ7e#dqH#Mh4Plc`%1VwmXD1%r+OQ!g8{%tYLdoNQ_ zKA)igK*u-Dz9>u*xwXY{`x#7iAkaib^haWb)djfSI?3kjuk(on7sGVju1}f^GAP!B z7E!(rBCDTGH@G|R{ht+D(lE{x{I8hQC|AY~Pge)sL_+sZm8yLmk@7WnH*P!Op*Q?$ zaj=~S4)T1X3UIyTaG?@}b;SamY*c6m9bJ3qb8@)nt-&h%JB2^#N9EAFt<|rY@#$T& zjBM6ZEL3={87@j|OQ@GUEhfNjRS#i|A#Sdh;-RXGhV zAcOs8^$14(49C3INM?wwDkTRs-Ofroi*#l&$7iOCQU1INI33g^o&?HOl3>^!!RL=}5;97=Zo*AJZ(G z8nAFdHPl3P46QQC>$z?A8&hjISy5xN_lFyUT!>z|Zf@D8Tqy|sIUmArl_ z(x*rfon2Zd7Z29&?4OXY4V)K@q`phf$mo8hrVpg!M}dzGg@auDPh-cww|3g{iW=R{ z=Nod5uBi{eVkP3-Rz-C*uf9t-gfGg~167j%S~0V4bx4IqDyx}&(?F=dXaGbPvl8%& zfu&mFw~lu>g}&lv>)5z`6rC^Ct3Ql5Hm$KsMYAq}1CSfc02lQ8#|_t?DJPeYqWu64 zp^e2<)KD`cm&FD2hAc6+gwhBkS_BD@BZ4HH?f!Awe$oA<`|N=4We-K_T;b^(a8si! z`hOpu&-qqvZYDb)bx9SOB1rfOb+!yd4u)sHyxd+xsEwIE_+%3<=qeZBYE{Z9s>cr& zd7by|>eaeqiix%Nnjo2&O*D%h&Q@-Pq#3Vg?5fwCb}1VQyCtIcW1n}Uk6ql4`GyvE z+`F->sclRUXW^y~(CefGTf@F>i#oD*HvzeaES$S}S17eD691Q6M@4J=%tk~8u+28J z#8X}l-R#2Pe0AB9^RN+x-`4AfFRifvQCSSmkuAf*DZOqjM>IX(^c549wy~GDX=PmN zea%VAZwH*{K%K;2eUpN%aUt(@jOF%r?L%q>?3|6Rb)G32Df4%O3;Ov*`I?nZJtx_| zR|TD2(p+1OFO#R7-v0yxcALH&>gZrxPcBYN-%nVxOT1u^L*kRTWZKC`K9r42C-E}{ zOG2>oy7IdaXh+_Dqe|IsXayRz;i|qjE;*YIW4<|cyOYcFa>_m|`-Y*A`oI`WSiE3j z14~6);kA;ruLOW;LPto?`u^YJOL+%ea(kHBD#(u{nsV+-g)A(7Fuf;Cqug##;!4M&XM^Iu_!%i6jsB8%{D6!V1%WDPG z98Jq(&U}9_Tq_Um@~{%16PZfm5k|_!51V^!<@tEs`m7ALxUmqC9IS85eKv;!r}?WM z4dZvS4)fg?>+c0ofk$;3lHEOm0AmVrlgQZl#%&IQfs9hv)S8Aa>h7pfZb3m(yTH-< zP@g7XBv-UVNFE=YW$V(DnF2WIXoWm_Ev-JlU(TLQSpa3?>C|{dFdwb(@<~AAe&yE5 z%{Nx!`Htb-Et;|rSeq5m=8V;T`O{)f%>V|bjL)|xAI%LezA0rcmG|J|foV;wGGLXC zTR^^#{v8fX0c;olXIoQ^Z=rP|?r5cU_l=Bt?+yhzCsi+w&N&$ z@_C=FK^{RjV}5AgJc&qy{W{F&3oyVIXdirzj;fwnFQknnmjygu&2j3_)2kOB{Qse7 z56k`6VSa%8yrY#9(iB=u22q4E<#2M>U0+?yeWx&Kfv#=k$p9sm=>N!-m*YE-`c z3!|p7uy9Xo4zWh&CT6beP<-Y?Xml)@n^;M(tl?ImyK-{pTKy#DiB*L6&tswj{Xgjc)ntGBI;BvFaPdze{rQXK8yXts5TqT8os7(! zeyz+H(niOvJKSH<#?;Yd*ZP>28(VJ75d^~bwl!!bZ%36#Vn|9=LcQ$(2fbh6q;(yK zUV|N#wOk}78=HNwQwkNS#;^CKA($G3v;@j>zGDj1jHzXXT6zc-f2H$q5v7=`lY|ub zztbtbMlHmt((NZhq<{);%mt>RR&nx6@LuYYCP9!y|NZEntG-5FIXmlFa(ucz@?S^V zV5Ek7)YYFo-*yHW+^&R2$N=_%->L%3BS6ofipdw)rR8X??t&p$>{4aFm4JAXum3pq--Eat$|~xtp2QfQQW7B4yUovWpUKp z|2sZvF~L@Uyi6inx)p`Ro=u2D1`6p$Z4l9H%|^3@ls!Bc1Xg_U(~5s&?*ad_&trN2z4M8d3A?6Q^xh7ZOu6>( zy5kfVu33}DlL*wDPyEJ0Mn+D61gb6t>R8#-$Ipjw_s3-yaca?wTW3{UsZVCwR@~g& ziu(1ev{N1(9f>j*MSq>bhW{7)&HcYyP6!nU@q`+z62&Pmyg4qF=}NDq{P~}F+F;`m zzC_YIWB96C$P|I^B(>GoG^^JRkwF^OSc zto`Et!4VA|qDh5Xk+#ggK}?rl71{liK5smh{7@V`?@VkkhaDbgPPzQHMd$0fK~e7` z2Lz)vvV?f#`#*8SE%{4)_@&~!wdVxX>j3}S6&3Nc{#(EDh=d_abMs)^NiCo}G&y5l zh{ObmG>m9-Tz}pA4=Lr>^kpB1O%L&BJ(%CW)~(4%Dn%?i`q(PX=qOe;n1a6p*1Pvk z{BWfxT#|id_a$$MV)dAbnfX5)zFU^fy!?<-4SAF(6n_?z1e>pb$P`O1@w+BZ+}&=m zZ{@qgc7w>tHb6r~o>5BPHOu$LyWr!30#qj|#RRotYwg1=sNTxuipRy;A?3!y>H~X! z9J$HS#Cw?EIn}jya6}?zAQYk0FtM467^gxt_bY-j88IBr4qRkD>tC=%xQ)=Jw4tY< zSz&|O?2oh486nd9F~Tu6iUe|q5Zt@S@3$)hPaaEy^IBluEEzOOv|t@j1t;=Gc;RQv zggMV>19MNJ;AFwW`0j7`O8DR32491i$XLQY)L3u2@tVr$GFN}OX8yHU2g853&8rnZ z{kmu{@ALF!qQl&CTE2!&sP00s2ekO^%xC=FZS2 zEG4)uk%IiQ%GO=Z;v?9N(k>9LFOe^T_Ro+Y>gCu8w>E7j0n+e{9mDQe?Ag5k*Tlb* zU{CH+?U@OMa5)dt4Pyv0I=<6MH&ZG*=}rTHxp6(>4!PHRr0TN4wj}@soFTyo%ZZL; zScZZ8{EuSG(%Hj8Eg}9dOGCpC>SsljUqfbQ_=OEbK%ybZc+|WZD#)wYAX2BqM(Uk_ z2Y08-ibndBMVji{KEk1GWc(!bEJ1FF)34YIu{v!lx{nH$2A}(WZs&ARqx2na2R$#ms~4|`}5T54;$^qdYk6-%BoR646gAoce;g1zSP6xoOJEN^9>u@n2 z)Uvl~Il?h&NPrJhjzHMvb55G^azBIkIqFX3N4li*YJSw*Ab20wgkHI&*K^2!=>T$% zRTq{5vsppE1HcDOX>mAnY|gC*E&W#V_tVyr7wq4S76G#y&{1sAXw=W~-1^cLAfr$! zU@Dw?<#PDP<19k`nY`H8EA-={&fmqw-=Wus0OJ`57&uo{Fpd?_jSn<4wLA!;7BKT| zmeiXQFSLB;n?2s{&8W>HZyz}k^J%(-p?IEmfrMkj3(mrN2q*A7tuLBcpWeJ_J3e-> z-2HWU-_P+ify3{CsZPUOG^b1bQa>b}irQbff@_r1n00)5dbA);Oies#qwk$@x6t6y zBUyDRI~FcNvsELWA_2vh^D!yHx!xv`bS z56cMYpm;2fc=H7o*A+pA zSLsBWmETnF9oVggrJ5+1pj^K`G9UnOHYW~Qv8x)HovJogTW{*8-d@+%_@FNPEn}1$ zM&&?o`?#(FCHSqS0v4zDIoj;O<%o)k275B2+Pf+fa+4&o_k6K~pD*Va3s=J9yEpEQ zOfS*coc^p?gCf%P7)_$yyY3BaAv~%O7V(j{llS6bwLLOld*c=(g5m_7c}cj~nUa)4 zU%e~fo11eyxFT-x{x|2+qnah=l3?1b!hV*Zn_q&(Ee{%$bl@mf%QCa@eqAj3bssFz z^K%;rYvy!}+)ZEB?Lg}aFBLQ9UKPz0YQ5HH%4huToX%)|du{8v=5~uy_@>+?szE@t zTH6wMXJL_xt5q8U8xcq*>?1QitKDkD@hyO8IA1JvwF$MDYXkBNDF0WC*3)5jd#`w! z<+#Dmv>~lLJMqGkZG7dlvqhmo(bWI_=%KR6|Z*Pp`D+l1jQn9BEEVd5i+ z0d#f?brJIILn%OL7PMozTN0WoZ4w$Cu2laS85@3I#IqNQvF*J?u?#I3=SRbOt7qp=_I;uND{Slamg$Vf?1U`C(j2- zAt{ZrJScIS%D2;ptJ~X2o~pnCl(>nK_xPKwidYq@Cx(g$Q?(5--Yu+L?yRsa@*pNJbOR z41D|AgmmO^{rr-ln~Fovt3TM)w?9agK8qm^T8z*zrI7wTx>A{%pD5#iwM%NVtqq3T zm;{vQgaZfH)%M5P(;fwibN)9A(<~mzJ5hS}B>5aH`=byY_CxCL!&<)-cuCxVVKiKoJVJp#yV!pp zXFj^WI;g*jF)IpZg04!~7Dw8&ybl|SIL~`6A7axi>(ILM%jb*brdz9?P+M$9hBbX< z3^2{x#8Qg%82kUzVl}SL+8$0@XZZs>OLxT_z6plRL5XN%>IETGPJ=#-gc&5xxcYm5 zp#9o|?iIe%S;~{$N=wM%Nn6?n0PTF#3^c8V?83Z40eLuS(4u4tBKmLcyVqWx!d+SC z6R*1Oy35^Hyg(hO*~d2=$C|%%#$l$Hp{goshGu;~Q_A()Gqu3rsRPXNU??k7ij5+Q z$f*~YTv^BIW`gc#g3KT*gIX3`$#c8!1F(2F`8*qIPv(2gNFN>lZ6=a2RuVl}n@q?% z`6=ush@lE@k{|zY(gA==#7#bUQULvd#5ty)V`E4gxWxEEuxQ7`9$25m#6+)`E6u7w z3=#R}mkGQd1AgcF$q9eYZ>^28sfPqc6HpPDfN3yDl_+|IqB#{y<6-Jz<$q_Fhq^vd zTEgWsve`8-S<>gIir_*D1O_`lEC;sry{^Zphqe(caIMm@E)-ET2?`3s2+(Y&P2Fny zuxS%wIGv&i*ojlKsK+DQeQuo}jvH&;|Bx7YUB9=P2H9e~QBDJ*KF<2JZkOH%eKdLa zx}=kQ0R>4az#?2?ij0B5gN*i@v7d_1Z% z(K-$^KP11nHrrd9&OH;rZrY9;NfzOnvIMfG+SJP{doV0q?jN4ely?mbaM6&0aXcaP z+GLyYQP-Gox{P-bRIy|QmI`{U?rg1%r)%ANdL+|ck1A*^bSCD+Mh$@()wPeK4o@hl z9LM>s4n)~l0Jw^C-;h)qFsl%#F>*^WmtNHahG15`ncqGuPdYl79Q}Zdo_G}f+Ge^* zr(zmrTx)vV_p9M?!d|4YY+0nC*6%^*OOq3}z)`!9zF6D(DRllQN^;VD8n~9>|L=@h z4KyvfN}pIklzvo~$(05rjqUdHe_8N#+HLsL=&)EP+-^OrUv2XQ3I5Iy%}bv;!oiwb zmtWQ@^7;w&tZr<4oT_MkI7>n#^a{F0Fd8A(3QYIH`&7z9NmD~~{N?-G0VpSCi?NI8 z9H|-|^hv|jyZ_qTE|yrb#C$THD+cEFC1g-1(+IJ;^3Xq07z zWih0M%Q+QE%~HDNKwu1g#w;$t$eO3{tXm7b%ra;u{7+IpDOoZ1BpdW5s0J$U0 z!S{jq2LqhgaH4;!_dO>r41w(}-dS@0+;$W&n%0{3p~2aW@{8)Div7H`OW5Xr(R5EXvIYNeSCTA?b1JME z648p^y27BK~m*I62NGP@W)3&62a4TFvZVZW_OJkDBu1&L+if_wwS=t^6+0X2Gm2oKow+MgVZ|n=HpO+V{=U? z>=QQF=mA9A*n_`;!>~7*fV~b3%dvwdmJLq4VFinOTvDH0omCQJ&E*3Xg-7S7EYPTEQHPWjJCjo;L5%aQ+W~mOOX>dxq#HCtb{VihAb&n`Ln9TR7TKJ;+w3rL_gmHU)}Uiov2&nWx(^G}l+gxc^3p zMcpnD%22^Ky@9aUh*j+|#vVF*oJT^EdUaD>=<#YD?{H#ZK&jzqZs_TDNtHj%5~wG- z>j;a$H1@yv-s=`t6pMp*h=E5bN?3ZLG+kMR+6uIV)ly|CKer|aryz&L#hv{_G44;b zC-u6yPh)($qub(3?BLbEsK?!u46uV%69@0xju}>lfEI@6nAk*B<#G*1YC@TL3TnQc zonio|Erwz&){SrMi(vUKVoPm&dA|EmIsz(2(?AXEip_^Z$z888YE17TfT0-p6_mN6 zeUFc1`zoP6Cv72>&zJ8MQNC_8f55XvgbOC`ZX#MyOVUYQyX>-?0{ENnUo2h%{OWdV zAAyda;om)$cMlxCuZ> Gkl%w@}oA@Omdq5C`o&*Vb)g5~)Px2uLp~*mOv{LPN zR{MvRhYjTAOHEn63Mgja0@3sOQ?52|B!E=5);l2HEgwu6=*lm%#Y#@jhFJPd@}ajO zmP67e0F4(Ekitd0zeyVNcQ9`;7?s$TWU+K`bjJ%03qxDCI^X$j~$@MpvNuc_4i$|jaF~%sXb%-XJ#wrpOk`N22)`<9RVm(#Xiy0*OcOkP+ zSlQf6l;e}3 zj;g{^O*9#Ye&ZC(11MYT6Ma!jez)Wpm3n`EEw_5@s<$OE!0wpS7=~OeCflCZQSJef z3Yx^-#q8a-@guQLCGk#IUQdZ!i;Fp%?T5-OOl&du?#sCn7MYMdQNNhymXTI?T=jFcf89hax+(bsF(x?ZFEgoDf+VQx}ku+LZRo$If zcxTHm%^bizxWg0?5;T*Tkf61tzvy||y3$APvC^|E{zAKYf73Ydz*VYE(m1D`qS1}1 z4+yV(hRW4t`|YTL6@hLM{OV+}HhI!D%Os7bb&O^EQqsEvd} zWX8j#3o$rjK*xwOLCVcer!hbkdh9rwaVafIA%Xq_V^Mek&XjFd!dB|Cu)>04i70PD2M{e+f1*H80jO0JRK!&+fT$TEPs^#`Qx-p-UuAQCSRKNk^gxk zTU*<2uSKDFZnHe-b^4%ttoWh#8+*luhBS<_+mV6I-oUy*fcm6LFg<|unjhml7;dA) zyoo#TDkxweUzG$`u#GB38^`hz2Y#my82ZK_uKb@o|9JmHM()xn{V+T-b#OOR!1*DU zE{%FJ5uAcXbaYz8i_cx_7~(wzK-X|XFq1!)TM}Y1k*W1k(dpaTY?Bm^#yXEJd(>>V zuw@DR#omV?^g&{dXIBvy6sXc$_=k<3uZuk|z8iyQVMTOla8t(wDsF0~x0g`>`Dx~t z-uEi+WW-`rnN0|Kh_mqIOQ!{x3H(%Y>ABeN_36+-dPd@Q7CnZbHoqq#;Td!S#ps6U*wCr zy1G;i$YV*pPC<;Z36Kr1*JwGl3>=Q<6LcL9?WfKMb0*H#VP|i;Xhbu%h*<|8z_hG8 z;>j9}m;oxGL8-nJ42VV0goYU`i(PcUoqKv8am(GQvC;J$guzNq!;3qupW9DzD4-Mu`ogXn3;m+ashKr})roB3ie=X=pRhn(uTY?~b`=sOdbTFBBs@)#>e)XiLp25asTvY z{u6EgwD(%O$RpE}(N=c{qz($USxF_I!cwuasByt@16ZrX=m_k1W+#v=nMqh$|a2lHd^O!CqnfLWC@( zFAMd_caY8I^r3FrG$3Cwu_r{~_ZZ`Q+Wg^eC9Ol1ip15U$m=QrWv<>#AjT$xuWWX$ ze7nKGp{TYXP2%NJT?5^gkx4^3pnl2o$*t}1_%xSaXi&qFC5R=>@!$y1%$3Q0yKr<2 zL~%&Op*>Pg^!eX_JG%nFVBbUA)vcm5Bic6&9Vxx}8#*Slq zUeo@oDZXTeze0ZuyTM2Wu{1q<-gTx5{J zu&iV;NlX+=bvEa!3jp!$YvTT(6MI&BSK?IK#i``R~YG+mW0t0_N)mEO#8Jptudz~pUSfq0f~WFQV*A#J*k5j zB;G)~4x}u^H$w*HWT_fofA_7_5|^ ztjAt~!3-t*%tZK`g({wmI-6N4k}yRLtYan!x=Y*LL|NO_1lPefbF*tEq#jtmT|TmK z@Njuy79mQ(`-K$9h|78Iyn4b`Z`DGP|BXWev_U|u7`?Sh14c@s`*4batn(Z*^VQ^> zIHAVrSSF^b1&b}&5ihwHPN-hWsaXG9I`yoFw`lnvW>iA+|3rc_|54J}lVPVS^HAbc zqX%D=r0xKziEB=wy`VmQyjHdNjk~`9i$=uy(5kPOdPbT##q>JU#AxMKG$yp~lE9>W z2vcBr;Or+`A$0QFDwVWgH!$eDJ~Pd2vD zP+^TzFriAm5Sg`?zZV>#2qK$M=O)Dps@3d{awN=>@g}L@HL(Ni7vck?6kcx%ibsKT zGI40?^#xFBQ|0|fI5g}7IC-Z#>o#YRx*LyOxh7OAzx%t8_xT$k3AHa(wKZx24mTNlbDswu zZjcUwIt$PVmeAW`X1RZ0->+Ph&Oy+nhm4#W|K~@u_dW^0DZK!?u;R^jM{(avPe^6j z)JMx~WYIJblFF;7t5>@%@&g~6*UtVfY7dbu4RoQurw5L_enitM`)w->(_&O8n1?rC z7!;yGvWvmU33oidpri2JyCz!#;Ij;I=c68NK}|X)n?I>fIyNl=wNqgo6bn4$WD=gi zZ~Cz=e%!Vt{m%PrDCR*#NDW#5zM|5}+BJ5*Sq}}Jk3Eahq{;y`Xc&3m zKJt8@xDIbCkgS1Ic{q_y(KunWXrI(j+ChP`KQ^b(uyV6p7ZJauPoqT+6m{z330b!e zi2|#%%kqOX0uYf3(kef(vXbkDa^bS`gWloy;|i@_Bw)9t{eG6JD+b8X9O2!9?5qR~ zsT`|kmwxRs#@diHV;@OD!wyaMr%dpXhLuT?j6UjGFciJiaMqs?%75tb-R9sW=KsvU z(^D^ufEaAdGWJwRb;T9v{W*0G6nRZ_h*+<0kE_8T#UeYj*}8iF+IFUbI&D}p4h;m1 zIOG^uuH4Qih||vD(HH{9%fAyl-XdnON(l$-3Xz(DgYd^E7l$v3Wa_p635eisuK$@s zEnB#^zSJq7lir=;6;?!XQc!a(a-Mc~X*hYeP+f7-Pu)Xcuv`}`XJ{b)KBrf%dc+Fb z#Z|x!aSkDM=*Xb@zPY%1hXu4vIw(;V$HB}m;eW2KuDSW$Q+mSGFXjQTqOUQ1jI0`- zNXladXy@II#zM7oA2;BQCMGfrJ=X%**Jx$5n!3PgM0tN7cL5h@i>UOwXEO3V5mL(* zQ>7=TZJg)`;|229()u)$RNSepr_E{Dk5>=(y9}LU4o?gI-5}3P1B%b4-hh0_v55*` zZjCm5K$3k*o(muq*4JS(c*m&8H#oY<6QCj!r-C|8W147b;YEE$c7iT_yDdgSLLxDr z03h@MWh4NQNks1oQs~AbUE^sqGM$^@0|VBhFj6o-Vbx$0QNRTqL}|mSdPj+tN>%~S zg>$ZOhEQtBDmUv>{|+0*6}F?-6?Y0`pu?~7B33}Gd*n!voqOr)Ci|B*FOKXW8S|%a zsoE^YkFEY|-5FYsz3T0hmZWWWLzjg-)ctzce~FP|3?bhFY!- z+U4XY7SAFWe6HN zT)Myn`6pH5-e6C^x_?CO4s>4KYt#9W{-9Bwtsi?DXr=SeD(msJVp|IF&J z|L=Rg?&y~i(tK+wLx~ZipRK|^Hg$yoztd$n6OADlq{0E0Y9F*cUbq}BHKVJ4qmoyS z8~r7&gT=PFPbn&=9rouiZ13c#sJ4~zn5j608;09*qe zec6PnAdc_=6=cw%BEqWLhDx^@Ct)GbQlW+=kChdbWRF0?fPW*$|L$y@bfwF#XsFvT z!gg~r*#;NrCFPMWBo=Z{jVk!h)#oN?GFb0^wk6Qf-`Mdi7R+VE6cIxWq}<_xTlve% z&ifZ~qU2S+`<(Z&Y8{so!_h`0eel$qRI<+J@129O$0B+q+V|HlSCko9u-uCJY{p1V zT+fbf5@jM0Q?n8s=A-%AwA+^{_4ACe$JL`J%VfiSFBrP9!(86a7GVZnQ*f~qoEC#q zhzEm*DG`rJ^KYb1RrwZJufIRB;!_mb4?9hT8a%p0Q+ft7yl$#pGE%Etmy){MuRZtG z-}Q6a&FA|m;}mKR^liV6kbDAA86RyWu0?PCp6GI3%Eq7=Vhrk8vhSjN_hcy7W{#D< z7K)t9n^^-`jSL@2qQ(nMGGuv6a* zRc#p%pZ>)I5Kr9;*JZ#`1*OT^EgUF#t{JI*IWuuzX-pardE6pG|FH7At6S=qap#c3 z%fe}m?;nWx+4=Lk(D_T6 zD9I}*QYN3OOE9W*7F8z1ks?C2A6GZPDYn6sMHr2^g=+-@}-?15qApnK z)}feG?s%U3AWj~wPSD%tI39vX>1GuoM#EH-c3GPMZN84pf>X2o{ClsjU`DE}o(z0G3(qDYHz8uWQKD7eAeJI-43X7Y zXx(2)rU0B=x~T~gWkL>drR>;AC~9lKTVEt!OKY{Lxu%5^M5 zlNk4(7=r>Yt;Dou$iMoe>xpe#J2!APrI~aqA$*K`WvQd@LVDSEh0^ zvc%aI%IA#SDGbWw)Yc|NmG|tXD%32?)yNX{fz`98yuNn*A$b`Q@p z&JQNk+p8NG7Ypg;QG*t%Un(X&<1U$?A;D7AS|;}rOym?r88227Tc?G99BMsLIOrcS zG;wvpTH4lQ?uHrY(6Ch3o8Y0uS1~ek#+*2s-YhA=OM+SrHK$((;KB24ULsEE0@r&~ z=KD3DlQ-il{qJpqs|yN>vQ2G)H6?Y*sO@Jl^U`(YoEHQhvsvQI^v^$2Utw8Z>=K`{ z!by|I+;*W`3_2_Gj}Z#rE@@t9R~Ciz^7_FSD7JKp!CfLjc!>--UrC2kSuN%xQ;sBD z(K0?~N%#j$>94$WSSpt94g?fnd?f7_k}|N(FeNjYz;HP9o%Qg~`eVTFXtu|kr1d`d zjB)$E0sCvZ2>+Me%8onHVl`Mlx^gPtf8Gc9=tu1H3DU58iI*{d8632Z2Qx~O+h>7{ ztSo8j@cdW1@4q~zCIV_;gI&jW2hm&RhZWzD*wpxxvb6E#mB_ll`G33$v6Mv)>(VgK z3r(zSQ5iQ=lD59h-=1|hpbC&_j0VjMj7gn3_N;r8{9E5YL)Q8EmC@tH#!?-8n-pg0 z?Olr$?`-d)P%c99tzAc943O(L3}-2`!Z&q^-vFD;TjEjDaSA#_2zoTveSFDV?-N&c z`@%x&z#*E!6iJv$LYuhIHVS))BeG&<3D zr|ScxSjxGczNoYT(Gf~r#SaQ18IHQA<964-|Z$+}}0&lMa8t#tX(}jNuB@7pouz8|imAU&hrnxMfL) zzoh;)oF7>-QGK$X(T#Bdnfx_*O)NiMHU5u9dSJcrpK7^MQs*fzN<6)4Cht85>I7@+ z?2kdSj8Yr6OJ79LMyhj-=V0dQ;6cnpuX#O7^qcKnJAxFOm|oq$+;8=PPY<`X$G=)Z z-H!o^NL=V?tVLgb+;yiJo0%VQ|KJLdGp(Rf)%x|Z6+YbRarqdy1n*R?q8>zir>mHtZA|8XvD;dae15RrRd<@5(Hnn^~Qn5$Z4J#Tn^MF-oL$DgO^qZ^0Jj{)G!GIUv%VLw9$>P(#Cj zbayubf^>Hy(j~GfY3c3`L8Kd`yWu?hegFHMZvfZz%x|rA=R3cB;f^@DJU?LbySvSM zk{SrFcDWkD;&WK;n^hI*PBOPHn^2)@pc-XCSH@*Bu<|~+cXoMxu>7MRbJX%m-ttG^ z=QTnMVqmw?H*Btx=W;hhsa2^ny!)O+(El%jZ9CE`CLXRN!?Z#^L?&EH2Dmz1%b=JU z&}1I3Mre?2F@j`bD{HNgBxe4HE{954E!7K$Aan*?vo?27&eC2Oe8I&fm==!-)I}UR zY3~)5YC~I-*~^%a2DvnK6YH) zPoBpEKc<@(KJ-&TMK#o+Sj3&Ff_{te%*@Lx0=+tn66mH$qvqr2`o|`abJ_P+FW2wxt!8#!YZONx z;Rf?ByAS1?#??j*J9+5}JEKo4OYba|8^y-0@@{mg&va6wlOT%{1Z>Ezqt3zKJAXNw zDSv(XT>9U;9i%<*g?FGd;X#%fdv(2*r^z`&$o|misw{|h^wq<{Vf!UB(~bn1NeoRE z`X&25l%5Uu%hyVmmt`V8=jAWX-L1WiALr19izK84S&D?8AIEs`}& zPB%eO^m6a|a#s9VBUJre=N)@M$ZW)o%X%02*bz@bB9ta65$Iz3(h=mpdRyh?c5?KA zj*i|%H~LrbJghH5?Cx!-i?lmQprv94;Ihv-TDqiryrrOt-g=rm;r4$j4ak1{c(i$U z@b2kv^)uTZdv>vA{BSa{oC>++^rp<1etqP5l4+H3a}c_Ds+YH|En`N_!1S-h5#+T? zG{s%^!uF!9YZAU%i*vKx>-R4EzfEJC+L~{{r#`pBI&BV&gYh{MnV}5PHum=P^2F<8 zhB-MNO`eIG#A_8Qv{P^?#OW+XP|Hv0vdQZeGG%b;n)$Fwn7ln`hp`D)QX)OGErw;v z=Y2UcD_p&{1sydiT{WTY3~93gfmWB+HWp$?5yPyFLCH zBX=5*n&5v`B&`mpUje&X)%oAU>Wh=xjtmlhC%2skpT?E;m2&(r>dj+eZ|6yv51mHyw}Z|7b38wV-!L?F9S2l z+7OxjZ<9E%znf>5pfWIeSN+)TBs1)H1t91Eqf+AC?4* zjwAZ>jy8O9t$1o$!GI|+)U0MGx`bKY{(Y4}XE*|+ z>|z5ZQOv_yLIv3iNyf@8R^O324M;A{{lrk+j*m??KttsJu@M#(d_hrRP;-VY+>s6|>=Ym6?K8m4JIW4#K@Be0)k~CoYmNBjNswU}4M5o@$UyVLG+>A*{TvSA z7G~ANK&3s9P`MhC>~cQlTA}FP+k}Y#E2O#lczYJ}I@p^?SeyrypqcJD>vAob9N=JTsRAEHk$Pts2QHcm#(S6s$F)UY+)MarzDSr2DOpH)2>bl zahyL)-u6SH&d;&fj0GkE&-2im4V+Dmd>~KqhYsERTk@Fs?(Frcad|>oqhXQ26EfWy ziTr8UI)}w-uMCt)KVzcNi*lok94E1I(JHtBpDd#O+A9%}au9=Jdr9oY z^&i`uMMbb`iV&$ zR;F+$@mX~|E}oj*F?6>^=Pe6YZNMQS z;KS^a23&6aGFVQg>2NZwg)KZ8QlIJA$OrqMF6S)TPVpOI{Y5`~3eZ=Xxw!X)Fq?G^ zP=X+VSD+G5C<3^gzQVXBwlvo}xz+2au&6G>_oOA}(MzN&dWZQ-Zl;-4BkK0sqdEPP z4qxOjSmweF#Q+bJ_r+H|EQN}CZ)78;;*sM8=aYaG>s%iaeLlxc`^k>6`GL8?U{RgH5nN2Vqz0i z)hp+Bvsu6XAjCnYoaO%TR~Hp&q*5ljpNhJP-e%4oifr>XNV>((CIu4s!#izV#wf{P ziZVzIB*LuCwncp!z+Z#KqSF>y{MF3LPULA$0|=?g_AH-QvtukM+1wr1XVK-#dw)3Z zy0a`ZVEs?3-lzas?dg!~NEn|1%z7iapH#>@uxybiSONzjnjw;*36~MqyoW;?8i8ik z1MX=?U`3b^M%ymcjrP+SaeG7!{D@v61v5XNfY5MiZKld?Uf5Z)1NOp-Uf&Q!7OFZZ zippM-QkYp#3_-Xqk29y&$?qN#cJayN?y$QDG*(v22Ov+{VTTTgsF823OxYPFnB@&1 zm;CaM+fy@NNWEZgF&KtQi4X<}vSdzoeHbGekR4Rl!@`GTUlybI-~?CJncA}F-Sx@Y z+S^Ma`$*|pwdG|xDt){~d)Z8uVHP7o*qD1AZ35Ak5Nn&B3zqbjOKN6osUKK}B`(~Z zI;jEB3LKzgmQSHme$gsUomD^{Y)iRSR93S)eXN7&pC&Mo8NJEI?7@!-D|mVF$pD;G zH)`#x3}0#RdQdP?57AU0%_Y+9Mp6-oKn+h4n-@ER`p`eT<$?hxgiV81YD`1zWUHn# zxQ8U(_CNSuJ+u$s*k7vtC`lAJ9iBnD6o&X8(Fa5iFB1J3ajb7@Fsm@X|Hty``ufN7 zgfDa^G=_kEE1Rl}=WdyxqmP;WJn-5a6XV1`K2 z1jxcx+n0a(q(C$+_UBoF)UUe`@dq?(l{^^`2LxO~cZpvH_t!IoA4SEYLboP33}6&I z-g5{Fj)!1~1YXCx6HIXW*@wFC0n7P3Lu+0@7z0OrW8avjwd(|>XW#Z14}AjJUOcbY z+013@{g}1*An+`5G(t!j{U5CT)3b2i8?E^U@{XoY!PsEcO6C>x%CpN@o1`fkvpQMo zEcioyvY#8nanS)*i?dh<^dT}hI;K-;@8-Y z6E>kgiUzITxgm1sNrW-;s1fw#JU?BJiF2M;mTO+nXEJr8)uGzf!lsy*4bpw;vEb_0 zUtwP)_D+bSAfSYK#Ly{d&H^TLrnvAs`f1|O*t4j9g_u+<1)=OQ`&>>WQxQ6OS22t` zMOsQlHHDo@lhs7|NKL4*Gru-~%K!S7#$%8}jl4#a68vJR*!7dxWGtv|Gt|~{s_37nZ#w0;43m#5N%G^J7 z(m`e>`FR~xZ-FMna2V&x=g&U<|C|AvVT-4|p!*f3hQ|Bic+RS~M(b^~y;Pp$#lIA` zN+5{X_Lm#xTP+QK3xk~ryjgr2)g@?aZ4-Za%e(b&j)l8`y;7&spA2x_Z{D4o$Eqk5 z7Gjp-m8niCB>IFjQ4!482KB!6$x4xP?oz~`N!5=szmgX?8;Jw`=d$hbvWdS#-Ry(FGkxkxGecj#ew9Uynu&&# zDK!_3UG?$Urmtrgl$XXtd=%}9?*4G(zk??vw6uS4KxTKJ_eb~(8F^7rd6uPphDJ4DAzk+mHUofn zmc09?48ojjN>oVw1UDM+GLlgD>ZF_vg|vd;r4(y$@R%S4m@q6{+6}=$EvdY+;%$>2!=jG-tf3}?Vu8Zyxk()k^F{RZWZ`FBd*#|qog=E_0VVTO~ zsK(T!{@2FR!sbhrPdkIC_EA1>rK6=*wXR|TCXfg1lg$maUi5s$2S69=$QasGbP0vz zzAwXeZlBMeK8VjObneHzrkR`tV4F%7^YBvupL1v7e>W!yeMw76@L2^WmFmY=Z4jkW zvq49_)A64&VJ)^!uh|iqFxGMc*VCKp3cb1hwi6XPW)#zc5dK>-GdH_bJm!o&BlI$c zv=J8KqrIyG>ajUH@53n}=jID{Gm$bLS*XYN;aW6X)V zvZ5uh%Gvo<8JH?3pO>USfeR$R7=kLV?L|-VI&o^USbM*(HoLN<2n7X6Q@X;@B&Sb& zbTTIWrk-QDQQIGjX4r#skyb6LSfW={nJvueb_#X+$)3(5e$gwgpvVwaNY!({j84v2 zpSCYRaLGuC8QHeOJY^yZK?#NRxnj|FH@D5qx1eo^LhS2<`iQu;Bp3nrEQhRORR3lU z9UBs~WJ)~}4L9kE0dbyiljB=1(HSPfTQX6yJKGq~4<{Y3{(O#W14l==NvKIZ=DQQe zu{E)AvB`g8)glW~4pLzvkv5UTb2zB|*vXyiCDYP`t zI~1%2MHG-}Fj6J)bhquVjays%C3tFCqPbP+?+)CE6x{zU6HX$pIkTvgp;23Rnq``e zrZgvZjL4?;_9P99OW)PF1wTkdaJH|k7_@lD^OVA37KZPBwwr3qIqBiKo%>s!5 zpT-q{QOZ$fIoZ+9qXcI(-YhAC3iuX8igjGDu>$enilrIe_2ifI_zWNVVw@eFd~Q1= zOQ_lE@D=!ZN_dAfK6f2-e*1}7O(1I4w~ zsxTg1zxZ{u;uX|+ciBm!=9w)&4cpsOwjDY0$myn4{63~-Glx@*Yr#ir7xiNm6Or)+*A;p1ZqSV zCPK1T$FVKY^I}?Skq%o9o{y%HAA)5qEfh6(+M`s8I-=!>sd^bxNH&L5`#;wpiXf^vl6-zADX0(;@{O%YT;TzQnmbRep1FQ3^DyJ~u{ z@(-MJ@bopSX0^EQ7&gveU;{Bf?>$D`cNX8`Iq_-n^a9bPDsJ}~`cS91XhvB^A|lmr zMgkW{SXkAe&6R2QiugDRl0{-t$;D7)+hnz9Gt%5oMcqdhVG5PesnHBoEpHsVtN#=WXV!%8|7z zTMi%f^o21L7-s=+x&%1qj{ZC6@WG)&!5jk2h8NQ5V>dzx^?dyTUvhZ`3OIUZR#!*M ztI3MX+e6|{`04=wHTvq7&1C1F9Y75hLs<4>6%3bXR1ivq87%-^Y$;3dZCvY*zFuO) z)dP}1dvz1g;n)mYM*81rGp0qyDyg_^^dOFuzyVvV<)=^KqP{n3mBht!?(p$af=O#9 zicwz8->1%%V_K-ZpuV`#YPLNRCMmYNlZRVT^yJnyeqSUQ{kJ1tP;O6t5C8Va$$M-z zHs2oc@ju82_zF>!aF*k@p3LjFLLy@5I27)TsEI;(c{nr%9{Xg4&*6=YRIDXj)YRsw zF~?}==ny(!1{Y~nyB>^q-W;tYpwTjc{R(?AT= z1)NN<{m~mm(3|hI#vJ&|pFX?TE0?~Jqm~~#&$yDXy)!5VUK2BFov!e%@;>mp**4ZI!Bp_Ps_m*m{ zi8_V?b1Jp~fm#{gU)%A{M!WGw3Oh%8VYW~Qt!+Nri`zgT-{aqlYfZ?bo$tA(Lj4d2 zJX<`nz0WZl_eS!KQ9c=9g1vaUWUqDY)hhf=oehqTsc&kW`J=Tv7NsFT3Ks-}D?l)n zthId>ae$dGwV&n}mFLa7F@Its$Zw!h#&LSTX3@wM*a>?B9*2_QJdi91U zh5&<0gsXe#;vtxum13DZWOt z=YBv&x|^nWHO)r5>(TzVT{CTCnxw*@E*d@p{nEGdnX!k1W(qZh$ieO>uU}UDgj25f zlO!G8x8{#KT=II<+>E+<=A(_*A}_y-(AHWc?MQ#g=Gip@X8lJm*UK51bQVMDg*Gwt zqs0)|+kP0}HoE7_^?pD>@33z$p?OSU}h0$XMYAFm=Tla7Tz zUC81kIIP03GrFoutnCLVX~$aINTd4eKeyfdTGdMzA*`$=@4&~edE#sT(sTIJ|2vTM z!)_fL%4#ThbStG$7-wV=OW+5rv0?OQD&Repe^A5l|Ml*DQ_f0c>P*qrt1(&i`$r=s zThJY=c)&ZTJL!v%m$SZdvBI+Nskw*8$0GQ+dE!0MRo^Ou=7DjN1)rmHx&5Of;O~`@ z4ujjG-V%9zS}0SQoPy$1&`){_M4-cWQ6t)<$xVLdTL`Cd-;2B@Pbg0EPEGGKjdV|E zCa9j8ULDvS&suE1eIx$pE)FjrRubcT*VXhnlGlDgg8^TX;Q=45_Tw|%%X-3V>ZLZj zTBH;yK2WE!uuPsw#rE-Re=EV|{x2^&+3#L5uL|o=g#!TqAOK0nWm4ne3c2(Vb+!C9 zVqe`ZyY@u8?7Ozo_VjT0Wszv6eqvDkflTCbj5{`d)e3OYP&YYGedkwG;0#z50aiwM z_;;CKvrRobNbOmZ=2?uyhH`F2M(D-w^S%&v$SX3^#J>Z*g^Tz>{MOsRDdY-Zl*>4O zvX~$4j#n7B2KR?t0^`Ec%`KaGuiC6G6!>Rwq@xe?rBe0uK)r8H!K1{@SE|Bob5NAy z6;Y*SVyokCo+8gT);eu2l&7C=eSf!odOu%W-;fRzElTY{6g(JQ#d^1rsH9O7nIzuD z$pw0WIGga!b6LtvFD=o)U4o?e&LRwwV7zZhlHjwMjcml~Hz9Rw&MKGS;5YRX#!IUj z+@7ImAYi)lUbFQ3VA@9W6V3Z(!@L>Q^a?#9U%tik=_RuiCC?|#Pp>Ua&g_iZp6*kj z(@GMWRBr8Fm#4P2xS*#_xWh8#p~_^%)T8y)b9TR=P0z#89}Zu1N%5QlZTK{KfyXcM zzsHX_^tP%_O!%IfuRI+gm!&*~my6DdL`NUa)D>DB2q86%wYaKtr-n*8 zb&9!O5K8T_t7YbNqsVXici36E9wwR2AC$q~_Spmra6Zw|h8s(lOm-GKlxb z<_FL>mKOR+MWV^Or6WHlt>Ur5zFx2nmV6{e0#F5TfIfNr@)) z@#IhU)4k&TRq1PBg^)}Qz#QP7!AxT1Mmd}Vdy@I*?at7*ME>~rZw~s$(&zdm%fw{V znD*j3#VuRdSw$c6JG-51eo)Y>HTxyRW&ZQ?HIw7#b})Dt)>bzJ9*V%+;$SOkFHfj9 zq6Q%{Ygd9Z+vB;3$v|eTNpBIDASf5d;psZ>z>=tE?mJ2_Don75(Y8j!1*)Sc)fotR z;*$%T_@FyEu8(>UfdC_lH2K$Cg(O}(?=p4u#JudV=ATm!em_61<`-dB43;7tUb0UC z9&ZZ^A;{lAhN*SdyI8ZbG}-ov{YsKAc97FHM1WIFG%I`0iU8S89?o2})hrk~eK|RG z+aF@CFlvP>?)wyiLqu28q3$>qDmhxJRblWLV@jAX|6(GBH;ke{y-qu)DO}_8m%C`@6Nl+ZlSD6EL!?Ae{D`v*`DX!ah zg5*ATl6*i%5YC{A`{ug(ypv9EVZY*=?#0UmZ_i0Aqt!a(O59b{?DP6GeeeAsLy_yo z(tVr5&9j=KWl~~E#IJ@J;zRc_+CStWgh+(5;CRS z@nq(VY8X>k+w%dvpwBjg*YVGY_;|MD5f%v4DIwPFa2F*1mym?KK!`hL61EBJ>%|aP zYX1B-;4C7q`?q`{12`7KLPe22loQh9(*{Hx&kLp|Lq%4ekK3LdonNz}f6F?iYv(=_ ziyr4>cg7pvjlFpj_(on@Qqu#E(TvSNECD-OS^tz0L{p$C;9OS9cx{(cHNoch_pHYh z7J*A%iK~ZXf+nd6k#;XsI3JHy5$i)aJU7~?kn;{3W$AebLhu%BdOK`P4~mKB>Cv-z z89_Y7V(TT2L4^x_bNIY$&jR**pUQ2K`L#vV?+SYTgf_lN`3Yhrb>)o0lJ%6*DSd#=((vYk&E}01eF3@qg#WJh;N0 zY!;`fQx%nD13ZqMJc29VtFGFgojq;_MB%?Rl2EJ}>gLCo60T0Dn&4APr)r>!k7h9v z$(yCW<>E~;(-^&REZ42KA?k-PGsRv+NM{vV1fJ!B$CwqJSIGNy2J0pR;#Sx@hqg7t z!iT?GA|0~y*s~x3i6=pq_lt1@=7!<7`1XiFT75wP7O@NLZUk$O@Zv)wyoWmNcA|%T zP8P2n8c=MyK{|m?n+U4n510V$yo0To=~`7ovBkH>O@>(A}1q% zJhtflrhIkd;eKoA<-V|+mbyeXsG4Kt;r2BL;|Rbg-~YWvWtuzsc}t$oqCYfrtY6=V z3tYskd(}o}-WEKQqwC%at!optX^N5WI3I70cP4~S3)(B=%m-Cm&(0`4Fq1RUm|5ma zJZ`UMX69uKoVGMx4`vDNLQO-_sZ*mtA#Z4T=Y@dMqc=Jcp7`S07|ab8_v=)DmPYF{ zmV8e7_kOq8aBA{y+7UcDeR&6Dl3k5zR183Ld3_MmM|47w6fsbctSesA`n*tc*>o6vvW*C+pE zp{_$>ry+B66yW9`0)XBtgr-3!Za%&qU{30^IJ_5{8;cuMQi{L)JKD;aI^qXN`K-rV z5SL%iREjSUf+Vn$X$F3g9OxLYCFf;|2Mm{bVyXbz6wtqGo%4UVw|Z)M`b#e-L=NL}A@7x?VFazHh?{0Usl-R6+czi` zE~0NpWE5Pyl?7<2d}D8+jG$r~c@41_!@TtaFR@;2fJ@1HO3JgkRh+yGy6sG0UZ~=7 zvnMPg!_k-p7@HjAlO=g-cQnJ!?(>vE?}MF;X8$dw0;DY+$Dc0G#A%B}jgBh{04R67gAdSsLkoGIllX5a zBy6ItlE?IVAW5qyVw+$vcBf+*bLYALstnd}XIsyTKFRNmWE6s7E+SRolE<{BO zPRS~%q}v+^ z0vLC7cm9)_j&;%uHGCMI>;US*8I3L(rDjLYxxdrV5WfHn+D705VsQ7i=2&C-dXqcn z3o@gs#Ek6pVfD7JS>2P$7{Cg*HY_xb?W?U-N(y+UpV&vaOozbG`<;S`Omu{BeX&EuO5r?%4H2J z9=Eq^gd`Lg+@Iml2_b10{#O#ai&ueLOC76gGNCEe*BhCzB=vxf~Wqw@+~dCcas4R8Qv-2Y#GJL zv$(9WdG6KMAnW}TprgCvSzrN-hB#0nAQFQ=v6mD<(I+IAT&xru@3uMRG+%Y}ZFyzX zre-YWfacV|3xgFs*Y`#SxB^{)MAqSBeg6HEzxho~d25dtos-ktrD`LTsdl3xw74g_k8dlA!1Ft_1Y=%UUS27;L|?cx&e z@6!}<{L+1a8X#yUMz$FD{d(XKzmXV)*u_djuK=;JU-EXa&B#Xj5qFd`wS0}E&yRM z#43LIk|PQIUdmYA@xV2z%~IOl{?0|m+1ByU#O2)2=w;v%&A3xRQGJ@*87n9r*jR19 zX6BRty2qClcC%!ns`skNUkH_C(|=tmA=AAc8T|7E8hq@$4;6jYj+(;?iapmdN32+B z2}>*2x-@^iD!m`j?il-Lr~LOPKtS5+pVj%0!tOqqqtB2Yy-ZB@O$XDU#V^Qgc_iNV zWOqBtJa&bAKwrL?C*&Q0%PV}Vnoz!xvQB$`OaqXL&>~{BTFXl+>J?w!6yY=Z&toQq zSDnW&6;lJ#<8AwJx}%q?%PCeZjpfVJ{lAaqd5wB11}0KAt`DCR6RRj=TlWw zWd7ITFX*?fOnj~TBRDEbmuVKS?Tmpo3Zkqz7b?kft2VLxu{Vk4y=HzOrZX7?S`3o# zPSqqd7w~)%@N&=_3`V?UY^uNb!#v5&>7N2cWx7TBLU_D*qZ5I-?f{2i z!NyLHsi2{Xrfc?NI~U6wJDG(t8m`UL+jQF70+YkEJ@ud&eJQ?{a>4WBk$! zPK}2Y1iElewx3}uW}wZ?81*~?!oY^gkYDy07Y)^7qwdwGrguGf9u+@5cHo+v4YxKA z;E#NE6b*=4hMGssd6clKVZ?m2y{6gYs!>k{bc+c0rOQTO_#EvD)S%S-5}N+a_ToR# zMb}e9+@8qBM(o4+%5Fs3m+R^m@?XRDZO1tY=QRldp`wpB8qUSi(D*!&;q-Bm`}GL% zp_T^wGEJss(iRy^gbKYn>@r@_W6tt)Ps~Q)zNeiw10oqsGF9gQfVu|i-fC=$x&UD12hl8%038wzCcqq*kl)fT!>vJ z?lw=Pl0c230#5}$a zhQ0rE9hS^v=Q(nG?6Bg`-tR_~E&2UTiUpcsd)Lr7mKLjFd@QMJc8$d%SGKa7HVECk z?$gZKV+O17t<;X&k||?Wa5wN(QT|`VEkr{BU6`HNJ0L@mq{a*1Vb_y%p$D?0T?iS? zawI!`EJ%`4($5}C)TSH^nsM*aZD&1~*}|X0%?A@|t=HbN84{WMF;VlP9%|IinfdvDv#b%oFtRD0bDNb9nQ~)I;qsq{cD5sM5iIia&*CUW0RxvlB9F+tRaSB!DM(p8CDrQvgo}F(Q5E4^yqqu4!9Aa@fr=b>!MBogvu3I`$(Rb;^By;fx2uC#e z#H3=QR`MtWUc#M{uEn|uA4WwZ#-3-3`$i?5qwqN|^{mg7kp6x}T55DI`D{e+jsU~W z(k2pCBaO@K6t@By|6;&Ni~KU8=kJfct{0-PkEXr6veJe zR@cNWX*;{pARklmgsx^{qc6Lz@2>$HgZlv`1RO$mDgqgIVYXSNzKjCBqJ*BqB1BYF0D(_$eHwPvYg!5g~v! zOiv|QWMulfnvo<_Slt@K{&{y6khDcY6yGUGs70QGh~p~K`T9ngwH+Ti($nYbAd%lp zegF)Y$$uwjI%O>Sm3#tvwtSPof|?|uN`}zxt4hK0^B`nMw?wnOy!=q25@skO$k(AH zKruF^S>s*dBCrS2e52yBy)O@-C<>IQNs=It(5Dt6o%%p{ITg&mTxBU1nWbL|iRaBp zbMT1A9?XzvY6eF4EtW@yy3>r8k-$?uVkq6i!I zjK#KNHY>UTEc8vYBp$^f?4SiqXpj~*Eh)?ffyf9EWPL7{fvCWWWn@D3<-vdy0!{Vs zW|XkWZsNGTR;+Zj4R1g%!4r7LM^RgUPRKswB9O8f3TK;SlRD#G>I=u4L49tNRE(5I zE0Cd{nG5F(24|r0!KyG;%!Y#{=N*2lXhvees4Y6M1U>gL9e2=y@KHjdmRMEmedA?S zQUZ1Lw^;(jzhq^i&L-2Vf1hcDLC%SN{5k-x>b2{?xyUM0tcNTYir!iXj@)cS6xX#m zc#>kATN6M@)%vyi((%l#G0QwaUy78%^J{fm3^`0nFiP|5#5`Z_=NrU%=if?Y`B<=` zl5eG@F>a(kPS>ZO{1lMCJ0pGjoDKv@BeBc34IjcBPcGFIsL~`%fb2mQ3WFXEXWvjc za-ZOdDsmvbcmxNq)JS27K?uW^TRd?NxfJ>%1(F#uYE3ra{P!aQ0$1-9?AZB?Cm8)RRPqA~d#Co{r8Y3yK&P0V&HlQ?!eIj#W{{-cMv+ zsGj<>I&oca2xP~CM2-!Q+iD*_JUs5!SUn3lt^HIe1AJYkVjMzhMX1AmD+AeJ` z_Ype=2>=wL37dUV2#o!5+`RZjV~`>@@v}WUVC56|(T)KEKRs61rPcjn{{Kho$A6EO z7PYignMnd$y}uY}3m!5w5b&&6KVSC@e|eLT5a&eL?rGnlp|Th8WWqU@!bFzC3Y1q} zK3z`MxGy|2&|)eS^nO8%NmpZw$QJR5W@+%=bD3Cg?-LF>vzxeoGb2?0rV@cEbWDJ_ zte{eKQ&{YVY;0nT3SPN^t5>N((#u*{y`XD;JWIF3PcVbc(Be~LFitLw;$5@x9Z*N6 zKdIeugJk@8q`l7u+Jq_P(+1%RSl7(2|M(6r)`?xbd@#aiHSXbd4)`h+q2hjjCFqb| z`|(;2jtF!AjWwCjlm%U{aM1jE8_=br9w`M^c|SV&Osmbdyq^1bV(MX$y>ZA7ts{ni zm%+g?)!WsDt@lSrr{0Ef&HF|dM*BmBOHi!4b?uS7YL#^7&o4!rG%r0A_6s{bgqb}z z$pcS+w-OrG9j)ZzphVQ9)~?IbGEi4YziB0+^AEm$tM@$aM5)24Cq@+p+4mjErmNl7U4&Mh%xM8=icrAvB`0p`;^c%9e? z8#Ln^MZgH0`tNH3f(NAyL4xoBkDpsGgTWxHhld9YgElvx$CA+uUmX3}G=(q${INqP z)8Wl9=m#JzuST=5yp(&*3>r3{{PM!qBD6lvkC8GA2lGw^0Ti-K_%(ill)M^~1OoOR z%@?7=4EF8J($!%=(peOos3C{$KH13X(Ud{d!8;L^LJue=zT{RJ2`w!xc3M-wP-o_5 zjE*d(*RhM)YHk~z`)VY=w`~kX88DfWdCM8SKNL|=xasUj5T1A5*pNHjJFA&(t2yNr zd)3a{S}%YX0S-mnn6Txhjqcyu&P=-8Dan@at*i!hxY(_3>(;vZk3}9D>3@1WBLM`2 zN$IhAa)#^f{SfMJP3jtJw{T|pp#ON+C!MoMePwdiDsJ&F7C2OAM@tYE~NzOdQxXZ?$*uG(8gY~ zD3LMv!`aS9+$UZ4s&Xu5wZGF6UH7S1mWGC5n-)Mzav$6jN4@Qv_x1?bbS@YxL;k<_ z==J@7a}J*}^h}*pdAY{_c!O+dLA=&|>CcU!mvbtK7W=nW)_hGHOAohbNX<~@>>lA4 zafvca%22tOM70QykDgqD{#m2i&IKMk1c`h@5`k}I{H;0mq)?K1WzC>3T&2aRrogbaekF;{V3#xG5nJaJ@me zeh?6H5rC_o`t9t`#>&<9gJI7#Sn#&d?6d=3#QXL0^5?Z2AaN#G0?JeeF!cdn$%H>* z@4qRdfibiplOZUn#JiktUtTo|eQMQ%;*5?ulUfY6d%2%Z_%6QgO0If;rdah>Ar~F6 zukPpzyWC48M>Xw>H@v;*DoQxZd)a1gYdrPT>+z$TGun8=ii@6?HAoA}Y-MU25hY!H zY!2jy5`k+1k%`vZ<)BgXroRL-4Ygc^67t4J{E z>bE9#()=nJ>=3@Ov|vl9EP5U)BpX4QIec_Cba&P$eEPE2F8UnsPpTa%QWnqsTIm1S zZD&dds5{bXoyV`^xS)OhdbhIWrz&)HS2fyY=d8&)VH zKAY}D*5eJAzCGA7*Hn!m6lWd2hhsocl}3Y)?Q}b5((lXs&D(!$cTBm+UCu%{xW%cfBWrnMntcuJFA*!a%Rlf zp)++|__Tfs%_nl-Rlk(F!O8Qf-rG9Aem(SDfyqT~`Y#n@F7AHV)ijPPj!(;-cY^a( zYXEK3z4!a_k9}${Qx8h^83+xw-HaUeRoECCgtslHKqcPfwz^}BNO_K0JQawDn~CGS z$4STUMa@Dto=6^xr=&9B@^@QMp&$Q`@FOQEK2KWq`FeO|D zL+wdTl0!YdA;Haj%30bnzw*4UJ$#Ydw{h+jj+nuk(5rg?-t}x9>!j`0384ARw*ZOw zJVTl<2u?X4PdA+~i}`BTK=jF$-+67-~;11V__o`ZTf4X4F ze|0(9m#;D+g5a+rE~Ey~l+~HUF0V4j)@*K+-b2e+N<( zyT*N|#csU@lnGh`2_s`6t>pO)%h7fCrpy)%_TRf)Z;n`vyd5LsJ0$1VYLbR)7*%ov zh7aED`D~UA>UOvZKHiX0IVzbu=H$kI^xvfSCnjqEa+jXuos30QniDZ_K@s@aG1Lw5 zP~^~{0o{mXxKQ{EIKDNPb(fyPc8Iq;<~HryRUsO>>XTph2U%Ca9H6~_?8qjpXvDTg zele4Zx`l>BV7UDqV{}^UK+!=hi8M2iK*lQ9W-AfW?-okHMV+;AdAPDouP~VC>VnwS zdG_dF4LKwA0rACsx^ zyRB?{&lBE|J|+TO(Zoho1 zx3sj|C>=dUIFSu>Yz)0`tT2vi`T(FGahP9Wz9dZONw5@2Y`orC5i8H&PRGzOn8Qkfiyi*!-!9xM}%RwR@rz)Pwz_b?&@p zw98$LsioOCpj`xBFPc*ki2#UNH6>;Qr6tj#7l_FJ)oJ^#Wbpm6i~7`h^{J#!Qo6Y^ zhXa*kf?JexJc(K^Gbe{K9`2;W3)!CEAzzb;%kL7ux}!Ghpp0m4xslohE_;L@X~^&H zZudTI(vWx+rHymWZg!5D*J-uoeGoW3IwqrvYw7#>ofJl`%?8BCcjx_sudjgT1y2f2 z3K|=ciQgSUft}0Y123Dw&+++VjA?%7z?%uSlh#wCD#Ol^4bcce{|6COu@}M^g2}D* zT>izMA4OlU=mU}!sMlW~eyy4A-UxbtT?AlxKsJcHuRe(+?)eao>bk|y_BL*&BRH)G z4#HG{11;F4TFSS4u}<5}D%C}2#AEa!B+W22lr1unksx19N6&oy2nV3MCMU(C7yIU_ zKfGOt2-pnYh?Hxwn=h`rO=OEIQ_I^%NzE*x?y(tIjfY>Opt8^V?|qE1+&-Kw*wq$k)jTCItG5Z@5<6bR+G+$$lVC}-j9?Bv zuRxnhSFJ=#le$=NEU2V(Za&%_-C87S*v2A#QSW_ye z@6h&tkT(8SJNtq){cD-abuA~6Nf|%3huZGLv3%QtH+`3|$M^q3)LBMF8TD&lkQllf zq`P})7`kCVI;25B7`mhpN$E~u2w?~*k?!tNq`OlQq~7~E&pGS;%vyYzeeeB`>-t?; z>s=r9%C%;f*5#dB`FwG=4^Pcy4SglmtTw~h(j z@PS_?%!5x@Y=o+|WB7fW&(-8#NqIwMQ78u{EV)EkyY4|4t{ZkQ<4` z*M^NrZ8+#W#kL)A7Hr&yY@pwE->*;oOE?CH9C83+G;8=b_ZtBx=>7=nD|j0M&^Mgg zSnr4c@RyDE=Z`NEDxH*S&5ICjG>_^cvod^m$5&iR_zKmQU5NlThI%0z6A1L)i=g!r z#gl&E`y};5p7}2RGUTypouvwg{^dn)=+Y0RQNi;7vi0l7^`Y%gQj|#|NliRg@U+TQXie%_hUWs_F`+5Z4-0a%G4#HGp3Bdn0d)(h}0|HVO ziL;Q<3VZ8M^4|QfKPmYBJbiu zTqdtBhswWzHVkjTgXKr>C`71{v-uU}@G5LXd^n!|Bgv$x3**=-O+tM3Pl_)MMEWc& zS@{LFfBtz_|7=X>OHA@yOH*Rpq_Vtqj?@9vh#7~6u(wT^-l=bN0ZwoPOulL?0&S zNayBA2-V|hx!!631k7VfrQte5FSw|UWaa#|s3j7h^n;~BvlOoaFK{z>EG9Ot{xmi> zZNC1PhMa^VCyS5PsDL_Zp0AOpt;02-02_}X8oHe|>>NG-C@wK8Ul5GlsTdL0B6yZ< z#9@kWb)YF_?6eQfco%DbI|{K3mHe#!()U7QSPO!~)yZmg^K%rOrY;*C4o^<4h7to+ z=h6U3yY<(2*1~|CvnX|^!WP03WQ+BCw5Yo7?(pC*e39WtyH{Yt zUdB9mj_B^9I={miNKszDMD)FZfyQ=XJ> zY_hTM>4B1*pKv6pv zn~W=->yO0hh;K>|a>Wg)7*zl?{DK`Nu5Ax?w)LL#kyv> z3^0#nhir&1Cme!7&lHsb#L=Q|a--4^q>brwyl$NKa~RPG*Dq=><~OIW9M^H3$BzMo z#-raSOpV)MoG@yJ^vP?s?9B_RTKr5CqYir32f7?azP2A>o&QrGD4=nBW1{KdB{i%WAsO4ZMFRKr^!$C z{}K^FS29oZmXF6>rHWL&2f6FKg;bjedB=gtdtcb&A{d^53<$_}rjvn+F&=-2GA*xR zh^ka4bXaq1$KXZSh{4O@5F?vJmNBGMe%Gn0E zSK7sT;m(Gw_iJs_3Z<&Cu}lz-S*4fUBmzkl5QX(_$;8g~Tm;^Vx~T&vx-Tsp(V@Ut zwKHsD>cm9rvg6n77oeBoFU}>`#5qcA=2^@5 zV{B%&2C7%<(t8$s>6%`6LuRN zG;}neC^DVgoZYK|xN4IwQUtfIz5?dJ#_TRJW^75cHUZm6&Mv3XcMqCV^GC-@UGdu1 ziK(!wqVGvLeDUCb12#ZAz_3(X;NazxV!}AK3*&3KeBs1|)S7J?5aC{g(StQR@A&sMXww}F2(-+`c<)DuaYnC_v3m{8UR5J?{Vjn=jU&Z zS8fCFWo$S@@bOY`zL7j*WzlB?>E{7n&+S3sw8=V9=Og3#~5}f!E&~{DUMDgjx=HVgb0X)9}Xqq2CFpm|mUz^e1yQKMmS=JTIq5S>m;XFnFqe z8+DFXN1Zql<~+z>ikOZa7|Rq8k?vU*uDZQY?uw9Co&u86o{lvV69^(>t1WiNTRC0U z{qdYdS9*%KmE8xo^5mT^*7(WX_DBCz8SVRDjg*rY=4~GIY>$smUhMpOrMyAW>YsZ! z%7nG|7xr+W%Y$eBX8-Z8ZtXlQoBpGEsmO>Y8%u~Q;6Ii!e>_=zeC;EB1-zg{%DjYw z6b%a$-`mF8Ph;-8HG$U=ll1#Pv~RF$G|?LDWVm-)18B2u5}!=IlthSQPN>Xze1)>y zLKDB(VFBRp@)&`DoN8pe?d@&Ab|PxjX8#fa4+Vt7r^&j6oFDs0OFa+xE(V~-;}44J z!45s2dqOI``Ly%^n(c@T=KnuJ&R-Xrj()drZX%n-UMF%P2>QcsZhR&Sq_*3>lVPTs zM7Dsj)G!+LnQ-I**QZlLR2xK#i)!DzhPsZA9PX)oRa3YfY4l%+* zfw|vKmF1&A@$aDXzd^je&O1LnU(m`-y!2fkxtDq1;fUGzF)~*nCez>9aSsG@wzYa* z+n2H0gME&O1qFqDPQO#pUl+gqTjj>*p5$O6s7Ro9)S(uWUh3cwN) z_a)T21Ned?>>}d+lVm(Z^hrv?!IZNl+D$K)V*6@g>|~`r^>vjY?7eO5e&;1a&03K@ z4+KByyV=)oeikw>J67j8gn1RhNc*A4)xl~p)+V{h8W{s{3`{fUtPXdzsllAgL^-dAduLAJ5 zspUnZr$LyoZaAmB83pa$r7~@aNo7%<96HjZnoCNN_s1ThOiZulKMlT9V*uNODE`yx z*3n%Rmr?!4=(F`Gt-(WQx4w#`KfbF&JM*p_3mkeSEp?TwV@Je&D`P3}jB%lg*GC%K z@u`cHY7>Pb&zh3c>$R>)w_4e*+)xQG1_s*ZH;cuRo`!?u0Z9l*jN9jmIY^ zx!*kw%jy>+p=|W&eYx1IMQatsTZBt)D{r12P}59JFV;d|B800lxq)@*9JP#h6!gTX z^$1uHVnNhOhh2Y62EP3h33#}-I13;3#7k|bdipfxsp;^+LE?tmoT!ucVj&*}I2GS= znXqMfI)Rv5#Y83}@T7+)%_aOdI`5s15BK#7|Gj?|vV-)>&yf|TzlUY{J}l0#R#)eP zwOPNA0B)y$(y7Fm?fs1e|6qf|xrG{yosaYdo#n&q(l;^5NRk4+#JiEge-4oYTEW|f z(j$OT4VD!WbQU>e<>?z8$;_E~H5|C6JitE4QvT!529Is=@ZmLCtGHMG(%+N)KdXU1 zueaXKE`!x}g$J9mRU;=3oSp3!Vi#_)%N#fw8wVY+RNPeG*IIYY}$ zRsO&0S;f3AK#r;NRBJOti zwM#nq>h?yh!$QYoDtm$k_}S_6cdp=^Uf$kw%O<_|@n9aJOtotBw#1oa=k|v!=QPae zpHhX^#UC3InN+i=bKki9CRNrxFA)*!y&LP(Skhx6tj-sVq>8jY6B-G{>EVbcLQ#uA zq1fTUU}ajP0J`#i8$6luey^yhrv-<*17+#{Ub``V3)tQ`>eH=W;g%FYD*N)Ms@30_ zc$522!01zl+gF<#@}!it4axANeuMh@7*B!^UoZcX zI5hqC@p_*piAm5_q!?cbNCv`X6li|emYVD=Pi!(8$<0jYP&Y`Z685*iqc!T6AZi5)FfL|DBn?Ktnv?f(XY3i27R4Dnb+_i=A9{2OKAa+=K~>gZ&{D`No<# z-pt}^LKqoSm|B>L<{+~F~G%gdO!T8&_kQvXRY%Qgh0vn=Q3T>WW?kaBy*=Q-D)2KCX zZC>!F9f~5?5qgV*;*VN`pO|SGP_R&CIAijzZ#fNO#t^GsZBZYd3rHm%XF1KfyfQ9l z2v}I%_{D?=a@|fgSL!?R!~(Je4TmahTOXHytq{M<@BjJY+^c}9o{$p-s-$wBtk!3? zlqSoV#8#a3s&KEBS9-uWXyi zD%G(6h|JM!Dwn7L$+AsjqqqCRym1|0Kw#Fr&*@fz=z9O;WO!zz8hu)kuG>bw-Bb7- zFuEc7kW=6IbYwe!42!WtM0!i|CnsxYO#~JcA`0P^R zcHVNyIZG@EF(+aUELYU8`RQsrQI%A-nIPBVC;NG?~G=9w>f)vU7<6ZmA$bQH3lSFCkR&=*4@LGTK6Zp zgB}7q3%hPdtAd`Uq~$BqcAEN;^QPR_N=h9jVt2Vr_`1tZb7Q{mG& z30LZ2jG{yK;NSn8rz_q_wNgj{Lh0TIR4gZFULqy>MTbUjAAz92_;Fi5=gU`=gPTod zYZVMp8_NsM^KSvuP(uB?Q>CZ#=LZT4KPyp-o#p@%r>tKp*yB`hW_kzWH4_-~S-FTo zjf0e*G7I{JzXhM7nZJLzLDILxJG*53xx73TQuz^+DGc9sZ8Ieei>$WJ?+$8EYd$qS zaNJ0&R-vMY(A@4|N@P@Xb@fY~UR(G?Qb4D#|Ms=L1BWAmpG6*1(b+j$>1~C68QsOa zMrUApkm*3 zh3n5Q&G|a|1blz*;}c-MXZEAwHK?hVQe`fZEm37It@izCRdtumOIMnF*(dk4#l?}0 z?iaNkPaM)*)59nhYFwDd!_K;bpL{>Ki4Fd7*=?TuY?`OAMCpxT6W=OPL(>`xtwO{?&cTA|dE58ky*VA)?CR zncJ$V*GTN;-E`UPD+!!3bwD`n{xGaN_)beFA0fyuHhJQepaze<%*a+FNwxR#YO1rl zR>Gx~8vh)Hb=OPQ*;^om4x8Li{E&qFN!iam+vaX`A?VhIb`WbMJ#HV?yVcS6llV{y zGfeduxRs;oldYD;V_iC&8EI%-fo*f0-D7|~YZ(EAFO_LtuWux^{O7k_+Zz5d6{u*$T9ZRrE+F$ zDPmK5uD-f##JZmLem2xZjEv*s8uflXFQAyV_&O(t_M2O~wv*7>MRpR?W7ks}H=b8! zm#YKNF@pb{^bG&sRr42xK5|Ab$mD1^bF_m~jk}|Zf;jdWq9)wGqEOVRM#_~H^2Xz> zhlOi%vw(Vo4g;TvJZ8`Dd6YO(UV4yC=kKU4`-vQ3U@l1)6q}YaSs-nIumCl&zccUB zly|HaWUF*v3?FueMNPTxK}IFf>9{sj^Oe<9`4chB65O7r(fzIt%Q1S9uhI4d!Qax9 z3;g08)-HLZZ|XnsNl1+S6eM$ECy6nMYyaDE?l9F;0w4|^F;zwSK0RIFK`V_rk8No8 zJMUk;8JV?{yl(l$Zr5z}9WoDk5)2tpw+u{Po$BaMj<|Q4XG!Ya)7011=!2)lp_AwGhxELFe^YT* z$7%pb=pcK}*Wv*I*u zp%NZHOF(#4)LKuTieG`BW@r8I>~t>E$JGIh(eJx@->*v;PQEsOZJwWMU6tO@4Z=vm zS9;UU%k4cW=IiZkShKu|>x|g%dw2im zp1OcSaNLWrF*y3S9OCR~HSkMKgv#*ca% zFK;hCNulw~u75z(w52vrEkJW;S5?sO~ zKunXWkwibZ>`t!;EPU7BW5>q}z|N3YSEU?L;nvBE&A7nr8!4BFV_3a=8?&7!BNMH@ z`6Ia`XwOY%Fr~)lEmmA!eikD?J+IqZuf+NjJ`KV(=qY)KokWNybw|Jd#?|z83*Zor z&--7YVnFd(g|Dm<@6Q8YF1dcsSz8NkK3(bSb9Uexo=bPW7qd@fjHIWAms~ec=VNFr3 zZynAz91LpAub+3W2lQ^k<)*HAu8{h#CC>vB@GFV0kdq#+pH1;mAY{xtQZ(hvum0B!^MY{- zR;~>bX5!Iaq})s!_*x?9?Q_`lIGh;?S7qq5w!1m6tBvY&0NgDjkZJVW8rtVM)$uVA z84#8Z?*a?$005DXi;of;U{la$=_zskd|0^AJ<{NE_s_Ha;=vOzUf1q7x1H@#@t$tL zGXajfB1d!@#+`~DhjN9^8`%6YR{Np<78 z_gv?n)Z(c#QpblN5u~e$aZrO*iY2cW?YaW~tQXN2s zaK<&!KCqEe66+hWVLdoL-yA%4v%X(67b2yy6ceylI!|yi$V~(*kG`62qC82NeqT zIIx_pyqB!zok^zTl&>DEcB>X2On5S7KJk+OmOL-K`0u%xd;a}07myWVlLBErcUMQd zB};Bb5{nJiyP8WZ9sg(W*;jxttsMH$ z((wnU{cgf-=SxEF?eGxoekHHehedX^FMBEc)JD;>IcFKjZvGeEjrwZyR5&R@_V0p| z_eIa`-gPSRtSbe=aoCyV(pW9olJOV`(VM_>VAXmZh1fmuWjG^aWSD(GKy2W77ujoo zuiFS)STL-&|D%R`wmbnrsJX%l%q4s;bK1@ol*D|_f5ptR3p5y6>4<+e_|&@hAwi#t zUyq20YkXYC(#+*-<|_q+Tzq+%pNG+@lzbB$d_cahmA@_Q)}9%aO+o4`%)yNyujETW znRDFG_tZ1;>{JF)uED-XLUE~c)va%7j%&Iy5({{2@n1|NdAz%#)|Px?UPSzobx_9A zQsx@uzh2zEASgi?gF!zg4xU#p5uq zZE@q(d7DcmKJzh+L6Mz|M1PFpELn^#Yqr3i9*7xB#z2h>nY=}%JGtvYv1bL+vs}d) zi{#|g{W*JR2mtXB4yh+`MrHAKS^Jv0*+ZX^$b*`{tylOgUKsS-IZyICl^q$ucYjl5 zjHr5KbTafND|`Et#e(1(qqdYska{2SpTOl3)3qSwcakl!+^)B&%H3SFJIwFN#y*@b;u zyObrT?$>r+e%$w8>kEAK4%sbCp_x#q!AwdOkS2i}m_EyBo_V>tX zXa-dAq4>KD2Gu45*_ZNp*;#UGaeegpEYq=k<1-(L3~tg64^KA=(AQ(2^!ck&X`IaX zm=0WRHz#lt1duzD2+I&GpG+>J0LB16e^M0O4Yq*f6Oxdb>72PPb__dv9c2Dc6g-R? ziUm93CH#a9zXjo#utmOhtds-AdmEubsXp@!HPhT1H@p?b>pTp$uDbJmzQp@atuPkh z7A&Y+Ka4dcGgMp>ZDf?Cq|Q@AAY$a8k}3{!O)f4*GN?5goDemS)(am8rEu8{B@*>V z9@MFj@6k1o@4F+X84Sx>Yc|j-vWF1?6^HmQ@roh-WCNqrul9d12U#b-y10n3exfZY zZ^^`a{u6ySYS@Jf*~;5Es;b#4%XQnkE_@`sZrGm*E7N~l4u{9J4xqZE5H201V>3*^UL*D& zEG17KH9nwTw;$8nhOJ->Hq0`Ojy1Z{76+OPArZv~8Yd*O%Ky$7) zZq@%jEz|g$Y+0gBnmyg5ePx}pVE_GjO6EP1UjguKlcfLjQmNXr3nn?T#}bJpj^J-@ z^-;kX%s^Q0Cq_tKpNt8m5Ib-~Wa03LzwPJchv)2DgwZTa_=L=iDM}i?VpFl{eb_Z- z%J7c3n?$XDZQqA?uM|vD#m2^?R5Q3OwWKW>w6I%)5__Hiw+Lb24Rw(Y$98ph7K%#U zsBXp10mV_#iUpJ9D1AC4McxQ!f*&TpNuRnQ0O1NtVT0;RjsaMXknQebq79V&Pp>}n z%k)JZs+LWf%eG>>e5fPcW*Ve`=CIPL$tn9{0ioKr&ID z*x2Gy(Ls)MnpE8YLfi}p;liy!3XEev0)G?7Rc@Y)Q)he4Z)X8=U{WI16`x~n$v-=( z)Y3s8+0Z#gzwO>=K1>67^y-1Qo?9zm4l;VXk7<}zsQxrXGa3cCI~P4KBfrb4o06TH z=kIvfWgyJ@u68-It0n~{x>V}(l)uHF)rd6Wm#Rigy}!gdS$+~|S@T9uB`b3ppVR|+ z(xF(9y93N~+*eY=`L*wHd^`6nFn0wYYVJvteLpW@S_P7-zO4%EANe3qZNV?s!ex_| z-S!k}9~+xie1b*}Vrk#Gp5L~+iT;&54;lEMvfogIJ=y%DEFBYz_xxVD?kIu9N&viC zwipx+SZgdt1T8}{%DWzjCyh`r;lk$T<_{<6!3D)(($)1$#^EEB{i;9<_8q1=KDujI zxzv+p>C@$3KvnaERPvMKgw)AJn3y|@p#iKg!0 z8<<lfeP$QAtQsM#V8*m z_#uG1hdctC_{JK;CZ#{g9&FPMRw%1es;@J02ntHPyGzS&!<|(TBz1mmB0d&$9OXb! z2-dbol`C!iyLRt)Q5^mA`!-+UQ$Hifp>8<^HF2PN^!Ex1Ls}6%!H1Zi#(Q6`Bdu`Z z45VaaPEJmn%Lz*jrRAAk!MLWMMpQNV$7i7I*1Ge@6rW^nz$_z14VP~La=iTePNgCg zlYKDkH!}K7zWpkR;mq1ot^Cr zbo4q=j@`Wyg{S=)d&JrFU;8T^f;tA&=;`CFX3*NFx(3xkVH~G?1}#EcoxPJCArl3< zT>0b4(E0GNPWpn7OU311zYdO1JqGZtTHDKv}sIE5o)avWo0sMZW11isf+YlnF-*Pnh9fR_%IIAXM!zm z5*z(&w@7E9z*MHAQNuu{d9o2z#sA>t(=6Eb4Ft*)w5^Pg#UJ8tyP@4a`{lOX9o7)^ zdrBr=-9Fcf9{3|t@{GkugSBl|*qVh22T3m-`sC~)bWlu3E-L$wgJ}N?h(zQU2MQbW z2sW5r2e;G!bg!MeRO~-kS`Tf=Vgm0@Lv`6nF_2@%sA=-0f=&4}cF~A_AnO#r|gnu<$V=3Gv zjZ~`Y^OQC<sKu;&2>Qwm_8@Va>82p-J|tZA{KzAX;JIyj)6mGVh)d+0P>ZuMYh<8X#yG$ z5NKQ>>NsyBeRHV|NVMr^g$6NITw~|(!BNCQT^~@*uH`#GFE;T_@D)*0l;YEnSjLht zx2miE{kUT1BX~xHeE*x`P8YqKX#?l3j>GpfVMa z!&K;3ubalyDYD@x#T!~lNE4cg=)P8Dk_yfuMV|0Pv3IdMs1(_(A#DZ>YE*EJ{+h_8 z8gs>*7pg`~XwNQy*}8RvQ*GQ4?p)heP%HI^@YB;{$u}=j1adc!rwjyqeE@$0|3L6H z|LjV(wWe z8KEi%0S*pRsq*TXPx>`FE9kdAo>SLP1OF|2nLTUF%(EWZGZ&TaeXZB~ zDhLJkC~xCy6ot{f=;LmF3DGIht~>0p!Hk(%Li(ug<+PeffUH7p^YEM9o|Sic)wsB- zC9dF%dFL}=<0*w2p%0Sdhnw+h7wgEf5A4(4BM)g8ZuVdHjcZI;VNWc2P*ZApj?5fas$n3|edTO4`4WH!|2_8zOY?HNb%`axa6;Ekr>Fg{oZ zjhTB8E;O6v!8}D`h$u<6CB7msPZy~cWXdke5dwUizrB5|QX=0n?sjhyRnYYoyOXD3 z_h2-V{urlgf}mw^MeU_EyF6`=58yLT8_)~L?{Ps;CUC5+8qD}W$N~S*ZhQB;h7CJ^ z+x61PtHgPd@=eH-`Cmp38RZF1;4_i%yj)#L8n1sjlr0|ep=Xm`A3xMvqfllHXUS5V z4m*2zx|KAspsm}?W!hwRae1=1m4maaO@|XB$}5-1_?$HG(L(#luRqD3w3^{MQ0tQGB1DZUc)q$VStL?R zK=vp>*%lAEo)IW{t{Hi@i&puH92n%K<4It%qiGN%duC~_C*&5dYozvJuNF2&)8e_! z?K``$q+LRw$3=$WK_Ew5-1mY84V2HQMROO_9pM)6!WyT(IFC0OmCsNcUsr)xiP%Fd zMX2N*G%;UNlQ>=1Y8u8)d&jT_R;8R!}uB+ed%@$-*{Q%8zlljYK z|1MFbpZIm}8?mhdXMpSSYfZt|kX1#In)Szc=tv!Dd7oo_mD|O(yt;BQ56F}CVzckM z{Tb&80QtrJfk@g@IV#30=-0d|7c%#!$%3* zd&s^fE}@>?{aNoUVKX+wmZ3KBx&Z>^+979aY4~fJ+cQ45_EXVto$#~S^n_!zg1Lk7?+&W%HJS(zGCH%MIOvU@3PwmZQ@tja6S*jN!^bYT3F9e-s zc)x3PRpuu5&Kfq+)2IB;OMlvcvsz_FU}L-$!;5@#dINHE`fCIT4~ap>fD}iBo~`jL zi+cq9sj?iZj9*kk-&I40fYQ?FND{z%-JRwSBed_6c%^UHt{24BBI+hmQP4rGFb3I6 zJXSW+=ojq63fD);{E2*)Ox{W2BR?-u3qsyu6+YgwP8;XbK3CG(JoF-m+>;f4CSPzo z=d$6>%3-G61!ha-83x7z^L?kjE2^gI5~eL@)~g@Vi9Hlk-lki34sTrWbv()gG~kqi zHIX!flNE1JiF`o7ze?dF71o@Iwa?k;IemK*R$eX*s#3#F)nR+&0fPe`Bs$338lG>c z!jzKi*ax5r#BaYeDT=qX9h@C*b@x1i>G=(;Ua;y5rp4^Jae0TPg!7Tn^8$rFYhBqL z*xp%qa$-qLtYNsoX2|a;YF|tOmgi9^+msC3nipGhf9?Qm%Y@t13wMf(wQVVP*A2h9 z4tL`U@39|S8KmBuS9jb1DT1bP_+oqeq{A9&D~@#4Ft~^R_mGj4=h;<>iy^hjpJR`m zK*Nwe@!y7l4+*ofrdh<;bxUbOAPz>MOP(FnX%kqy^6#>_d2#3rpMe zGxMO!8QzOsUYU{kaUn?b0Ud*;U>@lN4`I$yO(XL0$v{fmUVDtY@ik>C(r!^#Emo?n zt!l!hUbL8uKcN%!Rq#;Xiu)W(@Oeu}Zlm;scJM~|e{f+Fr!DKTSiT{UjAv%l@YGZ*x~6(&aVTSUv-VncBUjrA(z)@d6a`EZ=*|0AjA!~ zYTY8A2vCer7RAB=z7=3KO;bHMJqEB)2~l^(M=+XP%DhGp-Itx)Y`maQdF4;nt=hqf zcAS~l+cN(wES5WSKL!1sTM77uFsl#d238AtD#yd|Z`L~*0hw2Ud~~A6y9erMJlfB0 z6`$(u#*pL~-_dD8)cLhZP3`wdv-1kzS-b#R5+bFlLdDMFO-Iu!RQT?tivQ*Jv<%QD zoo8vbyfuupbP?o`i=>6>n6FGGKlw^}d^TAwQV7IsT)hDH{D*z`fE-mPn^I=Po@A8P zpt6ZSSqvW(n{%OQA%!#RN=FYc=J z2fW(+tfdVY!qEQjfRzZsrGl`?5NMzM-dHug3}YB?c~(ms3qe+(0n#WdYtCvAPAO|a z!CPjzvQ;D3dMGAIaN#WzoH&Ky(3qI(@kxz(j{!A&3J8c}0FyKG6YQj0i?oc)sgzfC>v3Y6aaS<+dEk0m>*HkGx5wsR zMoj_Cfj1}C9#_a}&iX|JRt1SS!B4kc&-}&MJ(Tad?zLV8K8(2pZYuhmuW4q*{pbjx zHO>Ll3u_e(HunZ)<@UPEo7Cfz6AiY9ph0*ZxIMF=z(5~Gu0nM->pi;G^umlbeq^lks<1cPy=6Tjf?t3}4@^CpW7U|erBO1+!q83RUt7sBu2V~6myf&<1 zcA9rL&_fuA!H$?#^H1Zsso+VO;}e=T0$AX*MWY#PZzx-&a}Ar15ej7`F$XpXl7LNI zY(VUhlNL!7{b?gSH1NEw(8B>sJNQmD@s;!_UdN-=7pDllAzb%`^rfpN)`Bl5RSZE<>AG6b zjU4w!s)x;8G2g;3o`nVCw@-zZ^15HJz>H@ab;%|`Wj zNW}s+=*Eut=x@Q=N+_k2c7qs&15BSh=zcdASPCstB#5Xki_tG<~2}!5{uQ~yo z*or6G3%MAXc%sV8gu|z^F%{TdSa|-;pC>yCx^I=r%gr9L%?Q%BclpW3IQHS&%`)Jw zYGFuY(&Wx2sh2-_^~(J62~zycSmh84O={|1X7s8%+&(0~ZU5MTFYH6m6DqT}i<&JD+xc8y`Jik2X zV#dmqZX_Zy3S{^hr_e>dMPp;tNtQQGNF~ivpw}fco#j8<@)lI5$0ugcRCh*7WhO2` z9*`|5-RpjO-`Lm$<;kpHZ#H`2q{ajo2&dY@%b<3U8vs2V=2iBPo3V!pgy@?%G9n?vJmJb~o?VHAOK^-0jUK zzm_p(BlV?^{GTP`GniIZa_YJ>1U&Q5eJf-3i6fFv4nL2Q@|F1F>YRr|EAcM+zhC{D zORlz!ZT;!anb0r973CR|XVRUwKZvmLK25JJ0=gcs^TEM^m91l_L*aX*;~c7n9M)Ha z4k!@OrE`=0x*D+xS71gQz8Pk47SiY3y18fCdiBK_47&yApXLKejB|5yeaYJn_z)-? z@d4F=4Xk*unfuppl)ulpw5;0{9bU(!cVlzoRW`5mMBG&8M;|l?!s-$C$s`sEx8Uns z3M#7Y?D9f-Y#}T1lpn<9LaNqa*b%n6l9Chqo@xyH4i=k(akU7r2QF_Y$pvd2o*oo8 zG^M7pPQD;y&+X|Ii%FUgfUu%K!{r!|JYiC`i}X95jrt~R`w(1eaTQ-T(OtEuaq&qF z4FU!FNy@i>DD$~b$H&K0TCts(Rr?rpK@5|*}=of!+8`MFg$oWu4 zY~faqFnRREueR=4+<`aH1hUFWZT^*|9vsotP)x{It{%FN+l?P^x*AC^T9?0;V?fvg%0$~n@lgKaCk=Pur~oH^Fw$6{xekt6R>eqbZx1B1JjpZ@ik z!FEZ~)F-SQi-q1l%6l~%`W^n_Eoy?q;lsN}?Yp9zoUZ%oo3pskoGA|7wkIXr9K3$M zCAI%jZQPJ(-3o+JJAkg~%Rd!vuiRY&SflvP&R17=l8-N?g3gksQpc1*n|`n{(!9w_ zz_$!QT|$x}Jc^)*5yE&?fc^^;_HmKv{*U$p^OVLV7{=MELv#e7WjRMS)11d@u zOyXiel-AIh83K{6_H-~mAfcVEVE*mx{YJ6(_it=y^u)1N4MkmDQThu;{AMv{WPq5B z;*ri^4wp=~j;WQtBdPi2C9Ec~6%di%<}H8j?w^u4?d(1EXd;TQ7|LN$t>3 z9cO`GD@=Vu0bhtM1V^?dSL0dvqly+YgFBk#t>7CN{rXk_?;PwW&Nd<%vxcVoCi2~FdOD7l%8 z5}Hzq6F=sP*1VY*Jl18{8BXp4@&z)i>lJ{(FD%dfU|NnvD^XBPR8`r5%!#qMyrqy= z`U$M{!4Va+ZxUfjE)x>YrccLP00u{p;HJXK*|Q7t0kH7P_I-01g)i6=EoVhKJcMW| z&`y;cmic4$eV#mrpQCUTC^R0D66Ig>!;fYv_}EwQk}W405F)h&^|yh+2P?`2+d~9R@lO>Uz)<)k?q^i$}6`y+O%$zM<)9{DoH3E0YEz zgl+=WZyfF(`xHS3R!6N}wrU+Cc0Mo)nduK26(>2&YM5<}SRBJk)hxVvk-la7xu6=h z*4;&t_G=oMZf`0#x=cKkuUYeDHM$61($9-BuZ+KLtw&k;AzAVr_^&Xsy$& z>gp-QqKc}cWL2F-V-d7<+#|&{;WT4mPrm}*p6eLxCmKM-Th@eV5_80Na zJcwn)j;|8w?DP6XsVYP{Zfj3-%((56^k2Y`N^1O5STI0rR+)<*SY`k=@+jrn1q_Dc zx?D}BTvBuqu1l?0nDnUc~#)s zg;lb78@3&3^{Tiyi#O?KT7Z<*(Sv^mkm8}2V@6D1=u-6>xO2OG`}+1kq!^H~^D0wv`RhAk5lUq}6#1W24 z^1;i?SMM$7^;TT&j9jPKy_H~|Cpg*T96@FD)fU4U7(D_S^!$8tFYiA^5%@?NnikzZ z;?>lnpsljc-7gx*?8&Jq_j;q8Uit6nhV!|+`v6JFL_S4faJG<3A!LB7K-~xFrr)3< zgS}6P%O^Fj3uuGUcPF))&zBYXV`Wvmin@DN%+g0w_mS(~>l_0eLA;k+&={8nL`)t5Io7OWf{Q#%B~;m3^~s~X?cF`V3YMfz_QRicQJ$oIE?m^r$gK2H?) z%-}iEjGLc{mIB@6tN)&QOpK4v)K2a=hfI2TW|+_y!JR9+JdEu8PcRB2_FVZ1WRp>Z z!uMfDOTS2}ci&=yiv1N;od-5H2#@|K;?hdS6QvM`bYV z>|lw7%i18ehm&onfB3$D6EiY00#7VKZWe&+>3rzV1Zcb{YMk9+#1qV2xKPfIpFhg7 z=hc<6^x5)jF-^=N)9aY<2k((9YZvYTJ_!YLu+Qn5Iu9mBAIOfzc+beFT0l@@s{4XZ zPOAw1pD>u$&Wl$FH>siN4SXm@%6B<(ath<#BkwVzW|yp{s?3?Wh2E5Uf((SQDi9WU zEx2G$t4iq!$W}@#J?C(iA~cgo^Fmv*Rn_36k(e{$8@Dl@)M79Iw&r*LYduycCv|92 z=y`=lzDQ@1o|%nH4NCzHq7vIGiQqo%hmlz6rA2uZ`Q4t@?v8TSlb z4Pu>j<^LAlYIS!CYbWx6lYO+CQExODN)~Cd<(|c6=XW%)9~mYC(7nFl6)rs~ksJ{j z%Z*-W-k6jvn2eH;Z~Fcgr=3x*d5MK(A?ZxHxD$h1Z2{9&&qHfXD3vJ@W)5w_14)G{ zx^<|Ec)8c^1Vqy=v+Ap`-tUBFxv~BW*x(S_rco7_4&j`Skc>zTN&Nl}R8nG6wVtay z5&|@PfIVjRs*(zZUKAH{SY%R_Rc3O&{@8wA#=nyfSs9$M&w9s=&HRU4LWw<%i+>B` z@Czt%v1@8Nk(W56f6pt(ce0pqOouc3coC)yOfJp!?JeRZeiN1!iEB(}CWr}(KB1rf z;Dt6o=?F46mQ=FOm^X&9+f;C8z-^~VHx5^_!{>>kdlRekUEf@=n42%^^YD+23m&eG z&d&xPfI?lP)A6xo|Kx1K;?tKh33mzh#B2p;)r(J94%D$sxT&hUt!oCvv$Rh6_(Bbo` z^kjg<*0@T8hdZwk;9BGQ^>Te5`@L=iO&qV#nZ}6T{K`>S2llc;KPEG^cduoFD8gYB zP6l!D9#*4XdgJID@MPVjxG+bo!hGtZ#2n^7*KJFmp<_yJ9YVZ z{>iX_1?D_{;rwMm0Erndj0>TN-h`@DMd+nUSVSn zT&?kK0VZBq1w}L)Eq~rT4cuKXc(#>q?m+u6TrZtPb6QrBESVXktCz&aZPmk3Y5r~S zO2(HgB2f?r5&ABx;Tg(OQU^H!FV}l#h6*)Zxyt&o z;4#E#OAAnR5US#;s>wo}Bh)NBz+~`!uAEo;#T@>04MS0t*`P`22%kqbI1)$hw7KB> z!1(-QMFlyYTB9n!yGs&a;Ltkq1MUEa^=#j2ZP24M8DtT3RmGcs%()Zw$RZ(7b^>$+XrI)k*qV1m%WN}4MlM&xOIrJZ)n)m-KJH>~R-xfCX z{BQ?r7kD}no9ABDBoul5MME`xpPs3}EStl)?0J2XDYv2>!@5111*sI}2c$1*K$wKZ zB%>+F)KpFF@%n67HS+)hbW`3j|MoM7SCrNi5X8Ot-PU?k62KHJ>1i!Dmb=apbl;s7 zE~&>hVL=W`NBCemiy#u2abkRo>|=H!#U67(dL-GBlU5aP7Q3!}+c(8)w#M|+mT!x@ z3TsMp(i61hu0ErM{SGAsU0x^AyR|3XH#8ghVi}x}JJrzev}{Nm;bgHREh7aBKt`lP zl~W113_mf*1f{k{Tx`a@akNU#^tKNDW_JGzKn)rbmYx{5vgGVA&l6ko6R|0?_cy<;vxnn4nF zLKJquHrRs-WHb!iI~gYjC?@|z)Dnh%V&6z2uz!xf&?=v_(NHtEHj}fIjr1tDLXAOEFjv*|6=>d?-hZ+?O&MC$teo{&CW0#g0)EhfrS!hyqxGTE6 zGF;b}EB6SMA$LpDs=gvLKJ8N)vRP^e$yWLSs<2fqd#0OexoFvC*!iek@gqgY;^QMl)cY)XMLjsEQ24u#=34lSbNz(_9IZC!$3(x zWx953hI%Apl!6dPlP(1vMRDY3=2YI$@a4?~;Mzw0QVsU<8b3TU=QVINYTsFBoncBKU$@yeqo4rm@bQ$M=C{-N-} ze&01Ngslw;) z;@AHoY!6odwd;UZoDqAqa-`ZvAa;^X5f?+TGZ}Yanz~o$%t(N`V`A=Wo$FckqEZp4 zQ6KY{*cK{RW#=BJNa|!N!Sk1{%L4}ofG03KQ%v<|2(+_b( zhXa+jwa_n#esqETWb5Tozai7ssAW(BTmv7V2RiNrV1k($;5@mF4pr(YM0&Aoig1i- zzlvd#q26B1OOjn{4_8cBJk#xOrs9sOjOELYE@sP5=i3FrB>VpR0khuMs-72#Nui3K z10sSQ?UX5WfIW|-HmnL##jgK}@(ogi2b&Vk!D(-t87n0(HS(LhRG6j`@k~lb%^v6Z zP6;dy2YAnXGttf4W9pi-cD+n9(3D|zK$RCpL+h6?I`FvsEUC7<+ zTYK|gMOKxz*Y{b7XDeAmV8j>!*$2Dzwy>g5%>7sM^niX^MO6wxG(xts<}W*=w|&vq zQ?$`ViM{%LBdFdFzz3fEYu24&^c_1iz}{9L8et#6n}p^boeMr9L`T7VNLiMWTz;xI z%K{WfhI?}z&4Qmc#MDtbmiMaa41lTl5Q<@FHWhHOP7>#xe&SdqCL>s4w>?a==z_6) zH66RV6bu9|kN}eRBiXaHW=a1mnoHt1QA2WyLkvZI=0R(%H)Let19x~7DwKkFl@CzJ zNUn(~fx_$4C0(qv!bGX6a$eI`Ojmwq+z)(MaJ!bW`)XUo;P`AdZ;s8_H>q< z&$8*w-k!E<Ey_Na(sbSk{ZJFq4$muBr=3O)!&tR%cQAIOq9XGR9up**L`; z_IJ=Ev(6CVgqq-AJF=JYoFh)c7lFK(STrT|4(mVmxDGpgJ0jRMhIFkF3Tu^K9=Y1h z%|urQw<`xszzNA>&o>KTN8e`rD>P0l2BAT;qzO)W^jr?T^6Y8fFiS#G;HajC zh8K?gjXNCL@xI&Y+c7cRxmro6ji%fjNuh9Zn8h-2%?5PedyKHM!tIkX?fz?`&-R`}3}X<8&S zAw4h@E~QhK+-D59xNj0&D~)DVXmlP7KPhn~26jsSQO2u_f@>VK{Ku@tfHTjlZfwEM zhKS4MS0tgtbB%8Dt)359yX}Nyk7D`8z8agAO@8}4Qf_1a**d=@UAIOek?Y&1=L7>} zaJAiqM(R?m$ieiw=UZ~`IqU&AfQovv4mG(rH!v~5Y_FXMvBTC2do zdG$3)ZgBZ}(cVGd##>i8f;o3!)m`<&3z*ElA3BHDOeC6EEQWk`D$A)csPm)!F}1%x zp8We%iD~=5$-ZM6RGGXbPblrW5Cgb-qP-=6ioRI3152Y!V9aZGiaR%564PP& zXVN#Cb+N3GGJ2&#u}Nt@stj7a98!C6e}9>>r&|s#++JT!481O09(wJ#_2epEv)*MNn9F0-eAwSZ_DL14I*{n+t+NBeG!Hd9&!4bv2{P zrx!hV%ZN{o#Jf@o6p>up!yi(o*u>T{=jLz@FQSW<jdLxS--!97=*5$BynjE8 zm))e76^{4z_in6UN_JfN2>u!$(u}9xbMMWt*r`&q6+1V#z%jGGCn&n+OadhY=U8kg8IRbtGdb9};oeNkP#B*=qw z%D6P&@XJ4wU%M;e`BC6^JjewS{fn)rw5sVpP(#D5(~+zr-}V+iuZ^*DgshA(EK*5Q zNmv(1?-rG9io3=m_VB-=Ff?x^Rslrwic#a`Qv_NNPx^-`TD zvDA-QZ2H9M&y$!gNmHp_w698g^8X6F(Xdn{$eyW+TOSTxkLFsrf3`Rj*x2)XofCu^ zLm4(Dor{$sHC<_;(r7YZ()Y~g0faq8w0;bQPI`}ze3q3yEztyQH&?wZjQlQRn)#f% z$?54-uALXEuI(Gd4+8$Epz`t*sIYrWDov(`#ukVy&)13pVpQ%#nL;tk)%O6jy*`VCDu)JC`D{JA6gWpH}9)r{mE{M*S0v^@`uhWB#bji5czHFg& zO*8FBmly+&*9%m3$V|9w3(NSYg=28ovkl8%^!8qfmC(}7dVlrb3+UTnHY}`hOI_zo z(5=@0vGaiK)5gW=CUs1&Y{a`YuY%X98J0`%bQ9&03uM8yio{|=%z(+D+tt=Bs@g^H zarCo>IxCypFW)~=E?xHRuMe8Ku8_!|Q!_~UgBino!n!3124t16UVD3cgSlWGq~t@w z94He#yj(SmvC8C;u&T+=tv4mtLHW)<@*wok?TXl z;P+#q&}r|6X40Hgm-%LopWlsNB)>zv|6KOv%VID3dQGt2{>=F1yUs1$2dUl(7OZd| zDn!4OB5uDUBa+bD$M*}s8#kMjJ=m0K*`B5cc}h)IUbNe$w^2mctEw3U73vA>Q$g*P zPY8GY@_q5o@2vs1;p?beZD+z7504X*C|wR%xd19+aloXI&y~h7*Jsfx-~P7E-nx)q7A*Q z?K#KIt<7>n>Isu)nt5zh!m=X$U4On>uA8Fw*NcOX@I9qfdDS{+bAuo2K^opQmu5u# z#H7>Ec24dug!!$6$^Z&NaXm+bu8~d5PBo9pUIlQ5zSgYMmB#K|TmTNx#D1+zAwWGm zBUn$&s>4#}&aE#LS2aO|@Zscgj1z&BG)#HV7SA|tE`u*wn_T8`wV!!_#4gIx^7pLM z6Yi(9(s1&tgL_#hCCh~fsym*s1J+kaGe=I>DH?i42oV;+g~(tiftTzlQf-^*r_Bc7 z+QGP2)KwgtkCOY8MgS))As{VM#fDgCs;NTm>G724sdHyjuA(5UweiL`$7i>RNDW*d zQ0Pjdq0yHmj}4^6K+LF~9Jw)74s(A~z70z@(X2A)D>AMe?9XDY3v2E;Vhmh+V!84p z_=wcxowRi-1QX;5dCWDU0!UhUsi`&-)jiXw-kBxzRFm!d?O#`#iAO54JdbW@DOsiJ zV?K-77@fJ+2Q;Fge`$Y|gLgA^*?k#SU9LZ1J$3fSdf<@|AyButdkNP(AE}sveE^=@ zt1n7d0|l=$ZHCYiQKJzmjw-FQpHApql_f;jFhm?qebu)UQ4<#F-c3McTgMxyKuK|Z zR6_NGcYzOT9m+4h8Fs0b8(F{DrZF^sjRROm78(iEx70>cLBJtk5I5jPtVfqZ^V8Au zclfpZ)eb0)l>)OI+tDZaZP2mcHWS?n9#atgQ4G5v+1!ah+=W796r!HxBZ zA1Oa7A*`=_VERVm=hYmZe1CI+-)BKCV@mS`+q{BQ=vL_A1RR=0Z0m`J3I>8nvw zOZ3DrS1T01h&8Uxwa9w&=%PvffobQBVV}_9uT6mD&$2yweGizSwj1UP4Xd2^AGz&5 zA!lvqU8{8M7b67*RMqf_RP%8 zLIX=?*RhmVq7r54_y*<@g-BA7#PO_@v71}z85Pkhvt|!+K*>N|4#3x*VHMTwVV9O? zSb?Wc-s=8{cBip*n)okFoO=+CLXQbOs#h>I+oBF$wJ*c(NjEpm%`g@%^OcXR8TXN$At+Hf#IPZg*cB> z*Ary+tle!>0gLA%_RO)hkcJ2KE#MTX`v&hY@1sHzjhsD16r5o+ih3GJWbbk}ulEB4 zXI#H2^P@5|bL|Ve@Gu9)o0rv{L^=uS|h#gVhNZrb`-Oh5^BWN|%h^Q?%gP3tCilZM$|lY{ir&g4N?r!%b_3 zo;+IA2yU#XxZO|F`?oM+@`$~=qO8VHt#6)ttCjK71Y*7r=3$r+179urbN)a?i&CjsY*%80Js+`bx$VNbif$i?e-#*OIx9 zljB0TC=ZGF={Mp@WQR{XqRvk&FKYtVf0t(E(rs<#NO-JF;Hzc`K$s$OWjyHO6=x}| z*+*6JV4IxhI=447v=(*Q&(t0|Pg^P?JHo3>eTzwdsIv}pMW}cxhBVS~cN?kMOQB7f z+G2CumX%Xubrp$uSv8-15KAk)^dAf=s;JnnhnN4{2)cd*kV8!Wo^Jh?@mF(ym5pm( zHKe}Vt?X$f+Qx?C0zl4t>Oq}{bljnyCc_FW2`G zQ_1(~tJzY+_+?%~kaioB7=wcbdM~yihQmeJ%;M8Vx%D8tX{n!tgftAWXXi)qm*9De zg|Ym_%W{EfFqFBZSK1va9*ai`!WI|>OR(xDn7VdE1ndWg$lo4Nzq+b_%lw6>)of6l z{-IF2ZR+ynFZsLp)ArTQ08$>S+kC9=y|Vbi<{K<$%K>=KHQ$t-x0tO3-X#hOPt2g# zdKt*KbcztH1fE=w9K((VEXrD2Skl?;IZ2)8wMm!|3xTP-woNjhmRPQ_j(`&am~8WLnGd#BVjq>eEk+D3IzWMp2;Cs_Y3D4z@n&(@m;R`RfTq-}hlG|_nH>N3| z>-uZ+{rr9@vV)p%Y@AQTBPdMmX75P$@;KHuOK~JI(1g>X zC?%OURmjNcM6!B1rK4EGpsN@;`CFVx4p^6RQ>(3E{nbu`!kelb%0}i{mey`j*f!J7-y5f>G zXPrlV0C8WIM;~Dw?L`L>C)U~|t8RCqJzET*@4)JiOk&ApizQFipU(R#$j4}Yos#DH zJPQ1`$=MhD-{VCJQP#rk5x_o69C+?*15u79@|3XrnMw5Ss$kQz^%3BHl5%;v*D(i5 zBG)5?P@rh+>?_!&6YX%z#Xp|yB7@5^_D}-vgaFlhdb$Cynf+eS5cK>r#myrHTV4S$ z`vku6;anAF;IxdI{x$EnR)_u|`EdMMN2E$|t)xxjcnJnEHZeClT)NUlqL7tOJvNm% z*V;8G;phh zcGH8SOop>dxXt^k4mIJ%_206*ulB!{;pRosQA3$1IXXl|Jrtw4cpDllL49jX>PQPP zv_ArB9c-_*b(QdI-W3o%OGWe<1J1I6M^;b*ktF6utF!7nK1Rl(O!T^dYsAmpAGWn! zIc~2nRT2uMhQ_WWIh+%xD-w}YboV*X`5OnJ=DRYrIjv6dQ`@nkoC*En;dpvtHD(Yn z)T**ix|X9)N-f)t4VV{-(4EA+j(RI3_h@KK{*uehf8{}Sn-dlgyv<4Ec{NuMoT_D5 zv(71Z5Y&16)$Oo{BnZ*E&5h8&7-}6Myet1Tuh)05L)i>L3ZWw+ab6VA@x|tvEiIDH zn7!%;i5Pk+2*o92Oa;%=^M&Ez{|e%JuV8_9$FJqmztg*;8($jk4VeAc+>y!n$K|ip zQk^eC2zmwY35S4Lc+)g40TF5nqiK^XUpl;13{_@8?QT>#-W}4A-Lg4*vo;!6#Zas( zARaXyf$VY%5$8=8^7ttxC|jSV#7QC|8jzn+aEXhSJrUE9yPyDE_aNFm(y(;eYke@KA6y*U0C|4-lG?(9q}XH{pCU#Gx!AeW;WVs0>YDc!2_6JpE-rWu zF*Y>4Tu%gX)@rx-^P3ZSrFEHzH0&5_L?}$E7j}upy>nhe7Z<@tH9r6w#+7?f zjkGE2D zw@X;Ci3OM#1HAgk@Tj*(c)^DmQ}0m_bx?SskUmXCB7vrpqZ=;}>h0Wef(ih6BZP^I zm_?_>>Fheq_WrCW0G=Scl$w@%)L((l|5hRx^Y3}`p-B0$HKd>KHk?-pUS3jB5#U^u zxW7>MdMjH@v`9Q8MV$?Wv=u0>s>plRnuZQuC6#b(&xaO)ror2o)^ci!Jg2*JvG*xK zFg8AbZh`Aq0LzW#xx(!VsL=#k zod0?G%h1V;r5ZqC!y|sc2BRY)CO&wN_dxl(XW;P@or53C^1Z=;joDcD1X<8N$!+$I zTT24mkW;X$Hk`R8$pjds0g}}a)O1L5=LYZ~?KzdSy<*f|_VR zukt$<1m6SbFY+%pDgSKok0pwS3rWYw$SA1tSmuzcM%pMj zE=KWay2wMOqYc5=G4yV2SzH-?QsK#OZa%YXYUNp9?XnHR-2v@yd7Y%AW6%e;bb>WL z$EK+w zeXDyASvi)pNx=CrtL4Uspe)Q(#dG=k%;Wgj@n*&MhTN^?)`y7X_~@MV?WBq0z~Fs^ zE&^U#BEAMxSXLlEUZvt*1!nG4e_h>)zwFZT!#|_ui`T)WseogI;Jdqzy;frdbgF(C zZ=A&Fn#bb`Zq_26a1w?RIF^V~%*!}9?pPgO5y|*6FppRrZMs3c-UMGe-_mJ@3w^?< zmFyZ`fBQNguyF}RP<#=x9b9!Erzyb^s4p4Bh-80lJ|>`<;+2lKbal_r+{@g{fK9t> ze7yJ_C=LDj+qcNZTA?llS}fW781`k@Se7~c+{xQ69*mWCE7Yo9GT9) z+8^3+HG&tMk>R_y_BLpXge#r*p7La^e@Xa^{3{YARxA)@Q6G4V!h?0>zmwgmgOxXy z4sK_6Ov{cx=Pb~>6RjTUr`B5CPq8SNfg>#irBU-steqKi zB{Q9ojo4#i;wO7QI4t>ehojVKC-q#5YCcAJwkjjdo-JmJANzP0#$zPa`Jd42zZ#nN zyS}c0B463Cy%1JhXy%6=zm-oW}xcb^0s` zJMA~2c(t|-jg3#ZnkOfxwTpDuCPH5$ir8v$Ok1dCBT}fKh@}Ym*<>h0=P(B!`0of3& z@7v18h7EmCk-pO$Btlc*j1Z_jzEb}nEpr|+GftyQEe~ys>=p|pE*udSPFBD~;EXWU{{q7c#VRu*K%R zpLQw%zhK$$q&JG82-9mF{*YFYS&&_XtjFVK)*$yTgC%dyjHZ41PJpwyN!4u&+>loS zIn^Jta)7$Fc&Y9F^H>t#L==`)q>2oDtJ7XOPY>AM-R^}&h~sO+ll!Og?iW}}H~qvy z>ixc_{&zpANN0iq9sQBO{V3Fj<48W&h0tCA#c z>jE5N$sC8N5E9On!D-3&E{#K*3{lHW;gKuURoh*?XzI5;K#c+Gq)@nLk7BUjX>!Sx ztb02M*teUoSsEplQZa^!)8s&)X+d9S)5g8!8Nqjtxs+tck(2qVXTrp_d zIzYezHrtcW+s|I_BWo(uA881Me2Or_|IR+MoxVWA~#$vj23Ba(}S=xa?K81Vb= zD^KGeSrkAw$`n%pWy;F;tnD%k(v(cwLW>&S>2ZUVxfQL3^`UAyguteuwcs%`t{j1x zr8TUlluTz>^F9_CIHWeDYIytCIR)+f*9;H+k&OW~EM2FqUap9(&hVI9N1rGrg^u>k z7@UEO6?>2lk=T%CIy@5nHuwiQo48sw5}~M2$i6deIer;@s76cA*e{Jm(@ly->t)Ns zOzS}K6$I9fyM(G_ltOW$1BB~49N=l(qf`%L{=U$9XYG=p%);&f8IJP%Fa=Q#(S4J2 zWAGqoMZ&dZ6L2AA4!gI`ES_ar#(uN`M;F{D61Z+;1`Ykb!#koGOL7d3+ z6%lt_8wU6mzL#G^|9b&k25kjqOvDror^EiQQURQ|kA6!Q!d%`=W{*udxW%*_4L(g} zQA)=&QMB7;q-7Ts&Js6*)WO4aLlk%vJ5x(_1#BiM;#d=aK+~b!U0_z9XCEY?0!}9M zQnp5n6ZJ|}QWBjt9(CvJSq*#;Cb%FlQ3K&QX17K}44OG>><7~^FxdpO#=;0 z_DasOKL(ga0S@ElG;VA!xZGGNRoAx|tpc+$Glq$HJOY5jcp z%*y>jFg`)x@=4Xn!bZ^29r!Twe~ODicf+8q9sxE1sS2V^Is3gajdFln%f%@Zf10WG zxQ<~wn1Cgo64RL|bMyRVtJ(L6t){~(LP2rC$M}jyWy}#9KY52*PCv=9r3ZG7RaebR z`MHxgGK33D+H+Izt`Ip+GRNEegux$asf&aQ9{}xo^th?TX4Y2z`fN-}Sy*oik&92fZmVo^Koi}sylP$A>(Sw%{OeiK9vrzG22Av}%;}&s zkSUC5q+oDMq_x9Uabgn!$@^zV;KN=l}08RR|fJ3ezo@PHju>_qs8S?@z7 z-$C<>)!u$yT-E|SE%o3pOxUaQZ3ZSEQ*r2ctnEtK*>4(4PZ5jgv{t0l+iO4JN!Nu! z!ofL6Bj-A(`;QgUo6+EF#sr2({rwT5nh6CsM2{g+lVO+pAG4TRoLK>L&__yr8VV}R z;;1lTHm}%t^3lQRjxJ=!5%*mw1SXN2e5s^_cf2AK7G?Qo;8ct=E{^vF~a7)_hMEH7(mXv8!K!@wbv z5Z>v^_ds+NE)TB85=J#3^&u`kvG08Z);>$jO^`ckD);2B7+#iLB-p z#2($%zw&O|_?`7{5pVUkN+W$H$hLSEO#vE=TdE!!YtSS|{`H?RrQq9b^tDBu?vF%i zFzgZ1pvqb_HibL-p7XQ+<{0*GikfxZ*Tp#A3i;h&D;5!YM{qLvMY0Bvcnmqa6}ng< z23n%IGRpP+%V+)zT;D;1XY9a(iM$zeUdJGb(d^ZJlgN)BTXx=SRT|YJdXO63wvyN= zf@eGG^i6xVdmBibis1K&yn9J{b{Ur=Cje|>vGs4^XfllDc@5H{$IZUYkIFgQ?&oVBDJ1?A(PUP8Qz{- zzh>Mw(s;QW8&<(I_+h}or)(zWKjv3X8$c!nq+pb3$Ttx1(z%ZP-=irIDr{G-_mk)V zeg8!)faJ_KyIua~%s)S@X>Rmw;NzQuiH3ryQjjfUYnqXik%3DG6FHVT&Ou3HIepKG zmHX@Z>@Uvk3pRh8^O+DFUVwD@45+!4F^*#Ir|PK_sl&8EdmWc15*E#or}>J#W`N1m zCX0D_ITG-lGNlkWD^IJCxVj7!2&TJhv;eo5E26s@x^Jry_Xg2{d~TL5+%7LKFM!I9 zIxPH>*pktaQF?}tPFcFrOVXN~QXE;+Ht^64p9 z-KjCtgcbR~UcI|*b634^C7pf{7^sj;E`8AfE7M@3Oya<7-Apa}rpy3RYkf)k3|%uL&d=n+0TS~zah@r&s-Xs z(%fmV=``R@5Unaxqqr>--s@WzZ|@7YC~L_hLBA{DzgW7J|Lb3czRcgsCET*JXZm(C z=@sm^H&z~K=qAW9%0)%seeyC{?AhtBM}rpw2+^Up!VM*P4?9*L45L=>vkvjlJ>=1dZ zW#)}b`mSB|y7(@7nQJ)jU|fwv-FfwJ=C)s^V1uK_;bmLV-|11%sL$bfB%S$?ThIl?j z$9Sb8{b5Q&i}6z+a`csFvOkNvhyn(xH5P(}pj2njgCQnCq#^pYz)m`(IX*=rFB3J6 zcnTf=esnRg|3?Stw$FI})rYe;i6*>_=`>#!UgaQZO*GuOr|qbt2H8V#`Nbp5@{5+( z1HYr?M`V^yG4lQY_>s|DJRT5pIkD^qOav1t`K$PkHK+}x>9*RCCb z&Wo{!=Y7i;gkgo<+2S^!q(TJS8*HeAy^;tofFt-V}-)SwldHGcfuWi#YTd@tM>f$Mb?%XUIx%`l*cPl~UZyprpl74x>u z4nO8@hHU;<9gYrQPt^PTALdi?UMEI`l_-dUMYs^qdTt^U;5-wF=&h`*JREip=)|1) z>Yp6fXY=VU{f(L9=&mtBbh~mV`1A5I`r>HovB-KhZ%t`)O#w4?A}>WW{e3!=wK-jl zQQfW-($>GV0CYEgl7O#i+UTO=6x{FJcU4cg&|1;%olt*~E~Dd+ufo zyWOGWA?(^@xn4%jq<683KsWM^i*0Np=~n0gcef;#_R0r7{^lkIg0RBSzn#UI`R_Y{ zC^`UnZckNur8Mkt6Xm5Hh-djW_>hovE%-(w0(|Nzk8xLqNd7%~z*8u@pZweT70_7S z{f_=<`~P|2@87$7rCsCSVEOOc1Ze*jvHyF)|CaCnuF@Un;NPv0bxW`rJ470{~o`zh96_{-2HDMLPexX8uOr&i+C6Pn>|Dpdewl#~yxxk;?<_pzx zE?+6?7sSu|?J32h9L4>9`2EPtqPs)D7EAGe-;|!G?n3_e(jCqm9M%7R%^iZ#mHPnf ze_y4P{Qvul9N&il|Mw(!5@;#tY#A*@-A8Jt=EUl0O4xxY%Q-=l*An5*`=X--%Ak62?Du0Ah-|Ur#|tnMzeI zyhCjEh8Y6>}o({*?QUSIWjWX1$G?b&Z zbhI9$9i(shMQx-AL`cfb56Yc*j7nwcRcw#_MEQXDFQSUo18Wmk9;U*H%k*rq8z!6p z`~R&M>?uNo&gfI=89n@E2>&&Z@L#8p@W@NE$5r}(8XFs1Np4+8FzWv3wwZeY|4UFotbJN?ahg_6-_+z<AMZ5y;hwJJJ7s8cV^x zHS8=o0Z7E+(s3xJa`r`HqMz<~cvXEw!wP;4L^a8DShRuVplt6g0rY*+%?&s`tr>gvWzdX4f53oB3To!Gk4-h1bkbHV9gSL$X{?>SS~ zm^v&VD5y9unnVmF>BAObN3~O!E3bxip0=o7QRNB*q7z-Uu<8Fp6{bR{G>o$BwAqtO z-PMQ1jc+Qx%+|;E;g!%hkf%H-5CDI(rx3;he7*l!_y3M!>~yY_Y|4CQQsvy!#obtY zy@8KsY^SMMGbF-H^K-J@wX!!a=5x+xo8mfhZWA-S(5PnH9|!QBb(0oO1lbMW0W!IQ zTF^wq#3KU(1Fgi!9)jy;-~d@`Vy4D_c1^IbTHA$?pH6eX7##mo;N-W_B9v;enA7FsYno9BS-m4)g3T zEiKgoGAUDIvMG;GdzXEVh^K4}4aXMuPHvtjME0P_SjAFQpfk$X@2)PwyA+;pjKThR z=d8hfc2MCs@D-sPc4g;h&z|+)rl$Teh~k(_=Gr*e%1FosZULHn>_x49>tx&GWh29w zs&-+o2S-(pmp?trCM6|}0Z1fCIOZgWn1C+)8e_gy?e!Mv$Mdq^_fE)92h_7w|NqORfKJ*xqD@{Gw|arWD&Z{KD^$8}|P?ytA}XA6#0 z@1d=L7zjWTwEOei_+44eqW7o!f%ih0alc=XQWDLFNFDplIu{?hn{+Igy^a#p356on z?7h`a?>;)%sF=^WP0kfk6XqkIp9vj}N$3g=W4|aMvwK`|p&MPVJANdeKm6RL`XrI+ zL>G26URf!)o+b7u*}No-U!2s$3~+R!A&ls7*!eVdqiR_kNXCF4!l2A3zB6l%y{$Wx?1AoyTu8f4?CO? zcmYWQL@AyB?f8s9e7itwI%+gOl-Tx>LmGSZsl^n~Xd*x1-mJ=uNJw@h`+o+CJJ`_W}_|{UsDC!udQSX zn*UBV&IQv70djp{L*{c`gUI+4va|-01bFio}$#dENWzs?M64eH-@kjJxB` z)l&-7TR8_S{V9?p#nj6x7lB{Gz!N+ToByD#;R56lFNu_IgRy4{@FuQXAdbxdQ|wc@ zKO})>zN|H?J``A#{gkux78Vvdh~pj(bVLe!qVWT$}Yj%2_i?Xh9s{qmo`t zy=Ah%ND=5*b$@RU+M~Hu`=qO==qJUvq=@~R1ca(5^0oX!YWQeRb)l4uOtU+p&_|Zh zsidT&kju_0{_N^n8#_w zWmpClm{8!`PN2%9^;1&>0-*(ZzxR1?aoi7F?nR-s(cpK+F zJ>PI*pwH9T)lLs#hw9mXcl`V(LRN3bLeFA!zk=swA1ff)?@g}z;1(Eo0LBi_nUj|*{e>@+-ULD9*-?FEQaZe{D%EYf z<+9fT4+Qx5TGXGgfIb~$SqHH2`{Ly^?d5kpko8>BWvuV`st z+Hng2fBpLPI|9M`yVRV(m?m?|IwL^N>PuN`@*9{ZSt8`=!2n$DKa0bpe!X)9~Rv4ulCZ_q^q<^wp7?mb(3@ zXpB@o&6>E^q2*7!bN$%7vo@R%*~eGWEJ+`|V84UVQS0_PZ)j++B1dL?U~osAXxIgz zZ0tvi?veq`rD2T!G(4Nm;y27xS&uk;?zZ?bBn#6*zC`ao;w9Jyq;mFUe*K~Q4HYz` zWa&>Sc=ce?O!1tjRZ8Fo7JR-$Tc)y5bj{!SFal@| zqBid)-j@9oR!NGuo<~%VV zvH5btu-mG`ZM@V3$mDTT^a=!Ap9NfB7(_ri-Zm=NDxkCXgB80W`#d;Lbw=Iqz7^KO zgGY*4X#jdMx_;PLjdHj8;*m{1UHkn2cxEH|u2%U&8hng9L9~OLiw6SiOBqTY-nnso zF~Kh)q7t3WqG5+`{h=8I0Z~052q+@+JOQTM5#FX+Ub^3}sx+P&Wds=i#dMyot}QgG znr;36baAOBdM?}~mx8AY8tNWfh2%;lJ)7IQ$!{=7#SFMQWV=9KvIoSByQfuzeYgUu zR@mdg@5=X@Dq=n=d$>mxD(=0I0>D1hJ}GzR5*tqZh;avi+nzSHETywa1?*uXzi+J; zB7%~YZ{u|j1s*cSLP`5@*ViEW{nNIBzqjeL&g!_d-zcV5ChLx)xatZ9xrz=uZ1!>o zwiJjw+}+(B79Jew*xTDXi&8+prKY7xP(_F2eh@vhw5e|9pFMoO@eXW6WbBw8Zpb*J zvXloiMVhs0y=h`C+nomAtW4oOjV4_8mk;ahO7F?lej_NSl)X8o@sfTL|IeYZx1f35 zucWFsRr%Qp?>|3Qhh>716Ih-;vLFT2QK}ji9Kj~2&IFMw2Ues@)io)BXOM@`(WvYY za}yJ^hLDhuF$)$oSik6@6Tt+eR-6FI0b)M-#eDat zu80MIy`*S{U`dlbG$uRK#l@xC+jd0VBY)LLHqtR??Ey*=iW~s)1{kF1ArIO1twLFl zGFs&e&_{>>Z$N`$G$kg*JbEZ14rsxT-sxKyq5&$$s^|zV)kf~Hb}n2e2sLj}0hEJ- zgCfEL0`-FP+-*(2fB(J%*6c*2N5qF5o6gXD39s1(>vCq(98&h8MIdW&hG7WoB7oPH zmDSp24X&w=CM%4~Am8urVp{*U{IKSlAFlFDZzCXZ!jxEQQ)?Br8_wRh@!4X6pAb&~ zs+e-x&r@sL8}0SAElVNNK2bISR~|b-wj>CfYdUx$z4mXO9{ngtUwT)0GhxSmfbaG5 zUiU2(9QeB*w*yGIaBnoYZQw)fwlQbioHBrer8aW?Fo1xc>$N>?gy&jjuDgfFqK@;T z<`Ew75g^bRZ^$*$CUABJ!JYVaknxe4op0^r0a?Naesd5ki0am-*iSqE2$h@ZiSLTI z_;YYpnI=l{VC*6#ZS@f@0AA7E+VfCsa{^)$O53f3+dm;RO+k>1L=oFDvDyJQIHCgc zTL(+-;|Kz(wovG_waap_^EDk-+RNI?f)q4&$-~b@@);Q!olV}0%4o@FC8GspQA8xoc?!z+-7F#8(a&wy;g`g^TH@8-DNVYZDWyd|Iti`u!Hm zjmny^f|-z*=Eca1V}-!&7NTf}3j8lBv!^&bPnCgvH76&hJ~YD88)ny7Hp#Lx@E2WV z4jy}^H+usHL`%!TzfmJ#JIn#K-Uw{JAzi{sG$Lw5$7>MTn4MBbYu;R}&}9y;hSq{@ z0Ss(}$pqaSMGqS{@E{b3<80uXVl6!$JQ2t3!9iE)Z{9@W*}XxBO2Zi_?w3)IY++MI z13B7!$GVj?_#7MLp^63foFmDoN4&t0Csz$3hQqi{Z*KTckGbJ+HN%F5xnq#MfvZq_atLBoBAkZtV=&0H3fL zYkxi1yUniWsi$+7@~@ibNTOD=@mv0cWbrGi;GLVb_5VY=jZTVfyhmD?2@YJ@&9pVG zU=n{vX~9m|p9H>iWyJc48-c$%KW3oV#$MgDd)>su)+1@&?UiM)pVJeJlzwTf5ppkX zWfQOLFiWvIhzIzEMjJ~~t+HrDZ<8{e4kZ;r_BoesIASUIDD`ndt4kZ1iE~wOVEzFe zJt+n<3;yF|B@@;_GGGv=3dwHBlJ=SvE_sNHl_vWp8saSc(w}8qvKipT_lY&!iXNt# zadIC1_AQ4fw~!e6^7$Vdu;s=V72)AoCn%Zd%%?MTbKBH_QOOgco!_Hp9~-u6f4A5p zUh=Mq^s)nF1WKwl9KT5b(F?R%^?mNh(5w>zQrs3kxmG)|*V)CO_d5IL(|97d?y})D7NU-*aXS*u3Ch}93`t;k2 zS6NFMVfeRBt6%ov?nPPWsWe5X+XO5aMM`S{HZ(g!w6xmy4#|n5vxanRF;0Ldk@R7! z?@J2;wz2zIthM#Cz5r1DH#cfdwD6VWJne~h0Diz0Rld|Jk}jo45B2p>2`pFH7N3ZCj{H!!GI^0htYDQ>~$vW3**6r-PMNc|R~+5-q0;jo=(roTkaoDNk=x z8f6;Jk-~VCOqc_axU3akPqfOj!5|u>lue5FOxCzk+|uOMFW5HKQX*ny`O{PW11LaS z@U%ZpO)#qA?$ai~8B>=6WS!8J=C-AQ4>vQjvqN~~@kYqqLHs0HaN&j^#R>F?%V8L~ z`llO#o!HkEU%6a1&tCU<4&(M`Y_iIuC>h_*9^b{4P-_T#?0qx4%Hnhy-Vc08Tz+g? zDZ<}Ux04%@S#^f@mcetFsU4)@&PaIwA=q!V6Pn;Z-$-=~tVpjg)yhvrDHn})M@5k$ zA0OY8mosXAr~eq!leg*y)e$;+p?i1@UK0E^IH&<>nJ+yPE1BqU{8OE7;Y$1E0G9q0 zdG8^(*UEKn^m${^{$f2?zg5&&C$loJQ$K6kAR6B_Dyw=ZHFb1!)D#stoOXm9zW<|2 z#V;TbCM6}ML~NIL_b@2VKJS)B4w9LzWu()M4@Ht101lw=u ziCKvO9f^I4v#Ur~geAp?2S@bq^>jm)FVp=4unD$TpHS5TB@PwOpn4!Q8d^ z$EQ6d@6B3#?AO42M#E+>p*%s|E2<|VAYeI@t=xbve$MMZ#v+{Q@gU1XE8#-~e-&fm zIN6_I#k69k{JaabB6uXqghitn0t)T?X57yS5}cvI<&uB5LPhorKk(#LU+sGb=Rqv+aP4+r6ugox?|F=Qf$h%)kmWFW59VhrY}$scrMY@? zv14dmauG7YrBk3d1Cq#>iMcsBCht~+xv`NtzZu41}}_Bdk+jm@o5H`l$lCN(}R#U3p}@|;FHdPS4!!S?qJ z=i86kS!d3PE6Yz9ZAVZlFMSqQvgNiOMuX{WmRuDDc{MgRHqwAj;V{5B%QzRP!Sri% z9hK72=fMCMTRcs>RTclo!)O0sQT<*GoJFj?VSZIu|Gkg{Zk#oOTd6%i4Z1gjFEBqZ zCE_M0q6h$RiM=mNTb3lTgIOMw1eLPLP^X;VeY|vt^TflX%2QCdg$3z7Ti9p!k*ZzE zm>c?_p^zMwLKTGg$~+d8!pc|U;9}0h?r7|xKjrGzVat!N2E)NLSkB>*(jNu#_dE0m z2fWs0t3CRQ=_t@WokLgW$L%tcE1FWy$_rbvP^HYRT7TmndO4X{$-?5sWQ=YNI@A_% zECCd#`S*|u@Bn6&jRkb!)&zs#Il_P2TgBqsC7y#Reqdvx3}K340rvO75W0iW=Nv1v z?^LhOP8bG{Xqd?Jh#-MDdz421+aucMIj`G_b>sFY`0xM3|6QEVHZiK|Pj4y_zD;&*I_}x-^efi~OsG4m8pf&2s~r7Xm?P zv}?9#GZ$obmEQb@1lT`rzVL0H+rg6ed?!uufki^%4Vc0;u!5n_XOz|e(Yc+#b+$X- zn!rPHyowE1+|yWO+o$`b3+&>#T&s!h6JuGc9czC5j~4)&RpblXjs{-$>=H_ad&Kev z7a%dWYIeAaeQKHIYf5!fd?m*qgS8Jthq8mUI11u3PQGsNE%9x&b^D+1AjjAuQN2Ci zdie4D{M^USB+y(DB(W$#`AFv0=#yU2q8Y-mwvfX$@2M*5+})7!262*@TP?oMs=mGl z?+$F{XJ_4oEt@>^t=kv(7Tsu@!f=M4$ma)v5)I6;l~?(f4Ib3DJMyZls-ofr|9)0# zYVG*?;fz$_j=%gKXHk67CJUf5KEHJwI{s#$L?Y!jkX1UfaUALu#k0bupz7d~DgSG1 zrrza-w}eBpFv2UjT7ME~Kx>E|VkMS})YsR0Yfs94lAYaRl_=}zy36^O!@%)*t$WyQ zB=_ban7>mWfj1s?_ia|thupBxeI64O3g(}p>$k!A#LNOy3_R>nK0RQ<8tE2iZ;MM1 z<|$$T9%7l{T^K+3%a0^XfI1s4d({hnFHR7AgQ}uQdBG21At7BYi^ip!kT-YJG+~*1 zCD*x0k?jh-qHE@i%Cjp6Ixl|ywxoFdJ27Ex;7{;BeMe_+n`Znk)~tfKnRzAvazjB< z+lzDy^a}ZLF7n%bOCaamQzf0CTYXzfkDN88;N1P^=LK`-IFl(MV88G~6?a$2mDr=% zz$Vt-DU0Vy)E!T>>Z1U7@AB!iWCpAqfcloer-ksd->V8hILlf( zCM(2EG6FgZnjAdmnszRVii&9ZQ&?_R?%%WqEk*=c#$HF!c-@q`U6Uj6%Ent~HvN_5 zBQHdZ2^Y zuKQJ~b)3DGEU0xglxBl`6$?I+f3{UgM5J1Ha^?B^ckk?}D#vZTMg|8lwVO|zM+%fY zL3%*HSKj(NR>?$hIkQm^5~V*QdD|6HJUj5NkvU0qw1bU$hy`+b_BEBmFT*e`!|=9n zCWaYoiGnf*jX?mY#wW#$qy+-g&i$UYYkRJ)tzFZgtIcVKb7iX4qmRt~Mg%)>rJfQ` z*yjHNeXa#GTS|(-Z9yy@#Z|m0JFf{dn(ea7H~hWxXB~DMZIvr+&F6%mw@0V(O)Q9@nv7Jtv9c5R(%)mO&NpM zJu-5o^`(lDoWJ|NpSH*Ad@1y0`Q^yIS7-Ybq!%eg75Q2UKALHHHPsZ+zBeYd2u$os z;FdV<@?>P4HR3G3PWV88vBpwk#1<~hA=IDL@!A3fDJBE)G}mUqepo{3;&pI2yK?Vgx;K_+f?Lo6i9=*&bRxTz9#9BFYU<#0 zZ>m1>RZ}9+KObm`n*OS|dkc_$T+f{lFD z7l4`4=k;N$cxZMsM|yVFyklzH%>+!pZ~wY9h;`FFAsDG!Qlgz{LPJe0{Os!Tz6%Ms zp9{V#Uv$lyJZENQt5hmlT26nt>i@a8l7sm(!wcu~9Gsnb^M|*T=_h5hOg> zqXr2q9ONZPyqpcR_=1uTuDo994t1VnEJQ9b+>WnVFd^UO8(GOU-0B>~G?+WMxrK-qSFNF7^Zw$IApd zl|gp2Ut;)}^%}@(<(LB#?M%xWBPn{qD}i&inmIcvth5yqY0A+6FvJVXX>Dbisi+|o z&ddd&im-#04LA&Ut*Om?FatiaFEf4*H^_N0A5q-|k$m0+8H z7PNZM0mH;fDlIX5{!&KR@c7qK_x|mTam6HF5I13Okl$Hs>Q(Ly9<$GhitW2NBKY0& zHK<0ev-ZQ1nsdRNNk2C518*Ut+tF=#8u zehWb+*`E_}Vf=j;;On8VZ5w!6)bYNE`~I@#Tp*F~1EuV}tX3i>8hNfytns}EIMCa( zy6|}4PPd#XjWF@l$=Mbb(Zkn$i8S6XeMvMv2S>^h+R|nbXlDvX%x(G$V~NUXTIZR9 zt`rX-$WjW_tbdV$=>bQ6*o*U<2q<5g;Pl%%c* z+{*$3LLCkZOfD$wzdt)%kFN^f8GE{NRjhkBs8w!etEwQXd#H+IBpF!~cQlEO{M-GuT7OSs;RyH7v zYe3oSL`N_&+=7E-$vS%pI&p?Tx!(d4<%)=^Zd8^wd(}2rURk+4IWcj>TUp%YNgJo| ztoMvL`stuci&d3NyH<}mdm9v4POV#NPupA?swhT)D8T~k*5V$LbCT`?qH27`@6u<} zcYFLfY-bo3dFJn0U`A_xF!?@m;ZDggd`Up1L++G&*gy(`CGPFt8M8#CX7#g%=Q)P_ zv*f&^M`@rtiI^Zemb|ThCopJrDp%O;a{^SKm4d`80kBH{(K*1J3<2L~8aA#7E~oCfT-Sq+xIMkFjCI7#r~MUw08`vCB7&xQ zIb%H-@F8fmo?v?`1+EccX($>R)GZZo^A%z3i>cWn-=Y4@HBOCVSlE9IiXE4u{a*kxxjgXMIIqxM`xs*@#upE8f&oVmE1u?L-?T#3HBcyWA zuIdBV*qQHFr?u}#gY81LUE%$2ge>*$z5U{HN8&yX)6tAeVFu@N*E{(`Gp~C~2YMfN zbFc(<(hYMP&}qOtIfnh)C@TO$_DC`Sv|Z&kqDLr4d%?^y`8lb{?=Mr6U3$g~AC)c> z1c?^Q*Pqx(arVXG;I8&V=8My{JleQHT9`;;q}HvgSYU#iu(tvT9ZPfwfXV=;o#=C2 z_E2~>OD5xWDs)sjx8+ecL8iszFSC;LP(H|`(2Q(#Baho22#HThrKn3mxHquPGIsR0 zO=jqwjIE>Xr9jera>`~JDibWzA(^G;>eEvj9;zpU7l#SMgM+){7UqJ0+2 zY_7?xoiW-!bmyvs2Yq?#AD$riiXB&2-$6CT`dx) z=VOwXefT&=;%2)k-AuhB;KoDnn+gqV4=GQ4H;jzij|}by!7&WdrBxzFL4(S(xP@_j z{K~!*(sFdzcxzF+fp(h;%{1T0$=E)2o!HLw8*4PW(i(+pTIq zO|fI?rg-qL`inz+Y_ok3%GQg@V{hWI;=EH{%v^~)>WG3DEgLvf3R`eL9 zMzlGQymzz&I665A6^cFj5+_<_cFpFpCVcFW0mFl*Wu0*X%-|u30a<NLb?1U9i`9cx5aEXz|(B(1vd8Z6dwqnyhh_Qfa@~8DDm= z$;g~^kN)5QWu&!VY_IABB+bU1RsH<_Qui*rC9i8OO3K0r;8?HbcC)aN2%yRaY`J2x zy-8Y~@!<+-Qg7`#Q)8(dwiml^!fJ7j{v|^lO9woj(pA)TUtg~D#x-iwC^nSt9(?)v zw1;3~bi)(x4VL)E&|V%#%FI-I1q68Ff$^Z{PAX7C1(tuCQ)sUZp7=1IlOX_MZ9Y-f zmjcyiXjs=t4$x4lbNa3ykInU+~F&e)otya~y9z>(hVa{Fj(MLL|CU-O*k-%LV z(fUVQlbB3G3wwDp53k1h&wwbP8r3|PzkYJTq3ehhT{x+KD_fpdLgEks>dRnD!BeD+ znomg}BcwJfh)s@qOBfx>*6)EBG1cOdu>HZ@fX2rTCXBY`d)GDe^{cGP@TdM52&W^y z0azPCfKR#`b9ZmrF&ON>`Rq`4+%v2%Mgv1RFzvi{+ep}Z0*h{h`a_637?% z*s;HGPjoT8UB1zQ4vhjNAeTf;w!~$i@S4BTBA^OZcx7o_%bhB>$B&!l@ldFB4}_PW z-52CV{&0}eJ(&QB@z~2n@iZFf+G&>Wz~8O+ zv)upe{hI^tE(sjD&r{8PkNnNo*0-%-Y$K%bv(JR8rz~&p=7Ghb6%1Kvrs%tvuyAFU zHJ0Y4CS@tNvG*+aK~qPr@ywwcZTc#@iwyy~xV;I9;|e~CtO zV`F7FwmB~?Pt4aR1zz3f=R4{in6+Q%iK~RKvgujF*uA7nx}UAKvqU_y3~Isx&R%Vu zui_|D_dSca9HMh+j;N2?`R2qLeydjI3t#FmG>pBd^RY~%v2n%-I5dE~u0J~fL4knw zK}{^c3Z~@N)i;(+AVU@LHr?Vw`uR)43W8`!^ScBS--Ds5?|C<#e>APW4yfy=|H1(C ze{JagEs0J-y407^K&$cB>Z&yvvf?xZ0=?olj~K~U2vWg$%A#Q**^HG1F13*P6;F?; zbU(SyChyqi)h9~YFcX1QLL?RuxBqPwf>LPx?+00fl`jH$n4spX){VchDx+wG6R8aT z#t$Cy0d)jVie*hB{iVXMHk4XqoLA=_B2CXfQ=zmPi$&#qC$w*h_rnTotjf!03YRl=to zB5iGe(?W}nMX>23_E)Z=`cKv#Ii-`rsUjLlvy+&!}V~dV2*MsuyO+H;H(0`tKtB+Gn`#ri+fRY=)M>-(2Q!#2G5agpTSwW@toD^6>Xvz{gaoM zSN*tclY4ODzBQplH`$Vczo38kd-VBIljbKF0Xiv|5FK)A`Fukhqy%A4+b*OP6cpGf zzr^5^|6s1lPf)Ha&)C+1-7NI{8c4gcz}zLkx%h)bm9ZHt^5mr}*=#obbs!)^aVaE3 zYTJ{uFJ>e=@pI)RpCeJW8exy`-TSf_u58O!nfOlSQGjkuOS`de?FEm1foEm`zl|kn zuWWHcgMZ3p`{U-h)xdUgRZHe2rDJK`LvzG240QMG?64!3eJ)4$PAn(!-6<`2mH0pl z)sIb2Q@8i1bL6^lP-XU^ zc(@@5v~R(SIc!wJu@kPJF5!ndD57F1KiTwd%+(yW*M>wlY_no}*U^P|l6|7Zaql65 zruHre&q*Q*&0vyHq*6Ik>hzo@@SYfKr>#FWb`eCY+-DlwqZk!SPyxoqhQ=hGm8Ac6 zLv#Xq4lk@GN#V*9(yG1ZEo4AnI<8m9sx)X6SDJ-ae6%|DKCDG$_M$ke!<*Pap6 z=y|!ie#Q35>1(`z1p9(|B&7=~tCp>2Wh+%nTU%w^0?Y^QxQp6a*8MwYdi z9Zmn{Oc# zSaQJwWz3h6^iYOR%mZCnZQuQR<>|v@uKcW--4I99{jh3Bqiu$o8Me{51VN*V?9!RZ z$Sz``WG7^3(A~M+R|X?^QPsBw%0M!6j5&|Dn*hEboYxDck?W6*yZKAL$7XT%^LQA= zZ+=Ef)c^8YjjQOYU`Wr&Pn{O~t1PjI?O`ua(oC%%s)kgs#r#A zFBMP_azS2I?I`80Sj%Td(wkKYx~xUWhdl!O8hZGYJ+u+;JFxV*u1>tYzg!{Y$J(iP z1KOOANi&Bw&OS3vGjj210~%x$M~Vh;_I+Xpcie}51-cs$N`u}P8c4YPs6Q93%BzM^ ziDjirr^q6(#`w!Jy098B41CiEhXn#m`TMDg zxBbakVSMm2FI#ZGv(^s&Ir<60{8R0}RS2lXc)p{)6!$aDcSY2X%K48m?lp76}i1f7K>v&L~BF#QrjJXtTlWwO$dH-F7J=WZnK*;+9kWCx{n4^y! zy{$oWSS>i4a+7#+Z9N3aJGQuXC#CCXFu?zuzGZ-#m&jscDMb7U1ubym0F8xYtvxN2 z_)ZF=+;0xR1owyj&i3>zA+zpcb$dqVYp1#Hm~P5U3#&-m8g8B0zuq=S+Apm&BEnHG z`&U|}G9JB9vsmPfGt@#DXz6-ifOO19y_2ke+gO@D&!=ZH1lzCnaJ#)zo@oqCh(nio zzSN_rZ+4&Ce}tC%6)y_0WXC`o%w)-j8)1D9C0f;Y#<{)AH6J~oyODID zitN)k#Agg@IW&5O%AFdwOY#*%>K0cH=6h8mXFvniW6OEed1pB41@roA<1$8E?>n<-VtGyuro>x6@MDr-5&93`g{^MOw%^uWC zHuLzoTq83x+1ClmcFs{eZEj}ZY*+m|{6w&XWzRf*;3)WqPS$717^OI0b%S#>DkNyz zb!iE*;<%MGLhJhA@L=KA*49h5eg=E%k!BURd)au1ibQ|sG#w~yhda&GIbmj57{Cd{ zKcF5vyn~8>uo|4leu1^uP6nX>rXVfvC1f5`?miNNc4j0fw-Gy6aj}EO?z8Z&=NqSH9fWobLpx+R zZxzn|PT%H{+gV>c0_`;z@}=i`3$&_|kNjjAnGC<}%r<(cR-BJ~{Tf_ff90?78cQJ1 z92Fivw-YI02FRF8RwjycSEX+Sj<$j5&DX-C{h_fhXyYF?aBfQUx#W2>F!9&f@S(hX zQ^^cpB`d+1zog1Q>-g&uJ~01x3?RYtFx4424f;E6Ij}Lea*zjEQU~n!svCz1sY~@g zfagQ5rs}wk390>jw^{+5OGR5OenE|Vl0UV_YLR?Hc%vL~u1JQNRa|LAkFPLRaQ)-w zlm3CpK68rg;3H~t|Fb>Q3*<4+zN-4UzRX*)i!0h+DwmjDIA*b4_C#mLvrbl8%R^}I z-$80vv(#72!lzO(TvZ7;BmTw!Y2R6^I`tHS=Q~zAChNdp7eA~@M}w-7^D7Lq8^sVg zM{p+$Atcux^x)UzM0dKSQIJ`Cb?;%v@!mbZLYM_8QOdJxg>|MnvcIUP(oRu>iA_R4 zHx~qFjXspqIkL8`?Yv%+Z22V^UMZj;GW(TN{W2MU{~bE?9SG%NKg>KLNIgxADMt$_ zXG|+Z53>QZD`MRpq0srM8AN`jASpIpLw4&7GTl{9P|_&;=PW!Cl2qsV7;E1sb5KgA zD>YC=tNaCqR&C0$R z7)++5_NL)AaDUyA-9X^y|HIx}M@8L!Z=-_Tlb1)$=F+$QEr#g7$0GtbC#Jn@33Y>rQ}V%!bk~I1AL{ zt!TZnTEfqbv(aaw)wC{K(Vuo**C1%cm>*yL#*(g)S(f5V)zLviLlZ-|J3JdL*>PAn zus{FyElE|v$BPzd3P>&d!fkk;{*5c-?J~igMnE15hZ&$UN2A~N%hSq&?p$)o-!%T` zn{%5h_pQbTVNn!dY8k)bIu6;Nq{&!4PimiuqgOEmHOU^KUpIH$*>4THi(*sm;sl^$ z1&?&rPZJ@U$M!}Of;7THjzIFo&DZCv)JO`pV?S;D{d=5T;~5@am9rsrEXg0$R)dV1 z)xsWdqpdk>UcGv(dhayvZo`MMmYlOU%AGELR76_`X-Gf&@ZgDa6QyZ{bA1z+!TToT z0GasGO`p09B}c237$h6NqmS<+ezUj{mQMo9n_FJuv+HvmJ7TzmPXeF*RM+9WY@#+Z z4U}ns6!!J?p!-&w5uW?9*2jZR0lLEcuGW0~_2`V&ejp3Y{FICQi0wx2aMWMnmEEt* zS=r5VLTz5xL4~_V=jxSG%qE}d!m6LcF}wVV$MN&VgtAEUeZG<~{(}YNo~fhRN8SXz zD-S&RilOj~dtjKC)9IO&xXz+WRZQq6Q&(wPTAI>=_k)&KV3u6ZFOAyl+_75TpQQh# zgX3@ZvgyrGV%F@fkj0{bOI;0ne8Rj^okw7dK6(Por=31}|9N;z?+A;k?WHSm7pm-c zR>lM~-{ER!okS-LDja4~YLj-+w%%MAAkJ=DEoZVEC3+Z+KjF;Il)!b%|B75WN9@0I zg^H?wX0bUam5?&>ETss)_NR8d^8cF0r1E)ayU8cNjR2m;>HbaV6Y ztXQAarwq-lyOom5R>`_lA~u~PkH3r;2<^EsT_}f&@7=QI*a=-LL-1kgH5i?zPnR6- zUZc{pD)>4u&M|+7Onmchl2G|%Dr3H*V zsPy9C0L#xTsSK#kUnvV zDZ}&PEWhThq?*>&LuGO+uB&x8LYRNc3#%eUUqLIFd`q_^t3&s|JK)$rA{nFTp@z-b zS{!uUbaepzc&BjuRi3BiD%cJN@+!EyOUR2ONod2m@hYczY%VB(YdPnYoliX1y^8s% zNylp;uU00X1yqdDS{JuoX&zn5arZf#DdNVwf2M6iifoM`D_!UdWb%j2U(!sULD1+C zAldhjQupIf%477)7XfUB>^UbYCAy%7_^Fwzl}P=)yh}4CsW!W`bU^Rv(`vnx3#qy( zrz%oeLt{!Ft654}V;=5539(GOOR0;#^RzbSapyb7$d>6}$6E!yM>$5fcRi6PPm#{+ z^V5j|U*JK7bCx)y?QdE~%S>WTkWv2izwHcuCg%2>nNG}XarnLYZofZn@|yfD@wIP+N=;2o zj2}u2B!Yak757z89k{M$%a4>?S{hfWs7?yf>Q*P$1S7+!sHki;=lDyM)xM;?W9g(I z_ScF0v*l68`37M^4GU4_zcng1|;x_^WA}|?K`nxx|Hudk^ z%I6Oi`q%_=?eBCm=W#xHM!nlLH4JvGGN*GiWwIT>+`4AmlT?!N63xpqZ*T`Ei1H*4fI#bEs@MW~@pBWg| z9~d4lC1f;b)Jma$AcU_vdofmtDWeyvwEVESVKBV7y0Z{_yE$RWniNEh3&Y70B?mIM zsjG7`QOcS8WtlA?MjBz8=K_JKmkd^EV7NVmZ*SqqcYcRnG6T`#^Q{K6*DO|Rt5Jj08=v}f zwRbA(n27Oz8DVh$6QKyjn<|t!?!C$9GHqp5Q6V~FjY2FI!}B9X)pzmCPNNa&`givE zsyA=m7=rA;T|bXjzs6&01OB$IW99p0-1m(=#}$W;h`?*VN#A0&1p^jR9<3~23u>?* ze{ISTo;fuc#CWX0biqwg;)Gy5oI+x=#~x`YrYNh+I-g3?e?ufnHl^olCM6fO84TO? z3uia?Pih%0GHt!vXiP@HV&Gz83`qVU4RfB{*(uCB%81Bldse2w^XaJDoz7+Z$(0f6 z87?P2!(^&88qZmx>WmY#-||Fh$J;`u?A$L~eGh5SYICmZekLa(z71ikTO+f#?@Cx4 zwD*=h!+=w=eMq~he1>oCBwD5_F(g(AzUgQmt<>T%TQup7!EAn zZ>CJHWD1Xz*%r{X9jEvF;6h5h**=8t94V*Jdv~4hL(uqr;L=`+aC##nC|b!H$TyJk z_~<2({Usk#+=26B>_PX&J_jzXzd+3Nw;&gKk81uKQ5tpiJ6OJcCcN~W#) zmmJmc1D`IMjR#UWK`~cex+1NGRcYN#e5d)&;amxPmWq`-qJ(?EnyW;Aa3w_uE6=y7 zET)at-5Pj&AQG>Y|Fl8{+rr}RDPr0L_P^FisCjDLjhqf;qk4E%^fU}C3v!RHREiBH zmD#hx)HV>usCDbph9Tt!&b8_`OPvW$E~aW);?DL&zb6@yPRy}ZaUV4*bVc}UckAX8 zSNmcU8w*9NT3iRArlOhQ)1M9t+&bKc{O~#(_I(ONgYiRN+2;S~fg~d7Z`gb1!Sh&x z+V_2l9aNNtC*%g?b)PCoTR6OA0+8HM(oB)NfPyiD{VqHg> zo6HTP`Avk=x1sCgt1@?FiF%~TR=9)nQtlJ+gZBN+Oy-3c@eJ?booBkp>#( zR$KYUYHQnJ5|f?-!>`E1d_I-g<6`~_FU6WC#+iohQCXGTF{j6atXmxu-f<5fOs~Oyy1z z$}Hc~^76atDIU^{A4?Rlw;pISaWPp0rAa{*dvcyG##P3@^AvJZhoom z7xnaqJ~K3$uld^70S33Zl%OA#fl@F_24q)0v`nun?nm&={sOO@n}=akpIa1#ql69}!1~avV8$G-z!GP^mVqCgtf?hzUtBs-+l@w{7)sPlr%IyHSc|*Wu6KwO9 zNnv_cwzqhAjum;6kt381$%%loI^pQqnTz3vH8NcOk)E_4W$Nf&@HM|+knnIa+>$cT z-jTXA@uo94wNz1}TBSMGu{J}S>4G_S%}3H<@)QD5&O}*VgX(^>Q|ns9-&2BpGRAIE zVp6MT@3b>!_A{ZyvU)qS*ky&(kTkx^zQrS8_MV3Ge1f>|H)ZFC(;>2+9*e2PjM+HH zA0In9Ty$|#?aw}bdc3TOw8VU!;85t?%lMK@1BR2xanfK(yt;M^ZJQ3_rR;j6+wy90 zd~E%?@i{#?@gAs0iI`GlY};h*_kFL&PoE~3hEz1_dPbx@LOp7p-^tZcL-S=cQx}U- zldk-A6Zg+Lh&zvVA2^$0CSfl@d z@$$cEXKFfg%WByPsS|kzjrl~P#4yNF5<1xS=g%K93h^~WKvcIqzz0s{OvhIkAueiC zGp_riog;)@@~moam(f;RzF+YVk5FUC9pB zi(&U!qWkb=W&}VC{7bI2?LqMb&Mubn>wfSJ*UOv{ON=I+!=)v&u9Y^1l%bbb6BB1h zW4V+bE6((^ms1A} z=TlXy1K~?t2)_tf1b$fmy{5W89sJ+FCG7n7*a(F5==J{&90Fk0?~%8x8EF5pyK54n%5;Hxz$Xv$ch9R~xMh!xmDO~pt~OCrRJ3n=+(&C4Z;5zL zpJsx$Zx_I8!~!~xV32#X>m>>O5r>~(v>!hG=$NZfqz$9HG4Dq942=sINB17MFT_iGsF!xkva*zw4?>_`jH@L#NK;zd~GZ zWY=mWWc!?Mf9F(G`QA>`lq1Q(T-3MJmPH*RgplMiP=FD)$v z>o{1U$r&ZZ|CDZQY$)mK4nK~kDcs(60To|UT92!i)<>k0Qs@J9LhSHx4rGC@*93x^ zjAr2j92U{=?%#30>0Ca08is_SxD@}dpN0Q3n)sjp|7(5iLpT53Kmy&ROP2&(mY!VB z-3Dp2alb}if^w#VgM;xl?Ngp(6Z|CT(moWTfOqLgm^2R`{!pMmDTMI-XlU*R-U5tNqY&CZ&A|L5c-jL+Zt?{WX%S=WBW z9lCV=DEvhbhyR-;h_0`trKL#>%mnyJZQLq|#ZS#|zqz4N?uVqLV*;z?M^@HYg>amg zX$Xx(bna@gT8;pxRr0m4&p&9{7VPv4I+{QJUbFBTxXxNRtno`gD>Kd!H6SFX?CgvY zY>w^g(;)J{*FQLzTTvlmwhUFt4+af=kNo+p)=o{^-Cba<*^8ezG#gY1CxR3EKYwCI z1^~@xf2c)L%LIL7h%A=#xP_~#tQ3XmOuRMvt5(W91qdmKy{o)B9Ucvn^?v12nPHr zB@W{*gtso)L4DUT4y)zd8;8{P0jcdbzEdD+W1Pi>teulD9!C{yI;7VDUCCK62q}Lwwz;o-89T@J5U?7w^^vR`~pw3)UMa?+qX!ciJ z$<+@%b#K1OIZCkNv-CVC0X?URmN)<4ZGz|V7$NJl7C46A%m3in{of81(UFnZRd@PG z(L*&4kENE!{n7b3Y)Ep8zO13L@C|ho3U$JcpC?qe{~@-|6wn)V@T+ONoCme^>4L#r zpzuOAZ{rW@NV|x`e-i)t-vB>LKlto*{$`VhH>0E3+ekA)!D4p+&%gBg_3Mz7kS5&` z=^p*!O`(Oq28O>kFfSu)^;4za9vDz&*E{sWrq7F_mx}CMZ?_p|U(mL<-FcRC_tEs1#3z;D# z_W0=FLuBL^PW6ne&!456NpGS~`<+F#geCS23~Wb17PNhMWaM&CHl5gOoE8nrhk1S? z594Vp$OJR}**{QBXcppLkahyoEK8}$=&l3_v42KIMMYsn#h%#w{5%EJOc@xcs@j{B z?~75TvpJg|hgfzdJw-Xlm2nDY%W_-u^b4?93{JkNayJZ%(;Z`$=r|9ev3ECb-V`wX zaYax_$PyHPXK-m*&#$pIx zezRlGNnEC2JKOfbDL$>64pqxFPhe#&-yuhQhgpCJKlu1P0>De3#oJsX=@33)&MQ8o z&cxe!`px5`qvDW#T<+}d_Von{BCxoBRRO8Ay~xivYMZa4mh-1E$(5;M8>`kkKG|nQ z*D_ysA~1I8HEA7?>yX^D94)uEw6Pgz4yB_!d-{6|H2>@$8p;CUWDYzVND=kU#2Dto zEziTPQ4SPL&kEkOk(GMbr>G9Hf#IaOSeW+`|7MvgfAiCu z^CF2CeeNbI1No-}t(PPCV0;q1MW`tGhc{LseDPx%5Cv zFXQTf)t;0MpS#XcHw7!(X{V!uu!XO`C}#}~V{KjO+eFVZSKBTBDwa=`3&rlPPdkIw zHh3*H7p5wx&NQ{OEa4yG_)vjz04$bA${<{ZPUT9_58=e;?hD^u5?a1^ z5whTAg$6B%2J|Cb^aNj%51E;OmSRxEBe9^Mj807CM*j7v5w-j6M@viVvFr->a+8B& zZtE^FFL#CP&iG-zjzIAV<4&`}`L{Vv>m`;Ohm6mM4XgS3nnH2;AhA7J;yhG%_z(+y zLZYFlJ1mSGq(o}a6|TnTgaZ3m<^odp=Dd7!Y+cy^c{;#7I|7;?24i?<50>HKeneVY zR|`+YpG!we(CQl63E@loXCcRut5ar^_^Zq|8R`;*fZPzA*liZ>fKg9E;s(^(ktI7$HJ+nEeJ@k-n!0?^+G$)@Pft@{9~~Ka$$Qmv;+=UJ8qM8= z+c+{F8c(|@biEDA@^cm>ZIb}~ z2|W9LIz27T$un$Xb#T1K6N73YpZW90y#5u@r08|%HQBxP`w{4&hHE^_78Vy9^ehwI z7e#-%FZ6LjEtL}FJ5>`INr^or3O2NKbh1O~gmY4vOZ=6XF3fElHaE*HPt+NL`i*>N zdSg#RP3;SqV#(wY8Xlrk1kffC3FGOV#7KIK?)nQQC?!^d`B@XW`30#~bud$)UBYVd zMEzi}oZ;v>0(50MOU_y4xp}caXBPTcaKxVKdzh+yvW`7|U ze(l{}9@%Q9vzPMFK}%O#|Nw0T3T9-&)1+o5woNxWaMB3UfX!v{QAo3 z)x}j%eaU_asM|=)K!Q88;k*MEXf{^qJX_Slz)xl9Wj~mCl$drROlk}0Fjzeg?+SkI z=cRp0bgkXS6j%UZ+dMgUTco;35}TEK0Gr@7cJT=N5r6d;R)!dPW9Fnw6lt4Bn){ zYIHu_wRf&5uc)qmy1cwx`6p7*32e1Fi0i%%z+-vn?CeYntYY1ft4#`&kVYpbGm@)S zLgsbbS;}M6e0KsYzeK*kyoZlA6c0R9Q3-d;tEkX{uK|dKXEg{$ggFd$1d)SX1SSt4 zW&t||4iv7UKbljW1qm8)(ja0T9i7R3mgft35o$U*G{>Kyf+j^ZRc_0@mIY$0hYJTa z3!(!_8k(99`guoU$-+mZYTG;FG{oj`C({_u&X?1lTozyQ@m=e0gyu9TV)Q|#|D;Chd*8`SEE}d<4(V$~57Q0!q>aD_fG$(&RCs&s%4Hg@OWEs`f z;`;VYl$9sP2c6+Qo6OLDO24$GMn954sQHjLR~itA!0sYI{riivUB2SGzx_RSCxe*3 zheWZfEQI?WrozMekepo5&QtXWG-%)^?OC}zO=Q%K&;s@K%e$jZxm1U6O;x?ncG zp6=H+M3d18nZxzvWM`|&%eOcLoJuTTZ{woia^37HeZZJFo?lnB@3*(UYIZ04ifrPu zri1YvN$A1_xj97`(#iJ?GY*_wT#C@gW|Hzckl$KROkEy2JgkdflIO49daSA%0pcfS zq^Q?!;niDDdRD1L*{4AOA^;7seY#g~btEMwqWSY{SG4clyI1DNOij9g88moDt*8y4 zOj}u5xe;YkrY9eEEutG2HL(iq6G_5z9gRz+^bf$>-P6zube7Bnmk45_m7T*Rr!e(P z4;H(>wxQ@YC!1P=`U3f|){G;j$9ogww*K|SwW#UB+s)-qc?L&&PX>y+C3E9#Yel9K zYCLxqwgwGB%9IN(HxpK$gS1`=fNAH-z1jG!;^dlr zw!kum*U(1lWUqS!7U&R#_nfTD&dMB>?x^Q#&7}9%nS~aq<08o5XU+F!T6M(o?KiSZ zra*1n>u{Ag0i@L7Bn2xH7LPVrPLyLb9~Pq+)@1T=C62Y_j|1_6)J4@?G+NWa;VWEe ziTj2bJpB84YikEbu)MHPMZLK_V%v_}u)rHvO^QV2MA3BEcEAcy$7JE>j10CM>uAw~ zcco?unYCJOWcLSY8Gag+jP?F_mo&VnI9U6|n>%sj8QBcRb-AqU!yRe{#)_p_KC?NR zmDh)C0JM5f-r(MV>r#Qa62vm*HXV8qIybKlT9=JwKvltfe$@(=kV5=3489KBQy)%p zM+E%5+*o&%iX;@#`z#{2cFC%Zn@FncCS}9``^5v*QFl1QI|3MTZ5@gTEt}p_Cb~*p z+4>BD9#JSh47|^5sP>A*dxp!9PoJI5&};pH1f=OpGmYy{c6?7Vp{Mr{sGv&*e`RfN zZwGTt`tCL`Zi}qbgn~;w+8?YN_@He-qq@5rm3){64(ZC-)B6+rbK-X}g$AfQDD^BM z!CwWxqR!MglU7=pn?H7ODFtAvVQ4sktAJ@gTyCEl#vqXcZA2|W)OoQ5#L!=0C4eDT zBoC4u(Cr`iyLF1CjXJlf_)Bu$YIpi-c1ZXPVU-4tt*Euu$<`Ze}mUp+)x{VD0vMYBG|NfSpNO+JlK%B<#s76wFfp5 z>y4LXX$!9mD^G*B@7J#V`(X{0yw~x3b1pSJgBn#U@`v2mDnn*J_53?O@3R^&< zyuMBq+e`M;NPGjxpVa*6bvT7MW{c>w<;b{wk)6D@*4EwND>;e9ZtGKP(*_0FDiT{7 z1>K9I-&cK)alRhx6bvEdk^3-E4<9`Od>sLh5*QsO zETnqM~0_zFm0GRwHC+C|X(RS+8kPuP;AU3VJn0>6X zRRKS{fq%VGV|P+M+oRYEJfstt?dI9e_$o?z6*vd<{l5QmyRq>;;H&JfU)2C~zZoKd zW_D0atv=lx`p$zcA0YXTo6WOlDa|3*%|p_E&KI4Rl3B*g_oT=sx)w-yzZ;n0qwlx? zKnt0&%v5!pJYH(8S8k^C@ZrOP2OYUNIVG@x1w%LxEMxX9^l+UK?K6>lawqGICn>Ot zPP569KH&wd?2 zoF}|@<|}YXQ7iyJ77iv(YGJtsiqGZ;q_H;5yhiChd@-V^yi}KQ`U}qP?iEsEX0~61 zFa3`H#?*0$i0BXz5yjnp_6jt`C4fXB!VKsJ5k&IW;$lI^*+=+rYqBMrUMvIf440IY zuk`iTgNw`dO|75mO~Jq3wVStihlaTNLrjbnR3MI7n&N@PX%RIO)wLw8XV>o9Nw!r`G8 zy@ZFxfUc&twyRhjfT;fd{x~ULAC2n@g9XpERr`?N5UlLP#={04mXG4a*iB4K?vJk0 zc7y>S;;q?K3-8veazW?U?k^aO0HVx=Jfp>!W4AFf)$~Vyd z@x;n`?e{$xTm?1rDTvy$p*hXqtL04PMEo$o1NRgk@BdV9pP8i9{>*$K9(9nUmGsua z5%-#Z@j}zzFNpA#RFJG7!P-Tp`R>K|o;#B*YyWQ$x=0=X8W6-2r zN+3ZD<gr z$7y0K<;-42Ge17eRxaij59p$GiseN0#f+f<#f%9gcFSW`+8`h;2Qd;&)V*%-{$=AH zR=Ym(@<9e}lSI(kE(5%9C*Qou>ruM~vdMP0ofy`(;iEfjLKRH|N3zL<-zQ*Ks-SnV z&rMC|-*V;mz*NUK(SS|O)^7R(DFU+s|L=Hg4TCslN0-QTf7Hgc{I;0gc>Z zGMc>G$nMlcsr`DDQOxBLEXfaPUt^tsd74T}JyC~u4d(2Jkx5>Eks~^fG)b&Ax0Z^# zatDRg zvM{auk<+^m=okpAD2&ik-|x#VRXqlEg(0_bDK$^_}_q-k;^fJw9Yco}h>4bDvvrqU@(ny~HG*9B-G^(c3RU zgg*!(;Sx2GRuk_<;WnvA@n)ijm#(sJ zkCIa(+8w~)#mkRCR)o{k)wMKmpP}4lic}%|56LY{}du&)4dE(Y|mHh~a0K<0hdV+?#uUsn4wZ$Y)7DkfAm zxz*QOJ>`c=`lj!c`xI33vO;PC9l80pop-T`%8-;1ig-N!M94#e(!K@~79M}w*c*~# z{OvdAes)o&)Xc9t&SqyO;n|Jm#jQAqW#d3+6gO7J3r*fxkw0|AzV&{#aQJ8eM5Fiao!qHiv_j&mW_WN3Ebi57lZ^G zAOJaW22$d!4*u>rS;qbM;E66>zU-ZyoqZzoxw)Hggd*&x;dqU?f_3y#Td$tj6z(m~ z5&8UxykL;a3N2(io(Icee#~_Ofa$v|$BU4Z?CI%2x4P=-={4rO&(CGq@6~x-RrYF@ z@FylT>8)qWL);H)E9>(24ujU2#(TP7yy=VPE;qD~tYC}l5(U%fe=NjZ+B#%>H^oD$ ztfX{Qab;h!5;{1DHoPtbQwiPel`0Qbs+6HMlcUvTu7djpSvvaq^y34-L*PV0Ae@kQ#C4I`wy6R&VqXoVpo3_8 zD2aDo8sf7aEmy_k2)Aw@B=GE>hv3t!2|dsC5t-{EI2Q_IWF{s~2ETR~EX z_v#MDR&Rts7W~HHk?Sn3_)1QNGcM6p?)5F0-fA)DuY>dRJh}$>MAgC~8+gCx5TrKc zdzT>hhy4u2AyIFHPt^OpELX=qMLI$%BwxQ095k8*$Tvkb2$BM7e3AiQpS*orU?@i7f{C?Es;qAU2BJyBltklg)vL+!woQT#KW&v{eI zu|Lcmus`1J_#(brq=UJ-5IJ zYm*JYy#c(?_V(^>%6D{dz|&ojvH;{)JyBbk|4qc_(5;TB3#uj>9*o%A?C&LKE|@sy z)GTH!vvF52=isj0O-ivn+VS%It6_PEqny~vTe0BE7d7#C1( zuU?%3mN*+=4%`sX9Saz=`P&4%HT3pTmfGr5_gKizB&MzQg}!QaC%v#@Wbo;3>ApNn zXLD@0!hU+%1O0HAb=z)~=C(>m+S(dNkM|J~s%p@#@woUGPGRj#h=H4P<@j)tt!?!} zVa28dM=iAe{{565VaI9MskI;d1nv;H%omVpJOS=tw;|3{CV-%jEvYHpALe0 zV>=hAXw5)Lq^pjVVQ{|@glz%!q!x~lFSEOMrYoPb=}uYc{pmj{P3Uj7zn790DTmCwb4HoW z2)K*^NZuL`fZDVN;D|}cPki1bHa6?;Uk7|v2^a@xBU-tTldA#A3fUm??DX^puuBd^ zgOLrBJueB*I6)3U-=PhHwDI5HC$~H>#!YVx!r9r`xda72NNrb^b7Vf4c8C|eiP86| zlf@{#5p}zv-Z}pIIQf?Md|BPmGDVPQ$n$n!ou3N}2vm>u^$8r^>NrP=@!yJE!3=;% z^4|aiP%=TH@LL|n0GS)Yr=qx@mS)AG6dlcL@tH1D>>7E{2z3-wTgqdOJ99<=t51VC zL|30@unm^kiPED-hjQ?g7mY^5CWv0i9Vqf+>L70vWv>MZIWVdC+{VC&Z5mtG0pIMu*{fGI6cRMWKobzr0h#F^^Y z5Fq>0fmwtWWVKB`byD0H&X%JwvK4phACl-=5f11kV}vS?T5cppYFy90k1arBeCfZt z;Yql#x;S|ItYekSa`bzX>>C0$9MHj2!%Qr!tPfJ6@md=V5{U7laDb>FOz0vFPF&nU;7LX^$$9d}NQLybNp7$sl;f8j^ z(1_P!yxP4l5&;7Hxl0QR4S0SOympVEgg6rh}!Wt>QV&-H)#N>xgd!&RRM82cz`Gt z$f4mNGv7{q**+hm1wl1X_fdn3A23?5eDTS_fqWJi{k6M*Qoy4LSoU#%IVRs;e$Rp_ zD_aDV1&I_bAO~PPA$uSIfm!g*JvFy#Kx>e52jc=1e-iwKcyzTbiXAe@_@xeAju^TD z@TdaG4O0uUD!iPVTO5$uaWCU_wa15`sL<`aw#{IKxl9S@0ADFBYOCm?_d;e%29=ZYSE`T~Cr?6!XK zq7UXaeeJ4C73@vOf`pX-j7KeW%9S1`(Xn#={f*#1oCvgVh5wwLoLY6cU}^xZXb$*3 zG7WkVXO)y_M1uJ4JB~rz?eS%{M-V{$^xK~(vo*Zi>V9%CF~Q9QCk93@7s68@FdGOI zJUy#iR>#NCHTi~RaER9pAzg(zxeE)H|FeiDGt*Z|0d4(93y|h0u8+4P{v^`icp!(! z)0rR=h4^y{6@q*(ppB(Q#-lM~zDzJ`OgI0j1{B7H*hKUzpJLtU;__$;uf}jy2#C0U z8Jxd1!*BMRKR};4s9}{qqhrx2{~+e=+hnqI?$5j%xNdD@W2hAoWp4yw0I&o?tZZzS zumm6xjrY8|Fwy1#ZAk>uM>_4z!~_wB!n4F*vY6{ibo&f`cBJ)?M8NY}grQf1JV6K_ z?DU7v3^+ml4t6RJV(<2^{|wdL0v1@7PzDKIa59p~Di9W{K?Aa|Ya*8}#@;8ZB`^c~ z1_m;~ddt0*jdX&{GSR7*HucJumO1$qv$T+avjlD!&(btZDrmz>#^(;fR+j*^>(lbp zX3vrjh-n6oA zvD@6MrwsU2`*~GS==xpRe50<%!*?PDSB#30%UOFTOJlBH8k)mr)+Q>{`8lJKq!n0C zpG_gU_nwXE>J`fKEkQpPR2? zSHH7d?MqtmNsRRqi|nagFDXXXiXGtSKOyhTi0_Dpiw{5Pcvie;nc)46B=8|3Gvivz zaR}*ndQ0S|Pn>1C=*u*ybFY~0|9T-bu&2}biRtVX;vwP%v_LSQU)T%h_HZoh{N8I# zs`|U*C|+p(!sXbDLI%yIe+?&m)+fK$GEiK9?Le1`S9VTV_1r8 z(2ZNS9*uTW%bJ^W$jHh{Wb}eM;<7gLX(FQQ92{o>QQrgZml{DM^dh!BC+OQZ>Bh!J zCSG0&(L`lZKXZ(32)&pVRx4ZMhM*uN@Tgg6^s*WPrU(h(w6kPnO|WGe%k=v;li;^+ zWlT(106{bz$p(_z)7VN&BaBff*mKhVy+4JXReS9RrpkBQAGqvJb!P!@SetwA7nZGvS@lRu^QQC+h#5em$ErQ=V z2tsPqh6rv{doX_2Y18RJ$t2;g!jCNJQ=^TXu}8jMLbJ7B`6(&+>z=ifSsps#wyGN_ zZb8C10+DpaE)%x0iwP6SBxKPai2L-ZfQe@>@p|sP9n-I@0E0 zA1b7)9U|oAue>L_hw(v14ehpdhjTZ(cn|BWWm;_s|K~}W{tA&`Av8GidC7*cnyNN1 zFt+pW`qozQf^+3t?HkOtz8N`|{S~#ddnV>G5^P}{&n=LcvxBr3{@BVC8@w5o6AYUP zde&WJ?jyjPw-KgL_N#0Ba8%Wj)7RIxV4sAP^z|b)Ao?%th@81ROifCByZHh&^^nC# zY5&cnFi*87=5^=#^dC2@$AximiPG{KQEWQN8ynw%)%^O$kB93X;F!&=tselZ6n^R) z_$dw^o@QWlE;2BT&)~ATs8I?^N<>Bl`Z5F;Cg8Geqh4?ZQsg}=ir_x`SGeAo^6^BT zjI!!&@|pW<%RvVXFXpSxSvEhp>(_mq%;#<;;Wr+{>i(2R6jcyGoUac}1;}18d7b*~$!nIzd~?XQvVxDFpWhLO zUgUe(OhvRond;2+m~HRwyzvfE+MDN)oa5PI7%oxzV};R$5?^L^_A?NUM*7{?*12`{ z30fTAG9+ni4k%LNz^@{3L=9#|Z*wT+F%ZPeE%w{FwIWn{rl zFnoA|bxiyI{nMvToq7-MJ3kEi1(SYBO`XKy2GNou;Hsfu@CKX>(2~vhFHsv&b;(5M z%^08eV&7elLE?}zcj)#5bb5Fn1!boy{u(P*{{1f0e~+TBaqFk~`VBvYpk-r(C&B1c z;i_r#kaofb!;F0VU*k32oW5p7G23}rs(TksBfj;7pM#u>l}qnO_e0MXSy&P~=U%Nb zAaob(ZQ2mkgI zoENna+x=|tz~?6Fd^5du(ON(~`0)kq?z$B;6Cl{4&I!eLF7|V+z?Ls$TDg?3n2d%B zpTR~D(q#w6A=ml%E`oyo0i5S9u4mo}c7Hc1J8-(f$Qb_pyG(+lH|@`#KXFc!XV*iA zTFp#u4Yhoc*)qUToO{vKApE>Y)jwx_m@2iRY1q?oD5Qu3;VQOthp?RB+eL&P!6S(( zsk7hw5e5q@7&hLwyN?A&84iQbDKz&KuJ`18zm9U~E7M9DfAX?AkU2|O>tPovy=aLkcw|AEoN?`r~%O z&%(kfTN1J-X9)WCbXpI z>mH3t>Qrf`mkIcac(YbHEus&vAWY26lnK_ztIzsu!X6!7WJOPIW#u>|ijk9(e>`0X zvZztw(WAq|_p!0TzkeIGn%tRl61_r6S<&|~vVA5vB*aOijv1B{go_gsHK#9Bqz*SR!qSdnR>*~ghw55O!$DfZls_iv!ao{#y z2L!m2YNTakd^axo44;N1rYz+5W0l+JyF>sl_F%EEK&RgJ@Z7tmSCHtdO1Ml%_bw}o zgAb#v;xJ4>FM0(Q0NA(It}Z$FVp;|g@)+%npP9}osJJHgry17yz$Qfk;N%I0v;#Jw zt}8qSFUeDOwfgA zHj_u@l~AX(7Eg4%KMB>avx=j;WzeQG?Bsux9g6}d6!v*B#vELV;B1#Rq2LxrwJ1%udZkg*h&mIQBYZMiL?%bt#xWIp=z9h9-$HW0#`%tBS^ln{y(T7{c} zvgS%JwJ4-_nqV)fmiX=g?epi()gSFlOr#r{``7#V9&aQc4qFwNh7oK*H3Q{@?@7(( zbIPlMXBgc4Fg5IPkJz9ITY{&fb(aVPuJ(WbAP+%5F%?^L{p|O5VD`D7SNX%!Q8P$C zcc0!xLf=@a_<+-%K8!cfS@rF<-t`31XsxL>sjiKM=T5s%cqI3yd~r>0Z+7uzmkRFg zASCA&i(rF8_7Z_8d>1>@m^IgWp+guu+C;#e>XuoJT^ML{O)B8+)8*%iJTej7E2f0mQVWaH9 zdebtaDEpAJ-e3RCr4}n-6wZA!E ze)zW?zbc@ZDz?+?nxq%CT z#U=ABl)CnNxpl@!d`dnEd?nQm<65asp}5^FfM9SKGWD-%z6xawKBvE#1x+6zM#mGa zI5D#);)3%MrRLuUVZi*n`y1c)*t>ak9O&1|J?(icF5tm=RcV(t@60cr%Ow`OgCX88 z%)aZ};6G~G%+0A{^lMY%md3J2@5%2TMG0c)crYwQ;2Xb7Pj^-F=ggBAzb}L=x{|FZ z9f)~4bsQuywD$Mb8OM;*3B4fqdp0i4V^}fumTL$|j4}LoMMP*Io_(J5YIFRnE_xSq zX%*8Xp}-s8fO@&ntEUNs$K6u@=t4&x<^uFqzQAb|>Ez@jbo09eog%IanfH9oC;dtB zZCXX@C{D_cz0%>vI(^sBMjpHG+UpArVLwU!_4aamfUwyXP-;KrwPKb1lVe1BDQBKGM1C zJLaxQzOl2YvrUlxJ+SI|qH%$bWSp5v_w^4C1A>Fk-oJlenkOc;ur=gA$H)O_LBYAKZ&!CA*4gYF6mbfo_v;_2jFam2~| zLcp=xkz>?zR-`RSYtAu^6jj0f(3C6nISQmC$d=9WiF>JY)oeY-Zy8myd0(q#H23tZ zQ(uU^!4NP0+w2j89e-&|o=j-%X-2anM#S&RmlQXKrS82bo7z2pTW9OgypzX1S?=O% zDjq$qa|Y1@I3v_#OSPJ|-_W;|7h2dO^Yb1o=DmgHhr&y5l6i3}YPyLQ;%_BP7ge9% znm#%_^VRASRdBcp4~JdLd)zNavFFI~9iQZFVIk9R+&tbQmrswL{wDa!i##AG2nEHH zQ>6w4Eimxq@CGUfoe>fYJed$iDF)a$LE6fS3;281qx%mYAhCJ?uIuf$9_aO?W@HdU z@02O%!fEVxgjoaI_#9Gf48ort!32$D377;jR_xJ5$gG9J=x6m?o+c)~At`Aga zIqEWE{Q^{sqhoJHC~Sm&1dRP&>x=}vI`OgQDO$_;u`wxK#BlAd+ew5v$F1x?+@jt0 zj;oIH$N>Ad4pYLhvXQ+F#UjFPlKyPhj z`AiZS?5tE3Dy$0NLQnQ6B2|*EtP)>7b*j<7(t5;*hvzCG3jzOgnX6Zca~sB95oqfZ z=_mx3kF7OP73wTqJ`{RKgi(z7vQo2S^rNlFaBWGyPq3i+)pbqHsjb*}TB1p_jaVM3 zb2z?=5Y%6eor>NnOBr1efrZH)x_Q(WUZ<w`*L*=T!H8Zi1-x1 z4?sxTX#2Rqz6T^g6?5FYDFZs87MJnU3d7AKy~DJyG68|C+DkV_&CQvENCa;IHAs)d z1+5!JVt$Q^ZV4g zdC7Ea4H)%|$FaPk zuoRa;!m3tn9=}e{YuJU&4Zt}&56~qP*xWUFVFKEu;xaO!q;a?)%maDF^h!tYUqE>O zvH88Cf&gs5TekKs-@iWq?7xR|7k~e*+{gZopc#@;fRcbx^4^c>sOCIK;YY90_oCt! zFY?n6UEFDl`Ceq-s5g|)g%tVRXg!B-Eu%IOMBI#-K|H@YW*iwsNR5z36hXij>v0Qt zt4Hw90`wN~sq3Ay>Km5&@H)uh5DB72mOgmQwL3p^OFQ&Yykj#nELAQWcJ?ckcCQ-H zP-m>wD#WgNc#@SstJ~nPgWz33Yn+UoCfp)XmOP@rmCD2=)yta6ZV9 zYFDZqVgz)Ud22g3KlS5NcCaULe7fekfPGfuK^?+YKF zui+YEGcYiet1&%iJeD7cxro&2V*mK*KnLFSRV8CQjwPI(54J<$TrHBaj|sKz`EXiL zI`d^t6$IS+KPFW3(6e=D!>nz?gGN$Q%XgPE4=;W)=$zZEsa(6hZg@^BK{Odp6Z)}h ziP>#&so#B!{Q?2{#uc|RzBZOZquRCfl+WhF5c#z7_pbX#dI}d=7`&~k>lMEHM4vMG zm>$z!XAdUYcJn_UB2~kN>1fYxT+af3MzfA!A3;_l+_N(chsmTDEeC?**fQKZGuuO(q;Hb0}d^G zV(8n3juuq+4(0sDC{^hTTr^lXl3O?DNYJ{So!l#zQrCfU7uMeitcg`NY88kCfPKAM z19G*Bh^$fSt;@4ig9vqXw#R&{N3$!#0)|xL63BkP1_+R-zxpA*zuU86*^B2+r82bi zp~oxW!GH|(Sp76nvMMUUj)jQYXY>*kD!7poqLh=%wP06Y1#n@%VQ3*p+{EcVx0zSp zlTdp4`|r_8L?k2{bVTrdz~AU|r?MOML|YTJ)y!D(I`5JKTju*%Y060kGCUyP63ZW_ z5fGq=iPi0nTW@W0JwrIzMzY;4j1vFhFWox1D5i$?w#Mi!Iybz9UK(Y&Tc!Z4L~x0dLU(j^^$}s zTQnKk?Xou;$dX$UTRvksU28)X6%s<=uLjZ`1CU0aTB8Ku%np%jtD&AmwXWgKuX3X| z8f?7Qc{epNC;l6MbH3J%9)spb@YXoT{mS$d18G@LqHcnx@|p^xxsGSdRMQ{Kx_2>~ zpy1Z$wS~M5cMIq_-{p%fmQgWnY@j!tX-M}mbx%^kEK<^X;CBmo_#QWCR9SymeSGr@ z`;3d{h4`FWzP9}qIO2yTB%D!8M%!5LKSV*RdRh1E6^+$HOcYKs`CydRITgO#yu6Uk z0YE`kb~-y(ru$68$@vge2jBw7q!qn?kv(e4FONq1xi>mC*6+UVj*ky1k^@;B@N_v;4qb->a_(o@v`GHFggLPD?b!)}P(^-vEi zi)=vVlk>=XTM!)=7XTV1&U`2d8YMwv`kks$dlcga0C{|`GD~m5MTP_V!uMsmFVfuj zJ_rMDTGB7UYk(nVAyL)xpk4tOJ11F$YsBH$5pW(jw8AJT(0Z*f4#IamjV1lcjMd)Gls zM@u~U0+IODSCeE^RGP?PC2LbC)dN)G9bIb~RV2@@&g1Wv_YNhpy~jEqZZNyCF!IiF z*8I%soPdes-Ed9lW(R8QSKhtXO1umc0*1S;ZZTlYlMkiInfq-r&3&b7L>MnGkg$y2RSvYh6^ z8zKl~L{Z%o>|Fr0dj4~XEp<>Y+->(214FM>+i}L*qDfMIM_`ysi8;hqtWq?`&ejzj z9Ss9II%p5b-(F@51EFNuEFaKj?zTllhBhI!f`nD@@wj=l_3*i~KnA+s$adW)6TjuT zDHh3L9nD8DVAxzIXc~3K2amQqnRv80-%iTt=n$!z2IO;Adu?AV9vnyl;A78?@jHjU z?-lgs*AE*(9oGC?$eZQ%YyaAN%rUzZOG>or0fp{(KeE@ZxUhNd^+&wKJWC%Mh#O_6 zoZQm9dfB&rmwLxJ^mPuYR6BhDp_q!xJnq>iqnF9mmRtdkh zi>>S0W0=U$uHRhJnC@$RP3OUrW0C4{*`^Z z7Dd2okud$b))sn0yGNH$F12_i^ipPZ}&w;8=e9!d$UbJ~d(wx*~{ zCBr5O!=y^w{br-0jJ!_4r`lPMaMc&r@>3b=dQ@UW-STr}?DV}oCBwmAiyf{*dL zm%3H|>e*&fW&2AkJ-k@g+T0#dFLBCC$?AMb%=0kOz|t&>bk};3oi~%**H*&sj zqE~7D+H{`}#*Bc|mjMtCvA_Y53Io{PBi?tO_gehZ%)9xDTQ24MSeZI}S}xo64ou!T z48Kbu0KFp&uN`WzdOz{-578sQ$RpS&c&V*<42_@6J?CAtd2IU`!OWd#+xwSm;i*IRP3eI!bfj{5oHVulTm^k|gTCgCX1x1i<>LP%?v)Fawqp9Rq;XT0VrbRCy>vylcT#kHg` z`vlq*C4pL}w=C|#H>g$kdqP2q z(0XvESGUEv-e~Dg{m^`+v~%kG7@`Q02Q%xzP{qs-y}JAlxI?};-5)4Hm@?213=~5E zfIo&kZ~pvo+@JCyWYJczAFItJrK{dsVMYLY#-A5yK}JLW!v)|ekZNW(9ii@J1yqIP zbGSr!wU%Ybs}dCu3|Z4sEU}x$4=_P{R@JkSI2PO$G$gcyO8eIECoBqD%`1_Hlz8ZV zYH9N^xh-ghpVX?}%vV)cWo^&dXw&JekB;hjXRML%IrIAXY!J$4^i`k1jvlAHLKWfNl^hyQ zCN?~FiJYs=7eXuPyVdadaz;W?JRj~KpQ>Ngu&BOYz&-3CmGMJ7m8I?e$54}gC0_TS zZGX&Z0oNOX#cP(sSEYh2uf5BCDFWC(A#(uZ2T(I{{`sdlfM+PLzT=J@ zQYj}8dz1Me{GFdG==e42I`2W0=L!nwhi$QIm_@3T}5i8fba zT&sre!8}R|{0dhkm=kS)CPHyMg=^V;syAu5ald_e)j*>8`sMZ5cqer@*l}XQh}-V| z^mo?G8;I_N5XK&p$Mt<)6gtE59evjA`z|J(=cIkKiEV=Cs#NaMcD`u4S_h;qHGZi33ppC!X6HhEQf=&);HI}ZHt-ywb{l9ht%WdALKme= zKoQFo(>qOeDa}3JVX-B2vxa7P^_OUr7(*p%@n{dyQ7}PSc|k>OsFg;EyJu>n+@DIS z2mH7Pg91G)AuTfVwH3>R#RF~;^vF2kGCib6aMQaV`#1^u!mt}{zPzlgtQ*HJ+r8?k z?=>IDLE)XK>&=ISWr4R2>=V8e6iCm5K?haqc9DQAip>w|OH^-M9xnhkoz-!pLD&Fz z1#AvtpGQDyQDNLqeA~|o&-#%)qycsSHsI-i>thxtLn|gGhEGWuk(>KW%VChq^7i`g z06X()B;~7TQT2q?X%$x5?jj^mwM@v5I@8)a$sn}z(?cz`LoY8uR1iA?{w*(mXf7eR z_POOhVZl|FO(_3HE8EIU40Dji&yimk%cHP<`DqRtm9s=6Fd79*Ybd4|*X{?YQFitx z*E4kqfh(p~K3Bj|b4oCz`Z=r7+d@`N4>JHD76Wq{A*V*QGSMEwB< z*kyYYZjfwmay_4&?5NLXa?PRsq0_DnWh+A}$KEq5|HaXD+s@}QfOV2P&Zq0LDW+|7 z(LF1i;qA6K#bD(dfZ)sE>eh!hl1#2V8;g}A8T>}Rc#85Rn=~w!nK`f0w=L&zc0&^Z zB9qKopAJ=b3wMZ&=PUces?dZC@v5IQ3cWgd@+<$A2qqXfNhQT>d>-XWRNeJb;sOWO zI;;A~*0#xQSyacu6poX z<&D18+G^Swkl3tQnbrO*(;Ys5-+3P$$))iU zMOP&3{bPeVEXO2SnXIdA`UBMNq`74&5CNa-)+v228(D&{^cEH>Htk%rE59XzvGU;T zk0!26&Y?cZ-@0xripCdfGOlE2(&UP*O=-*s${*Zb)hoU<)2kiYNK-|+7|>57gC+Td zuyaGLCAi(G-~(v>P<6g*Fli&y{F<$m$U1XSHu8kl2>Z2!T+GA-n}%cgQAXM0XpA$1 z4c|Weo}`n<1CS&eVmyr!x_Pg}0cbE?cjOG)hm|zf1ZpW!%Mh|+cyA5LySg1vdKzXQ zZ=$1aE=#F?+qhj#nnQeT#TiO{G@UM<$%lS5Jhww609tzhJR;&Di-^5JKtPCH4j%m2 z0XVa+z>6(6ebT(MFP^d9&?*WrW)hdX!DQ}MAe3pQOppSKSRyPO9HQFuy*YaIPQU>R z1UmRnnZh6t;_%G33QY1GNt8_)0!64Na3F5NDpCQt>*;Cj-H|PGtI+Q;6c1lHd}?$* zSx5q(6j>BT-N^fOy)FWNdwb=>cK&}aRrq?-38`V(OX?ge-3^Xm+nck!L-?inR|Q#r z0e&*S*GQ>4c(QJMCmv^6-hb__FHWa$uYOuBMP5b;Crs>{&QxI>9-`FkFSzIf^a*4; zVuA+94=XD4$Z+axzW;)%7K*U)~8urn=*cARO|;P)v1C zFVGDw`8Jy#whBYMiwuVZoAW%9Wc)|{V}b1)~Si(53wh#K%ixw%BQ|BbBlGVQ`5iS&XV)H{_yCZ}mL-bfyScrKMf)+f!B{K-+&tPtQ@Jf(2lZbcJBhp9LeRGZW*T zv|_Uh3qwszOv0i@wJT1dqw&AJe*si&ND!zk0TFQZPbCmDl2mDwvKZ4?N;9l~O5ipGIdDz8zJ+wBQA59JkBD=XUiY+9vAq8Y$(QEj@o)E zxE<6e9q3eQ2hE9#Ckkt6UWwS~UTGx(mM1?{xj>mJ@Esd(h_4F}efDu>t4JSSn0mcf zY8t+(q9@4#4q6|p8#12*33Izxe!N7$2^VOmZf1B4t=R$5Cmr32n!~fc8q9qwO3G| zY}Qwp)NVXMDiqwkxq&f_YWiR6>seaq*}-|pMJqr2AqK; z6ogmp9ZQXBepKl*cDcg)H&@uVx3ippM~3||?Br=?=L_m9x#vO}nSBR0SK&*ZhyM8X zb}ve?TR->H9S=mYY&3qqY}1yHTJ3|1=VCsg>85urX@CAX9#0jSfv}vkW-5>iK+g*k z8_@4tP7ODtTYEG~Eh{>*z1XxbNqD_n&PM*&38a#MLDyBuow{cS2@aFL=C6Fv>J$l{ zsCE|B?QCbAIz(Ewm1B1kbSRKI$sghe?n^9$66pS-zNt0h;7&!l(`zlyIB{T6^|$S^ z9b1BL$%(WI4#y>Ws4K0vkAO~~31&Tx#+?fC-_(&})i28Ve!X(%ZM-2NJVmR&thuPBCSFJPN$x@ zUFV)`vB%kIxx`2{0|f zn0nrKO{k=^cFmB~;c&CPf4Ll|*BL}*v!+ABj|Ky-Hne>ke=MM9NS_cV_4Z0-AXkbj_-)+-^?0al8bn!F`GO z@AnMQf<1>;H6KDWBxIPdlLl)P5eUXkjJEs&B7mG7hHC%X>)nGiG(R{RkbLj|bN?Hk z6z`@a)IcQg&u=t>;=P&wjK%%;QE{OmMW7`$|DEn8Ox@}Ud#B6vZVz3Z3#kcFpLv)Opk{7dfN zEHopI^l?8)>1zL;Rw>enGrpU4WGb(g8&OO3VjmLfQ10~AdUUuDRr`lSo9}-7$_`ty zoHH{_0?OX}2!mtrcd2D}8qBx@CjG*a=W)d393hqK@5~jlB`8t2^|Sl){l>+J!c3B=LYczQkgaVx@pg0oQn<@xg=$I*haG82`eE53M8 zJuqq2l_yF`yy*t;K44b!MRfxn7=YXrbAk5K+kwq3nE2sE270*sI)~GPB z-gax?_N}F&o>j4yX)}r9<6@x^TP61=@=_UuSAdiNZa;Jvs&gHFOn%zjrdM|ZEC;O} zg$@tznz^L$FU(<*C!MX{jHF6^C_8D!tU@jDvTm>v)3cv!-QOigvoc*qbb64ej1*+)Lxpb zG$HkrHXz!8K3kV#(cKfx<2K`FcTAs%1;m6clG5&C43vwhcfyrYzdo{8k5$XFx)F^n zcPl`{h_S70IpGyQGPH~|K7N_C(X-Gg1EB}z@2iU}ih#;z=xX*$=B(;CyEBXg-pMx% zp$NNoaCv)s-+2I~GR3=2{guo_g~Z+qVo+;)P<+zo*57%0S8Hjc8wKVl@{7wN+;20h z)$ghOkt!+9+2b*9-+dL~uzT{*AC+DG4Z0;Wb9r21hvO=;jaK~wP-0dz<3DJxs$G0x ztw~Nk3i4I!GI~=^^p;}<*v#gGVkak4jp{yc?PToVvMj!L69r0nU&V;YFs-ZG-@ZkB zCyGF(S{hJat~9n3(9p01Cnl;sE$HhT_B;+x^SQO{VCVLD>pQi_Wsdc@fgubhvZy0< zDSSO`ya|V9y`9HfjW(lY4SM%N;A3x$Ubx|}=_lABMTWz0Vc#j9B7WgsDN;jm1g)L& zqQ|XTLvDX(;%VT*jk>7Ic2Jb#xrWx_#pk9>7Of)8?&+-}_GgY1RfXu!k!j5%HUL5N z348?|_k&en+t?Vl5Y!5IM5Lqwh0UzNmJi%z2@6kYpPTdh(!DELPto{*OxHQUH2jPf!^F_`|#+s`6?UtrOY#P zsqgq799fJxfe2Cpq4>bRr)Znp?;nNQm78-cY2LyU zORqyI=UvH{5TSd1GUQs<(FT!nd-K-Y4R{=tFhTG zix5*#VE>!Ye);mm8wl4y*Dmo4aI{AN#NKUOp{B=4rVJ<@4g6**PXUFes*1C>1@JpK zxf_^TS^;I40Dq(<7N|I}LDy9Y;Q2rp(QU!Q#RXb4h=2lSMUF=YXq3$u%c79$`iwCW zHDSvN#U?PnlN}EhD>+Nk2Sb7M?qVn)m=;UN4?DBRbNqz`Rw8Ew?L*`lh7?RNjGF2w zBNlRLCsB|qaQquXe=yRMhM`f{uPJjmK94=yGxUSQ^T*XrQfcu%UOfvNs&Gv&*uY(myb zKdW+s9)ha{BP24!_f}J55!F^1Rm2+p5=|S!n>WQy8YAUY=4|wGBJ8O=2F*H;g{hc! zq90YHL5@cGMN9MUj0>H8PQjEptsusBp>JN=@t?{&9pq(P$g1)i7O7!!nuA$f8x|o| zSlR=}WV>sx9Gz|_B&qce_89v?IGwaod*YN)3?^-)TiIaBe9(f8SS~ z!Sb+nv)Gs6Hkdx@^oDL%&cq^-K4JsI<@AdSK->rX)V)6$uYf%vH|X!!H8wS+0e}@W z^?nVd_dg)iCPB)}&%d7txB^ViRzPDa))0uHj2Re8qq^0BV&xtj0oX7E0S(`$urNcw z_rRaK@A+kVUlthc9vvMe@z^}Jz)Irc;aO`wUtEJguw!-G-M1Z5e*ZoIRO5%h7C@of z?WY%5@BM(7i7Ph5(KcLWa6F~Mo)L(Q<}RS4q3nMnWzP#ekGG$0&rXQfpPiq$kgi9n?Un=~X>Ao1gPSp2GS$rmYH zv&8gb6(G;Z$b7}Y2>U^dt#&q{(>ee-vUNOod`WrbjE zROq0_%63Q=ftTg;1hl0hSQL#s_{v77f)aET7xe*^<9Zz-Dc)5#u?%q7<)W@Abuw#8 z#w{Gzzu!)+RTpRqpa@Htt$aQ_3vaemdehKfLH)rsc(V@$WnUVwgTmqOzAq_0hN*tF zbR@qv)Ryy-#2{FQy)>G@+ z$HKTb-e&ID@2pwK;Fp+}3yt~(g?^yCZ*y4;S^j%WSr*nO8TM>5kTl{Pq3+vn-+95E zXAY&OqaVT%j?08PZ?E?Qj#o>?K+0ao*hT!5rLeyHW*|8w>a_8}$h7^?JN*S{dk`hl zeyAvY_L{KOGkC8a(%J8mRHGwwzVq%Vj~kKw;YC+OV4(mH0o%7y3G3@`{A9gtId%)J zXl$I8P3xXRd};kjK3>0x9&)7zXzWMn>nG}K%v^?2L41(H?hj7z*o~tq>wW3^aypCWnSmBvk&RshPg4Y4RSl z*1*}-0Jyiz>#;2ZqaMAS*E5-#fH4fLIm3b1Z139D-yj_Fx>3^rYV=Q$kskqS=C5U) z`2-U%Kr}SSfd35Cno(*2yt%G{Q{n@E3RNvT6ySHT0Z89Td=7Mg#Z7RvSZRU>Nb-V0 zk$~s~=*p~Gd2eah*zf^EsTgqRpj>%Uuo+sZ7+vm5>89$>R0x}wq;{+pAN#efd=z74nX_7YQ{^vODU{mo^qlTxo zMhU9G@v)rI)b4}133A4mDO+S=V$bko440L*m@?_#p1iMgD$yGIemGb+km^x--N3U z1mwJG_BRadwKCqp36z(FWn9za(#*r|DR3^YT31iU^^?)g>FrC=H3~3GBR+gDKht{^ zpuEs-5oZt{)sWFk4~lzn(R7vB=k6B3CmNZz#3KeHyW$*%W&mxVa}BsmVB_kS0Uad( z?#ZpJK#K+#L=SrZ-5}Xlo67~_G~gDtclbIK_{C5Ff2Mh0-bbDZy3@cfN#^M2Uf>LT zJkn~bs_OPSM8CBLFw`6${)~uyc{Th|Ps|55_{66Abg(I_?n{RQIhkg;+f|zbzmV=K zcLwf#-ZJ#=KY=Da*6q!nUcon*?BN>IU;sw!UIGsJGhKN~Br-kh**WXaRf(2!mZlfi z4tAe4nM^h6-(q|7zRmwC_DgBK(yaqEk^7cd7S=z6HQnRO72V&Ex!*}(NU`l-DIuDQi_Xn`l5< zGxz?G!Fmb*;KP!Y=!4DMYf3*-ZFbr-;@&f#?<65@QQRLjL2u^P&uDW!N%NU-nRcE9 zEjVh-T)*6OBUsrv@6FRJrbNSD*L?fh?wDbMbk-s+y>N~mV-@?5iVU54pa|_3l2y?& z=;~NUNr~DzRgNx>f8rhBacs$uF*WP3x(NY44cRyP_f*g?U%Xa@fHJIharQAAz)009 zKjHwPu#Rr+V1}T_Gf{$it;iS?o49T4VCI@*m31uxzY$=B4JvRRQKST>^qbmp7St zK&O@v`=BaM+m?H|pA|tAX3z><xWXg4D+ay-pN z{r$J> zi5ggDF)KWzhBmHzkJpJZ5-e?)uiM4@og=q%Nev(OCDuA9q<$zpPDAYd{6?NaY;y1T z8&}ZVhuoAdb7y*!#M5;|?K1;X;$q#tzHNMJtCngP5^O)cSxub>t%G;E#kywmr73`t zp}EH+y#kRPp%;RQxP8NB>1`WIU#=|DMDQrj215kwo2(>*4L#Borp!Qx;uc8oa@Xm1 zNwv%jE7T76YM1^1-<{0ryngd5AL!z!o2rwDVZm;_hae*%fiCi?kWj{+VU}+4|8N0j ztBb}r6X*Ev(%iG96)0dlx>{RjW!AlOx`*E}mry*s{KUtn#6h%I{11GT8I6J}w)1`< zO|#_NP|q@#YyzZU#>r%CJYuyN4l61}guY2d2AFRtRb}wrYY$KzF2tDCnO6fGBC|BD z36L19ehXhf8;Sx5sU*7Btd224E$5uPSs!B0{P4wCkY`~(hsd2o9nbyyv0JUeE9iMQ zHz=z-2F$L|6mj@AgC7|VLWqqVSv}>?d!3V66tB+-6Fp(3cgVGyg77u|B&+?*sapgj z_UF8m2z~hBk!g{sZ*%cXJbHh#M7`U2U)Q9eyIWB*`bE65Ku17|;hlI6y5G?J))7U0 z)(`)uIu?q-xrT9>xFnNGw+f7tWBH?xESx^Vf_@57138Q_84 z4FsvjK!+nuy#}b4v6Igtfw@3A5Lxagm136XPw=~zn=quBTjYJd6ct_2lyqd*!+vaY z4Fc5|*T1M*4_}ATONo|?Cs--3NIH2Ido+jNyi@*{+XZ>d78QnLOJ6dk>O^%-X3#4O zc=2J^-+3czIpBnD4h4D-XFL{)Jx=X)z!|h=*WAM50adkO^;SL>{3ucPPxD36AK#f9t{zTu^!oT~ zo&aFNBhYiy5i=d65|vkPvy~(u*pMmmh*^wM8CTUeGgLo(`?dm`w|}ePzuo!TJN6iY zPuy=Xz)YgsgbU|vXpFL^%s&`HhxOCQ`&iu%vh|}wBoo;w{&5L9z#Q5yh znwg)!?M{P%5~UJkZ|@8@L$7Lxy?mo01zFwRzs`TMcZLZcVDv>|sNI79sry;mubgp;L!E+>27CbfpgcPyp5g*jQ`b;=~l#MIDLi zsS3egCyNL?Yn!=?%n$V>nok~3S1sAiDqk}8l0NdU{)!r*>m8EC=kUW(>(7?yH>s!~ zZ&eRFmCw{$e48ANf0BlHfET(BnjSaQ1M&dxqnYm!V})UbuLVF|{-s47r&$>{Vs`cO zZA$nJoA-534Mqg~TGjHNE!6&_nu*ynw$4U; z@k-5kOOb_EweX}fw&BST0_mgAVTMRBV$F0S7!eFHeL1bepyCq(HfXoi?s1ZtF`!h| zdojEPic(jtg7*!@b+!tRCY7NT;Ox8!uA9rE8@;TY+{0n`_Se*DU|PG+jsE3r0h`GX z1zp-r+D8EDu#w`Enhp~Yxdv4yEL2S(T(-|inY+dzj`AK|BW?!nq0^N&4Ct0$@5D$`$GFkoX= zu&RuvrjA$^N>vs-R3rBr_#^xmfD6={3xfZFD;jPWe24Ue&Qd7&ffC=ZQlU1k3=`G=)N{6p<19Exys zIKtjdpbnyNFh5OR!?^t2@S<0+l(MxCbk{OB?jgn>K#WeA`&|AZ3Niumm81{1CFeo4 zeu!FymeOvZ1uH%R!9yZ^Z{yS&Fo%#Gd9;!mmPD8UWS!KoSQIIw z5ErWgt<|`C3T@sw6&;lLraqS#vy(-=(Fv$YgG%RHzROaN30}feG)gYTgQ-98el;tc zuEO|Q%=FyQfTAYe>ztBW8eeRBBk+up1C^kxCA4oaRT*drN2quq>3si}+{B{iixwml zF)v=|eRDw4&Q)ntxLCkVW=8bckLq$tG~v8b^Pvn67-~)Y6kc&=HomAvHp7}f!?7CL zKRN9pP`nZpse*K&TC#D4P+T(piyx}a#GjUspq1xKZseCdQ%gyJpXdBI^nD49JohZW z=wnv%-o?32PWIakC1jJ0lvET@4p3)4f8FGR2bE(zhD0`7TfV)F&v}y>_Cy;O())YF zV`|y`=u5-i)^sXO%rlit_e6U}g{O;fdh4B|syEn=Eng}4vS3*#`dGT`N~fEwW_#OU zyuSA0kw0m?wBrO6c1Hd_>;}gMCiM>bEV9G=VqqFzPmNFTe z9;^fpn2-?z$6G*`54<;b@7dtuFo>imz*wJQ#SDk>_+ zz1a^xChBpuYON`^9fvIRChS6yy%F@kYO>Z5NjjnXiqS~H;86>kbk9dre{=?X?lpS7 z&$mfPkBH>S{?XMZf9?;KY)p!?ey3-^v$^@7UV7o|su%kS>|nv|Yxwdb;J0dQ&HMB{ zyiiPDb&m@`M;R8Bf_?s-8yhfY(;_-esK{&i;^uNE<(T(Tz|kW?GNBx)skv=GRUO~= zJE$oEA{B4z>lV{zvu(V06rNrgV+kL8Ro&xCS--ffl^Eg~B(8d{BF!!}nx3vEkgJmP;Y*@l*cT(&H(ZnlKfsTp+Fkd| zLHXVMYeX1PH;JJ^yBxCF6G&}5Fd{tpSGnTXGg6hu+Sf8q_VI#K5u!o*q(eNK)p9t{g93uo{H>6%)9;73 zmpiPQR(LeX)^#hWN4@l!O2C!n`uZA>ou_7o47pP)fVZz^N-+@9r#Com8+d3hG`dIu ziFt+3op=6bSY%{Zm09EggWin*z=1*l(6elPuKJ>|ylpq|HGtfjS*zluN#1 zD&ddlT~Uvod_TsluSc{+-rX)wu@x zaQ0sm`K<=w>|IHk$cIA3^@CPvgInMF-@f(ReZ=t%FtdKIuHgcPz{uS(-U*AfcRG<| zSr|5In#Y;?LnbZL+S^Z=OCjA34m@10Fz45rc|T$|ZhD?@?U`vm@pXB7spK7UoVFg$ z{!^#vSe)v`bF0gx@A4iw6?Rc;#S$*~%0$IWiId3YC;|caNRXDgg$Fn6Al32v>ptn> z=9@My@myh!cS^NqlG+c{qctu_((*zIOR|@x-dPRFwSCs?R#xaNaGy(mJ`+6Sqop7f z=IpvVPxSSzK)n;ihHARg%rDEo%1z~lmt6;RCN>^mIEE_H^v=%;#utZRmc=M=$Ng=U zKWTmh{0-iL*&H1;z)Y6k`}4kSUu_pkGn`4MLs1o=;?#=Kix_H;ZrKgA+xz4TA_lB-%_2O5-lx; zvC*?EC5RYHPF;OuZ(4K%hzTe9+;E`vb-uCXV5*=dm7%S|g+}GS-BeK8@U2o;XPZkq zvgzen;7dAGF)MjH{h`4?>m{K$W?ftdg~$b=4Vk=+gTq77C}ZRL8?}|dLT7@L+1Ka8 zT~EjHFsjFH1or7Fv8l@TCE@#@j*Up>z<|F8`W3uB!$A7T1}tM$_6ZD6$G07mfSF$Z zo{o;r;n7jOkySx0unYr(!P#P129`0&-_QzNA|`h4WB1I@-#=TWNFVh2R8)cn2IRnW4blOH-(M$xR$Hh#?$4_OF}E1qXFznr z1gL#nN{V?Rcaa7#ts|hIu+&@x^tSNVIojmFehXN)c3W#JD-!_nvt>VV7z(iA3#fdu zjf9F_&bXS9ni>Y|I@gANXllbos>hvr|E9nYkxQ*Imqj}Eu}-;O8ya-Dl@r!H zK=yYDx$gOcsmmZ78NbBW8}^MgZ-W=ENO8ySMh;%8KMYCX+8tc44d?=v!(9 zWw1N9twQLAU}=(Ve8TTVe#Wy&I)q5gJV>25{&Qr+WAoR>OTuuBY&c~7Y_zT)giT-Kq+yrBDiK>fluyWUY2yV9?L5oRAQuS7+j4{W2=_^JzOJB zVAzd@@cxdog#zv)VuZ8WCl3s@C*~Q}R#iW-{T_aM-_9nHSLAH& zBE;@4EDw$-s}9fE+f8G$-xqZq4N&jOV&zyB#Mr*v$*Ji=6%m6dQ1O)&E3ZCny>p4$ zmVTOv^;cms=Y+UNb31!4?AZkkx;in&_+4F~GyfbIxaJ91Cs$-#TzW~Hj}QhF6%=&V zE!R4t;7g*VocZ|Kr~aOa4=cK!e;B+lT_H5asWlF-sOdz&2VXRtOS%xh0?{=RwvA}| z=fpPwJK$l_`>%#VLhyBT_NVpVzBT0yjT6sfz}U|1pnz%~3dqbU0uu(o@C`VNB}dZ* znGX42jRiP1J;8%vbz+oxcXE$Ej7mOFRTJr>BoRFn$N!FgAz|J6W$9KDv<>d3Y*E9y z5#~{{#4Sz^9w;N|#m`uJuK;uR;#%HteEg^ZU3*56JJgWdk_ou1?=$2Yq_K8d*5RA_ zl2;udRe4+Gga$q~`%j_MCw<7aOVTutN0B;^@$sm|%*8~+%apzif15mt$CQLA(;Zv8 z;!UBmks5!OYZj|G5_WSdlH%S3iBFdrA;IWJnjh6r0^*jvcQpa%O0w1%gT`MCtI#CYl5Vqc4(L83)TzcfsCloeu&9>$6L#Ch$L{);g-tcsSR_Q7jf%M z%|4nTxbR>p-e36pWnLVJAA{1G{m%m+%H+NI`IGYg^!(@H`~Mwt;{H>V{P*bYm;dz& z{~p$MdM@SpDp3gQQ z{c~(D9^U{Fwhi$^(>TkNPhObL>HPmEV=qJK76=ZRUX6`2a_<7=!VyEB(=0Fi^fJ$X z_M{I@f{eO^i0F@#Y{J0Hy2`bfhXisDzKR9eK@HF+D9e0wQKuMvlR8>9fcb&GWM(SE z_tQ<0RJVF3Dq?MtOrD8=*bg9!boLQYP41zs0hLG$rJOB z@cXmu9P+@EvQ5DFjPT%xhyoTy9ZH(c;4$(`>d|)~@iR#-qVo_YmT{tf?BBYEcxW@Y zul)f1nb8G8K)1U>er0J&^OJlvn*}CeG`gKr^g3lx0%dXXSc6zxR=WzOyxV(~4Fit40jArp3y(yK+pcZqs#7725;L8iZ)TlDV}5FFZL^{x1F)}4`1 zK)s(KHSSb>-u!1}u;qh!S(#{EODF&I_bTe`vveCAO-+}M4-5w3<+mAVwW4r=G9o`J z?pWB-n-M%so#!cw^WqpZrBFG_DcaQ?vaPYKP{phglq)Ou=xd}9E$X=dTJ_k``J`#A z{y~Lp@%()9*bs8{d!9L*|3vP6j6WQDV~37*r^dExncGMvOWq-*=nj%RwhX+GV>jru)||PCb&?wh2?EmA9YLc zXL!jC)vjMr;z?y=j?Ueo_w4ztbUr=0^ht+c!Bj&NQkg)0cl}Ks@85U0dEPMy@8Wm# z0-`ZaQV62jqMS&w1u5xK)v+Ha+@|?^$tsM^2&X5qd?F_b(&Uc(e!4jqlgi*wwAoLg z^>?Y|%Uql(vhyFi>5o4(qc1leS$bdNKkAc%ehj`A!SLOlRr0)+6us&RCUlF5ojp{q&nVks|qD%dII*9j2z7WGN4V zv$iN>h!_bN%${F20BJGeMRW3|IcNOac5TAQ&=A#J@rh%WqPPb^r+ppeI&KEzEu>BG zFC^O$o@PCyjjrKasbRtSln;c+KKFBrLE47>YzIG)R=e2q4=<;Xw&XH&8PC2ufe{!H zj4Uj-0|s`K+h(GO@_2sF5t`@&*a$}RAMX<0#|ajD0i*z~em@kf_mW*%;u2dwe|i;g z8;Lw=a11Rt_w(Lh)s)V!6hd&`i%+BhjiEMjsB*^7xQIua4bJw=cCL|i`1Uarc}=}Y z-3}-B2#;ooYGri%f3%%tP#xjcr5kq(4#6R~1a}A$JU9e*2~Kc_;O?%$-Q5Yng1fsr z1o!FO`%TS{srflooKr;|v`=@x@7{Z@_2g@D2`#qSP{&!=5bypGhW@>dntf3gxFm$Z z+Jeha_&ueR)u8l`m}<}G(m^e>@RFHEdDnCGz&}NG+m^A{EQjCqC(V>idejbN&=#!k zqB|j8Yno=4$A3@^8PfCd&|hFWMT6m>>lxMGTW-&5y37B)o0h$!Rw*C^d6egu@7~v0g~3csj6Q& zocMN6X`L4eCkE|b?nK4rhbB>oscmf$I`Qgz=1AnK5d}9b#L$rXLXzVGY!i|ztYu(? z_r4XuC)&P1RkyT-UEW~(D2y`TeH+7cyy62`b|#6gK5Z2&oxZVg=t4j7j1_)NL(t5` zU!r4+GF6|vr6^$0vhaTI#rL$iw}}x+@SZ!q3Uqzco_H6E0KM+ehK}c?lWb$SpE{*e z7~e_Lk8r1I1zLYIslUm7hc|jlMHe9Kr(`R=^7wiYcRY`HPDd04gp{2>d-X~fxz1q4 z;_*X+l}z!D1=jIjh5YeP?u$YTS#3e6xJzcyctm_e6uCuw?O#F}Xg+3$#xkW(4J+52 zufV2QzM#P0MfHvd+Ri<_S`9zMa%R2E8FwBdM2_MF=C9<17$|3tyo!l&E@ z$u0ifYauy4Zlf0o@dGU8ErwuXB*k_`LL`88Wy@uE^43Dyef!`#d{Vjs7^JgRT6Ze$ zR{`_E&=G+DWs+qIpJ|j7ejG43MHvT5)+>zUHySOYINW3O%oOxrgGCRG)$~{8PQ76z zL0|?u2$rV;#guAjausUZpgOCEV_w@IG^mn-nbcsyBoFAo0D}*~PD~^=z1qf!hUKlg zy8ydB%bJ>^Sp+l!CD_Blh+9nI9YB&11U)LULT6&(t|*#+t8*N zh_r$P%}rn{a1vxW+i&=;cKAVb1LWV^FU=yZRirE3sJWxdDevh z0$5tni|IJlGybRvcQNA~YF?a8RkRie!EyHqyfDe(JZT{LUdtY-eS(51mqHAl0 z#ZU6_^^wzi?G-bU-k=jhKgl8mCax8x~h3?T<3AqyA= zPV3}AccSerhSzJAvcH!lLSXQ4OiKegj(f-rM`fmt7SIfET*dUbU+~5sfFIvQOgJB8d;W z?D9_p6FKeL{7>s(QjT{8oFFLhZd3*0ZK3yKjw z9C?&i&1(e0!)nH_n4wGu(PXjnn@PW^`wpi>Q(8JnRN>&aUOWs`Ub^%kf$wx*Hg_|d zrfRl8v^t52u;>$6)8B;N_^kMM#8_z89+(y_FJd@Cs_40%eA~6C+jbIDbzkeB1g(Z1 zC)~B){|1dN7w>2znwP z9D)uUF))9~{d@KH2H%Yd7>+SVV~bo<=f24CtLKfjJqX8xBb*zA1M0H{dYorlcp;Kr zJj?lhA;G3kVX@khappmG!% zSOF2e;0M>mQCZd2qFHu>HOOLP_&57#lK=b}Ru^RHwmE@UfH>I8gaFpo)`TlGNITqb zeqA4;==uN4#{}Wsc{j)NP`(7+!$4u{RT}=km8khIl_ky(*XoKVyCHJN1W)rHkj-$u zT8V@LJu>1pX|~HPAj@`!IMdxV3&#O z58xMjA;%#Xqn4^nLtlR``nVkMXWrg4jL*2+|2)LW0`euhj8lqj%Q~|fkE(5RV`=#) zzM})3-ge>hy3PZ&SKK|l*V4B7pA{uGDAAv>+mGi#h%K#q zStr1)k9}n!5bScnIly+>;y#ncDdY;7&5x<$hnO+zMU`#Yx^RD9P52@fCz{?9yKQe7 zU8H?0ilKvV-?w5nV6F%ifF29jls8Btb>FhHV59;wqjIlyM&r{eFReI+uInqNL`M3C z5J7iCmkQBfwR!VkF5A5SNHHpXj~afqpG3t?FqGQJBsgLXjt%ugp?G* zSe5`%T}$Cvnl_U}m2QVsoshQM<6+TchldN=9RUbD`US#oe}nlUW$JP`BJ3|e{?oQe z#>#^Dm1cETXX^qNuwP}D{_R0N{V=$}hn$=NUVgN5)j84o;zG*v_N59MzzN^>)o4Hy z)RV&*vTxfl*3pU|Vu|(j%i`5NTT3-A=Rb8!chW|KKfkH|q+s*4BKh$yBU`G$EP7EXKVH_ijT94>j;yL|=a1(Las|%IDjv zxk>FMEwL|RlAbnvXs&SFKPwY6k861TqM)wl*dYi`wo?ILZ#KTg)dJ%C9rldb_d`No z!>WR9b1Ua17Au4nPencD8#~Fd4${d%)RAk(EHzWqOJsFibb<>SF!j#j6=wToaRAbf(!xfyRcA zh}M&R%rfR38Oxx@whmyJX^krqv|}I?qAxef&e={5F4VvYA)!-S3&`mooG4>9T94h_>T|L>mNd z0Bd+HpRS{u|2Rja&xtA32#%jMBlvmQ$)5){lDzl3a65AN>hx?4wuvv)12=B7_HAv0dYrO=0P&Z~y~DJ)bWJz|l1rS|@!_k245f zPlrwG-l8BV!~Oce?;o}=;=S9eyAIO;$j|Kq#S7m+aWQ1KQ}tN8@xRSV87|n|jMre8 z$t#gRXrd(l(IOPOwG4*hQ_FY#9w-kjx>F;4;W^9}xZ7@XQzO_=P8l;BTy!8$mJjmxL4l zxv#SFC=YXu^2yz=H>YP)a;wCctcsWi50}6B?)N0+T9UpSVF+?x(1^6>vhd!T0=}AO zktM5pTigB|8bxYZUw=?N5&LPB;;+yZ|M{KXcHV>iQJHkiM^?1ssLF%ls+OI~*GDvS z_xy;HG}n;qw{62x5F{Riz60jiextsRKx6azw1z@fY^3L)pl zzb!hpy7uOr+vlkFp&;54jl}2KKJO_dJ3AUoc!dJ~soOwoXV{wOmE0wWoQDLAS@GAr zpR6a#)R`gedIUlS{xu$uF#nyw2q7WimzNX8s6Xx0!0v`tXc(dn;q@R#VmUbhz8wz%s1Z81V{3AYUoir$zUp(yTO1__{wY- zRm?KtryCL+Ln={I(x9pJrZoEx8Mh*$Yb70;CnGS_7SM{06BMFV0C>~>t+oM;DLkLyqW z8rd#Ek^(FY7GUP^eTwz1#AgkjQZ*Xn#47K3hiTK}&k0|%6!Y;3NkSl?k}xo#n(v6_Sx zGv#N2t{XDZApQNZOr|Pumjd3_EVjW`a+DgOtF7Fd+kt73sHD)#Emy^xgRP}YkuG9O zUtWU{Z?wS1bp!5uFYJesD+GWJgwhDP*IK8`FG$`8L}CH@AF*=D-_XqK)Ro-k5ZhA8 zP%v1rJ^2>UVhH{y5xx+x``z~8l_9=;Uu-NL^mdk7^;)G;PRV>_Dt^W~;4Jtca2cBY zUB9%pTctpBZar{rYa3{li|ly}zU%$E`TC?fs$g2HH3zLB^bRrdJ*)U=^t6h}H^;OJ zB)=Gh2t8g&Xy;1&kk!W#gHpQcY^P6?%tg2 zW>rqEId{n{M<;STj8YreKQuLJRljhL+-5Y$2}H^yOX%9(X-=hIc;N40L;0x6eR_B< zt+T@}=25IggOy3F_##=ZN3QZck})&6EP+6jf_e$Y%z3xcVW~2$PuKvsW#4m}xuoEs z7dC8w^@XYS`f!db!Y_TZ1BD?X3s;RCnewf{VgJkW8}r?TLv_!qd(oj3p3#X2&Pmag zIm?2U>W>PoCN+}F!>hNYf}=EIPy`X2ttYoP2g+~$#j{pA*KHqJmgnREGRaJR)Y)H$ z4Pjtm4Ts{WP_VgO!WXUjk7mn0f^_obRtPBAe{Xb!8dU7R!NDmwn*--7ac|?8J4CEs zY1pICbcSYs!iRJqK-6#{7@6?aHp)}z3<)L=ARak#0T8KlD)$mPXmY~L%bZ3guyjbA zT&+IeRby6b7h}$AD>Q7oZJ^IDLapkNTbjF>@PiR>DME4N2K?ZLE?J0%b!Whg`Q0E;QC%v zdYp#~f*_NvLn#vo!_fD1*!+j&u_FwIjey>`_j-`W?bO8&bOH;X z)0j*hhf^@Y)gKJ*=2<U#YJYAeqj2>}M3RxFoQr({Oee<(N>x4*{8r-a+!*2KBw ztC680Q#=32zpY1`J~)r8;YB5pap4_QQI^ZDQcZ)E23P*x4nC;eA;6DG(`&d%97PtE+3D%#y*;S&Vx(hi)yI4iuI}9bI|-= z3u(|%-d9HE3-&1n7bfmCDXc&37Ip9J_KN*#PD>+{NH*EpZ*x|5Fs&VgMkm_h{z+b@ z5S^Slje=|c>^~31&BbOJFRcMj6>=H( zTNe(FwZ=YmPqenA9hvQ8=ccPKmRD+z+q)P-6f1mVjc2Pbbur4DYt!X&#;_MgP}ZDK z&3SWwvF$Jbj5#3{`?1Cr8Lh>P4kFc~`**P)=U!C~2|4iVKkZ@@3#`EO=vTjenKiel z+%;jv|M4S3kMI6*E*mE{=0>MjQBH|K1e` z!u8eKLJCP-eUxict;bR38QriPnVnjj@9`NgmgKYQ&>d+~$$=Ricatrm(LL0jSnVPb zh*dem8$_&lB5G{S4C*ixq-Sba*`DL4f+{%Aq3tixF`WqCoPhyea=LZsWa~u1+htkR zR5@Pi*bxIwabXFP-;v05T1BXKL=mBcM6hq%wh7rzy41f?yT1tH{dIL|TmR+rs*Wip z_4cAI2S9i4j^Co2aqePjycgp1{-}HKreIcM;%$+>t^n(F*@r?O6nY`Je{7CkeY#7r z@VH{|JuyZ?_`9V=I3-4unfj-^xSvL1a`x_#N&wZ-6dMUMzaLpg?&c-T=LOz@_s+ob!&LGy)yy91VB(_D)Zz4cpHM+G=vo+E z-g`%I(#Jhax?6A|9>crRXjOfnU_b{01ZQmj)SYzwc258{OU<;JuCpKRIbP~upD5LH z-*vY|deVl1>Ii;0u_f3gL8uMq8R+;A5Uyk5%aeeo1!GZSP~IQ{67^1(=3a;^+ZaJ0UpOvv|8}$xYBz7* zZ%p^QGwbXqHUXjy_Q?O79RJyCNwF#(EN;5YeRZ$9>kr?9Opr>K|8r@40)k8Y}5+sqD-(2{$~n@CPnA8656 zM$`N?2BG85LI!TtqvkxA3Zfx(d*~cHK>rf|yr}sPOV|c9A1~O4U}@{&r*#1-e^Vz6 z)`FXD3_e!m_+&I}!u|K8)=6W|?SdfQ>tf#{Z0cItDs{cSJHE)Vjf? z$10^EJF4nW(1!_cU|r=~P@lP%d|&`1*@jGjaIpVeE|*lZgCgA!^u?IJ!0#L|=hb%t zz}D@o3wPalVXt+~QIod#3=>I+XYm9bL4rrF_Ilbn;Z-EbY`l9+WEutd8Y{MCG+xPX zsyQMY*=iB5UlQB1_^?5AJNU>q5}iz2Dv1yHQZ_xlUL8i;=NeZv>_wMgX<$>^m0sse z>j$>g_rJ@a<@<3Ycuxa0!DWSox?}s@oR7icT|n_eymP&I+q47NIO>z>ohKa`=501i zl67@?V<;E6iPiFoLvX{v5Lir@-$o_pr3m1L&*9~rmWQ7V4VlVhuS%!b5hs6a{OKT@ z#$E#FI|e9xqlHq~s2O^GhfZvMLpg1`cT09a0+IS60}OClFc=bl|JqW?FT z4V6G$fdv_na=@dpu`wwd8z@A9M@8)iBjS7$>DB*{=|CtftbPS{TvF29!BzXkFQjHr zkUvplBoTeh$HX*NY2F4-gKfKBV1df371n=3gV|pY=yS$D@<-GNT+EmxPm0P$lwTUiZcK1qGE;AGLnn*vjQxKc zRdB4pHV-^7r$MvXp^M=Lx4(GPOYO-HxnE5^8%g@0-IL@$xqsTVqJ6f0T71jluCi?w|Rcei+|m8Kh7 zG5)?#v1*o|W8TXGxm7+C0~|$xB?HF7BJTIuhxKj8r|iCq{rCwt!+Zc(mwck88}MRP zP{Fl++n)4KXeoG*&vJQB=toP>+%!Cvf1PCXJoU*Ce4w7Huh;ueDV3U?hSWjdL*Bp% zmr6nN-_1%rKGv*}FN_md;ZH1*pvi|}%cx~rJ3|{!|1=!QdJi}Ipkn65`>?rY|MC8M zo}tZ|6+*Uy9I~z|8WS^nUA~a6uD2#&@h+w8>e+h_srBbEgW^k}4z>^9EA2C;Q1)y6 zkk@*4mmjBDA-kK8I%md9+}Y_%+G){~@cNtKT48Ksf)0S5gW9*+q1U*4eiy+^6y+p0 z!1vLk+oMtBupr2@y>{CfRNfsp`wY^If4dGhZzoa21R%=&qM9tYKm&yV3Gfl(zMzJh zH<8Hq7b|lBEW6K#_(ti_-XecOn?dlz!z0(9kA;_QZg)eQQCW^9u%F~V12fdE`UC`@ zPT2VGv`6!Q->v(Qfcy+FpI@?W9K?`^f)WFR(KL=xK{YVdGBz%b+@fgxaVwk|Bqu`x za_Oz3{~2Y2%9pS4_~Gp?C8ADLV!wI|)YGZS1mDGCkX>BeG-{E&+li)!)e5&dU(1Hg z8?w*A0Bq9T6YXw+W^k+OQuf-MWAg)A>NrrC4CA$`VT@M!F;Dc(Ma+EMOfl<)!cp8O zULzZhZ07=z_(x3Tl@(M5CB8ydL+;}K4D_wP%Y}Z<7absw7prH^9foFH!$`&_G5e9y z>HSL)`u;I;fMYsRqAl*vQ5`uPBZPL*pzxeAHUlD;dOH3_cvGGDe$nC5DOfLPeZesa z=)B-S@?y);$fX)=jbg%QpxiGu0%bpjWld8-5bS&81_h9snZ+(sCyxY(W)~Q3XFwUx z@f6xDU%C^JLPdI(B%{wd(LisI?4M3Fo^7=0Wh5W4OgvP%*trNTzj63gDtmAQsfV-< zQRTo~@RdWv2%eoO=W~!fEGu8%zJ!W6zqU6;hKU`eB0k%9yR8zqU?-(tobG9_I628# z{q3~O>x;2@U2v|CKpc(?K~@X5d<-V#EMIdZGEHsV5B|Xt4gGv%!w(iIT?IZ-_L=2A zkkHV3D9>UMAz4vEbxDeax7-mpL^FuY!BAYu*>re$hJ_G-NXMyBwbAyua6!p?Y8f=r z3RhfUqbQz4U!>>>W7pEFwq8cTr(MXI%bVwgwzh#9eSaM@zLnn>{@iuhJ}UX74|E?a z%$m46P7I{P*k!LiOoh1^sGK-Pgk{<^y^4Xg1e*wD#nJJH&g=fKC>sx&!)OR(Nii=8 zNrVc@3`77YrXnptDEz&NmPFdeSMxeEzvos8Vw^+r5&I#$Hp=p44EgP#ENoVdE2iaX zhi7}r?JWdYTr8||CAvhM_#sNYcGr&}!P_9c00RTV53H58!QkBAU|Q8b0|E%n3pP^m zA>oq=RDEi5KV5407vNbao4QrX_r-_1Y0bS144Q`r$ruwY4rUQ}A0b&aMxk6l^GmN$ zw18Si)pV=ozm?p`3EX^hEJ~29+NRxH$B_Ul^ZMIrjv8HJA3Y^)gKugkH=C*4BLLqS zqeEi`2Vww!hI#VPJ#Q%DTdc)PWP2|Y7uoHcaVIa2;M+C= zD+fbHDqy%@ML7#z^xsG`Z_A^=pUlpUSjv1Od+F*`GkIv~yx9309w6-&iD68}aFY>v zCfxDHGf~&X?_7w9d?U0Z>c)k1y-k9)=T(=$A1z1tJK1V=gttlc`K}V5|8RN;4ZOFu ztO`MtFDE>IU0X;PQ19)`X&jAvK~oG-&u=d80Jf?@9(bTG;X^w7+*g0^8t>4Q#XGs8f$@oneC>nW*z`>vEh9BI&y25qG6U_JR0hRYCLPEj&T-s^;EjFJA3EEuF z`$6PTF&K4JJ@;p6{p8EPMf@bL8(hR0Oby&VN!2bR{JOONK9>u9kcp<7mW(noEEq@5 z`OZ#NCVSe7MtCx`X_G_%M*5sP`P8wm&F(Clx@1bq`)y9?`=c^m!vIb09pNu}#`r7wPNm-S@ zas4@6t=PgTBT{2E5QSPIp|I*C}uFPL4+N ziz#cTA2GIe?|+*%Fr3<-4C)|t6qF8CmGMjszxId{GUYuzwKIJlSVPvR(D*t#5{J=c z;u$56CIC}W5P%{t4 z!x~NIiaT+&cvVnKz5CbV1=ArT{;k+}k^M(<^2(>Qplt;_LvGMLSG&_J=bowF;Pk&~ z-Q{Vznv+64dmULjJjxO?;2i54S*hT$6YN99H%PtPRQYU~A7Pt<&W)Ie*GTE6#sj>U z#>h18{sIxexyNnsMoH5_Zau6j&PO`?XFyLLEeGKQD$?g2*4jsOR_sATU$F0>b4iRx z|Al*XnBJ9TN7`rkyUFVZbPoRR^1p|m`X||a`5^4B+wgl9$LHN;m^HHA4O}Pxi|AAf zt?U{%EU-xUcJW+^zWGy^YchCtxGFS39fE&y2ddFw+6SMhz4usdeRSRrxZvB{w3X}EgSIC%;8@=9XaMLz zE+FKXRov8t9uT=i3w)c(p9Mb5>SUv<22sB@$cqKG3Sm-q{YJ9&Wb>UG(^k-6)KZm_ z3N7yBET$(Tg8)H$7Q4hB)r3Gj&coGy+sfJQE({4tw#=>R_`q;P3l|BxX#C%mwE^%9 zztVG`kk{hlS>~@3!2MJO*2uU2IQ6US|I)3INd({ji+@8!4O+DN3_3HShy}vH=wFrj zm1;J}0|k}&JsJjv-ylZk{SplpVg#|kQln>Q<|$k1e^D%LUSN(fh@e&Y`ZeUo4@mBZ zwhYJ(oc{{1M|41qH1WsdLn>y!jYrf7H}uRO+TNpl%z}noaS!9)KPtgK!*A+h9LU7F z9PA!A?yfg#!zRLLfj7E=pvgAKzq8xM{j-C_>yju|y34w!X*RxE-@0J1@ z9GLbX4n)LkBpCmBLb_$F`>#Jz_XP}(cS~&Z%4Lq_bXW0hRa=Rwm(F+;X32YiqW8Hq zJK(o~5v;MnqbjwyZ1ZujX9%=2QE2ykms4JZwvYNKQy2gb1Ox;;>uPKBH==x5T^ZkY z2e{A`ul^?dccB2Qy}gfh+1?(ozJ0iwir3+x==W0O4+7_%f2*hI7K4?wq5K&@`J;$yuta5%O?Q#&58+B^5pIGVI-eK*VCq=e(3|@*8hLO4+scZ^jvY*{4 zHQCZ7>m>vrHEYZmi#Q<3;(Q+*yR*XB*79yW6IPENy8cPNwIH;0!dtJ8&2`cE#J7`?4Pu%0>W9%4~B;@-vnwdd;bl*#DT5ecyav;aq!+6R1c z_m-LgM{3~L%D{imsr*?T6$o@7Br-CxvbgwOyJ}wV=ln6DP~^P8=mYW|aF5V!Nd7&` zDEZ$?QVs!Le~hMkKCgsy>h!r-?*f~g^p+@)hOSu)7?xA2{yZM!J?ZQ-mkiuuZSK;G z@>7cW+I`#SED`^y5?=iqH;$bQs%_Aipuu?ZknwTrZ`{baQUi|=&WsH`!=O3@&#Fzq zhoTWT(R@diPhoMNpt-v4l8Jv9qsQz&c5^x4MA~|qm;pLwRm#C38{Bc>sL(@hiQ}BY zKf-o!G{&Nug4nekdjk<@$z_?zq?yq7hB_NyXxF(0Rq~Pjz8tc?h44wf3;f`}n=}9O zmw!5^4!3+5BAE!#j;c=p2mulh{PJS7ay-Ov!u;V-q~#r(fMi+Q0VHVy2!3|r#6$Li zn9*~sf-tRH1Op8aQD8-XE?U_%FJwFH0<{o3b`@yg5sKgdRRI4PoM}!zBzzSV%eNl0 z=LWVkzyo)R0w=7wDo*rYn@8JM`zf=3-%+C`Cic$P6h`Pj-}dimu6mBn_1{bXj`{yQ z%~||^wUzvj*X#fMMqHx*+v}2NevHb}uQ@l8NtMQ|A2M%<1mdC2y!|K7z#*?kCa>@w30ZszbIQ4()Q3NJ?L5`hEd%(; zX#EMK(Ofm0(4k%0o2b16H{M1{zvKLY1fXnPh*ocg94B31~-9 zAZ6279(#kmVPynzi(^5Se*XUms+zw3?hw&`htUe&0G0$GGD)q-CeVH!O;v%IIl^`X zcV*9ABfmXefD6Eb^@UOxP5y#zNtKc`R-}d2QrA1d!v`l4)drz05zvftrWX$n0fo`% zm#>PGdF10ENbq%bLJ)Hfp`irQ1+p2V+YYi_v$KdXV&b|7$BYs}rlxgDDQEH1t{|HA zi|w4fJh3kPCfWuX0Ck*&-z`i2I1|6`UXtMAW^4>v&P#V!AKFng>-?PzE zWQB#$XBgKf+2lzE+Yx>iiDE zMsijCtqaC_d{Rl!rMiA6LU7oTELGUPP7*&dk~$*$A+y%U(xf6|bxd%2Oz_DqoVCy} zlf3y)8%Muof{ZY{-{I?PsCM{(PggkoX=BdQ3&bLwuPM@G-sl3{ATi)$x1>vjVZJtP zD?~@JsALKs9o{q1L(Y`Spl@%gPir)MKT^Ra@OhAi#Cw{RSJr}EytHk)OQg8^$ z=Zjye%#5Dnjc2NwZ|}P0my;|ZRp9Y=sA-3Jw2`f2z0BSf1Vds_K%LCtTSU^xSBXej zP^JB)DM3)7cs$aFzP=1vQkQC#7NBFT&+y2{(|`->{ygAMySjV8%dz6=>8(Xvilm7Z z`$rHu0Qp*UK|$!=@sgCw2fGx>QXy5Rw?!f>wx+22F-`v6&b&Y$8*6zm-tGNQJi}ho z4e}dra+Z{Ap^Lc?lSb9}&Z2>o3tpzg_qwMHUk;TzluTwJI+_^ezA56tkhc>)r!55REAmN!!>|GZRzy=`9Yp?&i1$;h6*(gtDyn-i|%_@5f%Z20nnO> zL{Ka#EhdJq&Eh|i61|YrVwNU439plb;2{AC?C-Lxtp0UW1&%&k!kzdVHbm@I!=bD| zT~C=$6O(qMRcda|+_^H#*+Gt*jvD&K+@D>fEaOh&&Sglyjd$Ykq>w#S-776+iKV_r zjDXJKq(h4~si7%_jb6+1WW$Zg@V8SDd}I2P29hgJhR9c;Z|wd8!(Xn>_D?(};riXT z^{A=&yl7@|X2~z-8Q#0zFyLk|IV_Bgs)t@yUFUhl&y z0fZdj)tN^pSE_a5<}9dXYSaHz`?GOe;@i_rQ^uO3c5eLk<9;1ZE#f}s)ozQoH5Jb? zl>iq7i=O^Gr>!l&(M(PZ3}0oyT?_jS7mP~X1!`_bT7pxBY|mNRS4| z@$>pq4JR%~(C0iy&M$kELPHPOgm-BKx|=gHk1@k_CotVrGCGpH-0Thl)@Ts z_mI3VW&T=iyekbmemp1zAzV}~jC{8459Ac*N4Su1FHS03u%$$fmuq&~xk-$RlA^ZVEjH5atJ}e!Tb*ABF+}xb=@|m~_N`7OdT6Pm1mH|LB+;~ zA%L)fRMtuj!7c;*G@)!`U9#?AyA=I`D0{$97@xaG%4wIdBdAkRCH(n8}OB6`m=;#%@-r&U#SSUT23p@3W7DM4xsearMs#4*yjsDmuo}X}^vC{j z2|yx<{X0I32aVku-mgKt_SEaR|tzppD8A2Vm(CbeCa)AJ%n5=`RVASOm6P|o}r?bK3m z{>-1+^;}5Fzd5~%MB<}j62}>{&&lq+!<2)d;~o3o+iL(gK!I()nnbf=!J91eFq7>v zO<1*@Bt)iREECrKgn&xKH@w&~b>}m6Plh+s)Yfv|8oA6v#V9fLft&%|WhBMi#^K0{ z&UUHwEl?uM?dc9&^Q{suJR$vrCve~)#7LV5-8>hyUXdT-i3HFrjm6**?ViEJnzgK? zNc{q(N%JRn{*_GIm?pM0v1fMQ0sLCrjSa4bt7g)BF%Nc{yVIl4FL_Y0HOuyrLGFL$ z6Sl6ozLnpq#+fz4>Qo~5NrW6W#FUw&)b1gc(#|_P-yJ4>fnK?Ikqo^zDCXGON#2j` z=nAnMc7i89k$E{kg}loNg6!!IHY)bvgC}WBFjLtcSz_NIVl)wr#OTx!U@`XQ`iso9 z`=Hi5H0fYUeWK+J3v_SzbV(ntX}p;?fBvAnV#%jlU4@7NG3G!Vb+8-0xc$rga9*nY zrTNgHTZhWFKASPnLybnPOKEFL3QlsyD>a^v>WfcU3g#~UA|sjDIq-O2f7g3I zsDVeqgS4LQMPwNzgc7v7smr9iQDTtI!>?EEVFs3I_S(2tK-P*g)w{6mlSXB+WFe%S z7RZp(^Ha-_4^7ynuZba15O@me^Jv}1fL5AY)IqgWMbC|3a&=mXWY%a|o4H&7*5WmE{Aq!2{fItxk%u$EDtJ z+)x@>K&cHvA`w+miwNY_IL@FQoN+DKbbQ_nJ@XcwSha;Wz0(Ykcq5Kv3w(kAEL!?6 zTf3nS_PF2ymbw8EE7?ciH38P~_e1nE6a>0-KEYQ^lY1OAZ6(VTuI3wB#?}{#(b8w8 zx_7ceFSxoZKJ>}+(p(Q9k_4F z*{^|Uenu@+fUW?Xh4*~na~sgg5*H9)k8G?O5S_lSD{g9ngZ-VBn=?CeRQ+~=@1Udm zsb)vJMxbqC&F4$%{2x|)gN2Q?iDr$gPmk9jx%Up=_Bhwp&O%PVxqX(A9SZ2tcSl*} zut=^nnYyPpztV$q9bShUHR)W-GG3jRtFV}mFHn)}AOFKh39v$TAnQx#QR9F&c2p7m zRYYi9o>qcIIbey}?PoY1%IEyTeNqkqIPAo!$ma44$bX-96<`0jNVlOy?z9ZO3j&b3SGe%-U4_)rn^;bd>fIiUW1QcUNz+2xT+A0j~|;}RMcX?Uu) zb0jcAAgm~3-B_k~xk!3KyR6|D;;!Q);={?@Kr`Y5Z&UHwsh`v1d}@)qR-Ao>LKa7s zv-rn~I(eh-oeme?r1=~9(WxKW2eIB&0Sy?QW!ja^P{=KH4tV&34CSA`*rSwM78V@|Z}yOt?%vG*cC5JIvj&cU6e6qWmZ7>XX_q}3Vyazt@>?Jsq|b<`Le zsVihs^n)C^H{PPJGK@zJg%?rO&P(JJLHJ-{l4Zu2R#}ypo3*_^3+{(YLylS7uo;5V zScUh&0bATEhXpMM@iI{qKe~`#yHI>$n+X z4PU{8A{dVtU1Bs#bvl znJe~WONm0V5AF5hMq<#a8~yeu9YfIIp5Ks+JqM91(sr@+Gnv^)$0cP80dE-<`Xmc5 z7beQ@J9-1>ME)e5ZiB|Lul<+w^fc<|c~zul>kkpi@8~O&q8j>bxc4J#5gF3MFMh%b zL+@>2k0Ur}su({fRvM(tebXWN6}ifw7#1fTHCsVgOL_X8PB{krr|bW^N~BxdsjUt>mw$U zf?gkeCg_5*Az|6w1xz8DF|BKwlvI)Ov4B2R-=5Euc+)7&F7@@Y6#(aGau|s_g&jA_ z!gs{MI?bwY3Ek><7=2V@W|>t(MRiL#sp?Cz<>Fe@C=L zfom9F%}mt8R5!`-5mC7c71BS0V-oJB#DD&1k!7Sq^&=l6wX9s*bGzOn*K3CRsr-F- zKa|nxh?;mEd4xrd0osoxB4!9HEL8$_?yZzsd-p9ezeJZF5iA7VQMg@jXaGDGK&01f$xkdz;+nZt?VM=SwJxc0=`qr|iC*X@h7IQ(sbM7o(P7;Js@ z3#VQ(l&|jBG}p70`vL#}u4!5%0)HSn+G*XD-~r{zXu&3z{>?jCH~z;JDs1)JF3%vg zJI-s)l8TA#yI@oYVcU|ZMx#lDwY%IQ!*3JqHtZ*tjVRy#mESEACt3@O?h_erS{4X2 zP;v$o9!tp>4Ca<7DVJM{S7v3F&3tQa)zmN#DFGCb(m|UYo|hilpI)+e9GbWMve;Xr z`?L-VlcT;TWg1_Ib=TDyNfuP|BT*Zx8G@^4Muv{H4O@8;8gb^D#yf&x0@Gq_UFtp7 z4YMj;MwbD$-mX~w8ItjJzxmge;0iFY!&o{Zv>D;<&LdDnAj9LP-Tpv#Evpk%jMedu zFhX2ZsEEdP+U4sPL~X(sW?psA6gK*Im**AgEI_-U4Lu5C%MyS8mQH+&B)wBA2>~z6 zyx6+6VC9_pMvDL&dh%0Ii-*KXLaPNB2x=+uj#oj>mc?hR`}{-OQA5TE-J6wh37F z7^dTs8WV!OAZJ+1na7O%k$PhnOTQ1}LD#Rc?1BwbZ8r!9@7yG|`3Ky((!=de=d5Eh zZlbit-QisCaAxt3hT*@m1yAgL`>eY9!AlnX;%{Wq{QO|Is2ut5;t=~Kgw2~dEu3+E4?{n0Lv6kwTznq5MeH*z7)uBLN-c3mM)<~tQ_U;6P( zI(#fIYuj?nTZU?(X<^2koIdxOgo9)Bvcc)CM{FY=iO=}Y) zX0));PoJ9fk2z?1TF9eoEYmTh4vcrfQZ%A8B!Hw-F?V{T(fBVHfR8eeLCb_mZ=CQdoWY_c7lbjj{gF=-{<>4C^@opI zpwZmXmb^x>(FiAZjQooYQNDs>E2pO`Ry8EwzTr*F^La2d?s2|!C=-j25}=jqiSbm# zIqJn)D)0H-eW~<&)NOyc@$2sSK>#1-c%-7P&^mQ(szmvrqsTHgZg)znM*I5Gof?hw zmqD8TbJgXbc(Cc^Bx#wj5`v1x=wy7=+;&+1Xyk4cGd^q^pV&LGnx5MVWzqPzOGiP% zRIj1u_kSty>h_6OFs-|s5qA(N-$Dv`*<3X|;^4d>>b1TzT+*VKBD?=F#XFl+ES~GH zbJstI-PgvQ&D1hu^C(q+oms^9O#CW$I9$up0*vW5%8pk?)jOeNj`{!oP1x*LmxW!2 z9C?gLX7_iOlbr@igD)6mk$T?U+IinvWB4{~e|lX`OmfebM$ui?QB|9@Rfu zc58t$orae+3d{RF&zCtGF+ZfuJZ3i@G^89b$Spx$v1EQKP{^5i&jL0O8NJ9@G!UJB z{97O}h;Y)0dut(4hCxGLR?W9adUt!)6(-e6ZNhEB|8%{lBz&%6*^T;5AANdM<{jA) zRg_)2(%v$|2#)mCMVw&EQwu9zFHT)FB(3GObjxM+)@}Ab&Cu+Mjodl8vFe+n5^JKS zA;PjY%#xVbLMah~+P;EzVcAr|=OCuIyh!VgB@OSZHCYx5&$ zNoO+uN+24-eA?)j*?5+cW$nI~uhg70W-3pdu2S#&1k1VekKjVGsCx@qp%YGcqPppb zJH;lMYHEQTp(v`kKtmU}b%b?3Q`aU=8Oaq0byjy&j_SN^8WE@z3zsJ*3>PN@VZgsU zp+(v=x=N3i()zb#r zEpL0dz%5z*<6`fUyS1cL$V4aAdFdBM3@j52iEz2$ja{RmfAeK>&?J0u1D3UznO#iL z+6XfHY=k#Q44*;j}N4f#YS*<9LAc%?UG~aD2VOmtER=GEK(H?V=vU zzZi(An7q!JbRIfb;b`3VnvmQW@yk>TiG!GSC{|Sr@t=zsgF~nKm**5VAj;Zu{coRZ znBJL8y&p`)`F^+EgGoGe-@TuKTzdqy-c73;&P|j#{fr=rl=BkA77=!0Vj8OFNa=~% zF;yTB4)+=E>${p%B;j_*2?g z{0NDzA&9gYfy!@joT8XDwY|CL)#rXrU#6k}1^O$gs_>%*(Q?NBeR5*nJka&O@q?}%tsDI=zdkz?Y0W56bi(t!0xh4Ply|J4 zJap!9Y30C=3hKky5?P+6*$^B@1B-EjEQBN+WFZGhcD;>7?XAIpe-=JRj#O`#^zYBWqdJznbJKcFKpDd{ehHa_En`Rl#{B<0tG`b&acJsED}@@ zxs*kNS@uqxNSePDZLdS}VR34PIV-zW*4_Xqg$R_In~R1qQvN=3M_1 zQ29aZE366!FM5$iQoe$IMINGQIqgq*;5wD&A7Crm{cV4C#A49cTTpANnIh{1uiq{h z^vvp88?#OAI=)eZcw^_3Kb1y~&U_)(Ez`Hkq6s;iFfjf>z&lMBG`cUA(hXTM8+e&s zsfVR|3EI}LO$qTD*v*ck2ucC^q7%@9?9M1)bqM};FC2gECH{d7Yt3R-VbRkEc(13d zvN%11MDSS614eC(pR*->J`PZObM3z;8GR&jOvQYL?Em;M1B#*iEKYq#azxi30(H8g z=zeDjlw)pA$#fp| z0yW_e>aXNZdJwlokvX1X#dFMY^Ebwa!4d+QssVJf)b>gqht?S?3qAZdpX;Nlo!j^hly%*k!`5*M6!qgtr(AD+wGQy($EK3u@g=1YEC z`yw2Yfo-qso@3Wx{>@#|Nc0RE89vKD3!?ka!Pyh-_>9!h`Z5$W&<1x_GjneK9$hqS z07*0gvj{hlXSIO-hiVa_9X0sf@$mnBEqh!_)LV8>mu`SXg?6GugwfCZ(Gs8fYGK?G z13cCDR#)X}s2p+Qa`$i*F`s_#RNYrLtJa}op;WMpeFEl7%6YMx za4P!>bE!J1k*uGD`fsm%CR?IidDf=Vo}xYAWmqA71uP!cbYQNc09fg?_~cJ}2uHe- zd(V2(zKt@afBIGi-8v->gse`q@^}$QulYo|WR-0(K9CC6?V3BV#2^K26(%?cQx$ef zsj2d{2}ems3*zX1eINR+@kyUAD8rO(jsSnnc043mIyzliL;I;Yq>*aiL+~u7=!L8$O@AxD z$NKuh&hcj~V^q3CEe}$$G{v2*Rfz6Nx=T8sV`I5&pq#C76%8emX@SWcQPYP8)!43Y zw=mgJb0O6-Ea8AxD{JAAmLFj^5cp8* z)bbRS+Fb(Le56HLW)&>;vV=QD$*=a-a*wDZk-y@N=HuE>0T2ae>k?{SB>JfYhM)Ug zK6eLK5$}Io3Z%uoE(^{9Q8Wn7KitTO>k~>zfS=yK?wLxRyu4j@XnrO3Uycf8<=D0b z<-|AVg4JRj0+F1W0@3)GBke(q&`b7##^bDBMH48e_W0Epk%j~|w~YN)08M}Fsep@Tr7XM+)X!@+p_Gz@{{xXzCO>s957Mgh8!HKKHGjSW8soTX<=%R zZ#MVw0F%Jd;&0e(s8FOd)mXl^qy}}@1DTT$-5yTO+&Z8lcS%4 zCn$XFFTaXm6^YMT7)6#T}ijxTJb~q$BA)%NGDyMmLs?6 zE%VR2J52vF!ww%qa_x9vLle#bnid7MqdcK^ViChH$IZz+&4v1u^$Mki+An3{nSC++ z8i|vra;L}e(#&F%n{F`fYaTOMw)%)eqn3d_)Q}~TQt4>G>O6`>WKJnfkHD@2RiVP@d_e#@#uchk&-=UrVkUW9NheDkqy2Q zWR-+X=3SkK!Q||I&oojKM+~yVlYjh}-t!3xBL&$0oY<3NxESnU3nP)Q}jf+$jlrP8R^9Y7VVlS(gMme^^m2kWW z|NO=9B1c?U<<{_v0TO&s40pCXm~pVoI;HHYRo- z<_xihWaa>oc~Wcn#qD9YQyR>GSpO^qBo>Q)dMPnEm8TgX$%!yGIAf9LhR3qt`^tiAjl`Ad0tbqno&7T}?Q^f@iFX zBli8*eP*y+dCz_CGw8+R)^Qm2N5*&&+;UG2sG^Q4+3%q)U*}x!@o-TdwJ9B^{|=Ub zU0ZTaowzCjiamqe9FM8=TFKeg(Pj%gmwf3vU;eL1aELKA+~p7qxa!G>u7HEk(emuL=Crj_2jz%0-naBsl&)Z zXITAFTe-$a|M3$F_oY$!ATuvj`MU_c2F9{ky%2ZSFFLW*jbxY5)z53Czj}ixrG@)?HE%N;= z{Tcq3<03XGF0>^OGjtOUFy6ubxY~^&@eupPz{53e*aY7t_$rl+b7?A+;JC8xtrBTU z@t?8@F_i%)`-ydn$z!g{fWx7J8kRro_r(Hj?hJ;KnvXKWJ1cNUARioUKghS$=*U*W zZprIM{b{9{=!zKnl;zfw2!v%4ls%Mx`CM?P&;VxO21o#C-j}V+Xh5!V` zm(e+CkiWM#*>XM-H1B~B*jcpj6jNBZWwrty$?wQqg4L;#Q{vr)eYjYpbp zIpln|wb7kX+1ydk*YLel7l?AacCPiL%DShFYjlU)I}uw zYg_gws!onyKP8gUN{x5^+T$B|_es=n5MvtuH~O#dJ^t$mJH`b-thOWZn7FG$;?iT; z)tC2MW`JF%q5TCpMr+T=Y_sSs-pqI35!S-gER%MmjcR49?g$YclnnLfC~p!7`Fz$D!<0A|mdd>tuj3?trO8JNy| z!_n0USHwY4K{2IT4fle#Q@mU9COg4m!_?DG4|`r9ic@z){>L4Rf|<%o6kq;8O8O^o z8Jl$PL_mG&XmRh+LUbZ=pjdvxZc7iGte{e`zQj4~V3z#~1q^(QHp%n*N!92_0oH3F zYz^>nU75Y7aalpY%jr&d17&~5_U<|b_Y$23yWc^|2IFa^%R;3GCG6_J!dCfn=J!vE z!iP`M1M|@2n4%Jgkx3kEn0LoYf#RmJpI6(lr~{?HGM{B8+TL84_KkFY8*}+y{-Fo# zHA43lK-f-%lE@1v$+zMWe5|Gq{U{XrC16G%0Pe8M8Z2x^(;=jP0_ZpbSOPkxeW!jM zJ|+Zwa?68SDE@j8Q}noc|LC!ib}oScKtB7>pqMF=$a%J6&}}K-8Mi#|7SgMsYe9XLg zcfJ2km`*_@vog;=ir?0mv-ZmSQ2nZ`)s(JZ9zklF`Y-WH&~z-l$%GZkJB2dIzGz6{ za}NdvCnBaBMr1Z$J2t{;$1j2r{1ihtQx`SvCO!pHhM_+Vi zBNJPd&GNFLi=Sysbhp69Cpw(_rnGmcmn5vtZ2@*R#86Ge2<|w&uMGKDy9%y@j zDU7|&2$X0wl{IfPxbrI;k=AIbk@fvfJb$5gvavPDJo zUJ3x-(j%hRr{Rrz0gr1@x(ZU)Lk4FW_vdUck{j;r#^e)E=8{pesg!#`3>!$cvhsK6 z9YRGBmx_{(0Fq5pndQm7D=AVxclY0k_VhB*J$?j>w!3FhpQyy<0r(;TlD}Z}i9Q^3?~K*b?>Vgqt2qC5 zU)5bH4is|tU1L@kJVJ6>WlLN}+2SAVYEZm6ow=@2;clmWum#C@Ah8j#kub=fdkp)e z5WG3rv$rq*j#tL;hZVT^zyqS>$f&7dofKF^k#QOhsN+X%StZUU@s4i6bRnS%y=Q-l zT}9|X+*7^kke{W(C1WlSpT@BZ4S)e!@XK1;F%MAW9niZ}N}x_&A|2W$zNmhNkk{$G zb0MYpJ?6zf0@q+y^USXMNaF5g)qMf8#{MKYa76zz7UC~l%8NChGil1Xu*9w-e;SX! zu+IIE5go4J<%!4${=vVE=*jMfMH@cvKlH5f79KFf2;^C$gzld6yu`|L|L%+W*Vc$Y zt`5M40O`<=sh#B_E=!9H8$?|ZGHEU;UNw!*_@b=|1+i^yxV1{AkgrZ+=L#jQ*4&h^O4!!`HXulk8i4<&A3&l5|d)pWS+?#FBE_YiI)uG5H0wLjHe4hMc;k(t3R|>eiT(Vcs%A>abKg>cKd46 zQ0j8~!j$zg`->~I)A4|eJ3$;e;ZHWa0%su5JyxpFpIRH$UtJs0X~(j$GFpN~<|(bb?D`Fzy7jvL7V%xX@1>03O3`+WqX`@Mu$v7Ecc7K!x$y>ov=Hi}7J<)|~~Th##1cab1S zzui)vXlqY*9ltf;>>ydm)lk~|5FunCe1kvo^pt}Z>m+qG%h4;FDs(Uv-IO+3jW_F`p zc4mw=w9a83{1ZWzocjC|WUyPy>PERB*g58xPyef|W{5xga8UTv-RSnYtipbA7QW?S zmx%>35B_TX1DnT94N0vhc|I`j3F~gfNHsX-dpU@#KM)Zqr3`8oz(NY;U&B)Up+j(Y z;M^KlMtOu1jUr8HO*;S4XKHc<XIDZ`9^0*&bzuGMrm(7JuU|l1xO>TfyVPd*^?0S?6$M7aAFk7Z_rBVh2*wc zJyWS#Np}uNwD{)f8jw7NW>Omrf=!YJE?X4qpr|G&mxI2&if|%pw-;6Wu59pwYs0jiZ%q`-muSh zx`V~#>VLR#6`h6DqqT;z{j+LkH>Po(o`r=rsPm;yN?sm$XFPjtj1v<+Ls>^BibgK! zed(Mz7brN>AgZc(jE2GHV~u#yc!Es7T`rY8#5$?pTOV|1>?mOe4LI@IF5ksj?a~tX za{{G0IC_DDNXD$d;k;%-%0e`O?~?sL0e-TJ!$yD}a zW7QHvO2et~8)0T&wq+;&7HpIuikh9So+-io)YJ=j`tAHHIoo9s6s^xoP(!F3d z5?70C`R%-|)@Z8nsU!P=Tz-Wom!*b4s2qa96=?XGKlj&i0Dcb#Q4%&qTmwf1pyLdP zr}eZ8y$4n#{6$%n*QO!K?*rLxSYeH+I>=I-3|ZV={~=jhXOFt)i%0L`t$fHLjr-o? z`(G{qA%0Y(iJfnsR4<8<@icDHjI880*tAxI-@j`=j;wsE>?6jRD%2LphS@|)ehJpp&w*3Q&Qt9ENTboyx=kK;ty0wz>IiD zn#mYqMXI}#e>1s5h};;(uim2AgHLJq>ph#P`>N*msUBm)h>K!m4hE$@JD3#M8@nf7 zE@mYelw0B%YhspkCh=F`>E({?^Amy9hp#?tmW_sv^_1?}(eL|ad_Z#i-n+linap~A zGRln%tyv#>Ct4hyJTL-2niS_ngMn7MA7D7CQMXRgGC+}9ah3nArtmno?!X`&m$ z-+`**2J0idW`ZEV*->(iv)Xkzg63 zMf|Xwa$N`TS#&TZiC+AG5YKHSl1{LQIj6HrP(*u%DDp$_m0ZNUek*afuK8=Sxh}AQ zVXCeF-6%u!J?g|06l2J-Typ(%$> zf0mdFg*Oqx$0&S)z5!DAgxi>HsG&hSs(RNaF8&zBR`6IO0U8}3|B2!+vGvO_<=d$f z>cP^F^9ZU(CHujO@UZZ)W5Z~Bi!ic8Np}gdu;h^}vbqUkv<@3S|3=`4>k_;s{4*l{ zPS9M2+w^7}&FQLC&u}O9s%o|S#acD}?*w|3U9W8G^*f${VTWAtZ;~B%^UbWxHQZ-l zQ78}z^DQt)CXZqAU={6qSW*u;{7#>wfH1`>5c5qn;4|uuGv%TMw6FU0RA9UIeqHqJ zV1j;zSnLY?**pI(V1E3F#T*-U7vjgqjtbB9VKaBt0>)=)kw#uwyVw}dC&F{$t^(079VW&YO8cR@boS82`Gwas6&T$<%+)5q33^%12R zg|LQ=Ij;6JlZk=}%o3(pEk0>d&IZtjen*X+JabZrd%Pv{HD5zlcq3&>&TJ3XyqOiOX0;@mi4Fo4dqv zuU>S0c>PoqqqNpQUrx3BX{W$$X{Upu8mc$~!B50rgN>%+8LoqIBx54u{2MUU1ZGzD zl@!piu7!h;@Bn%oWQSmipcts919yhWDNv((`cYbhn6OkWXMtdy@6S)omDZ}Svo<6O zDVT|CDbWu$_Gsutb?(e}FT9f~ADtR-Om8PSFq1WP|^ko_iXl&q}4Ia;r zi-Gy!Kkow{+Ka2I;;NQu&P@J&JJWv-05b}#Mrv`B|M&QRpMLwLP6dtr|9kj<$0QT~ zr`Gx3GyLBn_Jb6T|M$@>UR;DIL{ZWQdmix6Wx-#Hu@NR<{`W1(LjUgs+BXf2jS&9x zY#_Mwzb^;M!DB$a@$UZn#D71jlP2^(wfX;9ivRmuFcfioOLYI=8v>EwDKF@Lo=8$V zVu8@c+mSUu9Mu0DA{IgM(-xqFfaY<7M?;H&Pn5+WPaa;;dY`OmsyJ!RrS*4eDqfQ# z=|7)xjDT?sdj{d};35Shd4=pBlhQbPfgR<+VT?&XnQahhKKPzGD30slOKLWc8fg); zZP~pGG)D(OaAAx{{p5?a%WZ}3`5vFm8R{Lrf0c`wJDGz_EL&OLE(N$^$q4@mFqE{i{KFm~<{>)96|Wslb*IvHiC!fosUKB+is4HL zX)eoc(nmeI^8ak;L))WAqV;EWCd(!BRAuEf%KDQ5_GqFK0IsfJnFOZ)DbR~}_DZ+{ z2)9P}0q%hW38Ln44pANQ^!}r4o3--`-ldg&F+!KFDHv6+_?^5##mWLBr}1F3GV&tQ z*@uAN@phn8kEe{#8a%X3@P98j7Xf7&;yM<=GWsS>OVHb57r9pfbua!O3 zYyY?YllqaI1U!U)9_)IOP4)XpTjmuJ_*fsf9Ir>kL&v~yKoI%GKC^Z4@8LiK0a*ZB zb0(eZLWh4GJQ@0y!v|6d&=WiwP%cv5Vhx{`0rh(5Ew=Z zeMSm+$c0$s?>9t#DdvKPhL#^68(Upo-L*x^Kp=lv}Bj+&8a~v%ep4)&g&4saZ%cetk6U_#tBZPa^(HnimRq$#IF= zY*5+twUJ-;Tn?x1P_XqUwpf8@0dvD-B7q_QL+Pot2dpnUD+q<>iH(a(icoQb2%ccRV|Ea(;qy zsk=K!g(2}*X+whn7Ze&A+H^f9VbnWjX6`xqL|J!FPoBN*k$3d;l>&aXnmUJvhf9of zbaeTX5v?5#)c(kOs{XIb4k_M(I%t#HN@YDuV4MzBD52>T{dL(K5*R(o z`$%Sut0>Y!zpwtG9tN!lzkx&_D4O^vGm4&EM_b5wZHU^pnKY@098wYr6)QeRm2j^+`=PEde;q2;HlxC5M?}Ht=RHuTH6x@b zS(4glA#w$jdzVI3{MOs|%lu9T@-R|X4(YW?Te43!K+OPG~8oRx@ZL|fZFyQW@iTdITAF7yZfxXDit58+vFFNU! z04*L~B)(k`lVEi1C@Sk&t-@Zl@CHoh!o9MVPo zD(OdcUEJxdZ`)q>PEZ%VEk7(as~=;DYF$rtV}(z5gr!7g@*?TTBoV?3SQpRt+4MpD zPu$Uf?GA_{0|Uk!EzdVgSN&vu6JOPIOw_O^%3%a9EPEG>;RaI31Vq#(vn*Sv6&hJ=*T)Wzy zr&XVfv-m@$V?o}u;q|srL*=7)Ggt)#2cO)MkbO zPo+*c^S$LgjR-Wzno z&PsPGS^r^#I%UR7D1GLUsJRmjI7@oin!NdY-flprG3-B<7%eirL-SO)hWqwnY?v`V z;UjhuD&L5Ae!vY}*Llw$g;K0}q;3GY{CKMv&!#(I%Z_t|)I#JA0$4HhKg~8$=lw3W zssG#j!G3+-I^=`bJen`C^YS{0H~%QTQYe7a(9Or(M;$xRy*_8nrHQ)S9k`@exilv7 zfKlVI&V*$7-0~(I8AdI9X7|FTNquC@ajISzN*DjoEl@*7+01M*>BBqY^)T1emjdnB zeiQrXf{(2KxWp>tF)}wE8a~Vopvt?O%wj&Wg7YdhA;jS+zM&Tisor#hLbmhM#dVk5 zAaiNH$%WC;$;m@S1^aNRo)r@lGvlPi<8nv+k3K|!eB~=lEk6hmiCS7RU?aj98XBS# zX}!SIdflG9cRj*?)5wa9M1~JMOS;~&KqMtf8wz}Kp5ZMGtVo9V6xA@I`l3?dCX6K> zw$xM0Bq{!6ll+*<#h;qlfISvfz~63WkMECPa_p0FiG{Ps1bNmvb5jlY{@xF!#z-@W zj;=*I2)MwoPCnqt+k`&(d#lFogzp})=1b$oz;W3}#>Oyhg|tzxsmpVu zg+KEbM41Z9VR-~vahl#~aKm}?KBHvfDQa8*d6xk0>FrXV?n54(+5r*(=wj*#lD%RW zxt$D7q)w~5+_?DCnvsdOq!~Cq(Ut1N-bbIm%bvwwy&${0A6q%Y347n~4vd!gh!e(V zL(bnIN;IEc_$<(LByozGB7CSf4{7i1#=J^#CyOmHbazTPHVeRmg^cK5Qrs-W1KKkn zIKuhFeegZ|AcGdula*&UJAVaS+_4PgAS-3qHa<8uD364rzG4zgMNK&LIf zqy1j}9pqLnv#jHik!!G$6A^6LbEJ&4P4vn$kfW9_uICA5SS<2ul|5Gd+2%t?D3_Pd zg}e9F+G(To)}q-Lx5l`vK{Qf1L&sF?*5-bV8$4V_hnILhs&dUk_fic$82g%$ZY)(l zbqsb|Qn+<-3AAtMpClpB-)vGPf}Ix5UIcJHoJHX@9r?p2?6f2QG6>4p_=&9p6SY=q zPoVUe5jb|->3~0h?o%Hq&=%1hiY8#K>>3rWC;cXf1wOS@wNjxcQmRo6>)^1%DzLG! zq2BDu9D+uM+N!%YUJSvF8R>w0n0S)Z7IM`R%v$FXxGIVij6e}J9wy9N!a%oCQ}mg; zsdo5-&@UM8qOKbT0Z=t$0OB)GkWdEu&M;qvc4T*eFRN6D7s~7+^HgUC+wAWqbBk37uy(rnrwcCmoBi#~8Ux z$pam8gRc;PaOL0jNj|R53q3o%2iP{cQT`LCo;#Ngs^cNM4mL#C5n-93$i7 z<9#2XT&tryLFL*wVP^K+ZY}H4#`^bwfb-KR_A%G*u-;93%kQtZNjzl1iB-jI8d2 z{;{zdlc9@DU2yD%)v8x_{W^*mR@p-Yn4rK^7Y;BGeQffSbVYa&Uw$}bANGT<{SvNU}|5e;3}O*#(0{y4Tv=6bgggb)VXU{(QmQzOgO9GiDVLq>&UOkpBfb4GLn(wRo#XvdpHH1V3qmK1-i zF^4zl_yl7OA|RmllhX%F=7I;>Z_AnHFmEnPJi|Z+R@nQ_J{?LfiK+MkseI75YiBf_ zgmip(xVu0h{S4Hgh64Cq4!*s~6Rfrj@v>>a>1H(c@^W%wW&6GGnU1EJEb#h1xsRmt zjz_T9RW70)pat<&G?V#T0pY&|D7d(;bcF9QC~Lide07sFvYbgaU(Er za9~74MDUSev9Ympii+R^$+@m3nDC9vXG;knp+;TM!^6YvA8%|5p{9I&eZirc!Q#21 zpoHti#RWLeRz1(Zt~&79#oml0?{m96HSGZbP^9vEFtT!ECZh|e3B3;q;N{zG{%zq$ z=KrqbSSZ6OKd4R%5HzcOMlc%LSBYl7y|1xen|rCuimOAjn!B#}Y{^tUJ@(*p`=yiJ zj1}xlO@I+IbSZ2d`fQB#&0f`eUNrsKr{4F^(%{U`>IRMY$SOiI-zxnY)Uf`UpPcWe z{;iw$sV=WA6MG@5N*eaYw$E3NWX`9*kdV#2C=5fbcpN)Dxp*~qpTBdS`V8EhE}lVy z;f;BTCyND)y?TmwH$rr=#PBN>T9sxeJGe_o%*Bg%B;NbIhij`SNbw{wq9kYuERE1} zGLIOBLKoiXwjovSoOyMyol;#W>eCOi}y%X-x8qJIrl>UNw7?k%w9m=w-U^ z;Xe0!=Sg!`QvROu?Nkpxs;-#Zi%~9YiEOD6x#-f24u=Nf!g7~{Y${LB2zaCFHUv3- zi*OP$!acD3(%v;=eNP5mPDg~7@nd$A|j%jDn{^4j2AXo+`wtXoQsl=kKpmm_`cjp)1`$0hhaARp23Ofg*_YpMW_xjbWY;5Q;LO1wC zZ2ABsq&40s4j!HnC=@+kV}ZrWP(@a8JYPvgtC%ss4@$bx>t`k;1TkyXo!KnaHFBe4 z?rB|bnR6YTZeVxQ zX$Da>AuVX|40N^yyP9FjaZ~AxMflH|vKd!KnnKYa05)3jHPgJw`UP`X0Fu|>d~o-! zoXDz#I3{e)kU-8Syi#X0(D;#?Y^0xIdd$MW#kS=0k`Y~b^6QiNC-R=ol@~o?X!&cb z2@^wB=$;gjMHy@*_%M(7!LpafWMk_9-9*cUB-OjtIc(7NJxC)5kMzIvS8i&h8%*sk z3E?gpz={iu6kQ1@*Tat~tO1(1fng!PtEsgdF;nm6dIxZx83t?Aq>W z6FwgKtstYJ^Doytuj zO#t(MMG7|b)O87Snnw3tUaxx}*vng=2PYasU!$$B6`I?JyNzB0R+XqIu;|gr(W*6` z4Y057PNv{$A5P2BmvHsx2uUjZYkY|T>jU2+WT|;?69hY=`KYh*9xwnUZQpizL~4h^ z({1{p6{pJhy7ETBk12*J6IH<-tLu%fPa6%#0)9q&gf{Kt6)|TIi2h+FVqquElP5@4 z7Gt``8SZ^MZi-B`%-^ZhpWC48JhNbW1Z{8m4+6KAm4KeOb)JL`lBv*qGM~u9uWFXg zwnhdMcnjX{S2vEAq2Od$2Z;aO7-}{*4dDZUxPgoh0`K0zbEJ+qhE_59zTBHxFV&$K z^`-oUp{Ax@&+7m=6*d7#*$6Ai~59Y;@Y?IQ&Ysu&@9se^*^8-82yr z6GwvieX>F(f8y?Lx?UJHCc>Mnyxf^Y#oSi9UE4-7tDdy8GuPWjG1SLq*aL69+Opu8 z7%UgAa^iD5@-*_s(>Z;Dy*8yMkB&i-5M$o$Uw}nyE2D{5qie0AQk!Y(YUxav&PnmH&&NL6c?_IzAn2QxQvKt@tbrMW@!>u{V$ z5^LL1XYJz9n$ram<6Jn!H+Po*y~hbOJG95Qh7uX~CUT(wQHDfHaD=Yc%@G99^73%l z!UQvW@ozZw`dbF4uFv&XWC9LoVc{JC!4l1~4QsYvhNJP|C1vZo0yZtV8k*=}*O77@ zH(dl^QHk$T)tN{UfdGmHfTh7^!AtCW@(1R9x?l8Qz|gxDlf0%h!q*S#blyjk2w3Zm zgIc|By1t;0b<mWG#VjS*zr<*3?447;YL?5F@VdW zJ;3k6QTUCWFe>SJHp}yXK7GAES0eO}`6Q(+R~p?BXd|ocTPR7fu|P));r4!EwkfC> z`VTjFMC1sZlMC_9x-+MFt5g}FsLWy@F z$lrH?oG-;Mr+4RDYyTf-Zyi`S_TF>fbImo^%&0rbQ9{?)TGQd$G`eRvk>nl7OUjy? z8cytoeN7^6+EW?Is~Rq+ehUo9z_mQD*-twoJORv@9iA}UzX|vn zM?#(0dfq@SOVW8zuOL@)_{K`;eoY+vr$-KujX+rr&3teAWH_#utKes6a$}X_I%AO2 zf13s;`sad6C(ZcLnq*?rGzU4t)e`-?KXudJx!qH;*A!<{64C6Xf0qD2O4O_uu2EFm zt>F@DLJ@s;uW8k3^~;aEM{b;v!To#M6U{dl-8Ok2zXy{CJ3*Z6$YsU9WB;$+Cd}sR zHo9nn1B#Ci8;>gBkTC7RP9iE>#^4y(JPTkQM9kMCzK;PxXoL-hy`o^1+sPouh(=Ad z7IVwpp@8fw+-$YNi@N?GE^vAhWWXk^&tk|B_uET?`mM&z{J7Cw5*%?$lYI~>@~e)5 zZ&vQ@xv|>s(M+ygW8EHxN9X2N=j8f|1Rc@qW+Tz7GZZHQjn}h;D@fe0Jpf6&X3~;N ztw_TV1*E{*`oJaR4h|60)GYHD{UN5&?7;=5bK~S_c()R&WXS|vBsDaWOyk2oYWc*L zwHvezrSMn@zLTl)Kw()z7SB~Xtmk-GsFpoEuxVjjnx7X)bkaMxLp0t8Sxh>1f=y2K zO9q(e;MXvZ315>Cy6 zA6|NcBn(h?B0+phA7D3BtTPDj({&!39zFcl{N8Q!mTW6q>%_zb6X{CN+9 zZ9DdZ*BcKIr9xXVyc#qH+L9nccV0au4}W4wCUz1ovu7LKWE-cMqF>itpwTNlu%dt0 z25k}LuMz;Yn=t1k0m^$!%9=~1sG{vhD^5-$AyI9;cfb2fmpM`1Z6m_(8spt!=o1k z1x1zZBJuP1A~4#rzzfu@vwsPuPG5eNUEo>Ugo(2x8rF9jSr~{v2TTY*ex(Y)R%Tpm zOk9o}=Idc?y;nBvJiR=a=XL5{YO41(#k(+_u#)7km=ISu2vlbxsm0w-|G>;ul6j=@Q~XCN-C8~=0m!8Qy& z1wJ@y%aZGZCVR}u$1cQ(au>iu^Pr)ZPbq(>E7j%A1FpLKK7nza)@MYzN}pP5dC50S z+fR%hGEr6gPUq>`%b-cXW~<@#H&an`{u(~w*dwNPccT@uIq0wL zqWb$J4QJdKf23mR$A#2i+bW2>uH8)VIRf5A(R3RdMJdkd1RVaU*$xBXxsluSH)ukAyGFNS&@-1*VvFOc^(OY-7GV&bJPOP4EB5v+Sc^@ zoZO>!8Jvw?CubP~kOwYotwA#Pncz(Dzf9Os`L{#TeeA{KIoL{Bf zU$nmdU8zDT^wU zuQN;~bN6vyo6sN_LSakADOUQrJVGO_o@h%5GdgdG5`8(gSTzyOJ-SL*Zq8lZ z{F}+GGE@Dt68Xe3c+=;gt;o?j4RnF?rN!me6fF;EzD;Y|MMXn(m!;I*rPT8Mi#^RW zkNbWJBcg--xpFScI$Os_qS$56N)5!x-Fo}UemWvGVT-4kA5x@uDp0#9*tG^Y=}eP@twwlIm6F!7k7 zsG<_(H_@F43;dV(b{zNUvGjwbih3`-v1bod65K6OSp}%qIwhAZj}2+RC8@aeJOL!-8R;in+K?ase?yGk|la2H@OIj!w3mN|BK^W?Ke6p~S-pHf-Gy@9fazU8I;pLPF7 zLi1YjLAPLJK>-s&Y+q+0vvxN=s?!Gr&X{aA z&&XWU0%9|%7txv-+B!NB;GX$yB$=b<8|}dN(o$Ah#qXWMH|u!m>FIhqb&ThT>}n4a z$xq9_@Dx4{R6#XwmS)NtC5qo|rslGD`@ph24wnGHNINM$j4>0WO|nqsGoUtQ`Gd=3 zP<8NYm9lM#20AfYuAhhZ5#?a>lT7EWYsEg+m93$QQwMSDcyu8L)CRUujX?twjrQD2jV=?gNEus16T2Z8t6-w%>%8{K%89SNAGqK9us=asTG$em zn#|H^kjLmO@oyy~3(j5ZSRatA64?PG>2CuLUNtwe~i70?6^fO9t5htmXZ7)zUeKjV59-G(3g zhYZ7fCHk#VAiBQ?IZQ8*hT`^KtaE@13)@Wn0|t9#TgA0Y;yOB{{jf}Ye0KeTlaa8vOjFpsl`e{!8&xv9@u$Kf-=?qTZ@p_Je?()m~?|ebIeATE=NF zpW3+pc90z3V{;CcdO`LikBc=7jDt6qNJ4$(SUpfCd?S=Pv^YXxArSA3L4ht(7^lu3OWb$kYj`&q@Abso6Yj*z z=CmbS0vCd5eF_Uu2w3m4Xwr!OjMWs3R}<@3CS!Z#h{8$pBSd0Dx5SbMn_ic!1C7IQ z;jT^#y{-#e3FD$E1Eea5;Ev079?Gm#jR4f5`i)y`et#+O4JdAR&_A>`WE^Lt~=!8){fR1;z|MyTel zJ744O`qdW97$ynN{HUye_!%c2kr8|k_pTDzggJk?Vj&Fpqz(+O;EO$6&*{BAkjuN_y|<VdDmCyZ&OnRbO>!z}?=~CnE?_#lru}%cznny59BN@;EtC+Z7(H|=e%p4olaLVlOi(ojNNsr5# z-B5qDV%-=1tPmpPu8@JTuIlqsLo>1fk~)$6Ga>%vj%2Tl41u12E5Yuogo7mEt#Nwl z8FqVu#TdB86t?5+0pTS6=FA?kP`a!alwiIF*@1XVX8_`f-Npk*Yg6FC!$i?8?mGv0 zVEV%&ARI8#(?c}92f8DjoJ5W7jGTmB+MK6Yh4BpizRMk)hQHu-WWm+Otl9i{o*L8O zx;aQBc>OmZ;Q*w^Q?6_y*C?|)?NgPR&raF=? zgafi;;2gmem-hDd?a9KX;99l9u8o027yyistBHK2rGq!No_Y9_)vo)((w2%UaC)I( z9z$*f+Hg+rYEV$X&9UANWQsAZ+CtC&3!^v~dk*WNbWKSVyD3|4aK2_qLikJBZ{;1) zd^R#SeL(~&Zkpvw2r<%Tf2RETXs?5-sb$koTb&7SDe=~MC{;xUBqrEUJ@Cz~T5ih~ z!h|VkZW+{sXS5RRVeAZ3C&`ETW~@eF`7zouiZ4WWW97^qw@`;|!n3AHT!`5Ot;xXm z_at9S8L=}`dK1N3r0zcv*Y_SB@-2aXxnMZ+?7BG7=TE7BWIXpQ9)CJi*VIDi5u zGkL5UoL1N#7^zqyJ6qGTdnk0r88*y)_a|;GgBxy?UsQEme_xdMIG|-Z@N%T zHr0m*l#ufUz>B&;EgfNCYEee+_7^7aBSVd02cn*8apbKD8>Gx?n&tlC$QS8Zvox5> z7dw<8vivOv{1_|_vtg5G0(PlHw~?vvQGqsg$jTFBDGYVDvWzmF=z!4WcLqha zZnLZ78RQ6d7E#k`!<;_i=kAE37#X7Q?yNh&@dO!hofYa&+yU~kz){MPtQp86FB$XK}8J+f6qBT3_6cHO4iRi$XZm6=s^G^9|3Suk_ zfJ$5dssV7dcqg#aewBR%V^lsv0Y%?%9hh=a&|xAd{H463nyheX>f&;#HC+E!E+f77 z11ghv=+<{OL)d>z-|Xesn6gg8XB2mLcVu*Q$qZp{rk(;hzm0v=7;tL@p=JooCjLiL z=Xl<&I*$tmzyO>*BkdY0jWuhcSMWLqXpm^i&>({T}iG*O}Nxv=w z{tm~MLE1jfAl|bAkPg1q!|szwxn&C+9Ayf_;2HfVo*cFy_WZt!FgYBaHz-vKwhW&f zvnt9FMR_TK-cM~be#Upua9&Q=lGqHo8RIvUZpf4ouo_kXSLS=}1*hXUiEtDAP zP*}=9PT>f4g(Nl@CBc(G8qxPJT;WB3{`^_yak0z5dI_fS&Oq)>qlTJ_>KGj4TQ)OO zU}vBtFW>Q;nyIX?R>2awm{3V#GZc@XUQacCxV>;zd&vT{+u=zyuMt1<>Nz<^Ho-`+kQx*z z77ueJEA$QwIGu$)UmwunM9E7@KSS<+*XzH31abaL^8BBt#@62h|JR>@-xBlx@sDJQ zJ^uH-9BaSIWxJjB(GeLJWrip-f+YIZbg91Gw&8zYN15gyMQbsk=d(A?TMmEaAU2`% zD%e#bI+uO*uZQ0msV#2WP&0w^=e6#WobRbmeIrZ@c|G=_qu*d!s)+)mUt@eEpa&(- zMj|Y17B;u^)X1Xu-&U*2ND4ICFeBAuv@8xinJ=W78Vx#P-5?#x(;MYq_(#}5AT*gqcIhDfqEAs zK`X}=Cr$%(fMKWSVt5cXnO6i|4wz6FSZ|>cnoo}z$f4$*0#}o>18VdUw_Oyz_n$0O z&AgA{_FfXKcmr5$9}dPX9Wir`xkOj2@@xpB1g+nMF8dw?w8b`1J<$o@(H|5vvW_OP zb+2Txi5JI;ViRwXZGonaxr9m$?&s&hjRMr4B_%r>X=rHdEUUFL_*?K@R~8hyXQ+Uu zjnusbF3RT{yC6glfdBvc;O@Qj%^-_q8wrrmz2R0QH8eCx%8iwKx;af%dU{;G86Tdp z=n%fec_LuHClM_+8{;c|s2|3aS1i(;U)A$a+}ZFQLeIGDlHnWJyZxT-&mJY5R^i~A zs4!Kp2qO;1Nk32(tNu&$G!pyXS@;`;FyUJm9C6v$sW%1i9UhBDAl`e)uY(Xau-PS2zh$YK>tXbNI=O=%+Ai<4xUOF_{+Sv^9{Wk%U=@a8oo`0$Qa9MSY?st z-%?+|`0sT7xILdvfZk_h(Vk#(d6k}aBPjzUefPU@BsDL#gS?CKAd+%ibk@3WH7&ya z6jLU8(jQU|-3QWr8JX;delJ|@p3PxoI_<$W-J9cvW2(;zkrU^2L2Zd3qs#%Oo9@ON zBf8f+1BMrZa^lGO+U<}03huAME)L@`JdZSm^`t*rC5GD`IL-zdCYHPFYqwY^rO=Y$ zW1^s(Oj}k@PgpvO3hB?qQz8SOVeRACr=p#FW)=T49bM>uri0MkrkBS22!la-e|(vc zC3S|}*mLdyhx#S{J;NkhGQ-vyDjJHYto@Bw$HBf}TwI>boNP93mBs8}g|1eC*zJK1 zPh?9lua{(m4LFN(JY9ZMX#gG?L^3;I;Fj5hBQX$~iP<BwM!a-x!2H6T+XTAdt84qrEr##Kl>wG^Cxok$=i00Q?ry`bJx2a z73%2}+I`oLkCa|3|I+?%Xf}imNE2|CmX$^R%ufaiu%AUlq{3bhO-;@C+Z|Ai>*YN# z;A6o_3_e+>+$ijQ+Xez9ASN-fXE>G5*xku;v4Kmg*4D-~6#)UE&gFm@R3a6*h5$3a zA$whXwG=CK&--2e4-20H>OkzV^`_Iy3Oe49wd6|=T(TFziF86b8-riemwpIbAcdMyV-z9}=& zenH~?H&Z=Q3K2a>_j(5k-{n$*T3ML?hN-LlSjG4Oiu)QLKA#_46Ev;A#O!`aS$X`* zN8SsEPs)tF<;g|1ldEvNVRQN&8-%sIY%^OQ&Rj1mmLv?xBX=buE7nS|whwZ=4wslL zO}ElYS|&myg?z%KgKaQjW%y>hy*{8eOyEw@A7}%%hZ<>=i8|l#Nv`JHID^uYp!z5N z;rpfwE@7S)8{s7%+OH2=14|3$mRf#4^YZfEf(tQ$TA<*tSV`wQJZaTkcjYtmLJl6xd?67 z6>)@sgYUW}%?TDr9+%3i>zg8D%vCFWTgdsQHlhR-%zqHD3VO9?lQd>L%u7vCiSM+C z;fOCpIl*{D5;u(DLN54w+M^jD7#`bl@uTq!?FcGl5fv+Jh)w(~`D*RaZx-jbj6S!L z9FoL^ywCqg5%;iAW22qQ>j0~gqu}uGvmv)vN6}y^T78zs7`;%f*uS>6_6`x9l7$8H zsP#!$UO~Ymjo+DJUMP)y({1$m&?-;TU#ol1z)rA|#}2+(w5$V7;_{s;XJ45UrpgCuvqM}39zYp0a9~U>7R5=;e z1{a`34vg4n>mdr#&|ie z%UQFTMpsr;G_*ejs*LDl{P=jZ3ikYYe{vK_n(hu8!NQGC#ogCnwb4s1uK2sVyGl$l zeuLhamoWny0MzARZUs!>n}E=M4df3Wfnb;!wL-M#Kx4gRj8k|Bd}J{O;kevb;2>ny zYfTO-ZY3)pl)MPF3wettt@SB}zuIn=a?O#4mYW9H*3oTLRwQ_As4BCLrFfSfvPGd_ z=qJn!0~me9&xA>fNifEQRz(uqI6WSYm#)Z3yX#Ol--U@aKLOO>hy@^mS7@^02wbAqU`G5Ij2mq9#{&kMHXkRIJ3t(4+!2hy>wWuK z)wo<6+Z&8;?!no5qO;{7!?_014JM|qtEi}{%Z<8Fxk2$L<`33?-Z>DPj`L8d7PRC; zR2_4{3*vVf@2{Bc|4>DV6Z;P%71eA>roC&eKZSSCxD&O5t=XM~gp| zMTotHUD8q`NM<+ZHcAMN<6kSZOx9WoHq`Wmh;OEIavR~uL|^jR?u3KD-$T)25niMS znU?z8@&zy9?m55nTLzrbV(;|%+eRLi+!NNYdI{`67gG_Dr~5PR9$KYzYrOk17toPJ zfD^UA&Yey(t{xr@G`v(_Wy`=K?$9oy#2&AMIWF*ULSjO~w2J5TO30rgO%A|(^YowI z)=~Y(KN?3cLv~%|Mp$eFABVvFtsep)MU$;sWhh168iN2O%h>i*J13e-W3`C5>;X{~aT0oUso4iS|33I;ErjIS zi~+yRU~JqUL52B1@lF4max#hJSuau|x|936X(3 zMi-uvAWR#n0g^Qnw8Rpg ziBaOfQdcMR{R-&YPOue<eJzFkv87sA^koK$hi?7@BC&hAik+jU1 zbgcu?xl9%AC34lX8m)9N#0`>)&%q8y#@T=7JNP_Id_%R zE9ze#Eb{(_Y~1o=bShh9F?`X>`)t=nOQ#QSXXnJs+N_sh#YtS~X+zL)ucem&J76pf z&({4LxZc>>n%}qk^V4y$c}gc^xVKw)FBKtu{7swe5+I(+ZwHpSh2>vuNl7vp$(>O zV8G?H+r&|y#Yr7Z(|ue$={H1K966{i6&*&4y{89i&;80t^_)RvGOOPm-0Fj7v zDL=-d)xSg6a;TQ-CW+<9e>u9_WxFGf4SAmrs6c#-PTt~iuT*}m9s z%H_@93b?cX>?`6lh{%S8>Xp{M_85kARG1D>ewF<(z4tXKDHKd5>eSh1s!i9solprs zUK`g&XuiUICc2B9_fEg*g7}t!B&ElP`_;3dm}UN32+?#&*X6h5j2+1uNxt&m11d9B2duZl)~l6aT>h?O|zTV*})s^$9bK}4M8 zqIMtcq7_LA{T2=n@iD3{sb__THKR^h7Vb~wq7}Dy&c=T6fkYWN=XzK>oy%^uYSv@QbXlLaq8YAy(@ z(pl*u)bIRCEi(gVVU74oCM{2P3riEy?$oQ{{_X5A*=->IF@{`pZGRgCf>aj-(Z*o% za7I+r_-n=!*u$eqB7pL1=*f8<(u_(pW(Xy6JS~~+QopqFX>~BfQVP~=wb%d|u19E+ zhxJN(6;1F>9unF)*K#w_>NHH2hj&;;bVSI-z05$Up*aydI`D&o-VnFy_*>A-db+wr zrTzIBEKouytWF^NxTTClZhjCI)nvEDMC*$$EFM2^aeTN(3U=D@Q2_tPTsLVeSrzhtf>%aH_=H*}7aI)=9bNYX|BR%}&RLch&Rwa0iw<#Uv+d=4*H;nsX92o%S=hFx zwW*3g_LD*^1JiC*qrZoqr8(-jjfH!wH`@oex4v9t;f*@zdGu4ZsTqi-drGjIYM|j0 zQCqHX=wrP6oj5OWlKALTGF92VyuaIPXL75$9OK3*hHVcbJZUl^WE7N@;f1gz{N#xA z>Q#R<*g8sR7_rPLFzg3LOs7Gt6oxH&)o8Rd*}+D8?FoluNl3>hC+^zW%HA-*bMW`> z9VX~h!ph1{t3vej^vd4xsnUXo0eZ$mxj$EpM#5v;X&f!Id0KaMv>eT|KU1Y+^d`C%Ey5MLo2|Sut-+)+4sTy$Qm~Gse->h{l*U2L`V&~a ze6$)8MU&~7=)#nv$$RhB3?}-uvbqk6yiyz8A~PD@hG=!wBn%_A!WH((fFz;xEtYG) zW=32?hgk?RiA9?@wf3 z#e{JFj-$TGr{Lug%VHIM_eWD_Xdxkwcpa=M|FXm>BHbv5}8G>o0d=WrrMC z+)Rcrz-TE;8-PNg zvtY1p17mQuIW$x6L`SQT1O-LSKUH$yAtNJ0DUm@fL>H*`vfrO!-(RT5tF>LMaDQ5C za_5L5<1nLF1O@Y+%^=#(%FFYj83x02pl~CDPAR<;6k9W<R4--Zg2J)e6$*2;gleq)E4ERWhxQ9QPTD!fb!nv#^1uT$dz@W zw*|hVvgGp+-|oZVXBIXcA-wy?EsD)%mF4LYG|=VD!Wu+08!ygn81_@YWn!qhB{6Xd zZz|i(9lpQrLUzUaIxz}v;u_|8dkCpq#25{(M~A^UT&Z9xjQi#VB@7IVM#Ja)A*;+j zbEsaiW!_7^S6>+^<2`5hwZR(K>%a4F285s~^v9E=Jn4 z@7^LAv?G$3TnvvW_Q6e21&QeV*M@%?*owaO24WG8r0E%y4lUH{0Bl=X6f@kzY#C1I z1&Wk`>}Mvjx`^Tmh&Ya8_rnS6cM8|Lu@Uml&SXljkkOGwxI5Y_hj@YBU$oaAL>~&i zikg|vxlZAYX}BNmdMS}5Iw{*BP+q7JVgg_#C^VYfBLG=3zt>&S#ME>H2t~oddMf+% z%cS64Zs8uoRmnZ<28;%}!RsxZwVab@z`D*N{x1a;IlNHs6bY!Y2ao8bRsKq(EW0C; z93oo#*j!J*n?yjWNh+({2Y2bkb){L%u{GqC`h;MxEhAEH-X4ksR6&t(6!J7h17JoI zGf*uSD!rGU} z{^bOVc`zn`EWCY;(-LnYt z*#a9}cAr&0$com$%uJ20JtriP^U;0=lmC}x0+%F|9SeigZMW|E4ui)K|Nm4@Cmh>X zvz+|1nKtx)hh9$pyZz7CG0+XH_Tgwv59^HMOaAu+=ezV9l$3uD!JYYy!YjnHHp)=h z{bWX!|9Ru6E$;@}=Z|<^9dWtEH3ku4>zVoW|8w~Nq>wr#LTSc=$^9|PKT1oD{sWh? zSyKO{4#Ah7U>oHRW_^hYr>O`ghyCxHRsT;4{`oK^Zt~B}5TGqJO8(VJQJl_yA2|W< z{rw+0dD#h<2WlS@5*ikwrL!D5%w;9M^}b*u{`}W}^v7BZLlg1&?SC(+`|^*3e?D6% zC|_}KJ*Q5h8xo=m!Oee>zkucuxd&4|_pNuGTs`K&wjHvEVt@|C27FO8LSXvqpz~~AmF?QdLhOv-oiLxlG0(4%C88* zOW(fwHUb)kkA1cXNHifE<)a&Afy=gKsdOj_8JDm4(HuFV91CVp)V*O>9T+r-5bESp za=N;>9f`s)QV>vFFQph*??$HOxq)rEg!zbwiGz-frbWv`5RUKPAK6i?PCCjKtbqB; zKI*`;dkr4RmEnD}1slK#f)qq{6mU_o;s9l{v67AnQrK|0wz;lv0X+3?=Yf&n0#!Ve7#-R*`#F zvDCgL1M7P-pVOvwM)Fqb)`VTSodWzXXp9N>8df}l_T0OTs)EBtHUyYc@rcA%=Lj#6 z(U)(n_b?Q&{x$?T1QVs`V|4Wu99~bT45;pZB1e_2#ToTaeh_;E)2F9HoO>iL1d^2K#p+y2Kr-eqHEBEJH?PYW$%}blpr7p zKtKsh#n{l$!R)VJzgTxqfuXS4Mi`%T5A%04S+=JBNqag9hyg!uhw-egJhk8o~Fwt#?~TYz89(A8HSGM#gZx4$K%{a4NrZ)c1;Tltp< zl7}zd*-?BL(2U~RvSPm2)`U<0oO%T->Sp5r>*9ax%Pw|3uQ}TlPAI>FI1)08!EW#x zLhpkj+eEf!>- z?<%jG^^U+6PEYl?8cVWmUj2Y5&uXV#8a$(Ee?d0DL z5C}B~UpU4y=zW$HNzjQMd!mEruB z6&f~lr?UK+9UC#BCFx=Hl>Kazh}>f1oE}Bo)TL~6^bRR(UNA!}`A=r>*jh384z7$jds-pH8 z+`~kKMNU?wpq{-75U+Ot<71xT=vvANxDyy0@Z8}u`Iivvt#)338MWlT zday1Jth0SqLV#j$P-XZOaejV2);J2Tsz}?#hFLW>jwP=%MH91mv&-kkVPK0KnCCjq zE)u&Y!+C-iFM>dtG2Y4m3?fibQSEO|O`n^Afn}mKHehAL+Wo`B7Py|{_KIDoDUAeu zkJyPn%X@7Eg@bMO?(76Wld33NZxxy`vAw*?g2=kbzThXafvH%~JIZ)M7AIOtKbm zYpA1#ZoLoxKuPd4*o?aDRr{sCjzRDbs|hUs9Y$aVExuNefFrtvEUT=f*OC{;=npNntn2?jbhSZ zTh->Tdmw*=0p8jEn8jtwDsUzkce{dW_x@t2rrGP?(n)e{_wg;YwZ}*owTvE)c`azj zzGuiF>;GCL{ldamH1SqoM)@>tg@6;0cv);Cy6008MxXUWPbTHvE7UWVIU6E`TnUfRv$oX}ye4JI5FIKSB-nT={( zIs>QE)$$N3&sK#v#-pM}Cg{TXV~@ThhWVgNsmiXn693TXVA!J+=Xi;Kp1c!NIBAcC zE+)CGT|a*9`Qzlc;GN3AS7dp@u9f3LLtc1*LB9j{6R~ok+}?ZpA6N}8mMSZ;&im(5 zQA$ zeG}PDW|L0KlYMq>{Pc_B2L+3d^_5X@o%CwZlD>-Pksjt15xIki(AW*LmxmF#UGr)E zB6t0-JZ0_h2d@pM+lSky{iqRm*p-Jyp3xCjh99bIMwV|{qz-T}S{Z7jG8*u@V6f}? zvD<}&>1ru+lZ8+KCR(zReezy}AMy`muXFVbyl?%!?78^+y|YvjMEpz5v$vfx#Z`bT>hhaw|L(fD zV$Xa`W;yPT>gH_uXe@J*VzwCVV2R|>Mu6&OFwF7dBduev`L4%^1Uhgh?2beb`{x7u zywer|c0^0G(1162+TQ2S22&S>GrU_q4KBx6A@fQPWl=6o!W10@P3_I(sj9`737Ii{ zMP$Fyy$mfFiQZOPsc7n=p&qyAWk$8qeaZf1`jZzJt5KzotgDuZ-xc;gMEx!fHeP6R zd+Z}j@Hsj8R-Z`H_}YIIKMY^v*=bXLoV3PwPB#Y?4qz#~xN%QZ@p(?NT=s8J^%hQ; zM&Pqw-os|l25qn`R0O4tWj6ENOd4eX@c#Y#A17yLo)yDb6TMUtmF%{n*2TM!B@Rs8 z`J5@m0C=%H!Z-D>4C=1*6I$;vWUR5@#xPEf*13z8d|ZCtj+On}U(+@1mCQ~_0mF=X zh^I`tT?}1Ns6UJXOEm*wTW%NHU@Ge0*6f->Ku|9$;AVr_FLo-oblC(XGAeV{bpe6HU6Q&=W5G^hn8b(H| zh9x8uM8p#s@goagILB0&pej|7HjIcJXWd&d_UTf_Hmco0O8lt*7#)*;TYrH`P(b$W z@2Uud8S&}eQnA%#Ld{e_E(+z_->D5&sgubRJd})&-xvA4)exhK^>wF13KAC9;jKLn z+;2VR4orFnm}`YNSO_wr4h}f4KMcmC1Qes0joaC=6dhbGwt?WdB<9yF5LaC!pGTA} zPRmCgOo!|bfuVYaQ{wT80FbR5237&8yni2KBjM=yM$diY#S%!k;Ns!o5EFj^g(?P{ zgUOsGvXj#7^4|hg3)M2Mrc2l$q`7Xd(`>UqB6?~CtfPYF=F)+Qa5nc-lk?rl0kx}d zH1gOaB;nxUc5}{maAidWSWSFx27{VZ1rL8CpZ%ZA$X(b6O8?P79GrEz7vK-mC%i#g zY9?AdrcYaN^RnM4`_^M#$HnxKSer-$kW6k7-#4FEmzXKEYFICf6YtFK@|&v$9YPE#3<=#fxUtvPPO+dOj6((L`t%w0=%Rosf-}&uGZ)#a(e-!xkAl)ywp91O( z-wpSnbkx5&3j%yP+#ZHU!K2<9)wS80+r7S?8E+Cxc+U7uNpJ*VHdpi; ztXyJ(Jq9U4=@iG?jj5L3YuTwDVP_nV{t7z?kt3p~QC_%`Q*8xf)m%+l!=krASYI>T z@d;~cJ^{#kS0c)uOGbrjV>RYANuSwBIMT@J)=nALyPu*>QL*TCsaMGPgC^4d0KhkV zFFUpe?c(1!0iEmB?YNpqFzsIxfrd{1) z9nDf0FY8%c5g+Q`2xsf_n`x8ZoHiDHW<+6ehY#T^8W5t##}mH(7U@BDTKUF)=j!0I z$AE|Zhc89)o<3a(H_`Kv%H?cpjmavqiCW+En0OnIq`R92#L^li64U)vmP@-zu8i{P z(wi9*D1ROmhc-FCvXtwFm>H&zwvFGb?yk==YTO@MB0{%5ElHHHOdYX!`@k&Sn3KVY zMzJjKJhmP@kc9Q^V2Z@%6U|1c@eqHCKspvTu9d+4PK5*f2P2iiw%Ho2$6z&yn50zv zy2LvLg=cN{^<4Egaz_UThfuJCP%s9G+wMeu5|5o;d`U3>=WQsVo*PVQ)2Upx=>Vcc ziB7#g*y&+DVHvEO?d;S}DfM%t~n|b$V z!zTP)yiu-71DJp>ynK^%bURM5%-XQggf^cJLs0%lWKfP zm@%6W`3dgvtq9b249j5cCi}WouaHqtuRs{nm+lAvNM)~a?(n$R&OYSY%x8Js%|5;x z>w*P7cPmKeH|A;v*H%tU(h$dyju=n!9YXaorFEtx^x+XK)QYH=rQ6Q^QS)s% z_g2WEK0TM_oWkBHgu*5@koOwrS{j20F3$M7MuzP16hZI5vmg2E+EX9w3y_X(2%TD} zaGD9eMLul#!eVVRH28_Gnm2bfE^~4z|4WqD!)sgbPdFb-Y}ts=9F7NGyl9zgDV}ey zt@bWDnaFXbCj)lgxby3H-7^T)i0}DN!G+8xJcGn54|{^C1y7O}NQUohw8BeNKF##& z&Ydx?Mn9U)_fWqg9iKijs7`UV#E%bWL=bxSf#I@`5`ofE;mWHl_3=hkC%h?J(XA#XL zN=_##goI}=jI4^IasQl1-DkN6`-_+p-qTxws`2fq;*@c;g19(*ofaL(fajtq7np=G zx!l=2rVT_6V=$TmRZOKeX|=UHhfQbik`!pwsZK5ZpZp88rVQBVK~*^T!(Xi+Z8O#! z=PaMnfRcmkKYCn5Eo2h2KGoJcgn$2@QE?l4rHRnP**Q!hbMRRAs93gI7aZ^IuWKyRgxrr?S2T3;)8m=~xA4(HH6IJI@bW$P{VAkum@Q0}qy`tc zuzOTo)i(@bfmO$mc9Yl1)1oxvP)lsCZ3?fD#dl8vPc6*XALeeIj;NO7%(M?d_geC$ zUq7LTzg3Yz^DPq8?$JGskr;-`EU=BA$Th$)+#8_!F@UsA{^tLq>Mx_>h_qJNLeK4Cv86s=BL7_Fj9gxt@hl zTbq#ZUZ%5#I6OO`T-QVNR<_klRzo<4B12wA=#?p5C|8UKB0Ug;vpgZzYtwDE!I+T6 zMuS7#p6gZL=0zZT?fJcP3f6H0cinmJ3)}XC=83}N>+3GZ^4{O$iL7HGs&>+^CP@BY z=B^4pPkN@cxoyQCOY3WYj9WJQb3}}0VzmpJ4ePYkL1jRFnn-r&lc`fWBqIwwJU1B| zSJWIbLxvFAxTrrg)hQa&)&wW2-w~ z3BekHx=IjKO$IVH^C1&AeJ4t)uPxKZDcp1#t1X1OmD!y@m4J41pa|g1yk8-x7k~ll z;%qJw#{U!ssEbK-vR$2jj21+F@_ktUb)}n-1+*z!Kj5fQp=k7U`+D*=H|n|z#jkI5 zKyjo$wY%Lu=_q>-8OLZ^>dwoQ?l9cj94p?`xBfL; z^rk4}~ z;Bxxzm(9kzWwv@DzxYR-gX%I0%2%WTm>;#;7A; zZ;`SyPWk?~&2wxf_InYDf5$|2LLc1^Zti9mv)Xf%2R?W)yC@*?zfa}v=_zV`%Qhhg z6&2LtBF%$?$LWgf>FExg;@Hqo_hf;1jz0DC^VP&cjS&>BV#7Gpa%Vt*z^mtb+TTn& zpb5x*#K?$SAC9w=@6_jThgNDFDR}bPvjum~$}gy+e#s9Xquy|L0de@tOTp9ZXHoOl zh{#%qFK5Gga{7lr>khS_?FAd#_tjtcxc=3>FRy;jUc`!vCyrU*aJ&i`-mAVDh2F^3 z^lMc9Wz}hYZoj{v_0OxM?1ZADcEd53V(Qfwam*psA0rWJ-fF`Zbh|DG57LBS!~vCA z`#cD#>Ysdac8xT$fx$-daemJ1BZiv&NrAHs+Sy!!YQZTxChC}>-XUq}fU3_Lq&e31 zN3yc^r$mqKPpv1soW42b<*aAPtF>awuH#eB%O2afesHSCd98^!crjp@tNQ1_1PC0* zDizz>F-fnjq-cJC5i4-}IVPE$o(vzeh%8GRBE+~_RbeBNSj13q1HGV_RXBl86$m5R z#Plnj?;FWpH%-HLki7MMJ#>tY`i(41oB-y4cQd0xoy^ir?S5&K;sgJ`@$89ttd6Pj)`@ ziMhHH)HxP@qQ=?_Fe^4QEy~aLbrj@mw~`NJh8OGmpA=DU2!Pc+Aqu4-F)>I$S8p#A zm;sehP^h|r0JXRC%Mq5XUNqslSwZJ*nI|diRnzYZgca^5$8?3Uad9ve38nO_i{yZv z(aE9@hPuqe4%n^1pg;*4N+d`YE&r7HckShjyuC~(`HCf2c?2$0sDy0X-Z56&|JwLw z!H9uvdJ>nHp6)@-&3)%g(|Qm2F2})~I2&37K#s6G^ai>nMs+_Ann4DR0osr}3D&+B zjJn@&0pf9}WOc*5JK>p1yLx|%AKGb)!6%yYhJEWUN``al&98rI5mh$ytwTdQX_0^S zPos`J+MJYz4YKkGX*#KU{w+`m0?d(wcrR>Ig|cvA=XdY}znLhyc+*%l0$sK;;?D(e zJP+HxO)&Ana}MxUZ9ZZX;>_s|YQ}dSZ15`ApjX zq;{MJqRW32vGdKjx?PD-5Qk`dpkkx#3VOAcWg8VrsVW=1Q!M;J;9-W4A76`y$I5aY zK8Gg#UehPqUMMsHFse*9@DHMv^)~Nl)sC|<24|`}s0!}+u4rT+U~ch!#*e5fH+8V~ zL@Z=zP?!xLbp=5Mta3>&E0n%PT_heh-B6e!3vgUlJ~)iNcpS(V(K@-VW4 zv3hZ%3$w_8vl{?exK1+>`DC}FetJTp2~EED=)sCzTu_V8(ZqTO=}OOU#5EUi=ANu} z4&OO{nv%PfZvMf4<8i-*tQD}NuB}w2N&8E8n+*#Z?(3eX z&41ESgxZ+Ezb1jLbElNnV1zdVnlAWwBNuJ^{~2X}HG8MH^A)NwT!1BzMPRa|!OdbK zw-2P*fwoJBGN+?A-5W9Y+%0VUS#_m%13zQNuf8FHC|z}2q|J@YuXl#bN7d6ovn^9Y zbHsAOY1+k*jyj9Z64c_#K&uQypn>(D{&MzA$DYq`$01QV1&nUJt@V5FGv=I>>knD@ z5w|}*`un;YLkRKz1PpS#P&#!VYN_v)ky@*lCuG^0R|OdOBM^Ym{cApYGa9O3RO;tQ zNYw{ry3JD()($sWr2)gat(X)RjR!Xi@?7{R_4fvN+6g=#!Dq`k<8fFmG4|TUVX?lm z&`?U_*jj&&ZgAnU~+?df^ z!PXvUv!k=6dPei{Y|x8<2GVDY|Nf4GN1&Ij)(4TbV9p{avp|jEZnn%x{!5?Of)fw2 z2TIk;&D&|GxRTa@*ENhNI^pnb$fiKWz>Ri7q}=!<$WSI63x0(Pl>Yc$IOvid?+jAu zvFhcvaEjz+x9iXLb^)2q74`bFv-qhb!OvF0<76kh*MjR^LRz zWcEN2p5-=l%DG&SA#?2&v7TWfx@i)hR$rXTuO%tge%eH6rp;avKMT}V$E>K!xJ-1k zl#*Yz8dZ((huGi++=QaS=0@OLZgXwED3ihPe&(s$U1!}k70=65(0si|iK06Rkr3Z) z@AprlDe@I_I0(BfI_+9C=xCh1==%-v!EhXj_)k5as}(&@y%kB${W{^YP_k}N_e8tO zj{(adTRIVnvIwte>)utpm>P1M0n+BS?GuU=+5H7(NB})OBRrdU!0N%<{Y0daGML1E z`DtEue7I`9`t;D~c$?@0PUim^+trBxWDs)xk63%Q_$#8Prw0I-nVB<$1BAc^qy}_W z8UOVD6}Ndkctpfn9Rp=0vzanwd`{~xy>=kIrs=HX$?^W&2pt0(vCqeCYP`g>cbp5n zU)(NTIcJ(s^*V?RUY0a;c{r2JM$(eNrdak(OJGlMX^@S?$np-JJAYcU?PB199C=@* zRpG(lbs;FOgb*gA5kdw~@*S|n$8a;-Eh-)s&@s<@o7)zdHB*>9P4>MS;9Y8XJ?6LE zoI;?YELohpK_(8%4T=xYvG0AN2is zb5i)-U@;CrzEIDZdvwvS_WV4b6-C(Qp<%c*)-$YvG7uIgg$#*|FAMN{B4> zIJF2}z*VL9&%XhBJX}-l{Z9_7>yS?hum6NsyvKSH~4IrJfbUoc3@ zeOIHqpOQzWtS8|=88qfZbT)<3e1EnRjEle{eKjKUXuVUGaSjX7uJF}v?DaFS+c~`x z(r%T)Nb85D7)z{r2!_YA(acm5-}C*lXu#=C1zqsHFkI;Kf7QhY%EBptt4J+62xL4U zlL--nm0wg24h}NOp!sE8^+`J(c8MYeTHjuu zlm(Jn^s5Kv4FW(?9tK7bXpl}@rUM}mU{!&Py!=0G3P>$yC#V8D#DO?!SFp}hyL~6x z{#`MhC`+aElbQhkjf3;Fh9JtX4v~1XqgF?GhkFD!@mPTVpQW;?b^aN)fdh|4|97Ee z%x{=U`L1~?G9)sAPe}#pc@u#I3zyPzz6~_dnImra{%y6glQ9@ccoihD(bMvu0c5zE z&i(cG#nHljqh?UFHzjXK9dCbJ$F#Jj{EUk~#Z|rbPEIwF`F`l09MsF_*d?47s{( zWkM*Pp!aBA5Pz}#Sn(&!TbuO!GP<0Wb&VAJXp>5+SaliUGx!^EWZQzYVQf?R)(K*c zJZmu#F@*xfT$}++Sr?!NbC9`ak51sQFe!8)0*V?+YxH{F490h74eujX{vhQRU?_}~ zW($YRT$S357zsXh3$p$;T3mqg$(NJ+`M!~em(;m<>+U(T@(oJocs+tzcJlFF^k@eu zVS}|yceVU75dapW=AEo2xTy1ZMIU27y!)W-2_50&c?J==F9@Gpk@mS4zVrt1+Ghl> z8T3kq6^o1hVX>qnuxM*rK|i1lQ~xQaiItd?i3Gr-+)5^PD*j9Qy@KwOVC}}AsMy*} z_^(r0iZ4?OC>Wt7AE8D5SuRA&a4Ek+8PW$XeQPaGQTsegkv{T%ZEekihK`QEBj(R2 z4^kiySZx7e9xEvR!cQlboSk>XhJ~7q+O?-s$ipkHV<3-HE(0y{F%pPW!rNv?Iwf_- z*n-ui(3I~J-CU6Hc($^mU)-1@8vBRXVTLMU6yl9H$wsG&x7*mt3WgL@XbBO zyWo%-jINWog}N-+?4j6#>agxAlc{68G$BgaYXpwjhioP>URp|j)5Rl2ZW#tiQOl~Y z5)vB!NxtufWTsf2G2rC*(Dhy9cWKK9cNZ`kI}96Q+RU=EyLidfSZOrD zEL{GkToynopoe7iL3VIhb#sMN@!4-YK~euwlH?907QzuOP(yNLtp@B;)m0IW3cjAj zaL}T9cAxpFtL^HlWD?OLJBL6E!}GkC&3Hc2)3xu3j`z4q!&?8Nlo{#<^bi$zaU*fC zt?|lxHoKlf0UGWR7xsq61JG>-96Lk?Q9;>CXJHlU-|wgT@uoNykJA?@&kITRn=GP$^_!1QuhA-y;RrM zUdpD;f^H3G0A<+^ipJ0~2;e@J!R4Hg&_Lun!Y)!E7nO^}Vz>10n;EC;(OX!((cKDX zG`b&}^Y=|?mDFZYNHQS4Cs=(K@a?d1?Ayb7;!f;G$&inY5V2fWLTTG%a~8c%3Y;&Z zy~-SpW@!nJXXn+2-f~Aje1+TDHHF=TvuaBJjaKP@7u<$^jD( zzOBDPh3Vzp?obH_QY-lfBV*|Q%6FVSqnUs{bzvA#2-HDuBoJmB$Rtx+)h~gBfnECa z5gWIp;ZeS3U4PL6rDt~#5o1#SUGCqFVjZ2Sh(1*bXcUw-RNl+hb9G@2GM^LSvkaK7y~tx8s{nSR(1`&n?b#i9Kn(>s7dw02{qT9v1&y!9q$ z^Z{6dI3FJZJ!$4rIvnWmBA*@X+Jll{tT3tc4}wfUe!J4_i$2PL6>#@n2#RI}-7bj& zp6O4@Z0K*+EE?)8e2aB>sZ`S;S-^s4t`l86_h02GRzZIUR=!H)gyMQlPx#TPWYm zgF*-LhO3X2)JnqLie}(*2pNbJw~8u?Zm&QI{3kR0AKL)@O=M;YK+WmS z|DO>B-JVOugj?j_*Zlwe6;%CC%KPtL|9#~q{(o7!|GV{OI29!M|J~|8?^hiEpIY^Q zKQ@#ozU?Q`f8r!?BglVcNNL}e?iAUx#sHD}Dw+QsLqR6i|Fd{Pi&{d0?3<%+q%nOe zbT|K5#{Jv>gUA08F#q?P|9{6<22txB7}wk~$D`OI*T$zg^i!N7aP%E&4=*Y_9#p#~)^}85kvZ(J8Udr_Jm;@(1z* z*GA-_BK9}SGelTWQjjV@w%NG`(&&2IplZsG+Ot63r{FmD10k6|maIzvyvX$9$q39Q zU*s!D0}5zgf3h%lRCg!-nHw(Nqc@5#6KhE8Ip<+=gfqYD3uF7G%e#3hx#-hhrZIDR zC?t2kFUgvkH&6fuJ%la5+A(u@3Y1_>QJcRuGbex+1@e{qNExUNX+T`A@)TkNf|77# z)aU3i<0TIzJO7;CH@EGw^`mx5_y^kW6|jYT$830z8wT*)Fzs>%3l7MELWf><#9bLm;2Yz5h`SI^9k0yu_VTjf$^`T6Qjjajfq=QnjDw4VOc=QW z#1^JVrx>kY>vR30CSj{`@T4xf%P%21jIW8Mc+5wpM*66em2sL$r+8G9KmP0FO z*{kG&msD1>-fgHopMYUl`@dtx35&tJQ+Ma|7BFjtC{O?sl%rfP=TS-Wz=j9%xdCQx zhQp<66#N zq_)fw?ruAhF2(d_WhL?;J%10G3kC{}`qoy(?+rFNZTSPNRkhBi%wXo3fuutp#!;E5 zfJKR1P$w=Wy)7xVw0wdVG48kV&kfMEGvJIpvzs1$;UPMTYWl*kisk1ER&VFcSrA283I+}-a9Kd@_m8F@{nZlR zi>Ui`ziXE&z1<)t{+s@*7wb0}R0s!eh_i~kQFCb+W6c!p(mrF_Q3{dONt8C(XIb;n zD9|CBgQG>9Ae2~x97~F_Sd%3a-4~pW7twRz@plVp?NVvzgIvZ1{8tUQIwDDmAkDAp z(P3nL0-sAs+Mze4s3FP4azMvygh|xCP0hZt@_OXGPlyVKo!O|#p*8B+W^x3;XtFRL}7bHX3#FY8Ubk(^1MM>1tSZs=M3@p_S;f@O3(@PieMg{MfzIf-EoMJ(zz4>byOL26A2Fs zD||8kp=4T3;C*DFu07KWdG2%yNnf zwLdm`!$ss~29Zd5qUtzMnO^2{gp8j0)?o-cu7A_tzgl@;%@KrN8p@4|0XQi@i`WZM z_t&Say z*n^kzfV={l+}mrWlLZU&;`i_=YnuMUHj)q7m$>5ok#inZ$ zO0v&R7!Ovkr6{S`nBIcZxPrNM;>-}Je1&Z2chU@~odH1;4$&T3(%TD$EA_>lm4fTY zOJhzxsyU>;N@S$)uf6FGc^luGGCWz8FZA%#?=rZL@(zbJm;5bp;O;uR{hLHCNGe>I zXd}OjZ#hRb1#e5yp94P5i@I(0_k4u#1PxnK1go=&-3cm)6P|W2FR8K1HmYzKB*0|r zOnEA>26s*e;O#( z{LO|BToH&2ynw3S2%36J6w|NQa{X8Wd*(l#`WAKLUe~+^NiHD)C_wIOS>Nyj9gsC> zfi~Z7#4~@SCC?^_UiB32kR&I_RQ2~CB>916JmC2+N-QHO0%q&i887Aq$=f|Ru@`n7 zCj9k>+~m3qIO4=qG8BQ-EY;Zd(eeT@mL zbmgo^OR`gbF!>2bW@gQ1#G!|ld_oq-vNl_5^U!1Z*yqj4`AC9QsS!q?Dy8Z9Ghp{w zeeEH_?VGIxC?Lcg>r}N3*#>nhMP82*|EBqNDU4TDn4e#htF0#<%Wu(MbB$nlN;fCj z28Z!%X^9BgA@nO~Nm_oltq3$s49uMRViKl^I-%i>+0+m&PH)zA*g0#9)tl9e5-4tt;=-r5v62i(dZFc(YzRsR@{aG8L;!1=w zy+=)j76$Fyy)`vH^uwhrzMK?FBYKHuGNMxcm{mKueVf|`o{B3TtQm5!iEbBUu}@1Z zuJ=4HNF0f2d4czBF3(Rlaf9sN78+!!d$XVdzTfk6`w460F$WY)$>E4#QCbv8Z`i?m z*q~MRkih;TrGK>H`Pzn+#o`~kkUj1Gr1ZUsG6}Q*PO}R9^_TE=56Sw2c14ykqH`fH><7^p*(GX5i(NdqKpI!)P4R;!yW|4bEHHXTlxI?oC-WaQgs>e3LP(- z)hH1foAIN;rltfcj)Hf@@ziHsr%et8j7$%eRws)v2_9baMt*!ITz@XNF!DSwo~i;A zzr)O*jHBouG$z$K??pjZ?L3Fz4CFF+2yK>J_uS8MOmR3O*PrjhYlhJw@A`h*8QAh1 zwtx0Cqsg1#(H-J|Y-03dZP`J-hHr}NSy}GYJAi_vs%FI!Hh5UsY(@@LCg_^3aSsd} z$8ms`XrGhbQhnG!Tq&*W6;y?`L#o}eJG6lu~A0GSu+FKigkxBUkMLMZ`gfY z?wO$f`KZB9%=eUqnLLUt?VX6x@ok$E!Qz!ruAYE_OUAFTwz*w!pM{R--I2xV{_Oi#8{#K-xB4m?%81xq{{&&1#_`1Tn9h0s zaF^uXiSr#3}2e!aKFOc>8(Ox2V;#{)PDEhw-PTqgAw} zSug9W#`~wN30t!d`a&7!uXq(RGnR=Dv3(c!G_=s`5P?6H8W2Ga9{yx2)=~rFkMm~z zRx7%_Jsp0Oc%sGhXJ3Xqp(#stqp|Q4h4o)k%9U0NUG@tdd#wK%(KhV)e~D^CY`jX@ zf-u2&_1T`|(Rwz^WU( zywz`PQSA>l7Xvot4S6_HnC2hcee9*6p|gT4AlimmJH-NHikyR1+cxHhidMYem~+q1 z{ziS-O7)l-Y^e}Gb{JCfVb~z75Cw-M8RsM3+E?}r zSv`6goVRN(e;vWQ$&j{rPU-_;`QE{fTBw^3Q(kZl=k{l@pH3D zaMxijRUxY1(IUzKk`=B?08lvl?fD(*-1y9)>_@;u1wNP`^868kelUw8-dp--lv(cL z{#J)aGGMGl4=2zbqL=V<^?v(a_x0e?Vh$(&;~gXG(MTl`slTw`vZcgi##?w7n*^uIye`m3_V+4mmtY}_)u=u<@<&=v+5=^-q6Y*z*aqNTlDLk5-8`Wmui)?v`9v4L?AWo?W79i;ATO*@J<;v|17j z1PZ}U>buF-Xw7#>wejI)g01!{Uu&>Kwb4jM<>Y&I+WC*?PM+>bT5S3>ckE%0z24NL zg{_6%3`DDLoXq?6nKc#71jKa~PBnq9KEY1ot>Y)zyd-nY@v?b}t0gm2{nl6xVf*|* z)TxZ-Egq;q=J$Q4O$Dou3$vN7yFC7$?yv+`m3s&5VVKi%c0a7nd!x@EjSW@%Be=#7j4_!IkMg(14-}2S=}Ybv~Ok=E9Nz`ja$Ys6#X8<%*cG3w!c%M_!x>>l7do4 z84m5&DK%I&4vuR{48K$r)Xa)+Thc)V=(tElla{Uxt*Q*En2l&>;zr%C_s?0Cwm)Zd z`0fr76A|UNXu`^~V$MXCLpXQodX!4`>U4L|>Me$Vr03D1Nl$gVa`XoLksCrt_$ml- zWr2lm+hIxnmMz|_`i>Whp$eDJ*rs`*-}9f}h5flH7c45c-A8Vw#iw?m`9+b5vPf4T z_XOpb_|c%`I(V*>4139Oa2A4FH`c`=gQ?DsxC}Md>sLaD~ZE zp;w?X`%n^z6|+@fgzOR9IEqkKFRHh6y{Tp7!|uy#oZYdTZB7EL$8e?0a}mHTbZS4u zsRVy=zJ4u$>u1sDBvT#_$tGnGW+Hl|OKlgKC;0U*mS9HofVR{TVg5Yr+e+U~ye3l? zt9=^WysD{O$ei}3(4en|1BXB3{2sfQdFiG^H{(4mcE<7E77>P%@a~xOiYYy?uKH2NtiOhO@Pc#^&zTj?@lo709+ zM1mw~{@vl5ZP%dR8J)wAaTgJZO`tzbJ2glp2-}3PW(K=ESg=1R4~vzEY!ULYJsl)qki#5;9IWOjGo>kYhM^^iO%vOfcUQH` z*POI$TXMjXRda5)sKs{zKMqVmIjVXu&Lvpgywgq9zg~K6jrj$){3+5G)1}4V^iF?> z{Tq1xC{2@zDXMVRmCU;2*bS3)!_jxY7Qef(e}M*FKlL`^1VZO46IE*XUh|_9hkA^>g}&vHS4g{Slk*X4W}8 zLvurmyCvB$tnlHV9Y6kyvFo3vY>N}E?=)@l-R~syKNi~MP_UGKbUXaTety#Hu@p=O zu-;Y%xWow6kCU#zBH)jX-to55Rw;%_VO>AK%3z9CGCaKdI%bZK7^6Zr-`(idNlJo& z`!_-Qlt}IgEibrW(mOzwHf28-L3|QK$)Q6u-p2J$bdprOK>P^GjHD5O6anSpZU|75 zwYD7(M&lDtuD3jP#~v9O8F-%8U}{5ByN6M-6Tj$hzIKxF#OJva8y2fT zuy|;?#@Ne+JW7ZsR|vKg6=@q?PwHP!$3w|eZ$qJ*AZMZIt@fVMRHvaq)ZA7y*Hv;5 z-AHmb%Zgd%ISlm$umU3KEqG1=3LBB4%RgMrRT@e$0876oO5;h?S*EhIZpb~#%EV$O9WK5^TJ`OaBDzLE#bJldzt=h$Q{guKB;_@*5w zN`^Oe^O*sP(=JnHl8hu9v3#Z$*-y364!4XSjLP?x1wtC>Q-A`WSRzuXPQpJ29er<&Pxbz|br$=p_oH43Yz@jSVmazCfR@LtysyuxU7Ach zm;UOx#I?^%;X6ke@|D?L0uZ7Gm$ewm?|*I%WURXJ%EvMxsQo_98U#(|OS4DCs9h_k zj3;X;N8=q)Z`s~3QZW$FJ&EVvJv;XHlyLR-6B2we188mglL~plbX5#hmMv_bz(M8w z_pQAQ=vfCBVj9T8k%@(*A>uuyf3L7uC_kTh3W;Q9UC08nh=D)`kbljZr#@Q2sJiO{ zR71Y&cqEgP_-I~rryHFTu3whII6frK@~0tWQ+~Hm;a@3w|7`*dUflP~;MDz9HiS)x z=B6~=0B)C<6=m~>B9$WHXg}l)$uHk}vSlQGH4`R9P{inz?<74?j5kaiJ{IVmi(8EL z4-DjXkJ}jZnz99F7JT{6_RbZv#7)-}k2wEwdVLeD<1v}N@Jf^kPb1B_aNMKW-%w2! zy&UJ7m~@z*V+TGhFMWkD^q!&obk?+>vG^oSx|w5EMe@N}bM)-Npmk#)4diaL^%gPw z5`Go*(DptHoAf!;L;p$6g*~D@Uwc|e{w_K=x<6QJO<-Vtz6@LvY60!H zyWCGBqbpZWCdpQrvb1r~p28C;dqeGa@Anj%UDodEzM$1S59)HwNNB{yW<^_s2Z+9M zW<70T*>~f}dKjxd;x!0G1qq%zzH!^Sq!JjuNG*vCQpLgbepGDNDQ^f+`M%Y zY&0Xzy5Y62n(43$9bB7OHV{Zl>ewQza{eN^8PU~bgR$nv{QW3O%BY#JbgrKjc;{z~ zv9hTUeSCv#&0X|T#2leGD1twXTCj1C^p58hlF`q2YO95K`FSb0QfA#{EH(@maGKpX8OF5cg295Ta!)@sk#j~vHSPA2A~z4^4$9M<@E2_uJocr!6$SJ>QTK>G9&w1YKP8n-2 zrWK9-4!q9NrXWF|WVi4tLPI)GeD~>%Ve%Nrk=ubZF)TX{|3O?5(+F37hE54r{1+FfJ8-G+GBN}nR`Xgs~1{57kISiKM?^6FYr<^Ypad` zkYc+%e5mq;2;~9%Y77U|p1j-OnlLO-d~H>A6js6#=&L^U%zOVA3y8(l?4%9GIPHurolw+`B z=73$PQr_)K^OyZ}D1T+Z=&a-F5g(tExy7FA-0XGJ`FU7d%s1Mg>xYt+(vw31?j zO^})>kEBbF;t3$yBvoK3D}K0aDBZ5{H*X*NB-*S6q{){J>W9p%hdWIj&?wl{rity$ zLm*IfP?WRz4&e&2yRU&iPgOJBdnR2c`o+K(-X!%VSB_o9>2jX)rr{0+RZ=TrTp<9l zc=aGE@=*5|Hk%X6R+7o7atxr{E?9}hv7`In;mqRHHG9G7GmW~_V zGeO55+%ZLo`>PFvw)TS8FtC5~d@tP^t(swiS3(feZ-zf2o08NE1~Z|9SR`T18OhpTkn!*Ed-#!ZC# zH>$Q&hfyy87_FM8ux}_NxH%F}8xRbCl3C3_%0uU@^7J8>F>0T=%ccJKIdA#fJo6pP z-q_Oy^^Xp5ObS*I#E~S=9<5Nfjv}904T)I4+O%W+?C3F0CxOz{vS3z-&-(O%W_w9- zOP7wVamFuxzn`^4GctwT<_?$q$D|+Wf^#K-qMvjB)l>BcPgg-=ERUjT0ip@N;JQl_ z(uhBq3^k^2!h|=Ur@!i2&oo_JUWae8&GV2{3th!8yC12fZ@v1nEEbA9O2vj$vjg5P zIDF0c2FWpZO~m{bUk|ZY=6{JK)1*ZbD$Ll?fslrXEo2}HLyWZl;k?%;m3?o#fGZs}Zk~x7Ycb;5%iMJauQb1&aD44D< z!9BoEZN<$owrnByMlc@lM^!cA@5-aOPpD=l#eEhXCw-y zf9t8`KF}ORyZ0!$!|U1v8WZ4rUY})*VO*PADMNc3yim9ixu$tiN@`!S(@B#b6n>V7 zad=7Yfr~2YXv9&4!{>cEHS-%1(jf}dowat8?d5ZqlwJCa&oJzGzO2Z488lFHSJW6~ zb0|Ec?;tyF`?`4GBD9-Sx;wjm7u61IAbM)y+{6#M|W{qD;kh}iT9~w zSDJzgrzn9IR^($A0y%n}YAA%nq$zdcp~_%_)3X{O8p*(IKk9y&Ueep9}|g!+XIj-(EOzY3+bIxTnPz($QXwF_^fljW2Qac znc99jJm)UmnqgP;dA(81lKPQ`MS2KJFshx+C>%}7DJ50>O-#(tBb#0@kdgzY!AlMRD{$%VREY9x_i;(0GN^-~2ci*Cbp=7e z*}f^-wy9dQhr$vrPdMa=kfVFbYAKE2=G@GG`NvMKN1V<6D(v8e>X=736!hQ-+I=R9 zpQW`_jb>~WUi0s~Musf9KeGh3T>4Lj;cd#i`$gnUS+}LZs z)g=mT9wIBpgpKihu0^9FE)-1(e#%$M3xi+xq|2dP;YNLHeZ)?RVc@NNGP$0OO20Vx zX(9MZ%7Bo2Q^%OlbVE2K%$E?O&;bk1iNnjGU0SUvkq!$=_u(isUDofWa85+b<~(%M zUU|2@DLwU+%X-oAT~eoc#XoQ5-23WgE0!Z3dNA3b7{j&8br{_O3Be{4PF}kVrCgX< zI(7~=3w|8;>3F1cz{1tV^2}KY|HDRO9sp3b+=%@-cY1FR(DNMV{-~W^kd-I>!E^KB z*8dW9);|KOXv=Zn&EL4*U<4MC)kptVoyV)!8H#=94;!x2jj`q9NB4=UsHT(t5qe4{ zd{`6CakK40)d;O@o|O3CP49I59vlgUn(#DU>cSFoKJgp;1sPuqDSughXF4 z(rG)782{e#R=|IgYLm>1fZB~3rf(hS(*DA7c5Z8LDXg%QWys+VAe;DwjjM~w5Whgp zdUN6s2c!vlec&y;u4f@LbD@dFp|RKWZ?~5V6*DoA$$92VIeD{i8elB6p;X7-_p+fx z_1hoXoZx_P8gEFC{`6yW*tVvtqEY0)M$fVw>Wk6?y^;=jd;2CsI&IDAL<;TT=X4j& zSI>|15Y-Wt~eQ z?Ve4<(84O%DRT9HZ7Ers%*>9{l&8O4gBQT%vem2Yzmr_~^WxO_f_vJA(CWOhY}*os+Q05SCY{fR z>;$2gt>O;Z74AaDX*Gsk=IpPk>lXf41v9@=`a@hYkO7*{g@z%v5B@H$9><#w{q(pV z80u@S;l8t|gMEnDt5K8@R%!k|MN99Cfi6e@F_l7JdnaakoV%;GK8c`0Ub`od$e#G+ zt0i>5LeQW2)5v1RH7IeYDW=oJnN0=nUws(?`Z-iGDpYmTFSl4sMGT!kX;!{UyPiSF z5VDaT_%s$UZ4r0)ITEVd`~ZO7x7T-jbgkU3oN#`bE?)vfBwSMl_&Vlzf9RVg2*F2| zcQ(Xz39@tah=({`euC}Lej!RA{S(3G7Aa}%%^dK$O1t9zB0)G=DwkE)*V#N=T)&fyXCC+NQcA>>B zp}j57F#tLB0W&sn0P6Yi_A$<@GFFa?$B_B^OVqJTEs<4N*+_!>hDrmoac`Y?J?=OR z;p2dB2z6<-^m1>+VRX3jRMXHkx+wBW4ieYCO9fgRX)UBqoY!tL0WiQcckERe@m(`r z6sljwlBN3hk^1pro3&S!<+naMMs&f!4w+9a0)!Ux&5XYnZU<=z9x17OsVeex@*Lx4 zJEt~rF5(>H&C7;w){v?wRGi&BPh+qZhO9EP`(|nP&H|-o`Dhwr%`Lo0;*jOdWUft- zqjHaLe?9hQHvVKR?GW_6%h<8jT0oYxi-to>qOUKbAuHWl`buNoyi}aif1p+Dcxq8w zw{+D)C?Y=h#{hWl-Sqq*fG-028uMQduThlNo~7Hc)cH0AXf1XAkp?y1VWV(k!xK*u zYTquZFFof^4go8KB9ZT~15LUctO5R&dbbTa0PTYg1D>u;h!wWKp?PB;xIp)~e|L>a zwsX7WaA08E+pPHYL)BDa#Q%q?cMhziiM~ZUoYzyH3@vs=e1Tt>GrzwEhVlC{iNr^0(@(Pzb4on>lsjuq>1&^%7!a?6Z#d5sb5 z;sGR#d1sIn+u8I(9_ zmR-4?GK%uG5gv$ULUldo{pTv3o2|X??8QR?FC+MoqdZsNhd_<7#Ga!>qG(ziBlzLS z?{BeL=JFmck5Ir2DTx2k z9!2o;(0R(*hxV*GE~uH+fN3MlV4eF(=OQNC@u~O_>=1E-tp#l3;gtE5Hy!3Ntbhme z;Aiw+#3g-%;l1eJM7AQVzFyqoK%s43V!}nVEXA|o-NbqBWIo?6C|N5u$PECWe7_deLH<-RZ> z{Ii>k*btJRnPwfa3(>#ipyODW?tVLE-mI`EV*o*qaQ$)Vy2s17U)Cn{i?1}ed4AOT zY$(%9X z#`jqrMKNF#D68ytuAF~84ShGyXpa;jgrb`>=Ou7MCI})6)&>Kf*VwWcH<5v``^zXH zPVUk!3iZqg%n|IH-*-$I3%PyNvxlT}OsGH}F@@1PFPZwOzzK~&ZRWf~{8UDb_9@!# zZVg=ZW9wLxPdEe|rYgAmp9;L%c@WLB-(h-NJ|A5qzz6ABo^T5Ao#&sM05QC9Uv_`@ zw$p(qJG&(dXYarP>M>xyc_r3SGg;!P8Wu7DK4uP1b|CtzaPSmzmj?w40HRa=NJ~w9 zG>6bF0JuVAHh>*L!ZkUl9gBn4%5If#pmzcpO_A2muy!f`W({wUQ-=kox9Xz0?F3y{ z^oybPlAD1U#&LtgZ;9Nnn^S{|vRRCXyVa*}&lHt1&%h7a*L0dWbFzhz3q&HK8AK|X zjUEQr>KCy|?-N~8DF&Mm9py&_^YY#=p@%mI1RrLvvgarZTE2B) z6Cr&2L_S&YF#?D^SEyH!ILNs(hWkY9U~peHCGx|C3^wkmWj;ImSit;D$;MdKNk2#V zIPe_1PWB>(;;floV1x)39y?1$>Bpboy7NU9Pg{RKT!uXv(oq{9-Xoogl&KDEcAQ8IMD{^+22s}MCYs&)v0v*;5_fx*!UiruD3DR(H9LG z7Pgfcw+9MMA{W|`seLpiGhkf`h?q~W=BBD@@td1r$ElgudQ+{fJ(1AtKcwFX6I&Sn zH_#A@QmR_lkgl&4jTdGF?Hjm_65f5*`)Ggca2!S$A7j3B-T>A(w1-f0OXx1DCg z4Y3Eu6?y)Iunu@7HryY}Fm|Es6rL&aPgNzQK`xe}J^s>B zt?;ppd%5#)4A5-B5$xg(2^er-k$SHu+c;`YaHA#JN1pp8>wlqE>0`!&?@X9Bq7@Zi zLZ;?=pwC2XtHpUaXlr(e{uo`;glyQ-#J+}AB{P$n{LQ9WDCElLyK!z^q9Ahxt2#g> z2DL4P*#0BB*wCq6l)%6@>eBa-{=3{dw)2;i;;UNjP3dD}UF{JB*r7YbJ&W6KCqlP06jRU55Wb~k4uQs8FoUb8YPsXVscJX9K~yIJ z9Dg9oiL2Fs?N8e0swO44-m@oX#?15@->7`J`sJwva(DIyDNQX>ZpB}k0n(q3j^|e} zT21`1n+r=2z}+cEm~y&SYi1_Bz_V>T0K{PYJorO!Zh2gN@kCrD@XDBJivHpD_UmK& z`Vb75j@1(1BM`W~uVZ(jXg2p90TgWMCHxuDS5?hBPqc|7;aUup=CYgj9AM{bZx&8n z*6xvrf?-10oS@nf_ATc@(m;&tAv}=x&OCCCt9hfg?5!b@5emujPIu!G#*`T zmQg%iETDmsq53ZWzErbzW?a^E>eudOHA#4?y5Pb&r;nENEf)13PSx9rwkUXRJ~>=- z&i_deJVp2l8td7jXH9d?zu}6Kv;rOATr}CCR;y@LlI#kUw;hd1(o7eYAj_f+TtdU+ z;7_$GXD^-;Xkp+~VXUIb>D5KGTM5?s&w<{AIim2wWd)(eu8+VmrrC3i2{V(+cRYxt zQpCtQn2?*oxXFt`<4$q)#?50c>IxgkYuc{KvOQUtbq6FhCkD;Obyx!SYTl_O|%qjUanO=i*_l*3;ZzZl1|ORZ)Q8ZS5u7BobD=;8MEo8Xy z(n=K3aD++L>rY6$ld^X(;2@n&F}(o`$XgI2b-jAM_mC@jTg#n(+X$AghTTi75am9s z`C^l!vUuSCC+4R#>0KM$AJ@uB)}4y+j~zQIJExadvpF>myfcaTZa1p7wQ3vZ4iduH z3i32K1J^-u?$Ygyfpf%+#YWnr*ZRbMd6CAmpdjNomO8b>05IM z|Kxl(&N=;Af%$jTwC15ORQdPJ0FAQ6N|vo$g6`)e%z9HyVn$BlQv3i>ZeaIlPQ68M zVD|OQpNiwHclDW|&pS7%@ZpuuCESu%BLyB9J;B5@|IgQd_=m}Bho|v7u~c?)R;b7? z43gioNWXgwz8X)-N|Q@Z4OAqf5q9!`jT4=V3s^l0{xN~&yRgiu(%jCkU&|qDHMS?3 zAneTg`kh6U2sfGPDRx5jiOdN^Li)Bv`k(ha?IC>L(^azOSqkB7cVSo_H!M9cl{c$ggDRl5ZKQPkJ+KAYN?kGkM}xl~t!s(>pX^#fiS122VR?+6UGJ zk$|`WWX>?lWx#B#`*pU+v}1bz>MgINKEmI)95?StZ9`5FJr^&Rv9HQrq@9&FtYoyo zX|t*u`hHNFsO8u+Uqb*s(w|8LBW-2t^mj0L{}v=DESb$m9ZA0oy)55h*48%p=%m*H z>6lbMm)k>-T+3OPxQhhw;S0>w*4Eoevi%!>Z$who^0w=F2atLQ9B|wx+boG(qHP+@ znJ-#?0Ss^t(km2l+TcLlH;-;>-e&I$fHM{=s&B;v&OieZ&wQh;RH{Qj0YgIY5i*td zLB8C7JQ-kGYZH`zhH`^6?eGGKKX}K#kugC4Dl)=2dU+B)>@3MK$8;63QK4v?PN~j30T0_cYOI#)+Ww^^F^*y)y zy}TZ4ct?$Fy>!Lhq&~pRg$QqEVW;55Kx%5c6V3Nl7%*!zq~IX$UxC-y1GakTK8x~? zfhujHCW&C!!b-e5miQ^T9kS57-?UXZ4NmYN?_hh!#nE~Lx=0{|bd?$jNXIqYVK#>6 z3vGq-)8A0p^YM13aXc^#;K>~1;aAN3_+vy{BYix070D+Dr^?Lc&yTuzi8;o5r;&Kk zSNGIb_r`^QImKfpv>-;!h8mXy2J^iY*VK~kBq|^FLRWGX=eA9ZWbl2-Ot ztjiFuqOJ=Ps4|g`w?usSCtLz7VuAd?IIa_3rB^p-P_rYEf!rf%r2{+K%KLGv2%@XI zJoOm4AIO>azpi3CqsUcJ0?>YwkRQt>75g4Pd{i`9#_9GSRH5g!KAC*R0(vkSn*%&Q z!o(E5yartFm;b0Oz8JTq=Ol44CT!ofxOYXqIEqEuBa5$FeBGf-g>%G&nd8&fjydWFA(mO0IFx(3Slje81=YK1z*0 zJ!5olds*Pmr&!It=bP!|KHL=Ed^uUQXT)3}$$ZYO8B+jeK>~6|7pHn2;?$s_ z-O+$PelwK&7Zioi$*SC53@?fLPL*8$3pJZ+Uetl7L3(&+5y)}o%8?c$s&7c%@d09j zsh8T`I2yS;Q?S&3xYOk+;FeS+4vf*O?{x(>T=%CD*(jnK|Fs*8pfRuIes{`Z;0=N^ zW-)r>ZH{8zw}EYITQ^pq^O~VDs+^CV9$h)5Sz`*1yyt#uqC8i&T1B;ydT09W?1KX2 zsXZC|2@?FTO}UiYa|gWlm>EB?PH;9xIONJmi1f4FS1qUR%f_GeA+||-%MDkhAw!vOd~I?$IIe$VI?eU)-&fi4yveXW#XTM|0p6(jVdPC^}YcMgxnk zg6&qQ;f|eitEz@Hg2v85B@}54<%kNdLSpQUu}v$_D#gkzY%1Ao=mM`K5Zm zPok>dMLou~LO~Xv6$Y?4%pI`@nYMMJ+R`uuG4WRY{r!K~dwWdFPQQNfI$98`WRx>h zn8GKp_icXQvhK*PcO8QEYt~(X|21f9#^mgkEvsU32bSt{CLSjy4eDP77-oM1`8NLcZ;e*X|Gg13fNJhcE262wn5d* zmFI%#AcOc00^^!j34eLmh=)iPA76zYY7pc#{=uK6!ok&sH!T0g8*P}VY3{FSE+PJ# z5bDb~7s#j~6uU&y@l0NCJ8^X|rhXCFz$K`O`dxeBe-$~?t6?aj8bheb8)O118NboSttLvar@?4dRyQ9NtwTNKA8n3>Jf?trX3vOTMMSqb^>cwN6lc9 zb`x$Rn%R>`cuC*Y8mSX~6&#Vx=wHc_HAGDLA2J1rt6Bo-vz?c(5!;R^*uVRt3(s7F z5(>QHF%IC}qwdQFPITc9lXU8Cu9NK&fZO=I7&!2){==pl~BrL4q zyqBj|t0(&wKQsL2*Sp^g2g__h_Zm;5oSN!WjaK`$=vf6}h`gXt2)?ZA5^c1`$p zVi2U^YC$RaG(3N`Vhw0SHtVlH6ZzqFm27APVY|xjp{0Jsu~ym|X$?9qU6dXk-VUm} z=3G4PA$yg4i*K7tJc5Sqh9E9kl-j-#Z__{=-u{a7H(+;d=+eQ|2dUWRebJTianxs@ za21*Dx&dpo3cK3-Syzw$RY3cb;Ib=XaMyTdFQQBqJ0(utwvSSi5(;&y1FXpRa*EB& zeRH(%DGg?DL<|KueFN;?ZZm#T(c6Er4+^sBHf$mR^Ja165g8^L^Ue z%33|+MIVx4L#@yT?Qe*W2u;s}UD6FciW8=lvUNJ*^9+_v+5B(PQ|*{D?pVN@Eo_Xb zPO(j2wjCkuPE+o<@$At`;@9xc$ zrTvG6))XEK!Vl`E0j5 z_9$`pZHot0Pg9yyzBf&-?pZOV-X7?XY&`q_QJj5#*!0Z@bf~I zp@AW5vx!%rJV=Bi=D5p>WqdKM#~5xJ=L$>q!rd*K2P905w4Lh%PnV!?5L?!PbNS{< zXAUtc@Il}WzY`;|DS4oYLH>y+d_BK|zOnoh4-{0L(2NA(kybQ(X{*(W$?ru$+Ym>U z?N72#>c=L^AMHPqioKzAuP@XRMLAT7t*3u(9N*}QB|rl^=yRM{y*-m=^eVLW@P5A! z1Aa=DdU-h<9tz%eV_q6Azt$-Ka+S#DC{oC~U6ID|`TS9{EC*4t9qGi|vU62FT}hR8 zy;tdZw5yL~Uy2=1ZX17nNdY@EPuHL}oz>&a)KCSTv%@DG^z*Wl?ewrYMU>d0rWNrP z4d&}W;WT|$I84RNFuN&vI0~T_r&~FhhcSD3d1a;uDC>ko*k%4zBQ1X!FMqiuOWkvP zpriDAMx*ob4>Ca3VXXv0My~UQYz5z#151d5*IYh62~5H2Oz)`rr<4*eE+NQEzoW6D zlaCZEVj3M2&)|`UcmaRTBVn8t{Tw%`Rr-czDC=;Eo5%<;VFp0TD#(LM@)yJcF$9=T zo${Dg51WPBIE`7g4azm|O1<_JE2uN?Rt;8P2xZENsTUs#8Yp#ngwRxwpinDZEbYH_ zYp9F3-M1z8RP#5bsR>Z{>y@eJMW%JQ>dJl03PfL+vuIs8Tcu-!xiEF$e}IiEfsX>YD;0_&La`zm-(fQaRiOAw@uBz#i*3AkZ7m zhMfRSUeSf2XgtmeL|;Z&26!1RmtH44G$(h3H6lrjhfHc5*b&;dnI*xB6Sjm%SI?+7 z0C3WpITp;Jz1*!6h8JBT|N95PKhyzsAV4yN_Fkw&M*m{F2wvMytF<8xUq}GI6?=x9 z_EW$`)?OC#F#WDmsPkdSU}_ZErnN3_5hRXk8Hp)O#Acx|fVj>A0gYe~Twtn15639G zKnwrjFyPQ`CAKLmDu0CVz4KF4@MF)Qvtu0DQyG!~2$Mo2#`N10Vl}8jt|#&{hTA=! zc*|ZE;YhreAJ(h*s?eIUkmA7~9>9)zgv$XQ?*n_K4kc<$E7{FKa5xrQAf?|Dl_IeV zFDV){rQ`2dn7J0NvYdgkw~eYYtu#lDw>br?q3q}ij~f)z=Z#Vsin#*`#b4P<84GjnCan^2)p*^*M_4$2 z{V=DXfEwz=lpZ`8ASJW{c;P<+^MbDC<^0lI-N=O zuOlb7Ga?6ikK$oJ;TK8Y;V0olI+&(vNubAD6Q8!5z#&C}=Z;OM5zq$UM>Z6J9sQZm z)86LC6#|6H;#gdMe6_{#jUf%-mkdl&v#NEKG}mkBA}g2uOVwEgT8{Ac1Edx-ArJJu zRf$tdH8Czq79h$f3LEY?KRZshg8-#i3dl~5|A@^d!LOPJXyE-sxbOsHAaHso4%rvH z&N@rY+1_RJNLAk@;;=@dulGcP{PxVCs#m{7XVWH7`O120gx}Zx?!;)ML@?{W^)9)U zsZPZ@*ntA3^D&kC;B0JW%N+J9Q0-|`xUD~UQ(2xQ^K21Cg~vq(hbFxCc$uaJnBs## zQ)dLTABc9fzN%h1Y+;3Ek{@rbgYQ_1s4!JCng&_O4dk^&jxzh^)}p9sjsuT37U7 zVA{V;ei?(-98l)~TE|4uaeGb7KDt=;mdt@NaT1nxH)`?EYKkzJB}Km)Se`<-VAF0d zdJ24y)4-rPEJ^(w$`Gg{1ML}8CqVv9={h_F0y%|?s(_7xmQCZQI9FGe_e zI+V=bUzxn1$*kdRwxecBU{^MlYP5+ecSFVZ3{G@v9bCABT3MQ^Ee66pz#YU0JHgWR>o}| z2evUVq2HWjFYAvL&o+f~T~69>ABs^JNmjgZBL|Bex=R)cV{JGbnrV9&xaG{%o-iyE z)Dy^p8PqO54H-Qo(#weZ)OQpa8}j1-y6{)-L}*VgEb@1_4VYmI08xt@3egd~SE~Vh zTt7-8kb5~yC|2Nh36XecJM5qW7sH;=q;sW=_(}rz$!K*vw#wSt5EN_%^%c}c+J=8U z=$2-YQq)_J3-sxx1P99t&lcZ8)s(}uV%;Or`f(PeF#LisMlW43o-IO_pF;2Q%Te+b zA-S~z$VKY#!XY(FLX+C!O4Qjm)>z5R&k;$XMjCz)I%#LgOBqrA^^&b+@g47nm91{} zIi*!f(nOgQY7}=c#9JFJQo@<{8c@7IA9kEaB*j865pKp`ZD?%Or8uV`6$GXs(vYm- zlDq*dmfMuyQB(-T*hK%Qb@Bdd-2kvRyxwS_AM6aQ)-V0Bxz=m)U;QtKE_y5(CQ3G4 zb)|H~axvX*3`4G(V@hp^V1#Ty z^{`YNAi(ZKz7~+M?=^VC8Y}e|(TaZbZ(XT$&d`}n`cfsBIz@>^L>4H#{}K|580~(DMijfOlwHow*&?KSM z|EY@6{{L6A#TN{0?3PikdV0{G|9!KNeLl!={Lg8hco4ZXNc+h+a>!9w!e1(3FoFEr zJ>361L%_fP>spB)KM(+W?QxR-^D;lf?W;gQtN*F*f4`{xEXn`=mdT(nuQe^`|Nf_= zgA)I{%JhHT-#UXzQwv!&oG9OYVRxfQQJW6Frj-JZ+CZ+oAmkI)&gZ+^A1qsLmeCop zUi@MkHj@|z><&A?3BZsS z1Oiyhx4)ON-2P_Ck$5aUsFs!*I}OKUkUPb7tIR9vPtYb7n-*E)CHX;NVFXdf^*Hiy z9_xh&bm|vB)WjJ5wn!=4TredKcd^Mox;T#k%$DFGz#=QWgakg-#v=^E!jnuz<5d1BH#^`3=EZlX1zF|AAu}s zR2wI<;CD=&#Vl!=5FT!E9Q~{q{X;t*Y@kVEzYa=a`KW%YygVAlu`O&w~txX&97o^7fNClCVm>^SF3 zI5I)TKkgu++|4iRcZU$0K+Bc@(;Y?d-(Wb-gkm}UK0+b#p$0=(nyxK7)^&TBTt;Fh%F+oJ z5VxubR@2Y{1A{lQ)UwRYYKbnM->VIR+N630D^`0H6v^}@CH7bJF&OU;Xc2+ z!pW9_;SLj3MjX^q@0AJ{nqH?>)?c5)=@58YM|HbPWH3BHyn$ctsY}G`WS*s2{1%0qIMre^S%gn7*!5VYIL^TtyR zjg&cPq4w){zQ)x7=;N7HUS4YQML6bI!R-Kcco7;fr$>6+>#`Ecnwhaz*gGO1|4^}B zCYk|qs7wC3k=_kEQC$%Sf~fxllEQ*u3^#4tji=|btgoMbgIrnzn)rcl%!Q_p*b54g zP!k8bMbRo&;MF!^Fl9Q;!I0mYi9Uwq&m)7U<%54SRuKgX$Wa%`e4Ac89Y4qv78ZNk zPow!w|M}vRKj+x}=7{zy1&dF+1&8=LD?$ovBxsrM%bQI#Q}JZW-3t=Th5ddfdT4Ew zHC0?WEpFPpb&esBZ*`ZIqj1={N<2`>TF9pxTCfk7*0?1}72*sllxl5+vcwwaMaIUg zmX!-57*c7)J z>7FyL*CMM|rgBE%Z0zNQxql;ARI3_hEqlDhYOYL(;P6?eCi5@McOr<}_3xEfp!KVO z4$I*awvva*BZFOzleO3b7U|0uK$0vOs+SwkC73dWIGWnHvwsOGodyaNHSNa_XwtsX zMhCp{uX{B@WBP0*2VFKhn`R4(MZ!Y{M8;l2I5KQP?S$ zo#$G-ek=b7lZ%ThFRd@d z%f@Q{)UQaz5NUH^@em~OKL@4NcOPVgS^J?=%Y&qy@+i;ZrHZnq;5W{ z=6b}_Sv!6xH#hbU&Fxe3K#X_nhfp>JJV(FgHbx_wn8wyC)&!8nDT{4pm_xp6y7N|J z%E%2fB8#Q-?h8BW%Ey1Z${C7Ax5PqLUM1F{LR>4Cay(^PGob~F6R}}~Rvv7bl7~!P zsX%NFX+TP-pXgWR`_|7l^J*+W?oCL#9@kU&@0Xp9uYcy;+flv3_15I z!D#pT(D^q0nykSk^O$yT7|A=>eu$Cka`m!$m2s(02BHpqo_EG@@Qv@C9&hx<>nl9!M+;nUnx$8Umj5^~TV0OHX=yfY?`+ne-iPw*(;wF2l+mjP=4RhiQfLsMtQ?D;@w%?NV3OS2@W zxh?yAkE*`$sN5hG?0h&d5Xi)wO8_weg9~TwR6^dE*E|-P#>TE`~ThVn3 z#Hz9Y%4l43pnGSv|LFmzVEDie^-T7}o2v5RS5D4d8C_^T76PlbS|KKGDi&w;1SAzpqTrX6yTUJF$K`J-q? zquChzmo7q*&2LUYCsWp+q5WvTISE^weY5_Hp@I6E+%ito-Ob)gVh7TxlHfkyIrn-KugBCt75~3Bg0?Z02qSMK zrSTYp_qJHB;$uA1ps^R2&_e;ECh$PJD9&z+T9G>=d@Fwj=#nbJ+s zLFtf#ZY8M(^40vFD&EZz#fh%@ZmsO6+o1U7)!z&4?90vKntEgLxmI&hJqU%7j#(Mo zkcR6$dEoLJEBY(~(8H^fDJnLe{@mHNG8|%k?TdVw9|suky@(%O%?)@Sr9VnKSjpMb zNmGH=-iKd`MTS`)&q{k`tWDm6y&3k`F7tm&knfcm7mgQiOgH ziyA)X&-vXqo0zBg#64lX=($wFc<53_)JMMjF5B6@=k4y^i&k^jxvD+v=n)*5h>}l* z{(-o|0w}~C=&J9HaNfQsi^VlusLLex1$?W*EvawRXd}y2c0A)bS`;N?e*9e|ahw-A zrD}9BQj)D#7$ils!OxPyc#0h{1DJDvulTW&ZnG#HTf~#fX(CkHZ?axOg2|c{|{#=SYK^n{*&siGk@j$@V}_YohArRs+j!9np*4& zmU3RB`F4c~LWMNx;mTJ#2pASTpoit8DfDc7VUCUlI*+G_wi!g`I4D$sU&dyS2Op z9__n%GmfHg;ly_p-Bt zH=X;^bLu%KUijUNi0L^P`2gFkpPCmsP-So~)~?6fVcTu1ZL;U_jh<>BfSo0gqI^qC zXY<$2@d$(Y>T-(K4A*uF#gr`d*1TMr92OlTmvBXlSb<8OM<97n7&fcpFc6EHdOcYwzTtBm^1|NUR9gc5LF&aRe z`u#2E5II^&N5=4PuLd7?2VEIPxAkA~kU#dzm$tnd){k=T>Mz1W1IgxHVSjZM%G8oX#r znBISf4Xj#vW;}p}VsdBC}*nXV)P-nYz_=GEuf0149pbk3h8ym~m(`R&9cB0*fKZI)ww z9K3>qheQQ$=!#x>)W6Xs5AYn_Q98F6Y(GDcdP#t;%$6@`vtni+RaMKhEvlWxQ4jjJ zh1M#9eC#K9H8?=A&v%rbX0BxlD8wVG(yzFpRPI5}a@xNyt+d5MKKuJHR3JwfZnv0%&FWDK)Q zI8esvlp|P-H0}^qk_0%s4%!_jhahI6QP8Jf{L-jEvI%^!Z5GabzM=l?+^jn)k8|08 z?y``=C+wk(#Q3(&VbQ1-Lo@J~1@xn5KaO&6gj3|2fFHpE%P2+is4FGdRKMKmjXXR) zIm&UM+U2E(ckR4V>QEG&O2O9kC(VP^pj|o>+I82UuDvrMSVrRwjg~a84`o8d4|N|7 z?Bj0-%o>dkwV|jtH3lfNF=5}yW``l|o&N_5@Y!6Ak&3>1+a5y8`q1f#QH*E3Vv7~W z!x$qmaSCPGFj*b0PWqVPeCFOjykia{Hv9~0@8+|x&u%nyuf3{bJltyjs&rW~2O^LN zr$z8ArFs{bj<4!Rsn(IwN6e@nczIJ2XPcAokuikb^KPaH zM;jZ}p(b<6566=gx0a}XZR-vX`H_v_GQliXq$kV*qNu&T$8MP1hapau8UT+?grQ$C zEME`2GEp~b;4y>ADA%EgZ46Ho^OnY(Rj}yjD`0ZIm>oMK_^WIVWxGrzG$cnsMpSpdhm&kPc zRWk1s{z0xZf3nrQkEK(u!CjF<)I)KE_l(cv8%?8O6|X9$WBPi}0oZ!Sqc=zop6~`| zKnJ+YKCWv_je{T;>(Hz<@J9%1Ke34yXk0y80VOvBap^fhM^eijG)z4>5{bAJ2gyDI zVR-k@N10Iy6-hH8W#Y)00$uf2z1wE9GImUch1c{B0n7^lDvqXee(KeAnFR1hSOX3V z*uFGYza!29uNYH#T3kj1M4bO^aDd((A_nQtPb ze?tOhG`i7#zr6d@P%IaTW;&B3p?XVIO9zU5h0bgPPYDUsQGesEgswZxBzFuNiVdW+ z#oy0BNT5YG;8gFkqW=5xm&wp}0=;P(=MmmAqi`^CDaIkv;#z_>R^&&^diJ`jHNO@7 zr~CpX?Vi@?Vi{oKM?bP5ZAQyn+tInYu+xFlC{Wn3Fos zy7{)gp6T^a#m}>77I?>O@7&K5fTzAQ2{AdwvvGNXjU37T&uW@8mKTRBgF2DD=~sMx zG!`o6S59Q^^LH6%c1X5<9-W)iF{wLpI!1tt_QY6#9M}9 z>k+6gYZ^4cTd;)@m|7KMd@DOe^GMW9>N95UK~0<{Yt z88`oII;}xHr!b=;soXhSHA%wGk`L3Ie+GkBo(EY*<^9w9pb{YT8FY(M>`amWlkpV{ zs{>a2p0N!Ke0SC`7c>{SHXG_MdSuzqifFmZ?+->hGMfCD>iqArn)6O&w(e@h_p2$W z4sahNH@<9Q3`?~r8mWv(jxkO&Mc>veJU{`aR~gv_6?pt|&A=s#6gNJMMMBYSjArBz zFQLPd?#mjLIH&O11l1t=Bj&)Y{Lhx0SE1|zWuJZh!jk-z? zGLJG;1m2+L6szY(?5WdWc>`3tE_La8w1x}zT{Iqi@*@)W)C@lKg zuLM&JZ9JIdid?Z}1uta3Mm<$Jca@+4rvZT_b+I@VLMWFB6m#B+I>>(^ohe9QfNXLF z7vHb)+m5-x7z}Qqel*Ho{80mFlwtV9h7QIX!z|F;+@o5hkqVNh|vbq zDxEFVrAO7K>o)OV8frY7-fYvy#Estf2_#saca4~qLWDA7mVV9snOuYbjgEA{YZFs_ ztedCO{z0hqu)OqKBW%{PZunRTLkd&UCZ`UB9ccyO6O(*IsHBsHqEWZjrqBD$S`2^D ze;Wks2hJib>;;ztU03B#+s;f*Gg8)F4-Hpi@o<2BN8Fb~=b?ktsKPM&5pYux9X2!h zOrg*Bo5O~G@#El>YYeLV=r01247`;gXp)WKK)6cu0;-G@?k@BGNsKRahxo|U0~m@; zbSZbe)ZMQEG$tXV9&E8gPSt8dr$R2;FMyHfhWr@Jh}V=A&z~x8ArBpos5h>8>h5V) z>TL(!(+C0ki>OO>3e07Oy55#Su8}K9a7HF{kog2OBYC?b-c* zN5K7fK3~P%P?Wri1fX_<2?Da5?y$r1sw|glpkeuJ*yUZevPg$keu*GM5Evu>s~g ze?qpC>n*)QR}MUE{C&Y(x2T@WjUTi7B`!zcfKNqAvq3#v+UuClAwL0jaqnN>eTDCp zWH?HU6bR!ny|L@%b!Ki1OJ~)Xo1ZlsYl#wvty$lfdpcvs%e%4*&|r6G(=|yCN2dCr z`JOFF)Y}%{kJ7(}y#6kk@3rkNobQcWCw<&zq}ZO7FualCW4r4CT|7K@d3E!k-P$KQ z;wID&xiR~Rd4k2>``DE6JblsOuG?TtrkLnYCBc}l$1(tLW#M3(O%y{c;!BoS3v(cV9gmL!jTlN0-| z^+J5uY2MP6Uf>|83+{TjG}8A>D?`6CISdgQqwUhUwPr{^dsK)ZB^5LhEtau@|#3{d0{a z48vW0+==Ww+=>12nKmkE)$+=Jfeg(E^ZNpnBhOebj9!T8{&=DDJ<5?jh2{VaVJfEg zM3?>PmnZxGL)A9`M;3KkcWm3vB$?Q@HL)hPZCev-V%xTD+niVv`|o-0eP7kzm8!0E z-9ER@?Q{0od#$zi_TAQ{dlla4EWkpz+|z39JX_>%(TUvVf?0yfj3kJx!XGSLs1bF-xcQ9#H_q+>Zo)ZdT zN3MyLDM)x^*n&PF~9$dQMMw^zdh|ZlBGu7`S0~t)zBDzIylY1loJ4SoOraB_r4Q zjeTTXc@p#h{octoY(^(~JZCodydRl&PjVMqNKW0_OKaz*i4kpIYs5X*@=_jb+ppJ- zkp3QSdLq$9r|8{*Zz91r!Q?n* zp3o(*6-%L)UNO5%Lo#c|u5@aMXDeV*FlNy+P{bq+%-1i_K4MM)Y^gZrd$0snt6j=_ z%@b!|jr2%+$CVu%d(m*tuZHDc?TtUrH)B>jbeL%dI;N!yV|^}%EU7|24;g0F-y!qb zu$klGrNDH_5;;!$b@5_RkH9vSRxnNpPqwO4j7J{z#mu6BG4s~3u zoO!|#dS8c+zJLJ2WYX=A{Sa^QcCZ?j{_yk%m5$XMpC(jhpj6venc&Y|_Okpm_23c! z=(`6b0b&`AbCOVJB zj^(aDk>*^Z>)@|1v%;Pprw1frq>_K|Vj1!hkQUZ9N$@PQIJ&0Ap05*6!zzNd780yj zqHQUi#UtB5Z!$vnv#A{#doYj(L!*!mt|6i@(tfLLG_Qr9;q%~D)7m5;c6B$y3`~m# z_&RT3fb70EYY)QAhVG1crrp#wu0hBvGe_@>KUB?PL(2B;^zKO+VfLNg`yE` zb#G_ia`=kdCxI&m%sTygHUCisC{xk7O`ME2jjq+Np5TrUr4Wk*p(a}sSW&6{DGV^dldT4NO1|dLX z5C%?d*s`9v?hh8@Xg6Pm=JNBvnJ%Jt!ql~c3a!Pw1h(zPu{3}KSZ$eG&Q=ZLM!Ud< z8*SxLTq;|OrIe4(c6|jfb89p%i=KD05y(P579~JIXVp`TzTETxfD88TpYOX5EY0gV zs}&5UT@Ard+Aal7!05SuxJ9ex#bF$o6AgWJ4Szq0w4wa)_`(i(9EkJTl7o&o_(N|v zWtFFUT5tOT(8Q6PukaRIpnTsiXIMCCu)xWY;S%a?IP6=-yvFi^(xQXA;mYc)xkgNP z5PB6wEAMBl+J@Hl2ubp1P08N&$)<^zzecKc;HSv|q@D2f^tdV)hj21pufNggTIt`R660WE9hrVqyoCOsqv7W?90 zw78m+qG>{TZUkO*Xu@)`8L5();2JH0FY=uQpJ}Wdj+oXL z)RA)@d}#+$gquC;krl8p?+?W^9jHwZ6~L*fPH)ssi|ReqOaOBxvq` z5a6Xd*PU?7AolDoE%c!X4yPX9oSV38QeO} zL8WHAB{}tYnZoSGome^~1XGiW*=z(7uPR5B(&>qV1D@{FwkEX?OD-J&eoh6o;DFq5t(12GnXWKw2S1p1^jA2*H93W%|?NAfV<|Az17_c}@hD8n%@BSI z05H$MU2oWgUmJ-e4knxd{hlZqk@EnS^G)Ugz92+i64Fsg`h-5_4fvaKYXWev{TZw^ z{vN`wQL}Ge6}}Q43yRJ#PTpM(XXu4u_kR->Eca6QXA)Ey3;L9PS&G0ss(tlseD{Tb zO5K5Wl>_zP1>f2t2Aw|`Dj}%3Xhq=elqfuT(`+tFh&B~qFYSFc2bN(@(ShxmGj6j* z?J3rRi>WFHu;^FT2@+J;H?Mtq`hJ^o(B4ti$X|6`0hWt*f42oyfoa=lAd-9JTE4E~jJ+8EFy2m?f}ya}0>E<>iYVJd{QW5sah@c8Jtq!CO6 zfE5EHqS=1x+w$(?mLR!=EfYt$<5D(~a;)IKCRQM49ckGAE?;|GqBWkdVw-H7i0 zyDTve{u;u`C|mLq7I2Tz(|o#~ofELd9~4{#lYPmPm=rLe*gjD=-1w5EUb>U)^xPX+ zWKP9!%kA5qc7M{)d3+ulkzwV5uU&_(tfw87LYuq*kr5p+S#?66U2ym~SvU%PEpQh) zObOhlH?r_$s^A@QfLt4-@P^=j;MH4Rk2s{_UY$}lqi60y@2}{H3v{|!d0|ja%&Q5v zt+BF!9%4ZFr7srgLXB(E1*n40jRpIn_0`P~>AWd-7U9ECjtBt@e)%YWoYg!ErU0Q_ zveo*Q+uCDBXSZ_1Mt_Bv9w1{3W3GhfF;AT+^eh_L+EY>sR_JZz90FjTNH4k`UId;X zSj(1YzNJyav^tp_H%=ymN|E1SE9`Sy0z6!gnG|+DBuqjg?k(<8G6C4NxEE9!iZLmH zZl?zaDDl-oA`Tl^DQjegztYc@k%bDWmO*wFxj;lv7w;s6gLO|0;!sJXzYiP+)RA%p z1TurUV!3*gaIwkrGHrNOexR{HzI|Ai?eU3jyrmyq19H_T8O^;#r9pbL$6fNNWc^A_ zw6vG*NajRe^)HLr1-|wdsq@XJn0-j1*mriMlJ~&xF|!)tER&c)EYp@Ne260|1XpdK z!EPj>+BN3J>(~JB0IkSQSqf4*mbWgH@DnzG8;2bv#*){5u$6=K`j}nOiT&N$eKp*k z&`Pxq3d-K|TXl7{xRex3e}8{mR@S9;gWV4Q>ZPl(nHd@FB#D`Vre;KaJ+r8&Xs(s| zO8WWLRtE@x&+9Q*>(c!x<@fJ`{CrSFMa9v{N$}lS((R5FlIYaLM6i&4rWZOoIx$t% zH#qq)=s8VM3!ZL&+N+uHe&Letcd@B2h>5~KW`0(Xr#-yQe&$7&KLFPDQ+rT?7pZm_ ziPK+RI}6#X*O*gTxZ7YbxDMog6FjZ8wn%4F0bh?W!RL-S=qBFy*2kNLztl3_bu?Nw z>^2Hqys{9H0YIW+sRqnAZUpr2l6%tleTci~ge?8+-gQNW+HK~6c$rm(eLvHmUIKyJ@kr=PW_KzJML{^bgrM%~GIIXa)47}JLYh?;OeEn#*~ z)$v_@li-slrZwQ5jP_6%iE(YN`+06qxrTf1a+D4)YNE|R_-lhDa`nr*l0_1a88&b$ z^lulBf`d6jGDo>E zqS?JMW#nWBvN07H1vWe-b|(z!mgzk~D+izrkUxfMKnPWfA{5i0R0{L^V~<+rKX2o- zdT8Wm#FCWX{7yiA$P3~h$Lr37@xIPbI+Nz*6FTZ|L&M=D^XmG+^xK+L3fiZ7rnlIy zMdxjfuV}qXuS3kgtq;~Dm<&OqI$oHdBzR7uE3yZbCIp;lYh|S5Rzufnc;Jf*phD|q+LYAK1u*5B~s>5sc=i-13^ZxYxb-t$ELrN={zm=DO&~M`{NFYHL z6^!Apt>f{zwFtMud6aa#svyd}z2wy+917g~YtO(T_6VuYPhe zT2uujmk%|jYTx1qYug%{a{E@ycdyOsyUrIphLK`sh9P=D?`V>RB*HaJh)PIdE$v{L z&VVUn3cg2~4(4w&`>?(<0fYI4?b-1Utgi>L`er=L7)>dTuY`$cU*^Lg3T?VOtDqE> zjGGe)h^+eABGq5N-Q`0N(w$tmwIW@?1P@>eoMH+Xm?F>252wd+U68JA?#%8uMnC`} zO*kkPxW}&U>5wiVmknqI9ac|uc(p^PjAh-HGLaYK}k zYPbIIw1VAsreSTwkRU)_p(~8RkwPe%&?I2lTq`a!!~hZ^S!tv(+{D-Q>vGJ%g-yUI zSgSrB_XHCsSR55bcK-iq~g|pq*+y~LyAs0Q5|zY06+pQ;IEFK+w!G3gR~8jXyLTIEu1TuetYoeDD z)kXBIeBpr3(wOlzqAd1a+fs`1)ajIp;7bm=E}bYLkc}8W-LG$hOs6GEWvF0sp+OK{ zIodrMd2!y<1H{5!GED6mWgd>=@9eSHnvR-K`DYu9wEAge(NWj zH+OECd)vpszI1`x_vLdgy%snijgxvQK3JN-$m{`Yd)5%Aby0z>iWT)EBZLTc$701D ztgfLJ+u^1w|)#0#iOC2ER&5F-K++B0v zt0X>}H#@FB*MWK5L~R-SXp`}SWh3vq=gu*cOrq75*&NpX$ypzMmIqmW`?fgH#NNmQ z)pdWV3K74e{`!rZ>N$Bu@Pfu$u=wcK2m@+c9Tdd>kmk(@M@n`; z{v)4v$zU_dVSx`LQ)Mnji>|nRt911)cV{MZ^-0X^r^rL7KMu1sN1pe}4wumd1318e zk0@|T`*d0GjN(r^Hx1(4RuB?i)G12LAxa(92I{*k&vCl*ea{evhXKo4-SvRc^kv}n z1ecF@;N2%d1M%;ePnGFcM>~)3ZS^99UV^QYU$^Je>2Do$$OE8(;8ALP2$&iEPrlSg zj77oKIjNvhcP)vD)nc(K2(DO=v>nLk-(2=fOS*Bi-qTjP#k^r;=sshTPvKB%q?~M@ zfPre$RQe_`b{gdQu7(EC&U9fRO?K$!ff1}K!^e|O*}Llu(YEQFpGW+U7J$}9ooH!T zNduxm8S=a427z?h@NuA6C%0{CAU&ti#5KRa)jBjXH7CewL=;Bc)LjVPJ^(RYR-R)Qq`3Q&` z2O^`-tc0e%S>ekd*dV#kHgPmj<0_d**hCL5m9lzN>(kMAAv=)- zP3^9#l|nK;btDmqKvFk%<)u%*md)^ZO!b-cnhU>r>yOnI8`b!OgxDInPQmMoOR+no za}o!E%V$TeZOdM;6=MWMXUXz$F^{TM$jijMq3S@_@s4^ogEpWCD~XGKS<&>Pam>@x3_v@_>LKh3CdM$uN@~0F^1>v%!ZO8PQM%=cbNZvE!|c<>Q&eMmSh~2y_3O@ z`SDauXUJI3s@6`o#WQ+k2ysMRi7ct5-?GmC9FN2;`lcve}XTwzA|r=ESHRv zhLhNV{Y}zJ-9e+4TaxP%;#ZE zDZ?jf{Aq&_D%YVc8bgQNIR@&rE;cfNoq-ozCP+h)omWmS=yQ9kZOcp^GTEl=_T?jl z0;oSSKuwBw45lcbwUI_Ok&{Pl(tPXHWmjpVx?L&JJL71XQ0*pHE)g z5?3*Nq}T*vO#Iyeq?-|wwaez|6A&}lbi{M8PiSgfP^NBZ4$cxZY=wU;;W07xDXt4s z#v3UOyJ&bg*Qsy7Wh|`yTvfgO8CG+RCZsh!c?l`Y|KiobUerzWLQ=8x<85=Yq&7y!ZLA73;}T zh5Be4=6=$gaY8{UFRD%=&o?K=npU`xA+GE&pa}~@B;ZEB=@Jrs0x_SnI+YXUOIuq3 zQmC&t9s0wAlU^W=*|?WMC{KgufM;j_i%N}XuC}|Z4K$YO0W6Q1y!tY1zm%H6oTKj` zfOMffegfj|Gsh2=dw$GoA8der%TELIA$B{sj*4abo#(n~INc-CJPM4QLK6ZwkwgxQ=z12f9<3P0NRpnE;g;x z-~Re8pYqrST~V3u0!3?CJ2MyssOG1yiPnD&j8H+;qhQCtE4L(8Q zoep|SMwtHIZclpzaLY%Wx5yUCeQ^&K;Z+!vHxSc*L;bLu$iGrf6#J{;7>%B|LnsOy zmHR2}ylS=n23exeLNtv6pip0j`&u8f)-TabceHt~y|Zyr;#lhKMVE12h5aQgkU*nj zMf0)~5flxrBIh4NAjEko4n*KkH94c2=p)QC%0Pi`{;WcKRK=q}K-8UYLG81{^ug7g zw;K>|!~Z%Ug~T74zD&Wbo%OKF|0i^)J`Ms0h%$?s=w7={-nQ6ssPlj_8HIxSD11{&><+`_mF-$BGa@Y|(qZ zsL~cw6}s=L^NrRQ9^DoK++^InH%zEdE)~#5iJ&I3F&}!A?(BbA>nZ-bVOQ1-0#Fu4 z8^cVBWl_-WaF)uRQHhv>jXgA_nHEeIs}FnCXbrEaYvuDj`?Lw8WC{*~&Dy+7-OURz5UL~VB!R(Y8^$(Ja)XW?7*^LBZp?BwqS)UM0P zO9+>sYgm~M%?+h)S!J_SI19fnt*XA@`O>`hu2BNj5Ky6=-(E9!us*}q=$Jpc#@;NJ zZe!hn*OQh_QJH|68t;7L=Fn^DYC^J44WJD7yHk6aLHgF}r^b0y$g|xPp$Nvz#YZFc;#trNwY zqrYTjCq^#<-3B?up>D<%@3w~JV0+kOy_tbs0`gOOvN+vz@Wm;$g7~PxBZ_enD-~{o zFV6YXwF^)*yZSeC)xo3%T7%z-MepOyUCEq4Mk^hhg0hRBcz4HV=KBJW-3Q>aaZ+|M z%^tVKc*u|76TeJMD0Ek0>V$GLGjza5_vw6NAnT(Hw=7$Ya<%rjsy&%79{Es(QrBs7 z&5OkKPcq1ftG*#vJnZSmjICrC85(3`ne_d9T(b=rqRS|6U{a}q+K?kIGs@af%_!iy zE5Pv?s*#5Z_xeEeiCZHA3OiS)gqA%G4DkH9`q*p*;&qgmE|Za3Z;f#P!qezGN=79? z>G|H3em*3Zx_|SWa!6%=Df)TsPI8)%bApnxVQ*_qk;ub=FXLIVl?>sy(?D|x3O8nO zV1ANaUybMq^l#Svb}-AEqjFfd_yq$P}k#+2X?u;n};ba&I}g+(6Uclz_BIsy-}8}44Z`i9(~FC;qd3`Af8 zRR|-J^1h0U{Iq*_n|Z1>f8}tb_#pYbNY6bXZ+#FIMqa?hfh*#yn6A-Wj`kSkmb_@Ot`MvZyGpzdN)Ag7&6B|L*|il*a)IO5 z!KTS>1}PZVQ~PsdoImaakJq>{9mU0S`PY#=_bs+{Fzyy>4!&2R)|T;WxSM>S6NJ}4 zUWy=9*feG-#3KmD3<5|W&%diK2#g*M#WMHFNOl0LGqt$wOgweS{T(UR4Iq)iny-%B zvCqF{ly&8ksNmKsVG~M>*~n;^uFoHIJ@E;`N*uE7FRs6SZrPs!0pLmZ3;=~rjNC&g zH@MZ|!+2;MMt)0>No*LTe4SX1`{Dtc!k=n{I#FP38JW}Yrs7H(n6{TsyZ{Nx2%at@ ziQO?p82~`+0qW+oujC_UXPelkKtxZ_-Ww?lUF}zw3kwS0(BzdCdJCxi3jKRP+6D&b z>(UwF`=H!Up3ak}p_(uk9|@0{$;26jw4WO@{(a;MJxQ%;0;dyxA6LN* zbq;Rwg3!VVYtZS|?n9E?6<6lZb&IS!*WXswDv|{sAg$m!7qfAD7W|;Vwy~TR?{o7R z@>bXKigbAHDr{FKB7Y&-^YJzgdb^`h8GpAMha^e2KuSg`v3T+K>S^}m5Ql2%_#o&b zmIbhgJ#o|5J@Wkc$-qN8DCDj``sVEMR3{;t(zvKIhT%Bc*)kMBtSsCQ$p zuSNEz*tkO}f!wgMi(MqVTU| zFomqYmxD7fj!QiQOD2bv)t-UMizF1!UL#*0gp1=ggaHveUA9`&v5~9An^WmRSs#qZ zcba^FGGJ-{(9NGIIupZ9T{kH{a&)qiXZ&S^ux;9bk9QA%xginMZ zyl1MQ#HO6%k94*}Y~J`BCYEfJVnnlIv%P5xhi-9W$Y-Z_gj0>TX9 zT`0)NfQAW>giQ2b)L2pEfbeL{m8|xobr~2y^9ARq7t*UM?sO)1HhqtA=8O@M?*keU z_k1_;A7zll!((8o(q(2cDICyNIztD941tfyn0ev@h?Aw~8ob(PjM6M(a&OMoA$wk{ z5J$r1tpr$VeSQ#jYj>wqsb$2n%)o-`{x=|`QGuzuVsy=D9aBZ)6Z*;6~L_aoXj?u zaqJTlf@K1Ai_~ryX|5Qg3)O!uQkDtcu!q-erY~Ewk$y#XeQ(@~n|;!pYYUW%O(*;1 z{ka{u6?tQ#>(6j&03UmXZy>Z!&6}uLpUbwmZ&?QY9 zjCaUSv0$PZDl2!EF7^ZpJu{C>0Q;lH62dAT%6WHb6Z*V8E{Fo$?<|&F^b|P%5}*8{ zp3aQ^=^S%(p28ndP#PntdRC&b945PB!jIDvs%R@c4=R%Vz;Bs&z*&By&2iWp z`vL^P{Wk!ez!-r%%!v7D`sZcW_Ob}fYNr4U*&BFG!{yl3JLh}d@%{O0C{WKNYL>?_ ze!Caj^>UTwwf^yG#Y%OvH~u)*#Ng=UZ1b8?$JaVSF1aP1tGj86tA5CtXYdzHw@&}B) zXYSz>WC*st8>8OengzYSN1SxIHSd`E#H4ipm~yecz!YK?;Ciq6%B|Y6!>X^FXKOJ} zGfTy*>^|lM9ni1|$QzGZe-~dQM5Ikq^T`DvLeQMTK|_u6Fd!Xzi1DWp2g&G*8CD`2 zZ(el#{Hw&8<-D}W*(P#)_v%|SCv}JKlZHZspgYxNT10Z5PaZirD@aPls+z9YTo?M} z;|zbLG>o`P9CAZl$tWCS1_G|+n>X|#C zc0;Bw-!J;Rp4)lSSKYNg*CjIf_6+Af%LkxNb|Z^)FA>;O&DR7TZT(DY*G1Dr1Cs;w zcPNr22@Q)IigPpBWuv>hI$n8~>w9uX{pN#(Ny7SPn9>@T{uY-Igx*}G5sFCs^W&VM zBXnPhmSNohi*)wq%5W?L`qn!AqlPYB8kd2)4P9f#;z8R0pF|XsZxwY`di=kWpwe(X za1HiHzIeVMVf@3uGx}(uO-+1mkMom$h&)iL5P3k%X>x!8_C0w;qlk z+%@vA*F#?POMKR|DMO}F+XCz5FFa;0ia>gC*OLhxUDv(%n zU;SGQY%1A}Chq!9(V@WLqVo0R`*S|48DRZr-7rt!Lc^WINOm6kKG9&tT z{iY7AobLcpt!{TRvI!-du^ed^=B%8)PC-Z!We9IB&(1bD#j*A#cw202S%{eDZHoic z#*7`Wpa2p<;U%|>?{#nHWO{zSSh$IJ(WQ*HRxRz@fe%p5&sQ@vuGd%q!BPV_J~)7D zKWP~-(mWo&uYc#LEih!8IlCo}mdp;MYMG=4Ag{*khw@tUy`VK`zsF~6URnLxB2MV6 z2QS8-P}qO+pJxn;E{Myw%ker4^ln>8`XKgXEO7r;6-8+$kbm+I$ z9pY)ys54wyN((yU!+eN7LLBx_W?5#ow9HCAgw1GW=$kRardgjpRwUfyK~w z1OV|5i#S>MLmStzOO>+S?`XKaY(k?iGJxwP31`%64!sKcrEzN-3+Ril6-U@UWwd9^P&b=7u`=fzZZlT-(RRY>&J1-=jq`PsZ@Uv@f}3&r0e~ z&>Vd4bSt?}8v|0>ReKzceP&j~9>4Pneaut$vuM}S!{$GJUQqK@YdXJb>gD$nNa!B| z--?SC_7W)hPZcLO%~1x~&HddT<`FPf6<2##e%P<(qTtpcXsO!uUB9_#bQeWVsUZcW zC>W?q>N&roF)%-4f>QiTJUg%oY*=uC@XT?-ktwKBKIYWV_0Sg5WKexOS8VFBVG9JN zPQ=lytG_i?myY2ak*{Jy2`~)z%>+%bn(Y=zxVz#o;=TQz6(;Rmb(FQwfP+eKfb<`( zCsJsC;70tBEwo+;Hz*G#@r`lmGT>_Ut&*o5`$F+)*k}8aO~4kSZyVj6uXn^LziwZB z@X=ee@rU1EvpU{XeKDgoX<$(0e8sYKefQmpViotN&eKiM_VARDIc6se#1(iP&SXTD zFt}>rL=J^|(`R@5_)-2NbJ6(q?h#E>X_e@o9rfJB&|mA^q2jZH!y;&CVc~`7&V1LP zS3H-NRICQN#}i33YGUFo?EvD_OtJTG$8G^2Gu!I+D+e__2)kF)Cygw~;2@Mv=XYiq z8G}_*rbw&Z5FH;E)Lept0zJ3aUV#h0d1UftX*onC+TQ9o9I-oLVn&ydOTv(LG~A!$ z=o7G@9xAxOanK|Jye8Iu^Pk4=qQMAT?xr z*S51CXl^O8c{fST44A93uAP;i&0P!yN0j)ThWs;F0R834qWJ^r(+Lpm`RPx298p2T zM$~u%W@u2672_Z;K4b@@RfsB*7z*(}1VU-7OK#EKc$lVcq%zIVMt% zW(Ghfv_8S$^|Vad%ZUD47PrfpW9t%;r4UKWL8#1M^Rv|5B1-m))4(t9h1iGT2Flzs zhLKDzr<0}?T@gjao1Tp}aZyq5cDHN7bnjqJ8(Dm%z#g6M9F@r3`qm#Rp$9`VkdBIJ zGZs^q0`E5>3UjfCqu;j>dif~!Yydf+&j|irC@V~polK=5uApc{^4G&_7-8h`DgH?B zK)A+mNhdcYWI*3aFnLdOhS;WJ^oG+L9OIKdEg>vu7&QRdv;nrBs|Iry zl7SViu~L7osl}Y`zXbj_MdlgK{w@HHn!dzGhJc~0+d%JuAV|Lprd6MR#`#?VPSTMW zY6rBn@?jxRq*^{eB^eM19=HWwvBwFzH1|HS_k7UZK0~WJUvDKu4e4J?X!x>@T!PyF z?XIKs%wW59S0s5^y9YAY$@lU+GeE(*K_j&5V?XG)(bV%F6Quk+(z!A$Rd~w z=TO3Ld@F^Yo?h;be^oB)$WZHoc!TLr;^409MQC*ps6S*(>Ap10%q3KSc*d^BfqwP$ zM4_q7!Yt%u_GuT;Ga1B9byVbOzKd)HP!-N)5!XnpISth*mvf?6lZc>@?|uom_+ z(xWEZiFO%Twdaz&-8w7LPejoVb0XmjV|slc%vQ^^Ny*7|efmI_0_GNrlzu#TVi>^`nK!DtCAOA0NAvGjYr9#;Vt?eaUBE{Aj*mnqor`=&j03T{6{9}vY`R{PVhHO zWOjQFx#FLNj$9wuOd>PzVRguUxeU{KNj$5IEWG?Gnio`4*?YG$O?fgjy_Sb$6ajZa z_v{o|lih`s^e{h)X@9Uob+p5VRxW+u=~REtA+j#i5Vt0nifQ%{q^N`rl$RPwSkM z{)tgb9Ciw7OxGzAut2i=yeY?jeZ-1r3-=1>eLe9Jy;(WhQ&ac4N5LQwqbJ*!KkLTr ze|EF1x?y|=%*_1;gPB(ciQ zu)i)=7k{nd<~;p=CWK0BxNGQVGfgcYgf>{MoF1G%`pws`dOvEZk~CioaP{ESO4!S2 zYMW?)GYT>vsAMZq15dDD5FHNPkUN(v=#m8+79%!b3{#euP4|w0Pu#NY`MrN&z+2Vi^S)C${6Z2G7t zxrffY7r&@NBHg2uy)=uIpxjA$)3g5!D2H~pe2{%7dYhX`tJTk%R4DNT7exw~A(1S` z3;&N6AOyUh2Ij5{xCuEAYsMNHS;PFr$Wz?l<~$a`+_!_DfB(62-?6ZQldSLIxFYK} zI%!NNCgEL`?%m>I`IwmJcL3coR_Y9lV>we%1Q~vRq1L#l>DzMa$rBB}!DiV)Lag%1 z0<{)(|51)i_>=W(yS;a6##b0I4moQ&E4F9(hj?osL=;&*y1$4)(dEFTAeSH%$qj6q z=JRK=`qiCsz>mpK2C8_IRB8}<5HhsjL1n(xFHLMYVsx|vB%ZyDZWa%T+7f;lnVCeu zZ!qjJ!ErsN?}bkKAi1yr32^-)@aI>QY@8(b>(V!l5$HH=nBgMX6GZX+2CYA90rA)r z@avM36V096-XgW%An|_%wiW7N?+|NU%Z6roY==UNiR! z!olW9mk$0^09p{nsRIQH{Q9sB9xMAxlff<+BXq@P2@|Filv#}dDU0h`vrK5v@XNT` z(uD7&OJ;YHzLI z+i|{PMiAeFrWUsnXgbIZHlPf^8ZZsBhrq+!PXkQ_9-It{t|u`5dj;I-s;>y$2#Zmf zrcVXZvsdvOBkPJakt$$3qE@rkNHeFRmSz={1WsNb+PD=ostz!Z0xN98@c75Li zIs$ZOGFCz%-P+IZxr#hulRdE)izQA9y2_`CXrAfL!Cx&tDW&^!QYXaBQ#4BoXj)1C zp?v?62GWW1PXVT&C!qS@{ngW6jJ;lAxdcC3{)I8YoaYt|VBq%4U}*?pXyhQhlz?BU zT%{pE6)NzXK#%mR!EIYn3Ec|MZ~JPjqk#*`^>?PzbbfwdDw$#HAMnx~T{0S7uroGd z$U%S2em1yLDpD#g8TpL6=|5>}QaU?C4J6T!%Yu&T3?66Za^C@= zJtsb5*uY*UDYnrL=yP+yTi+>ua7c*302518h;=5^%6C)g@-H5&*; zxOl!jsMV?>*uwblpm#|AaK!&Jp?||b={Ky|@AiTKdTR{^c4aZ_O%v17PPSL)v_Mc?z~TVj z;s2IGvpq;Ka7DQC-t<~&Wu%J><)VY`Q$z?%q{G1&lTsdup#JEr(|_DfX>`!%LNFBM z0E|WDS{=}5-$Dbx6yS3u>y0-2(<<}ZY-Hau`zvXpNMRz7ks0b1I2%o}gsm7Lmn0loDg-nq?dx?V3wP(g^Vh}DG(Py-*Jdzb(nc{!vnlvTjH zd~btKjj+VN5%f-+YtVhDtx#FgaZ_jwqPFHzj`8?7TvNH{ zUL#1?R>Kx!9zC#>@335WDB!DVC_e+7=z+naE65t91cb!)Hme{;gAA%9VlNam>u9HGzA!;+N#O znbPYr&o@CT=t{N|G1v{a$(;pNHowB10grvBAQ<6qI7T%skJ^3ak${A3jc5n3U!{7X zAP(`S!REk}NNNS8yrI5HbL;J#-k9T;1)v=U1==Q%U?)pxq$b1tT~PQ7U2*EVCTO_2 z{wrh!&5HiHOvwv=)QM)os4x-OS1n6*U?Jgt5PZQKh`S6NBbkkTZ?v2!&GIuH2Q>7{ z@+A)YP-qfx-k0`EFo_;)Ex>8`G`V?TE+55g9PWt-DHv!z>4IO&DwA&ppxg~Hn ztk{GQw@neQLA6Av)$TMnzQ?vt{M|R&hR^W13+I|%+(L|j2GjY+$BkpH1qFNm`{XBm zFQT77HaF)!o+Sip8HcOA?_SyjJTZy1rLdSnkIaHw`cC`wmU$FSmzAmr4; z;XL$fKSVrJ*xP06uH9L;Kbi$5sFzzr7`Xb(%K)U%pei&N;6naWra@DtV7u^iMM_)< zjucXX1AG4DY_zuRkH7Mvr4kg>k9Wc~%T)SpTi$}pNJ&eVERj*HfsKh>JFIgmY{CXW zehryT0ne~Z>-T(0sc_Qp{DHL z`z~j*GuD>uc>7+l5NyRR_d_5fhAot(eXQbrLDuFLyzP;)s{B&Wxw$DfIa;dS$V$8j zzfmw>9H(s3(bihyGR#M_OdVi)oPu~F0{Ht(l=V=Oo3Ox?ix0#wnTAaz9VpX>bDNWf z31ZA+1eS(uDS>+FFwr)R?A9i|EUJeTg843JO4hDmh&ZNxT!5jUX+THrI)P?T;{^zt ze`kf66^jiOP6U?zv84_wdPSyX3kx8gi&7yuofU--6ed8DDi7My24u7Wmea{VW{%Ek z=v_gR(#aYB_)jH)8J$8(KH?$|VENP-HfX!dXbRZ{*kb_-&%6qL4g!M9@(q4lQ?;NE z=+g_DF74FHu;<)~S|#S9zWdpIr=wupu==?Ae>A;wbYx%izTL5HV`AGjC$^o5ZB1-X z>`d%TY}>YN8*hJ}-}_zb^ncxFtzKvEeeSCJswz08&>wOb1hwA)MSTru*?{REx&%>v zvnI%e@}bI#`D<1^b&;DR`@I7&RjYweL~%?ov46>9zSt3lss|0Mhd)?5u(Xdw?IPL$&1NH`7p#&8TOF2r-E1 zM~}!vrx)WdRpHJdGfi94tuHUYyRD>*j$6V!G;9bc4h{|=09XPvKd&GdlSHWi$uCi} zEDEH1%>Vsn{!crSiU0)=fS7{=Q@vu|Lj$;jY&Z(r+Hj+p2L=a)6Ul&ee^h^Dn1&Sf z^{+6c!=Yu0P!kdoN=r)}n!&ilQ`6G0f#L>uS+e1(s;ahx#ICGpG7T9vuW$OYV8gS3 z95t=miTe2P@w#1L1NUQnef`>nz7y9LnFJp5wZS?y`_?xv19G>W!eHh%-pGeXP(vm_ zL~PcfOGh`q1|Kj4wgO`KBVd+rk;pWm%0H|^oFKYM zCOQ3HNz)s(=!h@(%}ObXD#oAEs6sU?vdvg(VpjuP8d@3(LfXVUiH?f(_g0&TSF+Nw?_VX|92<+A;7B^IY#8&e! z@PrqrnfNdg5*Y;M9lszg?c^UYHfZ^;X-=!~nA4(pg@1bR`nl z6>>p@lZB-W`v5#Yk$tNf>@D{@SW!Bw<_hZ#dxyH(V- zbc}#jRQo-HjSIe}hTUM(H=&u1KCsF3F(HUhU#--{i!r+RBfP-V^hYZ+?bPzd`gZbTo}uYT${B?eu< zcZq1?2Hb2?Pufg^&J=<^tJgAa+14h0Bwt_@tbtaT7_C}2(eV{9Q2`93WA>ZneSBOt z2>VQ~;e;f!b@5~{e>}A&1>D7~Ai+r&QZW0i?83dO6w6RjcD8S4RE>o6f5&O+KgwZg6*AAculNSqN;rIxwLIblP5`3wlB7m0Xy5(VHnDZW< zFr#8+5>iq=kGC;x6@m%#<9qc&C1Iku1{X!OMF~w?`P}J7EU{=|<9}NoyIqXDZH!gF zE6nf_OXi)f(d>&*jQlL>F*4b_kf(B4SWfaji<-MkTVIO+0kjr!#lL;qIm#}fa$v@YVAF=SPbGfq4|0&%*mD?BC09<( z_iM4dwPy#30mI}WZo^>xsfLOdrn#SgQc&r(?)~#CWYv8^cM=VkF@kkwi2VRP&Czv@ zkH@(PJH)sP?d=hkASM&ukgIm^S4yGZnXQ@V#`hu_rOAjBomPxmwxH`RoOzF|B{6mD zmv(V+cXxLZ;tttAp@3IVFY$fX%&CiEbgMtG=j{C2BDwa73lDaTL~?5Ccx+TmOo(<> z=;{SJv#6+OzA6m~bQi6gb`_>u`zCz@@QcBrp=}WHk&&?O>teycqY`*Xrpeva_ybEu za0rf~=DC4Fa_3a1SxH&$-~H-d7D_8JM1;PMz=7&o(FTI&R-6L1i4JfQ(Gg(fsLq}N zIP@FadhRTn5{*bfLG`(^jWYg4SPWR)47L31i@Kl07$kDjU7MlSNMy|-I8dG>t7zfA zwco{Ta&z~0`(p_T5W%fzI?;FCI&S%zkeXJ)bvwn)D_wKf4Gj$lgV$m5-o#!lA&Czk z_nH_|>->`c3dVx^XQDTis@e7pqrNxHHB6MGT-}3aq8@*|a+pD+q6xSqkL13A4Umlx z`f-i54Vgrl@8|#1AQAy7iz0}5M=T%4;6rIZ-ImrhHJ6nPH_jk?md+$0d$_{!Strc& z`J_@Y_8Yyn^5iy8r(YH+=B3ja}t^#K4+|>uqLMxs)s&fH2(zLo}?7>h8xg8x>M!q zd(6i~<#(;HV>?FpAX5JtT_*~h763Qqiy*nlqjBM}EAwb%kU^Pm&XCb)DzWE5$<do%Nt`mQ99rkYIPLkc- zrI%VpZh!1_+Ht%$E)Oz0oyNuEwQ|_|S_c=6#0!MDS7D8ss?Ie4d+rSoc5#w)?6UQePInR^yln%8dRT?^g!~VzXJp@RCecew|Ag3asO=`aF zq%||WpSg&)+9sF{0zHIy9VS~MZ#j3|d@xV6vK{6#*sX$KB1X0|*-qqpT+(dNa=y?q z(g>#eUy3Fh(>PX=C#wEiA&6Nn>wcv`+8r_dM_*jKw~Atjo9Nr$ZK*O@IOV9k7<^da z1;y2bZw^l(vho6ySu={hM8^CqK}OS|#BDr5DuB}FwM5?zXE@ajxJ;S6u+285qRI{Z z1O_j#_V4pc6!<(X|K!B|zZ&$?2gC<3?01#Kw~YG5kthYN2*e4i4lB-1@#a9@ z$o{3dYV|ZpfeQk~-xn#F*}rHwN6wEZ4C9ouz586Ce!x!m0FfZelB~IIORC~obpl(i zlg8S;oi#}03IC(vWa-YwcZLQZnHjC&wsF)H>_opMVYQclocP;rH^@QlI_x8oY6}^K zl>OGj?Cv^z_O01CQgL{9S1DJhcH3)K>vq}kw-$dYfH`%i%M*AP$p%oO;HCCZIw-inX7?y~50>iVhPF=r{MxIGq=0;z50)TbAIL~LTg5!4!c+dooCS9tLqaCtV^U)1nxHex!-&p*GG zI#Hy=lr1@RmyaEz6}pnI-hDwU>QXqpvIJENAQj?XGbAYVk!xe6V6!sa_$4TGg%m#6 zg9uo_r>{5Jjfn|yZ&BD;2iFEI7)$aCkL`XYU?W&h{RUE3E(&wIqt@-p&EWJ~F9Ic# zWX(_v@`V+Y6yQ}!gf)X3QSCF!nUPxAi|71u7chWxfEUlqEzU7HG1=B~zh*wl?0dQD zh3B(a;V0dSRnMBY8*7L}Fo#5p9V_auo|sc)^r>kQ6D!aueXcaWHrKG>z0QCrVAdsq z=ntjU?Qr3{)>dv&X+;Bxog#SX#%9dh^j&rsS#0EA{Z#kp;R=x-dvi6z%2FMWh!w$x zq|hKg40+**e4>+j2mxsMuJ3`Aq;w0JZY9FMaGpS-eD~;eErEdE&poG~`1Gcm=5c-aT!a zdQIrIz^iZmjA%&MH#=Mx@KK@gYoK(KC1~>hz?^#PeyzWoi0STA`M3!i)Qp<8&=cZb z|ANus$-SEX@}390N38%i(VjgtblXMz*tk+TYUMB15j0m%5fm#O^3?d^p_$V zb&O0@4a|!U;BW#z1vbzS z*>9gYiZHDaH=Dvj{*$0+xtAA(3xS%QL@&HR;yIwq)7C}{mZX@}oVaR*D7rwVm%C^f#hNv%=qmRwuEMNtz(QC&yioVA1SD_1ArUv3MzJ>Y*U68CD z<&YAyU%55vH?)i%R`7uQC9v}V#Pi1K46bHz0u6*xI`aJxi@oDS#J2WP-hXh{Y%@urD4o{3G8Mz+Qb zaR8v_kxLwOr16-LytCR>-_)uIY&qLKSl>XPW%DuzSbZBhGBPqm%kleme|X;oLue=l z52_~}j4TZp6Dm@n*Vn4XkU$6W!l!Toi+5o|`s}L_{afxrTO2;=p+WHxU%lnaR7J{E z3+n4pw;ryyiGKb11@sCYmJR$}Nr@Du())G@i?Fxa|K3K%IP^F4KOApIOjucO^mY8n zLh5m5Y6xX^>#3NcwL}&I9Jd#(f`(&TWbEi2dBq_{X9r74`cmA#F{Q!Pa=fdUY7hlW zEab~-63NMQ!Ybh&_woD&jU>`igK}u`!E=$}R~GRuupSV4?rNy*YAM@hZLoaqga-)l zzQC(Q;KIl9W`+)OiY4l%-jlObJh2365hhwb#dDhNg$)|@F>2-Rh#lHtR>}7bB-2vU zS26;KbqRtjhWupRD+&6>&S5{F*yS){UQN15VhUcj0Azbk6pB_Rgy-t*!HetJBz%i9 zAVDk-QjvDG_Zi&WDBCvF!gkUGG8L68ZVfVSKG(^}!Kb*Phu%MzdaUd{D2Qk+Z<^Z8 zl|efO<0_3=n+U1`^Vf!yjThKF4bdOgdd7tZRtE5;M5@oG$tN*EyCCIQCUd{jA4Bb=P;RzvKQnKCVTOm1kcM2sfJ=Ubj;!wQN$SJ!Y>$ zpx_|ns>yfZ(n<*A64wL>`fpWQPMu7*E-*=n4 zE`~`J$%=ZUhCbjNMe3E(yEXOBbUE*41QLNTL60$6l0u4B=6(Z$({hl6@*|5sE;(N} ztRUexYrS>=@LQan{BMn~n;KNM2OiI!^h4Sg9~<4xyZ~re^0uE`lIrSe@o@bSKdvs* z2z`C}w3XtSkDlVT^KYN|`jRss!Ad8uyVg$rI&B6Ho9#)OrdDIS9LCV`abu{f(90lR zmK1h>g=g%khy6h#+i?O#5Vn9t0?n%|z!j`o9|F!vANl%=Wb2Vrsnv`DZk*2jwapJu zR8@{W!~H&&Y?SymD&|FO1O1=U%4#ZFz+Vaj2RFdE2E}{C*e}H*gg7cukLNuZ1w)D6Y1Ix&<9t$w8U6NO5@ zpINkQrv8rwz`o3h8L4h2?ijBO0HX_Q1P$T6c8GIf+XajFTY_|IwWf9bH6wu-(&_^R zJTwc79oX4Wg0%j3xSp3I6+GNT>0?n58|~1t+!peD^B&k|kMbFB)faR=|7aW59eDhX zYwx^Sur~dq-|&rF=id-N&BsdPsYF7B?4+o`OK?lF;k6%UudH^eIoH-2J2`xOhuJ;l zgxQq!(_`YgvT>)RM?}kcIVa7nRpENTABQFifC{Dml?j6B@e2f{=r*x z<_+ectrjcO0kCFC-IIEC!>8Ux{4KVz(cN3rF{T{J*m+GEpz|iksKfU{|L#n;;s@p& zVYZ#CIk9w1S7I^jk5t}$&HBz4%AS5*NGi3lQ=Es&&PCg3B%)?U-LK-WcQ&PfS{yrM z#(x9~cqpfm!*|+Zx9kG!UABKWxkC)CK$7x+_h2Y`k)eBorpJdh3iUd^J+S?`Y~fBca-{0aJ{kVnnzSx}f=mx2KcF=75s zq24(}{warbdYL2;Ntg!q0~K1!UT; zb%|haY_Q#%XaM-n_J+QC={=uQs)q~op4*xkPyHCL2--$E`2}8;>DDecz8C940Dz)A z^ZvbQSARbp*lvq+rO7hO=}dMOVh@#6On*o2!| zu+PoivhV2S-)~M|?-K&^(|2FeS zH{NyUp7=3=;r*D2zrjr(Qk}8${XQuaC||n`{Vn~P7onQ}9vvE=9;SW}DBUvxmGvr= zI6OdHFG)oc%gzXe1URsx8(d07GPywW-82JsY%S@#JcI|d8Dx>QchOH10fk?VX$`IL zQyc1P=f=|*ijDUnG+2PqKkuC^PRQm_)$dYV)t&wZ|;@S)bkclN6xE1uX zduZ`B;5@l0kcnAeva!(TmQU-q>)+n?`R&RmFk8NzE|dmOf$)S?-S&f;v1X{;Ae%50 z?9DBt1aLRsW-FH%=-=tT-jZay>PcmpJp~E|x%GL%n^0nnUAg1;1oZjmg`xl65cP*T zj~Pyl>P87bDWOnotBVVxF^@dsCqf(!Z%Z7t)yWgSEUA4WnB4McrIQNHO&XpQ3=0u# zO?TQhClmXx(;a2s#7V0s6L{jJpAWHAP~!oJsrt=a8tItmHvV*`^0}h>$i}k^~m{O^zwevlO*4jd*~{z zdCfk9lsv$OjdI2n{j+VR)7CNV<|t=%VqL}3dY9%Sp?R*e3bT=m_EDQ@XalbN+&OiB z7eVFrCbaD3!te$HbJ-Ec2rN&9!{_=bxiX2|Vq3jM+f6rjA)g*alfNH{YezT!ZkUtM zKWW+VQe->YDcEXV0$h=r0DG>m;WpA%Oic{~2&~K(_!kvT`I%c-xkXPy`%IK}>V}F1 zMDtv)=F99YTQUK*r@=gX+#F}melwgol*CbG=PnHpz~bCxa0>>wNJOBG{lIenVgXNA zdpEnjHuQ1dvt8j&M3nr6nsLy0HtBi#ofuN~cJ-nIl;i-5xd-5~PK*&QF5V=TwY%DD z`pq~u<59x?Sg`qA|Ko7o=L|fEnIs)#l8|ea03OQuU@u^C>&6VYfw%;- zW_%C{5HPyeQ?YIOZ}pncya{mJSP^XZdukpS{Za8vIeT~#@^E$l%ZBHls zd9D9R9&4$oDvwR^OvqoyQ|sz#LGpRwA?N2w4AOH;1b4GM50#0j4l7km0c|5Mt}5UQPq;2Mi9ArX;Ia{G<=?xDc*?_e`{pZmqGfC}c z%WvAlRd*ZHtX_20i9Zu^^?t22b%S}KV++TVqU?x-H-&loM`GMbTy_NmWJM-MNX8(~oU+m!D z2s$`_0DRmfLUdg{z_lCfCT;ks8_b+NtKvVGQAKataXuc z*+vf0SD!INzxlt>0jwfr7$E9}DU>WjPWs~q9)`N#+bLy}y}@xb%oO)$1Z;(9c=07) zAE`^oO8uZ5z>p>Vin5>rms<=lgD~a!v>#m;hgas$aS##XZxjvj2I33lSskwt@j+Sg zBsn$`|5v~N^BND;y~*bNxU#60D-iDQ*7fR8_#D{?pImvRnIS#284Ixl;o$l7N6jZk zqJ}d%WyP07vlkeCHVgbFDb)BtqVv4@Ze$J;0N}?}hh6crE36%|bFBlByJ6PQQaAlc zqzav>)LJy0Waz-CQhRKt+G};?bJ*5Q__6F#vK;g(NvxNX*Ny+v{$x);K`jLZLI(j5 zFqR}C=HiMw_S`Li;4k2sCyruWUVpHcDbU(GBZc)t0Yximd$n(1Bw_@*SA1MDDUTQ% zad~H0YdtNF6ayO}ARsr0l8g#v{oSbhz5K2#u<^;`b0eykeNg30dDdhNrkr*gB*}<% z;xJRoc9e&UZi>W?DbC;D1Fwi%JMDNFjTAyzqUI(&saz!RFx>_hgK}Hcru$W~)C2^u zcA}(c1w5M29Z7iTW~&6!fekMxN&KfdR^%iuv~E$RyiRaTZS~_KZH_-$hLeABy`9I| z`fB5pBlGXQBZ^He#Zd9OK@TriNzCP;*iFYC^!`vvPlYf^uQB>f92tHwhjExb4B!gM zimS;IQNrPm=dc1z42w0!*)MM4*Fi5|DsuZ%nPNGV5$|xuW-^!7%T}6Ov!rWP+P7T6 z;a2To0Kg7ziZIv!`5%tvB9kU0mVM>8?bT-S(i})l$AQeFBQ#Dt@ZdFL-`aSDJb}^P zgYQZu*a|+odHv^7Kf)RZ@*CbxO?8kjdLZ>_c}$khGH;j+pvvgp+w6#{*qHV z*Q_e~n(8WGOu4aU^tqeV87AuL(VwLTNf;$?=EWK1ELu-Ku@e&`T~^8ML~uf%kqVmT z)ws(vRmU7Gz_beV3<4Qd75Pk@3@}nA0AJDHIs<&swM_h&j-U)}6ZuGdlrCJ(M^;Ts zbHbUD&OBr=k?X4l5K{Dp&ytNc-CM;$mY(V+#}lkWE*Wi!M2s>Zv0F5ZQoisM=>v$7 z^49tMVC(I9184x%KVvLKuq({~x;V)D8FRnO%R{YUZzqMmU95ftobBi$Lu7f1W?W2K*1+K#2>x6aZ}RQy=XI6ZK!3QycK57j zzP3JCCbWLoaBO2pj+z5r-29!|cf}xd|G6zEbD_OU(ZxY`5#JHvfJ6 zYe2{QsOg+np^8|ShXc{7D1fO->KHykLR+_=>#n&I(iE%Nk3>*FgnZpDrnIl;gMmZB z4N3ei4RZ5pre60se0Sy!KiYHQl@&$-NjNp4ZsfJ_HI%(T!p_x>l^q*eN}rH6Fp$`F zPAUzyDm?0&GqhorM$`J@<>^j-LV0mws=k<8HX%=BBLKqBdP$AQ6zG%y*^mOBYwO@5 z-7N?Fh#85vKn^eTfOlv)5!+ivD*gw2);|!^c9))ZNAAo>Ua>!*|F_C`|IKJfB(deg`2K54 zclGOT!h~v?FLZNU09ZDD&5CSt?G=yE_VK3vsA6c5=Smll{8#fY+2C99F=j(Hr?n0# zblfy!1Y@Ymq&BUk&X#126jCH-!QO1Op~=ArNtvH%joK~_Kq z-e3Oj3R!uv&9m`@Le&O)(lH@2N=lQ7G-kWo{yzqN&PLrG9a$W97e1Iu^dx+I_|Kci z(W_ZmSsSI$q|&HkV`F)XRzROsSPaPb0uy`x`4ZqDK!pi1_(MaJX1aqQ$DbA*HoO2D zxD81ImCJ$$jX_M{-P#Eb4-bJpu40)g6K)KPW52=rS7Mui^CUZ)@0$xYJS3fV!%6fD zK6f@$$V$_6wYq?gp2+*N@Y%!T8e%Cd(~yl=GFVB8VdmZ^;ge5ToJ_{mQ{oLp$&rH) zh^h9n4s+4CoFzs+%QRBY>FnFg6JJOPdeaH6a+MA>4Ukbu|;KKq^Day`-NA_KT zt2#_6Hi+7d;gZ!8H@tT5``1n%$Ky%1cYF(_2e0jPO-=r}&)v-OO~f@ZY9Zs#EF+zX8Wx=Y2ssa~ z`_=F9oc%-T%k{+Hgr`kjp+I!psdo4F^YY1$Zp9Jqhm!2u06^(MN(i{_p(6xSVcoZe zXjoF;s)`ZMg9zt;#^=q5s*1Ow<+W4s->~r#T)g9RvK#{&)Ig)*dL99DPKb=tdYEO{i*v8;q`1=?cEv(x{AH1Z2u<4L3I<7y%!mjVG0(`{fJG$DTPjBUr z+;&pJ4q6Q+0NXk5V#mjvt7+spjbi5pcABi*m!2`uh~^zlQp2n^ydiytQcr@U4vmDW z-{-7Mgavv1`WMZLBW+TL@h>dn8sJKVFJvX^}yZjtNQ1*uD*&T&k5am(%v0J+{axgh{hXcSjr z)=H00rG+7CUK(q50v6%hpQV@Smh0rF_3WhT+sexKTxA{=%05cO1sJQTx-& zmT3srHnX1_LshkzVIY(J zX#O^x=Se;=;|l<(%=R)!h%~s~q`%*>gbljBps~Jwd4{<1PHr9z2)9E3mD)aUQykqI z3wUNKFCjdXjg3IJj2~qs~WE5y6|UKgI?kTWkEo*S@6{HqiX1wQ3~C)2DP~ zZlI)d_C@h8|MDO9W8}$5jc!EBr@muf;mpJXVat)X7qFwb6}=1zD@H!@#FuyHb4*2# z+L#5FF)}!u&iJC%XTL zOd?|Arl>4>BaVFHL7RvumjbFOkz5yMaktJ*TWYaDRG_rHp$uRGa+9jvggyARI`B+* zO?jmE{N}*kEPWMVmF!`7pg?#!B2y&P1TK?(#WWG(KZTXhnv4>mczG zC}46w*`xS2jEvSYbkGJ@*Ma9!YQ^e4@)>&i^EDe?k(#7Mu7EvD>6L6x4hjbL7>i3y zJ5_DxTOR>ifkXq1WLLR^g(z4KgD)!er`t^NR7xWeE8fR!l zB_`YOKP*09z|&4wnIs_F_GyN$%BEA}r|b+w6O#LhPF$TR~yDyrW=vFFe;fY0!dZ4YU&m*OcjNQkj@}(m^Fjt zXtIjd6*jj_f)!_gJy!&{8{a~ST_lxi1^xu|6BKS$^%Olp^$1nY6@0mKFTCR2rhv{? z*PbYF0B@APnI8o5tT7oA!M)4sqo{2*Se&0r^rpR28gGHv#vY0 z-BE&`@ldHgf&@{2d)Vw!zZ(6UaQp#Y7rm=7UEjQD#zrVGTLidpv$IU+ZQ7e&h*TJ-`qY@gMG?!9JQJLKIiO!r|vFJ`)i$yCb zFDRgB6mUPUek360EHR-ss;(O{{Oi+QVp25?01LnoDl}22SXJ_Kl1_Rzr`v=!DVr}; z$4Er9U7!L=E@2~Tjh1t0SpJ3tQN?pgJ_Zv+smE@ZBc^^k>X6Y|7!1lSb5}Ln^!3DE z-Maab1?TETWic~w7eZ&uQM=&ArxpeNhygcQHrBJ0RXXeW>#J*LpWNS4MEo#=Vc&K& zDsN0SOP4FPH(D(s1~9PXq1z4?N&c)#dTqvM9jU7eo{asfTCsthybd4Fxt7C}*DdSd z0T+}04VnNWSn=bZPxB%)6;|;YD;(3`D!+rIs}$51h5!GsM@%9F)nNZj5qbnFFPQJv zIcY{BM$B>pJ(=K@5!<>}-$4_I$33uGMfsVNl~S?nr-a_ad>!ArIg`XzT`e6YrK}a? z?xuq)=6aC0Fq;_BtRJW>#`dxV|A^)?dQzSA*dXdEl{=SJ7p4AGl*kj2qf~1j2GVlomtwVK*DcH9~ zuaeU)9rG+R8#j!m(dO<$9ZofhYF1U*ib4SGh*%m~>b`USUv1*>Lp>|fH<)Tb@Bz!U zTSvXA%0a$jI`@#g;2{c!cKzzSQBN^PZ}G$4ZN3ai?G7!#`aDWx_W|@am3P1!rSg}w zBj1WMAEsN_48^ViHkcd1uN+BL9f!rk)VUrIFl5Z5hiKS?OBBL_!R+QOxv1^$n+A7? zvZ|^pKBNH&fTp*ytIvz?>Q{an9vUSa2XQCsU8@a&6EpXM-;SfH1@;fv_*Cn` zXn(vnxrHGIe?rc%ftUgzLCuEqEudMPbSYl3S~~FSig}5A^LQq-qbAK=gO+;z%Ro5s~3Q(2FjK|F{OE0qY9C2iYOCS$tIl^cjVBG4y5fr2{C8!z(9jZkjn}{4`@Im9n2*ML}RrSgxRe z{n`o1tj?m6p=Dd)^`^IeGV>ET923LDWCq$DUlsh_y-worN>-TA@tt#7ZED?eLInVQ zN$)J>m{L3Uw&p^wk))AD%qny7qmE{5>$K!p*)DJe;8+S6lFJsaZBYD)*qXRb2D}*o zfit)}bke>>W)Gi-R4K&EU54>$fpGee3T@x7z%{gbu~J|--7b#YSUUJn-8_1BEztH$ zr$S+kYfB_l;YpBG28^kb=t_bdmZR8sF zMr5z92Y~~M4ZpV>s<-{|?z;3JyQvWQ!`kONwBAHC$G5Y^21Mj}DLOx}q z0b$%)2zpps+CHCzqIE2&HJTMr{Q)#V-)Bw)P>|1^m#tJm8F0|TroZ_ErtomV1Wz*n z0GcRK^M-tQrMzbhgdCir_X^<4(8lyro9^BHCJI0K!kVc;T9B9U&Gb8`X!n!^`_sWb zx}}>EawC}mP4L1Mv9j$KFYjB-wb%NyhP_daQI!3DGs$P1dKK zTw#<(bn$wjL+W!>+y<@vb|y5~x$5^+=w3T%)Rvd9@!99@U~gr#eZ4_g0QOX` ztu#lwbGJ`|ix!n=IwHIRQ~Gx-l}+GVig;U>;P+j&FgAq8)rdZP0xuq;ah~N;Jqr&^ z7%$x4jU(Y&2sWK)1Wa0XJe8T89qe*h>@g7)krv8=>U-S*Besxh-@!Yu7Ur$b8d=bC zd?bN?Xz@CR3NFzF@$G{E2Mqh2jpAb-AFDK2FwBd`k%TP$ z+9fS7i08XQlfkW9I4#SM1%vs5A|xwCPIrVOWwj##f*c$s9AsfQ3TcN7eLZmKUR9C znFvlEXBIeQ8LQzARR+p9(3_?`AlbenAz0@+-}knc88r?A$XRoNS=VR-0n~nsjAN%W zZPN1r3xR5HD!WVPlml_CAreK~MQ>hg=nz@;S9su}rCC56yq4D;U9bJY0Bri|7Mw^P zh|3S2E1q5bj7ERLD!%Xf8Fzb8rabyVBmSd4xlC6A|IS>6FL7ux6VR9m$Y-Ezl0V>y8YY(1Hca{7Q~fe>4*H{-bOy(#-_vQ(x>JR^8`)^cH^z z_{~Q-k{w{4WPo``N+;=ubLGKT;htz+dF3!{ zxN>@lAvlMn!m3H^>?RPIJk4^Wxc<&4fB{;AblGXGPtlm(SW ziJ?o7>B2XI|G*Z%YUMW&qcsa)Jzfs9<*Yp(t|2Xt<8d`==5-KW)}g97qAFmEnDIW0 zT~B+)@SC)g8h35rbHJ@pg1H-*d6(fVn807zQ3LI=2u3%ScZn&p=pCb5qGV52HpyPj zLM`l7VQrriB_g!_gUP_WlWs=2+W!1N9y8|YpIEr4>EX>-&x=iCWgCvDB5e7=?)7nx zaP0d`TE&N$#|wDqV8fyD?TRxl>R{zNkf8iaWDBm;DWTSz_ zO4ycmJ3t0Uw-{#FoGh#wDvTyDV+#!lz@SX+!8~~1R!t10&j&`gB;igb2*S~E-34uH3g>l%E#h-%64#j9C~JuyMc zi<7tPD8Tvy?1BNzLcX1jz9awHB6w>NchujjJG)%~90^9J_*uGqdN z!3KwV5>}GqRsOgO$pigg5r5WCxZW=V$T}4mVwn(7?U-v*O=NKQ)|p@&@#8SFJ}N%~ zV@Mp)8~A_*38Y&grv(r>5m7GFK$?ckiGtEEKA=>=20}xYNf9vAE`DgmNqK>#%8So` zjegIXPe~rVjncVJd`qFt))ESly^(<>YjneZ^bPvccxW&1ZN>^#I0U2)&CFFszE$&P zGHbtEz<_V6?Gc6Mo>#0`{BQ0FfS8&2mWU+a;cO93T3Q;IDsAxl zd}F;2I&`6OgW8?^MlhY;XbMS=Oqrbj2m7emTJ0Uxl^b10N~#UH6Z%$w3~&eWzyx-P zgt;4(LklQ|y0V8r40;nbgZu;)6!9!70)MW_3>cR1|NX^`a4yReLikxQ{I&oE&_TQJ zWtS*r>AUt2Erk9JNpkaW1qiql7c|-`j#~ZkLy&w~Q-};=uFnSxdD+x2fYWVrAC0s^ z-jHizua;-PcqvVFjS|4-`8cC_+_RrcXmLG#DoYb`zbcsTPiDtMi6gt*WY_!Z5R2lR zf^R;px1DX=j~8uWR+aV@+FlIW{Y6GP>k%Umfy`1_5xphcj<50F;vW53ZM6~JdLg7%=&Bu5G!}YYy|&ji6S==tKu@dMcNYR! z!FB)*cor*PWin5)P09D8u$EWTWb>hQYE7dA&mc z^oy4C*Kt;0^CV5S3pew3W~3V79*dF|?`%xrd_V+g8m$lQ|15+%xouCWx3tj~r%@RS z8to47&*u2ZM%c!NMLQHikQwGA3_&V%(ue#nm4}uwwXvVaqq8>QX`=PKKm{nM4fbDW zi=QQjF~`^2T*q}GwAd%*u~$)1iS@AfT&TJsHTO4rBlJ{81uJYSW}~y*11_XPWD$hA z4?{L^z;1FHbN$7Um*ezU(QL{j+L%X#%gPK*C(%?4}D@O$qtWE--jDVm0pt zjt?KZh)ZkrY0uqX4mzU`{>trqkF_uN`UZS?&as_txhQI{f!05xn+8!u1}GyhFy;k@ z!&Wnb7C>Mi-$EG(3k|@~M1mCsUXX}BCGx|Xxx}#*+8(`rqGV8H|4Kp}yZ7sSD|p^= zp5~{PwsXpH&M|3_aaJVEzROZ9v17cyrk88_XXA1{6r4PTud1-IE z&p9)xLTO7Pz5v{}hJfY?B2ZB7HJ1%l{ejm?QLe0d>5t5=3+wBuR2Jh%=skQto&gi7h2-|PN{n`MK= z3;s&k*VMTH51f$PR(;|Eg%IRrkO|No6E(MNyuohu}9!`;PD=iS$?cuWZw~2c}8r#Yf)w$b;4jm6)4SN?v zZ|qOf9I=W#sGVy}*z_p8h9N%FgUvp*L27)3%~(-syo3aU6{VU5v(=4u`*Il^3!%Xu zC?#{x=x|P&?fHBLHru^_1#c&cv6=tQlDWVT$SHMI?Hry#Wiu0-*5*!j9j z)Fr2tJo%Nom|qHF>eBX5wyM^lpU_C#-$2*5$~!S6*pQ79CxSFA|4ub4rr~(|fskDL z6vw8t+hPw1FuovX!FhP4KDoM&ELJAqm{eRNIzexjsTiV!niq{14i9|7UNGsa`H94G z%`}&pU#Rh!T}YAV29dfI=v_ykO;HKws!vEQv*k4++IBQmecefu`z)ujbhZm-YYoGS zWb)ZReQ`Wjn`BF%3o$877^2(cEY(uuGn;_rUeEc_C6fqPIG7*++#N}>U2?#4>b;Q6 zVy%w-3ER=JzSKR3nSh2Fp?>%&cTc@ujdYaq_ z7*%0$DDrQDpwfpH_L+bV6sR=h=kmQj&8ZW=g{n@&rza2EB!Q5bh-kx zRlHgH;ASEf1br@TUdgQ)_ZZ`&>((xcxW_wn8$x|SEmiz}9iaz%${znrH|sp#U~Eu? z?od*ZZ-X*JnW+-5Y*DT)ytZHH84M654qi0v&yrZ^VPZrR_AcMb^gb^6GH}&T310&B zn6p|&0T_U4LiX@jh)R+SIC`HGu$Ybz0c5hsIZMwG_})*r?;L0aSN_yE_hw8^ihp!b zsU8paDFO4$rzN??zVA;)y@3#WMOYMy6)E&Kfq3HcCFtP7b93{|??JD7z)Jt3Py{^V z+r2^K{Rhlhb$qoajz+qH(?D8{aET8-*t_ccB1zF-*Oz#*);xw-hHq#(iX zkEHJKTAD>FJ}CQW0bvx9!;*ef&=ubT5CNTSnS-NL><@atUmq@ox=?$m|65(CnW+I=zxtFshv&RAA?X!?`>Uv9uUDE z`NeAoWWP|u?Y`-*+&T@1!yZh~dk>KnpG2-*7o9Djloa7|@8D8)OqvZslyq)|?Laj- z^ai?&J8NjV<4~kYF7Sz6kw$}He6?dyQ>f0eGE0%L@F5kSV0R~e$${EW!wmbJ`~H8d zeT7$5>lf{&8xA2LN+U{_bT=Xm0@97r(hU+yBO)NuozmUiDJ9(@E#172d++a!_Xj-3 zfCG-hK6`())|zXsxl|YK*0d>ee_v@8TEGnTQyD!(baZs~dZ+Zz1P}t))C-tG6AHb( zhE}|hfA%ZFZ|RTi<@E;zz*5hJlDO9!vmC4=D~Uh8zb_I;#@)bEI(MiTFDx)=DIv_T z<`;JsWVXS&33qP`5=I;;%O=@;iKv_;3R7(gWlh9LY&vh>#`2zH!*9ue8UWk8>DbuX zNz#veecJv7-nBwtaO*t&2cH5H3xcA64*KadHQQfn77KCUGw!T)hu6R8FU7?GP6<>( z8-q?Hm#rd&T)YdJ3WkLgbKPaGyqj9+Is??g_ z;4uw7(tVyQ+Z_4fFyp&pw1|~u0rT1ai*7G zUwc<>c>e5pyqs$REr~M=WgG2Jwu8KS!3(%UOjy@%U8A8y-d~PC4-nBt`NfnvH8zb* zsoI2K^4dqO3@H8d=LdY-&nP_+Q(tp(?&*D%hEG|;C3FmXltoKQR`E#y%f8`N0JqZb zH1G5LZHgcYV!TF{b=q1XuM3~YkNW+WB_vJ+e1Az{>m%AV!_rSoW}dyUM3zxb-bY5f zT5BEC#gR{DDEnrkv^i1aSs`ieD?@{q;QRTM@ymF{%Yi$Crmd-B@;c`|+5R{dB3|A% z2?h1^Fx-a5LDC|ih?X8HbcH%qG?Cnion#F*rB)@ONXa#H{tuy**zJq7(4lr!MAc;JA9K6jBo3OO$kIo)m?B8 zleQj6B;*ohf}VLPP%J@tSpxe{}DCdiLoaVf#W5?qGo1JkHLr>@}PKWq{qj z5o!#py#mAAGTJ@KqtR~JIeEi1ixa03SxOpO(%K&{@o>bEYajOy3#-4zP5mrFkGg5t zmNF|9yb>DqZTW5r+nE&|lQuY$%@>B(Ryxc*B%uUf^Gq)Lw#a^LqYR#0G9H1_4F{J- z5PIpm=WaHj0M82l4Lzve_rsXu-!-)BVbC3%gAb!EgT^j}HOIuB<@}}kS3vS%$HSJ@ zg)QEEh|;;EGjk|g@)r<56jOw7Az3}FgqUtbF?zY0cLYH`#c+3(=Mq#SYkyK4soL5R zLntXEU>3t3d-Km?f^5FPW)V!LJyus%w#Ua=6+U(n*B2D(@G9c~Wnyx5ajkH|95_4d zXp)Nc$7yhfJ4xiuL@+T=S&0M#Y^?w|9z+T~y9EHZp?kv6?WG7ZYp67l#EFe}nW+N4 zOG`Av5n~>cpo4Ca1Y+YMxG_5`LtBui{pM%hQQ^>f($8+G;z{iC0@?6~$Kb=L1K#0= zwnKf1;T`$vI?y*(76pB)kM8P%0lrW+*+;i<$u8MWuqcU*!%8iv0%RZ;_LvtmG>8(2 zR4pcWvA!~+EhxCH^GPVY>|Oh0VnG-X{ma={wukrgqM(R?7q%|VaCB5u5g?y@bZpPm z8j*faNI`XReVyU3ImBbXwokSTXuF5g<|$|pv5@D5U@7WViq9S0P>L{4qn`elydk&* zxXwHRkFC(d<%kQEd3kwD_HW{3Xk5(vVOv87NCB+F*ndVdq~%{uuWz^bH6=ByhY>kjrj+OyM#KhbyLe z_WmVFp=N3N%xwQZj{!z_zwO_lU{l|tmH#0je0M?3X+1*#r7FGf<%f&#nBwkIFYFNKR3@=WMGX$#hz1NHe)NrWohE-?hY!<5ul~z zWw;~-jYcf9f1i;}edhxd@Xydq)cCc04t&GMc$~e*^}j2slRYfFhubS)m}F-cm-`Dq5!GPOCMpnW?zSbM`}26~ zcd2pS{kcRyV&c=Ai`7Uc8}y+1dVZR(b;4Y|ot;_P2`$9sViLc;eED*}b$X>t8%@_? zziFz}jNK%9HknFdWYDdHSoSrY4Q~`S}!uSFd=t1~BI2gAhFhoDS_cs8|+}`g9)4 zWzTSit~jgUsf_(f8;iRY=o#$qKJ9pdii(<>9s34{oSdA^=gw0lPmOc_8$JG`M}bZ| zlM{{{zXgZd2O)hH(i3E~ZzPW$uj#px@0t!d2F@v_D?H_XFr< zpNcc6cY%iQUv+Zsb(vQ!Yuk@nO4A7 z{;-SFqWQ>Tj0XXMZ$7h1o*lN7QMpUxXU8=Cq?-lVc3bZyHXpS#NH5V+h~5`$kY0GIa;98 z;L7mgMGrMKwXv*|UOnyHB0Ca`&|j8I56jmA%nqFCy3v>wmS06PQ1sgJg|$KipSKs( z#&jm}Iv@kxSySh)e;i|av)hR4i6(GmsRn-qRY%KcKg`li? ztKpy=XC4>;{=JClE4aM8oFLu%K!XYoEkn+@%C;bMd0rX(umH~?Y+qLJT1aJY}!%~a4qA{nDg*9XnjiDM;(;-JTKPqqLAl*qu`QBzXFfxyOJuee%= znxFqV2JD)7@MO)rdn_vb0>>jrB-8gH^Xp!Xj;_af_~VT9Pg3qjWrIj`bj8z@MADWp zpRd>2uZI8?T|_82I2fL_Stx>(-;7T6i^~4ddOsBhM>MoF`BNJnvbVRl>LaYNTlTB* zy5@pw*_*9~gFx+5Y}sV-Du?+{%h(t`1didAHR+!3t23Ohx(7@9%Ce&KG?` zCyqPt6)C_t`d*S1s^pb8?`ie_^-JhojTDYZO{IWZK>zA@pvE({UJi`%XsPjE#vczQ zS;NEKffz(~r`vD7%VqnCCqt9?%KVfPy~<1v=B1R12Wop*UG*?!FNg!ZN>EUc&2~ZH z2dg3c-2CgOGP2N@#Kf@9P@+(NI&TPC?Fw%P2bVQE_q!1Yw4UW^4J$S7HoCd^3k{H# zO~QR~-kUK50>Y+MZ-1&A1L5F{C4U^dyBoLfahSV3nzcSy~9I0!16_ zW}O#GQriVUns0S8#iwh!+&pR001U^2`v^v|9o$!BrR5YAH}{k<4b9r0@$vD4MCUXu z3PvS=bF#WEC5uw!+v25>X_!v!`evb73_VRpqWj$gK#-H-J(E_Ksd6XNPs|Z5gP0v5 z@Fs6b`eSy~v}?ogo12=S!T8$h$ABTQNO#d_JzMp=%rtbpv4(LlfxG)Vo3Rx<#k03% zCTQTMKLUHz{lr7s&W;r{F%AKgo?rNi0?H)|Bd;Y+l3`+d6&Mfuzi=pDTU_g5WvRz} zf&;xATUnZKjPP%I1_wK($-M$V{X_^biJ?MXS3%&3Lm4!7Q^F~tdrR!s``D$^VokwP z{{Hekp4q_nkB=DCHB~Mk-_M^>ny&ZxPxfYspwy|I=jz*3mA`+t63J{E(Kj1B4npk0 zc4iDRDjpb+%NaLjB~DezOH?5O{>xN#yR}3h9cj^Ku#iU2Y{q^eF98`D8Q6MH5Ft1? zIG|1AFMmi4QlUU~TLc^=qlIrdzyX7bLC7fL?p`-Pm8;(@v@x8b|A(tcs}h~1@#HJe z-_6!6Hw%}S?En*KHB%8x!exaD?L)|KuEZW(i29sEJKl#mj|mO(gquTwz&aBt)@x+! z26b6iXL}40Z6` zk`k`RgWP|?bZV)*dqsoi34VJwo{Q_qr+bX9pGxQu{dlC-EnjupVwMNtZb8eWU`-*f z_@!!&!lQ+S1(=u!eT*1$95pvL(WAEk0YRyw?+TCGIlA^g2+l4z%fhDQ%_OE`^L~5N zv^}1f;AzwoZdkfK4d-4EF)_(p|GnNHH=3hJ4o)QPGu=8zH0^4ePN4Mk_is13_T=9e z!yUo+59-4Pi%njpj~G6Po{;i82c>vl12O{bxY6Xe3qC|5wN?6AKFtOT!_&LK2_pG|}V7!9dKY-GJ4V*Yl%Rrf#%ck4_Rk zA_d;N#g04N<_N(12Z=EtAOiMkrPb_phDsjKMJsXnms*n1>{17_I5?5+?DrGw)J1&Y z+$3&!%EMfTJO!RI>f1N96*u6De+Nfovd4a{%1#ro9HzIl!JxYqgN7Khi$G9vZ0skX zdTA(#ZvyTvC?o{l_X=Cz_aDQEm<;#NiR+;Wj||+1id_P+CBRU9alTeqSf~;S-0y)O zoEVGV*G$lH`fpJA*Lk?yPWqk&a&XVIZN4Q8C1fhweZp!0aoH~HN=amK=U?GMiV!n& z1oy6=Uz9$^eKhHfSppJ2H!6(e+s^nE*o=Gtm}q~q-Ec0BGeuxET^0xdq4&GUAi{4B zA&492_GrEWP$li>*tod3=TJvS2ZeyZT-iOacfY|xtlf-rA{PdSBbU{0U!a>p>gzW6 z1?*X40J30Lk;o`2c9Z+u7^2Mpoa1C?3P<1T^i2{;&x7w@n&1B4xi{F~j{%lptaYH6 zA&19mL2(lmOYw>q9!WUzYIh`y6JZY^2(sGD@${3BihsuL1ZT?fH?9$K9g1V^rf_LrAG z{{Hg)`(Re89r@+bd>aAw>w zvPeJGEzwjiE-zab7n|px&w|W4HNL>u8%-9zg?z!Ogh|R*A?8GY<&8=S!^bx+XJKQ* zWgWJ8;kNws2PNDHvdbBoHEFnfg$a4OfD47wYKf=ukfS&Q!59 zP$Y-6(|b20HG-6dEJd+4)*f-@uRd?D( z%FXNjhR$mL{{35!sPX{|nB|3T`k3u-u<0nDKSu!}5;Oq!1!(xMf{hP6*0MRDjEsy@ zU?0)-&HKL5Jpg$Ef`jL{(&oN3_4TWz-DKrf7?g*=Uqf)lBrtfGFob~&tjE9%cJ)Pv z@mq@B0P!;}Y8K&(B?Nj+rPHg^9T^!J5l|XfdZKyO)8F6DP~5O$XB-Hlpc+Wz#Ro27 z^{yiDmBDC&2~xw>&m`oHh6T-eZiZQoKB3`pE=^Y5HVOm1V_9YGcKwbQnz2)`@?LXb zF(Yg^s`%Xe{XF;)oZap7^Q6fBt@b$0ZpUU>%wNBM4?17)82&p6|D}Ijv(n` zTwFS}_DImzM0?x^!!_ad6ncOmG;0H3B+zp>1F#~wNU2YErn-UIf49;RjEaW#;X+Hh z%BodS_*QNC7*ss6y&IwE=;~TIozm|HJsntG_I3I{ME3>&mxj!}k&HdQkSnX%{`&$& z>w@ZOlFC$Cd71)7Hfxur)2vs+M^!&UUW>;Od~DxU#^&bcyklj6I2@3_*#lg)En%rZSp%I@hC-?Q4}?1{P-V8qkM`TiihlO zE7lk4Z!=w=B}a8a0T|f)Tk33 z@{NofKF!R`9K_bp>whtB?|Jq538ln(EIcm!g_RdWRATRr4{O)HP0HObEfYG1W{Rti zKH{a91_AimYW!etG^^X$-T`NU&2C9#4(-M7!?Uxhc(n8hi~fXB<$=4~>%Z%9`h1fH z-%(g^j`~@)er1K0XhoZRgo*9gtv~Fe`sd?GluQpl6{v`zBH`W=wP-+ge||kX*%}ph zJXj#b5j=r8ZH)kT4(^K#O;2B68(8-rc7L;#f+e4sl{GzH`F@NRJOcC(!^t)*ggjyZ zp_W1Xt8_Jb>j-_|)Btzyg|nWN6fy|JzkniN;5#jY-5+bLk~hA#zb{mG2f2+$1g_QT>Q|- zl3$JQyG}w@R@Uvx=B5kP^XEB&(C$nn#)Fd$e5Wul3K?(9%>cpzI=_gRnb8g<@qcdr zjAIP)K1z93aYI)d3AQj25_AZJpJKsN2|`|c0N-Ppb?JMHEVeseU;W!_&VZGInp)h% z#DoI4vk%9rvvZYG)EE@2epmdDN%p{c<7~n3u=w}oB`RPoPa@P;!>ZH*B&b9U43@@0 zT*Vi4X94=E_&~%eze=T+dB5LWG&|~Nrq8+Kef2C^sh(UBOK&bu=pi=d?3)#j+$86J z-8j4WDKvBUpb_leNt=2_tE=beS)P*K52?X7Zz{_9B&DV6vvP74$KSma<+O8?<|qFO zcLEdBaS_u7`w?u6|A9YYL3#)!P{bhZ&nk+bf`S5I+wP}9sKYtoG?=fh4rPk$NX2iB z(#C5^nNz)F#j#;WIC5f^(QsWFn1F5^Xw?!Mbc!p6guq1Li^1EEHjgn?yiXLx+Rj_v z$?|V~@llMayHi3qu|`dCSBMPz=R#JY#kK^52mv@zaNOe5FiT~+jD%%pD`^AO_jv%U zI&qZvpCg0+-$=PsmNGpX+JK1BQ;&Kl3s_-PF|zVPLPGVR+mCb(SY9zcUGwe9kc_g# zk^u_vW;J@x+xYMyIv5@vI|zz>zQo0C>IdG!N2q%~ZV`j@F(|_n-r@W+A8ZZC{{W5j zlBgeWTcRb_uu^eAQ>WJ4j!ld_we97N4MMsonTFsVajGaDJc3>T1qZ9-Ir>;wY)^sg z0y4^WzUqS)YkZ@p38vqP*LU5}(2xlexg7v3#8?y^QG9_g_l(ip$(_?b0KDnV)qy0C zmbiQ~#DdBrD*j*O&>;vWhD6bnJqxZDRvPkJK|u&*sq%*n%EOInzWFlli109P4p=l^eSlGYl-`p3c=54;7YacOlGp;iYQctzn-s>^(t zDs%u)00CvH8a;^fw2_!h3!RTnP67b*4B{_2T2*=Of1j7_^M8(B*u-~He`LdsAY3)a zW`!Jo^@2dztTqsacY=Kg6z-KR1VMb?ZX78n1p@a^2?+_NKH#jtCKn0=$Nw8}#KgD@ z;ig$m6%h-#vQ}D6|K^>;UMy-D(#W z=m{eS4s!_T8h+<!ATAF{>|dZK(kKsahB&N84^$+$e=3a3~V& z1OPyTt&ud>!&a0(0D&U>j6+_P*W7TXt(vFi9A`Q}b|!ESXvPW;hw_5gxo(0;fEs=0 zYnDa{1Z2z?&Jp0S0f}sQc=(YbU4C?sGAlFf4`^=o2~0lrRvlf4d3JQR7l@#NmWb$KV1f1}K>v6yM^`vq3VM=7{ z5XH?s)tGwnn0;DH((Z7jhQr)3V!StB5kN_fe53*b0$|Y?PakY-d;;Q$I(wu=IKKorIVeJdi9J z%~hsGL`H^(=H}Jx zoMUT0ayK_O9*;9daP6g?olpP+w9U@eyOVbah6U+Bh48Ek7UwdMYVejJWe1YEe))Mt z5N#WiE$!vI>sNE(cQo8}F+S?NG;JbyX`jcxy)Meuf$jIbwUrn_kU?5*U^O!KMbw_^ zM6VZ8Z1Bd|Z(=4!Trxy`i3~&cYmj}SLxe^QmkD2kW`KhFWTj2%%5j8BFTSz{UzAVn zy9EE2Tt$jSdP_@P+Aq&UdSPAdVnK_-w}+MGAQcUcSX8`~q8rACc(#JZol_dfALaPMRil{v@(ATbnCiEKj$Qn)oN*& ztkqCb_M*_L4o3EQ-~8=n^S*I?ExzEkN&4D1{ljXPX2m<)M`2`uq|=$JoWV%0m%wTH z34}UYLlZ!&SkR-Y#;$cvT1El@@|_&R0>*UFAOa`Sa}_1Xgx{X4<#j17i73glk zc>0AQt`8d%xoeb3CF1WLO;APhDH6Rp=}NA{(Vvs7$L$1D>G&m^9ZL?*VhPI zJaUBbdXib^VTv~7XjZvv$Az6Zi#p(Gnc@74RFtCgiW7*n6yv4VQ=h6yA0j|v6}JEt15=Y zdC(Wb@E{Tf_CDlr*fx_9DP(c{^a?nzOszOA0#8f;PV{cN>>0p(AqW*4TWYFEx76nz z==W1c3K*$&gCN2N%^TWqf~gnlF=`wU^@#7Z{nS2i{XMgYRF47Of+`uk!F3>FtbWEaH_-yv=~#u8UT zx{P4EeJ$v2j)>`w_X#|u1ud(bgcqC~U4{&zZx$rQ>;AK8jHE(*b)d1#{ZcPt(v;}K zrnk>IidZ^aA!$j3`(uALCk^u1Vf^AnziTVBCcloq_tfh2il_tdhdqTfnAfR7HiS&9 z>wEWt3^HX;Dc+)Oay*B@0}|796Z>(rdF)U^U0U{RJF)TlhZmiQ4+eIh=^j>#fB1a= z>yk7a{0JL=z4W){`~B?(8+p4ZQ~}N{yx7Ll&&bYA%0^&%1m>}}W|s+L8_u{JPdeUz zttTm{%`!a(j4xj}gr$Q6+v#fWTla*aaxUu`O>b_{Ij_=EBiPA$v8i#(4e|SwFqncY z(`I0vKmZq##1hZ~av`#X{-rYm!1nC#@5kGbxP|&WD$8Do~YvNCM92Bz$5M@2qeBWq^P4PEo35ADJ zq;vPz!W)D0L=(if2cB*lU(Ex)c*6PmlfRK~NkDCG5^(5U`eB0(;MdRQ|74;DY=m0u zA=01cNW;lkaU~`8{G2C5EFoc%p-XsA-emblN|IgF}tyE-s1a zkjT`w_D5}s6vj@$rKYf5c#3Ch`<(!NjZ_%B^9Se1&26>(6Fw93b4{R=t}*q?@X?pL z?}tMd)Z=OI>*hCMa5zr&AA4Y&jrI8jBip+9C4uW6_qXSvf^ne9U@Vh1t@Hle`{~V% z4YM)Pgm2#hZf%Pct$wrOi7f$7 zbvEU3L0-jUDz8mfJ^pchiiV&{1C;sYb=8_#t-EB@Xi;M&}(izU;`L?5gZ3lV$Uw-B=AEy|uhic*lYcuy8t&qRUUYbV@pmFf^uZg1bocZ&`VYGd5W ziv?(KEuDq!Mq`yM{fvw3xhTk-PhZO;@U<(FVK%-B4QrsG$tyM({^_)OeJ@w<(h9I>Vo>ucIP-E z(Rcp1u*a$!i)ra0LS&Z7qOIu*UW2&PSog%bW#)*ZY_C&dOcsl5JmNk%t!=DVw7e zP$7avZ;ZXb70ddo2;z^v!T3zG?;X%r3GrN9B<_wd8jy*|T{kAv5N-f~6CX-MeR(>? zbd4smlb9Iqke)%*pmiG4c>@X=+_Z*Q?W28+!mCsJw6kQgf>OZv%C-UDsb4~{?HU>zqRZO1)Kp+H& z(uRbD(5oj0f!tvDX0k^FG7ec-O$|>}VxrEoJ?E-q>u9#Ss1PJ!bXSipw#`fNlkIzV z^uW5A$-+C^sJ+Ml*tXvyTmxpR!QYK2iI=LVQJSNn0*7XYzpok_(zBf|k&?v78Jz{% z>K{X?EK;krlgD=K)E3-$d!_4-E-7#8QGO$uaLZF6!lz^m5m`12<#%9%9Hzt`M9p;y zQ1=aXMsw+2mvvkxsjY-)@E2x&PVXk-C)|DtdF1#x94srK%V9B)1OS2+=yRUQiQXgg3(7U>h*`^Df)S$X=?zqhx& zC~Hs1f~T;bYi$c(&CB*FG-%DxAwoWb?nv?|Se-%ZmVpHc9`8*V*2e2>>HeIIvKQ}A zMQ7~c4;!=;BDJ-%v_$n|1=ok)Ikc6EL&tFT4ENviHH2Tn5IkJy%Ll?|^IiZJ?^G__ z>7Rw7igZLs3?eF?Yq@GZ(}I6q`4P6p;>6j2u$1+~1_K04YRM$JV1iqd3mF&Xd z*%gvz2U^x7=IQ#~+Sn7LKTXl=DhsFKJVF20PLN*oTlBdn1wRLBS??p9oSt?9)b{;S z%STAbs_OHpTts>Z83S>zo}+|^>9)bHO^N%dMJec=Nf}_hXbD`n11H9ZYlY@vJ5890 z!|0y^qgI@sqg;}2eYJ@g&(bpK^iapamx9QTXY8u(owm7ayZ*IhUznv5W~z`yw-qr1FM1m(@0 zHD&hyoZIyc)xK*-y9U-c?x1;Kz`jH-1l&Ya0o#)STkCRaSj z*G!)3?^R~hcwMc7`5sRnFc6d44$?ny#-l+=Yy6n-l*hTQiPvS8yaA0&&J(OuJ54iE)(z23$4Nop?~n>S z(K0Rs=1|EeVf{<DcI3_3v6^0w)j2EXSZDEm*5c#z_ z*aZ;;sF2nBb^=QEDnYgw0i?nxfS%20{u_pu?|%h=P&dN;bo*^zB>-!alaoz{zU5<) z{Yegj$bYtCGYPY?mIHc}CRJV&P0 zS-(Cfrem?~bX-h|AB%!wchhV$<#6gJH7arAW@lF#Gb*w$`sDn)+?bq&j=YNbFRukh z_;Q~oTd-jui6Z+{!!RS_eJeLNmu1h;Fz@FD`h4_;<=>J09#rY(NFYJ06nesEY^cQF zRg6Vjb^F_15g&H3Jf~CGT&DJ-;yvnVSQ`h^$~&cTAOnQ)imkDqEnX~ z!Z0|jl%gI$SR4^Pdf#7(MN3L+W6ki(-WGz=J+%!d{Bwf$GvA^+7A(F__xI`L6#j=P`V^z?Jx3!5&=wA7&~js(a{ z2MjcRE#~})61?@n(4J=Z4=B6U>Bw`?K!O_17yr`4B?z0pupj^4eBuEIX<7GLR=~B? zVbyo+tzp*mn&y&|1lf>ktH=l*kI6ARbk->QZ)KPYhm4=>()%zv<9@NEu|a?ei~l^N zDPFn$i_!Htp`jweRP=Z=#NbZP_MY9XJ@AEc>b*&SGe4jW+*)TkF3 zO2nddc71h~4i@mU$x+~lMh-ggP*6ai z45XA-n1cf!#J{aX`ks`4?xtp?9u%nCC{cTyRmThE-lJN8G0cxr5Lbvw4Mt!aX63W=m z^Iz`}Pu3xjIJ-geC;}mH9Gjs;E{TMq;R$aea`gE=`xo48_B<1KwtvKo%{?9rxVrWZ zl|6$KZC5x<0VTWKB=T9wDamOfVn*yky0RT-&5_2fzsNiC$~73fP1!Xt$>+)^5j`Q_ z{4FPd;SaU^n^ccsAV;mtNqlWU;c0BV43tKPlLeP&QbqGjeyr#5!vIG|^0F@yfi|_rv4Pdk(n6^6LE% zyQp5uD8hyNqcV=a#{syGAFfk+RA+>SP05nC*lM>_*t1>>d9<0;PaKX;5RRXtiE1J{yds7ep&;X!&9@n0%( zsXeZN2Fs_0_o^>7tA{pTTY<@y@i`DQ6l6evz6sxlUA>O;+b{gN#BV{MVm^cj)ksOU zHd<=Deml_>&T953qQx;hs3fodd$LWm`JCPJ&ZsQUC=pCFN(80tzEl@~KvL24J|Nhe zt3&WQLK6ueup{QSd77t25BMGcd1)ISuF`+7xUtSj0&aMKAJ>k613Z0!bg$m8&m6bM z=`wS2GC--?yUD`%!OH^mpJjgt7OHK@k+Gk?i@(GrB>V&tbz^y|IbQ&&2OK-8ucB#V zkHk<5b!t_J!>ekK9v4{K%+-8kX}S=5Aj&}wwC&*Czd#{-xqDyx>2ug+j-~h*;{&DaDRSZ?SstXMnW5Z$!h%_IfO^{qQ-WMN0 zxE;NTdM+Us>1{fWxOIF~;(Vj@Yjd57n*kw@=ne_`5{gmRd`QbDbSw5oAV5XZaUbqr z#4c9_7_G7*eNh`{T7eq`1`W#TbKX;%*tnd|+SkEbBQrPg5>%8gtzejv5p|!m&CKwe z?(cosoX=POrD5lP>qfvyUEUaUJpS7)IYb`l#ov|q^aZySYfc?JMQFq)>8YX~e#ahx z>-K!2f-NiD;2i6GWMhSh!K%ETs*Zv)(7F{}RAESHe{;|E?xxRTJXbld8$eD0AbT>i zdkwJ906@TV+BQ+Bq>Aew&3gS;j#v!!f!5Z>XQx);v)mSFv@sAro*%>O;SZ?sbxu3# zh1mYBzQe-zI)KKV*%ldE`r{BVlF|Srduw4{p!b1%Yuk8A2vEVnY>gj5FhENOjfwGg zcp`%NAtG#Glif&pc$?93Jp8~!vkaB-FOT4KVHs9zGQ5w;4NsD+;`^3hm! zcJGI`swzK{RTMX?iB8U^P+AsKajm_Y&MeFiqd9#ex3KW4!Q-A~T%g2`^^=pqhR%kl zj&dU7AIBW`!}&m?)7+1lZ>GJAKEiq$+;QVISXO$f`}4eKhk|r#6)vPDVl*RrQ@cBV zJ_*^2^KchWiNkQxV)qo=jBZ z_S+aR@J%_M$mEPIuk}V>0J398*6U~I;`wUy51a%ez@~dhu1QMGFylt2q(lPl*eYP3 z5dfUHU}UvafwDvMO^J8Y`uZau4p3~B7Zemk;p5}5X)PmzDiuj44seiul)bQI~<%aZomvd3G^C`Fe`991x{6XioOtNoOMsHq*?WK>5G z%&f8>)xezhbPs_wGm-t-ubopn7lt|Km>xsc_{9_fT`w!XbL*M6U2C6|2eV_`cds1| zs42VeoVd{mD)M|mlKfhEbQL*zby%21Ls-tDKIjM15C1=L<&lf=@hZfLZWNw8e2C{c z@gC$(`_V-~hgC^`J#U1Kx<7OLS((IwWq&oVrb*)Svz0!}h;vTCFS4&T>V8G_QQ!Xs zkoG+i-hgdNMOF|la7`Uf!chytxYwkxz;GQy@3tM)Z2Z+JF{W=`&1(` zU%OztqmZp-oFu~276p9efS6p;4T(fJd#$&wC|DH0H3qbh3 zEV3SQoSAe3)E+F*3+`aAcki|+;^ih`kRvT8)GgJZ)vw-LVC`rMfTERE(kFxO+2c#R zuAQwGn{-`0fKVw7BEX&jMPEiip{hW9(ty8;|96OM`i__d_`G~+{x8w^A(5(T$l_E+8$Vf-U z#v=c$x|ueZD%NMI#+rBrYL+n>-^%h*Q4f}5e3M;YL=RjMu963q}vIqub4wu_UXPfqGO<-?zZ%4Ugek2D8cpk{myA#=5$7u>Exu}UE z|3)S4?Pc%9$_b{`YaOf>f%;sk_a$Y=s@7HFf*G<*JAbw<@xS$O%^6TjsA6+(X= zG`{-W%q1+y`S|_s>s}p_qtQMKH>M|8?k2kRR@1b>h)vjt`cD--on26|nAyc;m3NP= z!zuIQ$MYUCM*kIk=%`R+q%T@v($V$YpXYO=YaKH9k63jw1K-?`EQp6bcFQrFcP=Yh{9JS~Wn(x3$3k{_G!lkN09@G}c-d zP5Q-6dX4AF9tX9L<=vakJ)1M66Q-uK(^vRN^CycWd&U$KhVXGeDx`RsO>}YH0xgBH zpZzW}tEEZn!LuSUG^PCbgevK$+C7(Ci5HhY+}4AYI~hw^d`2}CL+bajUTCLGN7onL z6nWbp^W!g8M;x+{@uRLh6lupFHk{(?a(_hQhP8{OdsxR&fM~JezM_sX>tNwbd?U&A z5!aDo7rBA1zudZR`fVMC-*zhV6nBx20l&8BTP>^Ej*6yC%B^-p_#iL25A=-+82;)Q zdBuO~RYfFTA`iufestKdhjM#*+v=ok%#rB22d?AH^&GePB=P8w?=8s`ul5~|5j0)1 z*Hzso_{-f$#|Z=HR;3nwui_b^iM%_yhxJWdgrzyY@+hrb>Qylp#`zN2Lsa*)!20j%*F7UFIsIHXI1C24{|9rz<2;>`Vv?*+cLUo5^BybT}ClkR7$-L-u7jVWitMSv@z0zN7tL#dDsa|>cMbw<<{NA(NN8( zQ4F5%ZK5!lO3oXmYMmxFZ!#(A`He}o^L6Wvnd1XP-EE&k^9>iCH)X}j=%9+B;Ur_? zDC1Vh!04lsXR9J!*!4AI841>6Ok>|3|A@Z{>CaeklPLAg5t8wqf<}W0DO%t8o=;RS zpW+3kxYcgypy#6(HlsXBmY1rOBn@lXVutA{?7WRl4jGnmHqGHK_8%SEjY{3pJV~?< zo#5>EPrAQh7Vv7bsIC0075dP9@ zB(W|4d3>oIDAjqEi@2|k0+a1F1L$ieDFFg!oj(e$>#(3YU4`2H4T7$E?8MzOl|N+W z#f^eXPk+Y}v>*KVwsFSzWl!2Dm3u^x9W0AK!{SMonTEV!Z0B8V4j}|QNy{p%7aCBc zHlr{?%US!b0u)>o1}WOTF&=M zPrj94z0^TN;F!``Nz|UuFI#(#)|Pr04EaKNPHbn&Q5?!S#ggh1Z%y8$z(H0uhioY` z>!O4!#`Jyj+>S4W$eJUq2XB6CPGwV1HWS(GUxo2LdIaed@_bC1wzL|064tsrg#dX< zc&pF0dGQ=Wxu~nflOP(>w>gRJ{qaHfaRnC{P(GxxjV8> zWzCR)iO0NH6tN)fphTaPDw}JgRCr8zu{kxlPyDsCM25f))tS#7b9rI-q~+C~dUq}p zUB__bkYQ^n+7|B~mjsUdT1ZI*>${gdyjM8b-lycp{>)!5Q?D}5hc_8KX-uq>s_+F-GWQHTpqh#gIg zA2Cf@>?I;$cQ3<>&XoGEGirTwQNES$U~w?9IZ-&+!(!vHWCA5dryWsIsBUL(p)&{k zEes6hlV7jrM$h`leIzbcIwu);r9p;B9fAJTts~sY>BSFWa@@u5eXgugsJQ*HoP5kv zf0SPOG`+d|kR$?S>D(o^7g*(R?FV;bwcEo;wyub^-uxu6tahK<1Bc(1)s?9le;jwbAYtNm&;2%5lr^7bx=dG!; zJE{U~tYP8Ffu(T>aA&MtiTSI`FD_bnrJqX*EY#Q}&F`^bUdF<;;F#azyfr7ZgK|e> zSAY80tiG1AHa+c}u1CR*>OHbTB4z2tIheGl0DFo;H zmxX2JkB_bK>7U|0_Fspyp*Yifs&-cJQi8mT`v|(pPPiydt~hpwf+1*#-|vQq=2!}& z8wXk6asDn{d-R!QYpA{3VCz+IumRz~6&j0UbU5%p>E^Sp^-ReW*A?Ok zwcF7o`z6SX?lR9;I_kvW>BV{;k%tN0Rl8#d|Dk}s@>E2&8=J2atn83iA6C7*_J?~e ztal=pUwti#N*OV-=M?~^{evu8349B0ztdHlmMJ)7ULxpdZ_Gis2g*t~1Qi#gS6=&!3NXNDU zE}CsWf5_6Bb2R3!;G>K!e7bvd7XbUE?s@u}+?$!9XZ=>gc4sIu=Tlt;%jO(_$r2`5 zrtaH_6EF>YJFCi}JG(z7gK7!7oaeQRv^(m_ZWx?e9;UBIzKyT1oQJL3WK~!w{B_XY z?89E}O=`bf_WOxFOI!;#%W~`6?Si?E)Q9CacU?`oSV?hkeXJZeEkZy;AzmKQ(Wh@wxm05@%Jm+>k~=WNR#aRo9RhMj5Yi(%bSBf*FBF5ZN34&M0qvHmXpKq?>U0S3oh=$_YHQ1m``zo*TkN(|ms@%tt{?e^_~3bjo`3%)5&l?0 z-mCh?-Lip|D!2;np+%?3_0owe%cgMbmM{{{rp9AcXn)Jv;j}3)JZs7%@)g7suAH>K zg(z=^N)pDkQtJ_G^DaQaV^rQ`!^2mDt^A6na2m-^R5IJ8Ff>~VFfvJKcb zYNV3p6NM7D5)3$42P8HI3T1K<)iuYfHgCHr32t*Fk66ZFD+6f6ve}+rS8u!Dk`_v} zLCcSk<2}s%S18qN`eO}!K2R_&hW+I05zq4Lg4rVHAOCydJu%A$mIHt_XK|o)@X5c6 zG*sN6V>Nrts7Y{C6>h?#QFX79E+OE0ncjp8!QY^Ufh7%evu5A5;ZF*b4SkSMH{cpm z(|m`I6}bdB_|SuWy`Hs&>2E&WudIA)`rGM7L4=kj^>-^coz27bYj_n*E=$vA_sjhEUk%`NIM9Fs7q)9`Fc`OGaCDlmnRXh zuh1dp!v@TIUzLvDBE96UFpNM&J`&F_XUzZ8&-hwgJ_-d|*e$7)mAT+9qfRE%U#zT| zf9xqFV7hK0o6)i~mrfZR%a{#$8a^T^>$oN!sB+tU^C=8Q%*dmk8D8KlEWyA$f7I8z z^RUUN&E-LX0uE3wwDD!`Pm+)8!VKYlo_v1I$RdxW|KO_ch<5{f2M8K3oQ6je*9(1tC2;P zEG47P@2wk-#WUYgPgo4vju;`gG&B3cW(Txu>2l6iOXcK#*eQR2O5C~El4B(#MER=I zdEEt72xHu4#@&&tuA0x8$)wGF{Aa4*{aGOwNjmsAprEAmG}X1g>h4B?9>R3ixui{^ z1nQlgGxZ^(k)He7+w0h*m2v95f~X8D{^>uXrNb!&f$~H~Z=6BF=;#Z^2u-C`qET(uIyygq@kWXlB&mhqf!Msqb zv{RvUfjqh>KiWHS<;!r7>V90`aW#-v}-BLVaXRvffREsY`M}>azOOcotcq zDEeZ(?6p?8@RF+w*mu5R2vm65cbf0^UoXDy_NM>PL+HqjgjnxPYA$0lPyLv-0}pH3 zw;qz@>nrG2Q+Jh~$Rnw%ne*9b>X?3yk9@)&G2`z3ek3E10)mC(yv{)o>?z~pQ!1VN z4{Bq&jqnt0(&f8M8^Je-c z`#?&q1-7w+AJJ{0i7-CKohM{2N2sBzjZy?+t7o=G!o$Av%#Z^lN3vPveRVG-WWIA3 zyOUt*lCGf2%}7$42^HTv1Eg^t>nh)N8U~0(VG$5K6vIK(KwxOo8Fs0ZJl~FM-z$9_zGm)RjE#cx#8tpr>u-n$DQLvog*B2#JN4eS7Sdp0RcfMXrEMo<_472yjs3^Vr3wi{mG>y z|AXK2IH_RJNizmw{DH;Y?4Lhz0Q0jBF0o2uX zPOB{Lds+Y+t2M&Z%}}E694}Oz0lIF|nmDN!gglOvfNk#w_1)hw6he#P0=7N?Ze;Pf zu*D}QKPZ1XqQt}!weu%*90&a6Y_g=F^>jN-HSoug|-v;#57$G7fumX14 zk*xF1{Y)i_nSu({1Yu%z+j*&9mFU+bqe-p)E>_Eb`0%0b@!>W(Gc!|l|E=p5^!A`J z#_x8&cK`i_90)poBA$W4hiLHxm(SzLi8H|bpMeTbHz2ZEErv+NBqeKw6`%ccfUSts z;M4yZFjca^0*O(hq^+O1H4t$oAx%lsgUb6-C{C(s9BpBsN~HwcQ-N5B`!1o+ClK@fUP6eV#7tROu9 zh7dd{n6}QnG0#8$^TM%-;_Sjt2XTcc@|gk*%mFF2W;Pbt={fkMeM02&{J9v5+tN*9 zYs$cw1B|PP9xbOF-D{Mij zRY5!!*w%%2c8WD_{sz7x0F4{$A>y(n^uE~Z+q2tUXygXO?=Q%hTnGSSCYqSIxbOkP zYX$+am*qfMby@@59*jUu)_phtfO{?Ah+DjY11=(;A|hOhN=vu4ERpM!LjR`)aNV6m z2OchO_Ln}7TXVMDoyhJjwJxppZ~?(Gkl=idk3R-$9Kcz|S2yb>S-ZbO3=kdJp;(Ym z$m_MVOq*?&7>Z%BBEi4*^2gZH2omjCf!2!WeW`amXu5|R9KWN!# zt^&2xyjQeP3Eq6cE$r|Wa4NBh%GT3r^u4CpZ-n4et))o(d#zfxhh{=UjT%CqDD}mQZ6+J1;wo1&JVLR~PifQ~@OVZe-^2@k*w3)m zfNs?jUJSbB-l>XVc+Z~)Z48-~kLO5YeiEb3KiIa^;S5=K$r|P}ocBtG}RZ@!WI4xFVKx``%Rsg;d^C`bZfW<;$O3Kb+6%D2;LxLw5 z$e^Y@`E9e_^O)KIVEIiCH@g6lup4pFmn8(bwC*s3rWFnB&{QImT9=`K%QIfd7Sf9^ z^jfC{^lA(8JTYN+@ZuQ)FfIr8)A&{}a(ct#Xj1EFsUf6G_nZ+He3gg4V9y|q%shE8 zQV`0dk*x?>{0&jmk9v?fbi|VTR{A|R^VaLrrAyWD7nf|v=7FaV!b%0PBZMuCVq{f! zg;Rn|h*~%%ALThew@oZD)fw*Z`(pzZZHwmX(}*5S{H65;=wsVlJtVkx;3zU)vJzwG zYTQZ`PE6S#1g6c*-W698Ns067mlg?tJm z?J^syU(f0&J0{44a4-2*ikpkis46ReKtRP`29u0Ef!jM+T%EHBW>GaQ^t&~kJZ@yA z+%G5NvhSn@F@hBi7xw-nfq@<5c9fHW+s4;D%`$XtrI^Ni9C9Qk9eJXeN%cE1y}N@s zV5oLU_){d@ef!7~q>0~&>{f3jG{7PKH|GWMFmnjlD`U2?5wF>-YIuLRKO^a@Rcc2aiJg|6e}4b2pyJbC?5U`@{}FPg z73m~Lm=>zromV+TX0yiy18u@V@CPPV9;9I(+ovy(kbo&yh3D~#2CDyfBN%BYmSZ#hGaFuAX654Pe4nu^s>3&g!@~uv_u6n7LPN^&|U>beyVnb4b%X$de zfLqq>o_0JiZ_gQF_V8`XcetLCTMSpGz?h5O>9ueq z=@l92Aal1^$|_rIm2`{;A-C$a#<3!ZPaVyN9w^K?Y_o3%FMjJ%#RS% zzB|)hJiw$1=E${sK#~L#Z7kO|sYyD~(c4+0BhlqmIAbZ~uhahF`#iZnMQyFDPJRjc z&HBGX;)cJqDc_3g*qh;{BSR1xpcb_`UfX}Qm)`SWZ2ZoxbX;@_1djTijYxuC_0jKZ zuy97BlW=*i&kq6FqCG_p)3Bq}vx7-@>@YDbl(}y7MZg$#ZI6*B6aKLUIPuk1PK*%; zakI0(WH4;>ZC<*CY$ku($ICZA3GP@<&qr1-j<>JwLYi%*Vm@o^2|QTe^3|Y(j7_aAb5VLn0f4Oh)nhU6$jiu+bxCFHkmBJbg1-r zgPYun7}Z};QC2?M%F!bv{>|sGfWk7y^C|lqtakiMm?Vb@lM-WJF&u)>f=qvFp6&{h z-pr|^fKnEEw$K$er2DUrlBo0j@#rFk0gh%5gxbF9{Y3BO`1%H;K>ZNVBV}h<8zG#qT zH6aK$b)6_f4qb+#A}f+$d`&9$#UZ+Syw7xd;a3}OY|oG5QSw~9&~m69-VMiM$D+sw zTvj7;GH{4XmGOs(UbmWPUJw_Y%bY%N)A5H%>mStm>=E1X{@yu>Q%(p>Px2Sb%_D>s zUMNNeC^oU(A-Qnx?LS&BVD3b42fx^ zWQ5Z&wiprJdSr13;LRIBr8eMNkC5TTx+(n!(D{vjsk!b5v^5P6$1L^zW@F}Pzz>UI z?i6(H6&1neHm5%1UB{Qg%Sb)0yI?Q*6D zdyV~AoGmF%&uwR%K4nS|!a}6XaQIJ`OWn)Vi^sCR72)G0aPs&G##`w9%s^h?e1lUf zM`pLky}jnuvf0)r(c^UyH}`ezL|%gPH=l3)`}o2bQrV{|=dFFmqbdkiIC}4lRc!07Y*96@_6xw+PPddEd6u6Gdc$NE0Ll*Ti zaPZ`9+UX6Q8!Z$8vV&S0*_ej7>*%7$CPUWnJz)62-$C#4xri?{v0W0f8FG?`L|qd* z4vqOrdyA~&T;4|?a`3Z1OqPy0_qGdjw@gi$u0j}V$-m*i3?_fzQD=k-N33EBObq!s zk6gF}4zL^dMb}5Z;$O0WQw&sL{!rW`zjA;H^buCsf_ZpbwOvf(GEtq zSIpDy%9@MITO-G={iniL>_@_GiDC1yJAv)ozSeT)=aNT8j{HXByGpU6Sjb=mP7C;J zOQfj34O(nqxqL7?G?}_BW6v4%Zf?N9OBz*ndPSy<#ogRyeayYd+%>MYsRyUIfIx|mjK(&rOc*5z87b01DLJrBSB>@J9XZrh!Y`R z5V>|-FQf8i^ZVFPAFQwhqd*TPZuqNPYQE9qQ#1&UQ%9_pRBXWW{Z+?~X{wT@Z^S}& zvxCEV`p!FikgR}1PtYJ9tvrdv4iT>|nvr=t8K`$L zXX9!;P3BH0?CW$MvVJ?ozbX97btrf&q8DJyz_d(qF|n;w?_TP~yHZ?M5=b!{iKgZ- z4e^r}y}?;>TE)6?*e#((X*O7PU}@Uf$gSdi9=h?(C(>s-`~BMqqnqB>!>+wS;MxpQ zt+T&x4`Erb3)uU*`hnbml@QHtg>XNt@g3Yy{S+J~0Plf9@uTLgl47pP-z38(L(E#y zEaKXz#x0Ft6>6@PxMT|*+TVSIB=APTT}7^t)ExqzO+HBG%-%&g<0dhiXK#mW&we?I zzoVn6S}tXw5#uOB^f!eiEU`#hDdo3$+wBaUnD--qL0l6aJS3A1vR9rId z`FxGuj@gX`8U+pVP1xz7F(3FluT#!{LMeM;1KVuP_0={vje1rzbp*lZZQ8T;b+iX$2frGG> z7al16W=(NFx-j$fQk)(%heeTY_|{a8blj%gwjL^lYZk|&9ZaFKzohfNy51bi^t?u` z9bLr{k&^vJ^iLhsYSgva#lU*OR%hJ-t>J>^zM1vIz(!s!ENiTkIpD*7yoKF zCFIv;CQ>aSG~r?gLA%v|V|`ZW0h>+LKnL%YCK&T}L^SFJu6l#;Bw?h@KkuS-zsE z=k=SlWx7nU<8R{2_=V*nZVe;CSFd6@oiVM$5n!9rv6 z0y<;s-3cnVY+c#6*E$w6zDh}9oQkZUEl^{q-GPEz&)cYt_wJ7(7G=!VAJJ@}e_iX0I zL&UK4IMt{kE8E~t@@UZ2@|I|Cp_LRf{qyUUo3D*dhKC_X@p{+MXWW?ckwIRmlz7)! z9=%ea-DeYg+YQSy_%eBR9p<&7|1&Tsj;`FtmIh+z_Czx=at3-loetp*a+qrQ4*o=| zvgG!|ZJ0&93lR_9I09P+IF{V}6l@_(MRdJxLU#0n;r+_5`~CMJn-g5$p(oha)FLCE ziCYO$A%b<)Hlor&4DzosW&}P@Su#SPNmF>`Z+%h@vbVP85XPR9XXtKO?u4O&?z4S| z1+U4~REizH|C!h+L(a&jG#Vtw<^J5)eurG4J;tyw2E4jMFv9uDt6RUBkEe8pQ)BcU zck1#R=6hxHW$Ffmuu@VO)<|!WkP@4Fe#T$GLC|#2xdgbA-1a6ikv!}dT~=eUb2@Rh znGmDSBa{6?6^xg%RrRRxR)Y{?lFI~Yv*0Ow>wolZ?xiaRtRaZ6A05Yib1^0Cjv{UI zc8fp&c{^y8=8f>aW8<1D8NL4O31w5rw`nkDWRxZ>gA*<-e;Yt*D~HgkSSO5$E9K)CeKl#q}}O}&2*kusLaq-c#2I zu<`k*H-#V^sEXteIAR1fL&uC$``8Q9Q8J4R59>-UNbFI16}5EVfuH|y5RuDv)_QMH z?B-8Kk}rJvB3lX`)Z7~so3Jk*n?f(Yjvld1jjNd~SsZ#EGUcA9)Im)+31;)3t6HUSG=OcuYSXy3yl zd2@AT3WL%LG1d3M|IJ>X7dfU!UpQ?JAp^x~_ji>o7w0-I_UF|BcQ85Wjbn@fS1=E? z3+4tGUj<02-@1QQHP%KHM#IA^m}#16dRj z9Hsl~edo&J^Jl7A+h`E^=XN8_K9@tI{p^;A-CpjLHJY{vqd%K7dnh0mhf9b1Z>HUj zmfv-Da=c00VFJc4%V~{zslZ1TOI=-^{6Kxq{dh$jl#Mq}DCdDkMibwCPH77_cw`LF zKKiWBgLbOeM}}1Ut?zZw2)#pG@(uLN%oH7IK0$7Xl!)cQF8*Bw)F!XVp=RXiCTXX7 zNQ2z%d_4~&krn3(XGjpo3y~AD#D1X+U0e0#JLiCb)+x*Wf* z_AOjqGR?h6j~1DU>;|{{oc+*M`0yu(y2=14$=$G`kl%8?uD0Yz;5r0p9?QoeemK+Y zsKeDCbS<*kP)SMmoS818!?g?x_~RdBC~-x|=V6N2R2dY(R?1MGxb0@(YtUEh9IrK~ z@e#UxT>y>!__+d^X8wv;odV-xetXd=W}NL@ zlS#|V1DB&fy*Cc$E=adNH5#$4P57@~y*dxtxYT=aniPfXY1q{qeH=V-(6nqMf?}g< zlfE=~aFS7ip8KKEg}bK&V4jBsN>N(j3a_W-C?#)~*LnJ3wVgFW#v1rds|8BGU7vsc zwVqCe&DBKbVl$dGsy=6zs_jNhEK2rWL^YN{Bo0FLydKxHP}4xusG6VBmj8~H3Wy$o zP-=CQc!v@%#b60V87f(6efE{(dCwFFye~r~dqu!ZW7|&;Z9jq73{{79(E~r+aE#~( z1D71^!wVF1NS69!o285>N}(YnueCDrGR3=?u5sbT;}Np!-o#Rxx2&#iP*Ia@u=(`}Vg?;jK2toL=`g^q&@ z^&MGo<6maG?@mf=m)S<-q1qx&Msii7+9uh}8QSrubwT`F>}b}<>s>aR3{2YN&dyvd zIf%!He_5f{I4ljVuC8jkAf36mxXhUvUnb_MF;v)0y%7ZPp7}8BOrr<$rTHK(7zMzi zxh(xr1{h4JsHy_Xy*3S@+Fw1D0gZtRjE~rzgd{_}LcSqfsCA~9;sIz2;ownV!?^04R>3O7#A`z5&+deAP4RcJ{#FiEI( z)gOkdQ-h1MI}=)S{_eGteXxqA6;J`Q(7*VgF*T_N_A0T4srEm}a9-~QuXCpv0UfGH zZm~oXv?UhVZ(!eztI}Ye)A(VI|8bmE!*f;vn&5()E-x`MW9oiXoLgr%W4(C)kq9Fu z_eYUsm4d2j2-v6guC-_L8{5X`F7V4>TMN9)%ByQ5h43DAsgU0PWh`#(^0w=UVwTi+ z-LY*rrDcbCFpBr6b8k@`AYJgIB7=ARaMPxi%%rX0?>%vNCWYXHwIBMklb(TBG|6Rp zA0Yt<4Ly?D2t1b*3Raa%WuQ1k`(H!QzEGz*g#-v%cs(#~R^GD|;{Fu$!{TuuKP3~G zoqw~Io20cZNijhnieyx@t4sj|SCtNGlc$@;%DP@sWD+>Bu)7V&(@xJ!top8o8Z1;etwTUNGE| zmH?`_B@g+P8HG^83F8aD)<|{pxlDvY^~v}5IWE(xw_~2d`32qRgra5JwQ!KScIZx^ z-da8>0ynX;;|`C1lLbTLWjt>o_`W>FG~HMDbwVE4Y)p`cYYRLT<)dUjoqvOqlNM>xHt zU2LHIZxTST4^&A9gL29QjwONfC)aU|6Uasxi)tz;MG%H8kLJp1wfOR8vYH?^sw@F2 zG#XTXfsv6@>13q`OD#8m>Q;eG-&Zy>6jgd$jJa0{G6051uMHVj4GGC$JX^pyIn{N@ z8dmYDwy-dr7=Hy+=%h$c;OasFrie?<3R!w+EmNY!?CTEmRI{7!k6aTJL)WsA6{e6W z7#`HN?N`jd8)j+SKTvI8Z`!{Tbu6)b3t6@t;nFJ-MCyiSljVc6{mRdg);kBIC%oqG z+*lb+4jYlMs6MtuP>GqF*YZ4aw;ZPYcSB9&uUHcHmg8Jnlh0aKK3ef5q`bF8KUg|) zta2pDSYnS}n%iaK0&}|>LyLP#E^LjN+#l)Dg*tnamXK(D>lqpqp_P*TiZ1- zgB5bcw!2Ot5OJ-1iIBOV_pfd2=e#~tLAs$s%9HWs;bdYmlDfD;OCCJy;W3r_bE1@3 z94O9nla$s6&oz~`g9MNiPr%<_mbTN4$MyRG>A1+m4|+555j}qxhGD3J>jM8(7g&9U z(Ayt0ck300yrDxnhrxmv1$GzyeA+SojlfSHTHOr&1n?OiWQQ*gD3B_^a5MGaTvVsf zQdbuSWi>mtTWd4nOgKm7^|j~K*mg$}jlrD3L4OrtK?YmLCgaA4-pO-YBUD!(EcDHd zHYLMu%l!WRyBrv|l2cH`0Pz5D-w>n5hKGgWAVybXz_Yft24>k{U+~o&X~>j~2&Db( z*^gOQf8}xdcKsE&S#H$S%&j@sd!>RzjoFt8GJ|tGn;4gsW*o$&vs{v3%Ylo60GiZP zN&Utg#KypCf5JLjqxc#yR9PM@Su?Y-|8MA!Oh?Q=5(Qksp?Rb*RhVKi>Z7;BIm8B95bMqS^F zNy8`K(|*^zuKd!yrQe#j-m^@1v&OY%kD}?P0~-Mg6>M&{(oRt}Yk{Lr?Pker?w12b ziGlbJ5L}gz)`^;(U;K?dKZa`kd3*2Vx$P{iZIqn2)E=xtvNUXz)pNwebMJ?v z_^S8oNjBBh>3u2jxzQ+Q-*THY*-36ZqnhG~!QZ0>b-Lb(Z4M>0tdW9`kAvJfV+4jQ z(ju$vIM<)BkBB&Wn`{dTphF5WISi>p!&YJ1hpGYB(iQe zrYg~MIE-z(YRtXB3G+(TDRr;Q+>aTtbiHoau?PU6FkilW$pX@sgoFg(^baIDmhA1A zS^KTr;|6kXJ+~rdY1#HDcB^E2ZYEYd5SO{;5F;xnwFp?45&x*&FxD1)*|~fj5rlcj zL56wmLjcQdEeWLlt0G;jdIdZmWhX2aF#N~oKG)A%XWbsdP*h?F#%b8Cz~25n$Z*g? zcpFeVGyFVq9_s8y#esKrXN*9W z&}83?zJ8wiE3g^%nXWKxxpp!Up~9i?8HpcGXfK$^IA1;{#tsW66!^w`(Bu_3VPoI3 z)U#*MQ;_YabuSkl5S2w-afzmX8kajOBLfA(-aRx&P}+tx}8frs8Iq9R*NFj@GY3u!jc3x=+tYN_E{H-V zksJYM>w9IjfG1D79c^=>~CKslUR5xOE(E4gRLljMJg8Hwr$3AYVpR z&pwnHIIxwzi+bMm*6Tj?0ci*qZdQX`K_K2~IbXxPC}Qdv@x@7%tDgEq~oJ%oz4yVp-sp#Hc`PG`7J z1=YGXMV#P8s+?&zZ1#b|dLAAym&dsLSc3g%>3D_&eW*NG^%2xE^2gFx@}b%F>DNb& z3|~*E*WMdvE-t-cbsW+wMv5hg;yJk|;AybtjUfO0=_?h@->FxDyA#A~bQH!GwH$J| zpOHLRrmoAoczYVWDv69_y41nM_L}G#oU*hU4U6SA~ho-)yV}nd5xrWcBw!=U? z=J`KZRrB?lssw+87dbFVe}8xw@Hx)8#%Td3PU=%Pfj${)dv zslm154lF$E?w>9Zb#gC_gKpe|=JWq5O6+v)F(PuNS>Vp+KwRp*IY%tZwjZy32(;_}hvNne8arV{0L)XvADP6fE8qaPsDWFFe z$zeT0($3iF!#xDz|Cv&5|Af+L^KECvw|y;dQ~R9F;vmJ~j#KxG!;ql|uFn^L1;w88{+IF#QKkCIeh9Zh%KX|>l7vvv#{AtUt2LW09$nmC%HD(%S0rNsg@S z6pff^ZC7z{gS*}yG2({@6;T}6rlj$4 zMLZ&w*ZnoO0TrDuh=EwRp-A@mJQkilU04~KD>}!sKN*Pd{kXr7MB42tc!2Tp14C7Vy;0a@i{|>}a2udGe*T}Qkv%s5Nc_D>jc)M1XRBSlMjsA)@AjsvG z-A%2*dar*0`bg@9rIX_^TABdhm+gfx-}PjKCKZ!MnntDMuwh01KEnm>gyJ(MLjp+? zC1ZynzJWQxSciU{XG2HrliE$D?jtt$Af8D3vgZl(U*) z4e!hQ;r4jX%`uAWM6%Gjob8`EA1~R3%5PKY{q3z*6a9S8yUCh5-zmERVNy+-XRYX0p`-mUWsx}1bW&A<8bjaN5I7h3wyP3E(Z0tR!)z%B~Y#O`Ge z*zjYC%r;dA$4e8)xi&)1EXVDFy_ z87SAM*eh#y@kld*Yv3C~x7)QfXL+dfrerQWvubccjrjDbZNA=x2-0-DkqQJVK;66c z2MDa9bRC-U+}zx*jyf>s=98>}d1%;kI=1XT=cJFF-|OnWQt&vo%`H4BR|h)ZvjVsA z(9GB7z15t+wYv=nTwowi9e+=dS6F=cj()k$Muj1jlZq^o_wu5oAZ{h68ty8rO35d6 z({8b;zK?nf(nk0kRtgTwqT*%=G6^FEYsAYYnC{XtQHbH)_Q|3{;u@o5y5IKs@guN0RK zQ~DEMC4?gI{R-A(4rVY0Ea^s%Xs(!*H^Y})@jnbUR2Oj_%>1y~3qGPR5~mj=^;OaB ztAsq6KK~x5mf)9H)rHGx->|_mIXdN#VE|Na;z z&k-r)leowyT1^G-ZyLJ;uWnzcu!{ZazC@myuv*?L*WN5}Y`VH4MTF3rC1{=f{cVm} z&x#1v#&4>gEWV~HTdv+}69uvHhG4~_?7F|z=xCO77+tGc*RlfPCWRRyf{!KQm&oUt!=6qk*$~zX*w_iE|x=wTsupi5zKsA z6vu$0lBp)t#c=J;^K)v_u?ldk=jGW%?4EuPd92iGCTuH)yw2aIg}Lh3f6mpB9TRaG z<6pnp@!7!4a4Jj0@uz3)*sV318%7YW=KD27a79RpD3tQ69(y~XPpYg+Xmt!5ZYp(X z_t*6sjkGrLG{^BZh*+K30@FPIuP0oiNjW%~8qOc-&vQsHH7oTEhKShGyTOAXv4gq2 zdsF`hdG4ReU%ZK536(i-2Yu@=c*bwM_d*KKelXEliXNxEr~NfC1aJAP84+*~`xTLH zfT2i_3^{@-I6#NmZ4rH{h{^O&i8#QP-1wrWMfBC11&0A%B|V+66_s1|ccl9{DqiL_ zi5fW_T?4-PvurRvn`5<^dCN$k3zhR9U@?673D`7pfOo(bxUe1eEFeZ;Zyr@>C_OEaS3CGJwAi~9Ct4CojrEWVKJy3p{4%E!%`*A*p%MdJ) zwEvi54&8vEQ^>q)N`)AVBPKWckyuXh5)+{u9CZdpuq6U4uI!8IdZ5!*skmAPI&HGW zZm;To=5ulXLS|^O(NP$Xu_SZs8%D_l!sYY*g>L&F<3IZJ@@_^}@Iu^S32iI2(T(so z?`&l+JL2vsaLHk@1aH>M>EPQ_dc?DL><2XI0^2$;>43t-Za%C&pTSIV^cPi3N( zqD1ka^$r^=qS=s3*smC>3>=sF_|?#?tv7_emo#toNk#&sYy@g0AYPCfk`I~q?!PYb z+^>B5Dh&l|k5)OonKszUiGVyUIx)G(Ia!LnvnaFHsZFh5UX`6~7Ny%0fkzhhs*JdB z7_*;%|J#XsCODn7|HF#^$5T2q~Gib0UV2TF-*FAf~GB5*OtKwx-h%C(Fd6*4};#huNh)u-xb(!sz5Y?5w-I z|5WF&JxY)O`LcKbc&pgSsSOvE|Ck^>QMk*0RH(tRHbnon_P|uQhGO{={a=V@|M~yE zTQ4($hBchk6ZbE9aS`@EibyZlas&3?d#~yIhYb94pMP%j-2O+f^s0xea6iqo;01q} z{f`Y=V-SC8EdKLLOtJm@HrF0!8c(kZif$iQ57}qng8fw0aFyRViYo8IGEA2GGwD>> zPwX7p=!fH1qkJA1ln#WdD_2aM*j2lgcI6((7SrRGTH=YDEMVc8VS-c(vyF@;3U+C_ z4pU4yLc`%68cg=fMVBFqpK?e38@_^&*$)eNQuzKC5C{Z1Nd*H7zPx$G&dxqV#lZ;v z%urQ*B3Und1+s?0cZ!Q255PT^Z)pT(V8A`eGFi>DzGr_%l(C-D|NE5SwY|OV2OjMs zBeN^~+N}GliphYGW~okfUh^sCHPAG~lZjLU8tO9{Y)gK_&9H&Jz5P#7VG?vgmSriE z0s75(rA@s?cCEjTbqu&D382AU`Yg1Ab3e^I{k!^SL64z{YHob+tA@cNLm-xPCUVi= z`)Sh|x1rH;w9??->DU@U!jxG+>r*x~IN0nmn8Hb$&c|C50UQl!-v*nzonN`nTG1iE z!rVYz13~`FD**xhY$f`cY^j|aAs>AKL9spHJar2~6W13(O_jB}x_Zu9S6R{k`a6ns zSh`_`xAuD_EcgtTfKCzu5e6tlbljPRv?w2+I$dyl?BQ)uNeQWzwzl>>=;;>&RK{z( z7Nk37+Ep89j#v7WVh~kG(1iZrhP$;@ws%i2DjKV<;n&RVzpbm4MY8P3`=Q%ym7ne| zWl8=%?Af?7eG+lZx5R) zGXfs2zuOlRaahKJR)?Cha@+t*%DB3}N0bxad2boV@z$_>tHH#xvg`IO^^L%Ip~+F^ zo1F)O3nvQZ!{+py`3K&Wapn!`Ee+K9e>+_unokn-NcvZVyt<{Oi$vlVY^1mV3 zqM-*BzSk!Sb3XU`W}Sb~8xH0JxVj|C~km2wB?mQjyU zWS^4hrlhFLI3UFI0&eG);(ry!dl{@)t8CiGY19UVLOYct(rfXrjwc*Q@@|Mm8s-E9JxI|_sUIjKrfY4=}=+oyoy^;dDw78+A{ zD=)v`x?oqk;JTimxf4QQP|*5!WNj#B>HffD2ORx;_*pOnqKG+VK-f)ohWE}ZCg86M zlA;n{08zm9AAR>3vsMM|0@S|W$c&yNb9uV%`i3mOhMCpQnM3MCPibV#2dm-ti?pJ$;-IhxcYHC!Q?O|9BO1 z@JN5Q)#Y#gb3sm|!^*tpG&{tA=y}|`ZF%vEn_DyBy5I2ZYBgrJASYVI+k0gN3mlNd zY7LJCH_b{Hkb1H6qw&DHO1Fr{`|_X^1SeUZto3;V_Hpq3a>)S%Qtv7f5Si2^fyG59 zB!J^-O}eqVr_0#1x;fj9vUh!L*rL~ZyKtzcq_lhhI^;~+KflYzW0LWyiHnQxW7vb3 zC7n9Q>?eys;NaadQcn}jBLX~$R|MtqtN>1Zn z!KNR}6ToZ+g0e1T?9m#(>`t>TxqD_rC^B(ceHbtN$pKt22f#Aom)m>L06h^HGS^Ks-S2oES(1SPNs=b!M&lAjx;H)!X z8<|=Zc;Pn4qy&Lv_5ZU{>zGFNeRlowA`0X{A|N0{+1~-Vpw-pU--B?*AC9!Nv<-Vd z`{zF(k#9xwpGZw5iuERF8Wf6R@P5~46}&s@Am+AD!{AwlfYn!+F3m9zK$ra=PeGvS zh`{AMjWl311&Z_|T$Q_d?j83u)1BEbu0&fjyi=BlRNYd>6omx9mY}zqD4+Bs@ZbYV9Ii0M(|r=1J?_zlXo&$ zuF z4B@YI?iuV6Kq}bdHKsRLd+_Ed`HFsK{N_58fjNQ$sRhfMnpOu(`{!z70Lc+#n%SeO zYirGd$g7zWkp5-7?{W~e^GhTs?;d~QMRqH2bp9glixeQY)i`Uu-$u)u_I>tKha`S% zk$s@HRz@C{hGvF!oo7)-;EsbONU37EB)f}iW>`8hSJi&2b)sRl} z6}M#|>(M2R5vB8K<1!3Zk4q5AT$+%gG3zu`dR<$7-5?et0^KPnzL>IdP%@iinDu6w zQ?p=(XI;li8h7%~T{3w&6(y^M?E~S0bnnSfU+8&8^6-8@MfJNu@oxn2ECvTEa!cjy z!Y7Xu-(p$R5vK@{gzw{{ zW?15-e-XD^=Mh?&f1Lylo8?;9;%v#T?hYmh#gKKO6L=)HzAUs!0zEKWIcSA`u-qHN<-^6xUt> zNe%LQYrUf$cTnosL(>#O0g!z`Hw^_6j)1>BYaU)_Tw-;SxUu*K6yHohIuOsw!3h($(;Xeymm|#} zVY!5Fa^ug1tgYg`>z=x3$qIi>^ZReU%#YE^c6SACT+vJ_-SfrgWM|Li7ZmqUA7LvU zAGjYqKRsC+B^nlhuHl^jbvTn>SzV?y6LAGcqxyR`I9^H|;(UvaB^& z$AG+hBLlvy@>{g@Owug^U_Jp`jUq0Okvi;sR0E>Oaqb2Re8?CP8nj2n;;aIU)py?X zPSBfI@z=FaSU@pdEyO7CiHW(q8QwOjSGOT1>xVUpofxW-fIXNtsrKPJRlw*-eGSHs z=>80p|M+=%RjTn}VG)1;E>NMAt{ViBu4;xsz?SYalbizT8&}O=%YPLp|CJUan!fth znti#zHhLV7>H&d+RVERu-9)1k?eTqyG2-(&|1YX4O!gp!Oy#)V}O22j%TX#Uu zj^NFAmRy4BG@X@*U?6K}QqZ+Z){h5N4TOvHp0&)f;X%iy{HE$X=-QA1QiaYnzY?5! znB_%8wBc5kv7ztt=iLK#G)0yg(1iQpB-h~!iK(fAsIMIzmJ4a4f9*S;V3YbSk0RV3 zd#Agw>!?$8jSgR*s||Gc@cr@d$Txsv zGIo?dyZ}bgVWoD)d6|ww&cxW#BOV$T^gkO%VBO(O4iLY8{qkit#Y=e9VQS`5z^-8{ z-cAr@9hjI)99Uw0N`!_W1+vTUZbC?d?(3@tp#_Y``$J67eBM-6#fR&Evl#aBbk>xslbQW;yARMFA-TCu+B9)VFK8_fU zx#bclReB|7o*@k*G8jZo#qZ{H*YNA-ym|M|WW6mTs&+oVKxWPNPDD2}36a3eXsm+E z5Z|$d79+&0Y$=81+ewrt`qAHjKPJ4d$Hy#evF9B$W?&t^Ed#ROAl+)6Y;5K8dH3h3 zpvz7Bdqhop`vr6vt1Zhl$lG%NeAc+4#=i@8je(I754e3w00%xkGNpk6*Pt;+A_DI2 zT3=3^7gbQ8bEa0F_u7weKd<4`+R!zSa)rO04U6I&1-3YC*M#>&*9Zz6p~Ng?LJ;|G z-G=V$iB4%DlhWqToHq$?^73?*m7hZAb_5~KsL3&QDc zE$8P!n67T7?d#VbSe6B&E=`t+R=#;4jWf{}<5_%{X(^{XEQ&Y4${)>CB)pLJMA5j^ zz9VH5I3PjfTpMp@A6WlE*G}fwySx5HCS^Ceu8|4>(l1|?yd1qJ+i3GSEWz^ukH6c_ z6zBfEukG!TMA8gkP6^PBF!bFC3O52D#O@37KghPkwfm_Q?~6B&YX)mqv~G@KQa?5Z zQ8RWLKC}Njfm>GAyp;{}%}8Ey@_v8rg%}tWqi`#_BIwOED>#gfXi_J_t^I(hC7yB zO|77?un#uXPtUl6`c_sMozeuhbg=$r5OTvSpXRzB<5N!Eec9k}~BAWa6Ka}6;gplXFx zg3_|xuAM8p&$!qkPpP=(!3K{*?%|J-w2-8dw|8pt$&W z4n^lDE5pY5_iLfLmM7EkK;DSU3*T)tLA#>Q5)|crW~0lGsosC>bfT z1*|VH?i6SZcZvqX*`ZZgWOHAOIMKkA5Fa0@-ZGND1jI~$UQgaiYwrOq!tU=gSLTL9 z?r5~{cVe`B=QHaTy1F7=Jzh-{gNK0DSzFEA_YVPr0;X>qcAe!sXTRTaO>Rpxr;Fz& z)^*En0J*PVchpr+_^N{!M1@bmMneyIRKMQ($VvXeFn$5gK{x7E$)oLypY}kHZx*h# zU#tD~lV&{SB&}Ed?j#^)a+B7{%d{XPvh^4cDv5g61M_Q&BZ<(#R@O;G8s}irF?0F(-;r`IJ%c=8X<81_il2o?4IAmd8o! z(1AnTJX7%OlYrMG>!H?$Kg5eEQqIW~PH{e_ZoQ+a!(41_K!s-g6Z+$rae*)5qTYS= z%ph_NXc_*BQXp@!3ncd$HtcPTE<=c-?a6%abx?q~j(Q^dg4VTNL3Xd-gZ2cnIsW^p zr;%z+iv_v+HFbUk?l1NB_8t}(mjv2^a$PK#xqUrz^HIK3BT%TT>&<%Wu_kCPG{^Ke zA~lbp0#xJ#9gJ-wq_uiVUUT{gop5*{;1q&Th1YvnSxrO$?ufg;P+5z08T1@Xk6tDO zl7{XrUA-53cx@zWS=uANu=D%KpZh}A@w|A#gj8^!Q4P{^)%twScF76Mp06Q#@L_6S zfl84hnr5VwU)|b&RKLG6&ycPJN%@lgiNG*qD}g^6TP%p&scFCCk;nt+a8*Siq(o2UU2hwF!#Qa)oo!`ke6=| zlb7FHC@d@tA#D z3_R7)VanU!f36H^0$obAnDqDam+ePGKDN<;(A=k_?yHt|N1hW&l&4#eS4E{L_IDUT zW!VDuqXPQP48pMh`;5@0b>Oz$;5*r;66u8{7=)K-b z`E-g`ysa{wW}dvr3@~K6?#>bT@8GJx|8gmfSc_cD-@mZ2)YRWlBp`#DRUjn-Un7vSggf@d#?RX>!V^`xP~v{ zB49%Agaj{jC9Y|sS`{FKi{_D~+*U=jTNF7N9>~^$BKMWt{Cok~VYinH?|wdGE#B)2 zB4chYmcgDbqEsm&_~lW5dH8@%G%2gR{DH}08BjkBR{_$8wuRA-THD$E%7K9H36`C5 zUoy`qFpKJi4Y1M~do8Rk{w9`|09)icK#4^Cm6bmy z?bx;?{RZekiY>EkB?~2&QD*xdtJ-bKzx*@c#F~&-x9N`_bo7Kc7z4;@^B30ph{2T` zuXN%u%OL<1?ABY;Fb*L1-Ib_xg)%y~kKCXPK9%Z4aA5t<&k7o)8SW1;PZ5D=MS@>j zQ*Vnvt3c$6D~CWsTf9X)PI08(XO+SPYpUB@z+0(C{=J_Yz&}48ZX|9N1&!5t5zmLP zJy1o7*^bbs`~PV>4iavrjDB!pW!Gd<>1eor=QHJVUpoD>Sov+>7k3LS>oz{^v_g39 zz1FHgcDp=-1zIo9^!)kr^79Im*$Jn4*v!2iy)ZxTxd%Y_cq{{DvVyO^-o6O`zTo=s z)3s@FaWNa)2O4u}5Io*@97Dc>Vf42!hUoRlZ_lGJ3=1}#x!Kv4V{raZ23#a7%%6O^ zWDI2-Wsgp=$)Bb?qFjoOKgZSoc?f~tuNM@{_Rqy1^7kbE{X|uo5^()_2$;nGH&9gn_pGR%Sa!urXr~gz z3ztVW_cB_NPN2>{RQ$2vDz%$U@Oibwc=Ljgkkcj{&{pH>@3Ez(W2{vLoSfJOMl?_) zRTi6wIUas6?86|hl|5+X=k%+}?=V)h1^U7+J4Fm@>Sf>r2xGn|PT!2`nwqjzLYFo~ zaO3hUeqOd3&oIuhxGv;g?%SqQSM0wHNwd)rf2A!rM9{L@3LJRYTn@B!P;c_We|Ar! zbp)o^lBTF~Q?0f%@*~}voC|79ZmuOMQZc;se|XmE`1xh5pEv_g3|>lLyt z>aO@(dy^g+6eo*qhDYaK_iBCE!7c(DYM*<~8x@d}gno@{?d|PdTAS-_3R95wS{^F| z90nQ%#-vbap~GhV43;A;pvd~0abU1-t%gTcC|4$JYav$Js% z2x+`Y&<8WWS2%ry=8L|9P~=tBl+26_D@Kz1y#k;bHYq`nSNS+o^c> zZtMBM!SO8B$(MQ4A&B+3wN?0HR&H)9rOw*$+) z8B#@+Dqv-UxcJ}Xz<27??vchWCyH0eqyO{e8=J5RR5j4=)EACZj1lZ{KirFOPKG>= zFNvfsGql%IGh0Ide&6!Q)EAG=ahIZwr5|$T16H$Xeu^zA>< z%(gtLwO3?<(1o$?^`bKx%4(O!b5!SYOyrT4>9_Ak;#!fGr;i@Ig&HyKX>3WdRuhP> z+i*oYd7cq9K-F6IxM4j*JJ%OxS4?CD%gu4)YHDg53GT*^^wkmRf)1N&Yik$7;x=|( zr)Y~AsP7cuR)KlEb!&>%DPlXmio6qDJy11AXx-d1#o9F4U$oT-ymhNZD}&&%DkmZf zARrir!g3hm{D(bli%xz^ktpyo&t&@d4qq`zkL|YvqfaZ*Nv)@VFWqn3-1F+&+U8)AbS}n`?|$*#jdd zP#BvilG`Bv>7xefwMcI6sRUN%cYoP^%R7s`RzC1-a^{7o{S#P#ztd6}=|XY~-1M$@ zZ+HHYE4ex|RE;I;>goMSb(QkB-j!=f!UK=6e^J<(|Ie;M#Q?x*ZqK^Jjxn;!*I>td{z(H)_qrLnVlOiG_+5kpCO3ig; z2KfMFQR14vnVH#T1%>_goJj#;;cK5Z_u7$>iQ*MGIXTxRL=X)Z=8U>l6C_sa52JRH zac7W`MmYCG#%*7bt1WUpaJZYBqmf*WwAW~6#yrC;=VDt_S+Z2~s#s9gYQCe)tM@%U zH!y>iUY6)HLH`bPFmrk`l|#X@TQrI9!I_~^2{)f`;P7Ug!`6gCE3IOb^qd}D z1VU{8&hl7|N@9Gxgc{YM$L}Z4B`nZydavM6v1Sc7xkW@o3bL}exR-x3qnC8x-gsH2 zd?s?SQIYZxrVrkXVdpAqy{cNP7)dH#i+8t@V!JkMCfm7Mf6BJ?TdJgp?XR!#u>bAO zTs#%){uFmSJS?n}?(k#nR_ohEdqG&|{sC)N{&GM2ER3@afJ-NAj%v)Ubu5QRCwsze zjRaf(VreQ(wyCyuhXJ)esO0~jQL%ToKY&ZE^fbCc*#G5YwWt+h7gkSduu8!t7F80} zefybLjm*qOSmFF=KR^mrY7&27@f?7p5uFA1O?+tLxa=Je4^saUJn3X>kz3_^URoii#?98(;PBNbL2 zXpNd(21-0sXHeOiJ`m^N8(+s#>SUHEyh_475 z%QNg=Cn>>U%Rd);Uo!0r3kfZTPj%{%>hgQaZp7*65$hgur}Wbs7fsO$`Z$r+blR`_ zm1?@W-NPfbD;wsTmQB#E={2(9bdx!^V-2q0(fc3xQF^uA$Q>~8j;(T7u-?D70N_iG z$XYkRS^OD<{5eZ*@)}c1k|4ZTVN`Ve<4EnM+B4ki*PK|!s)0tqxrb?KX@2IW2j)-O ze#?vy&D?2hO2xh8l9ifgzZW5WE9PKGSXfw;{?v4<7)r%Eqgu^THMjvW_hoi_`KRla zF}4_sgLCP{nY21-;b;9|=VS@z?C#t#0GqGdS)-2J!;ufzep~6R8JZ5^JbJK&iIK71 zDyZ44E*kgt>~H`j?4(@xa&hs^0+%lNXO))zrgyUZz(3)t%m9)SFp``n4ihR|10>N) zNUT_-Xh1sVH9}Lv)zW+?zHju6Dk{rsRHpRJn^^)@D^ylawkjf_($g4q+$<^o!)iSZ zl7DBHC0)Fw&;fnlNr%TF16uxWoap@at-h?PYQtMXSoxfYX3s?|9Rv^R-_1z9?=pl# z)8I2%cic_TOlmuFGKq*bX|G3Fw5JJU(?joDl2TzX^LJYHb2Nta3=Gy}31cy$iRn7~ zC_cuW8ZO$V!?1HB9zA-bEE-}YSpIsBH!MLL)49aJ`Ho0xD5{*xAUs91t=8|W{wb`i zK62n;hL9X6jsJZqo{_mi&5+P%QIqdcb}9|i$&B&*>#v`6VR6P`BD!ZqK1zEPR92Ng zwO?pJ?p>?Br9b#>U9Lo4mf2UJ=jiTX^pbK0VXso+F-)44YbS7;TZYOzD&nf@>Xgvk zui~<$&mM2+PRLdxC;sm1E9)`h<~?g!Sy`E2J$OgOyhkb=7Qh3m)uLireo70Sm=m0< zfmY@>p~bpcy8DWpOHHL`8CQ1UeB|?OfB(hx&YHJHm65(#vrQe}7Cr}BPnK9RCqk+E zukM|$NKxySJ&nT%dH%dhEW|qOL}z=upQzd4!lLZve{Yvc7Yro-s+@~Sd*WVV_}IzD zHZ#8vQG1(;!B0{Wjl*nREVkq>iP-Ubw~9n_zO2@>%6FmvWZk~Jm4&zxMBc5SQ0dlE zY!l!JS&@4ed{L69AOU`U9|f@Uu`}l`2?(TsC zcG_oRD(u=m)QFQ?lIS~YQW5NI4Tvu3&EQH;cm0#!Qj_a$^kiST+j;3tL4j)XUGGxP=l#2*s_n-oE_q67z{FfnpFAetMSQuA&y8 znjU^r;kk7B8M+W&HOKOmy2=e>th4TPI(hxvU3+`-J(%KOD}xZb#)o|TIV|*~Uq`H+ zdG)VH2fxr_$$cN#iWmaO1&E^Z0j-2J`)_m0ElK*w4yUd$;KIxW=c>C;#mB`ha?piD zW8G_TH>ZRZO4-%#e3qZ!LIMBl0J)MYgMk8hpRKsz{?@G*xA3Vt=mT(^spk!6zPuqf zULEQ8@5wfHuhx$w_&7OMz@hrz*K<{~1E0*ylj7q&NYHs-@>6E`1Y6Lpo+|?*O?<`L zs^Gn&?Q_WBo{D^h+~bI(cv?E%#qQfh9dYidxb{h{j;{9hx(l`8w*@I*Rm1^mi&#Jk za}u&Pja0veOYg?QO2)#zS%Y%v5{C{Wg{(XxTH(&lzuSzaJJ33y2rMZI#mnJ@VoGUQ= zrkxaYj9fTk{IpHfc-phKJ?Iz4&4iWIuIrZZ>Yg}0=*PJFwzwH9j4BLN33fO!R+Hr&vIF*q10H|(tz_CP~NzPhT*%VURD zXFAa3USXA0(Ulvyq9K#5ocelt*wS5d2m_?hOUYPp&F*QHo+79}azx9n)njs9vhP>x z-$NHKZlpZBq<{6+_P;YtRn(g-tLSTn-k%sd1iw$5ArOM-G52^0WA$LTk_SeZkV0ZD z{!?iMF%<QHjnPY8VgRdkbP3uONWB zYjes3-Ky?u5HmAgmLN-@y98e4lUeG$y-~R?zt{2)VG~Rkn49|*vutJ$akJ5hlnq>S zity3atHC&HqZB+lPikJ)tipvh616J^0x!-P+J3v+&9gv*Oh-7lk0r4X##Wb(Zr>)1 zU4f5n&%&>MZb|Czl;(C2K{4g8ET1}WOaA^LEyNVPr+DG}$IZQ)$oNm`)*^E&N!!a0 zI@3?f1_G?wFC93izSF!~FEKE(sCc2YiAc&-C;!&91^(vmT!0;GR3>UieQn1NsTpIC zDc*K0{BDbeI2P!7b{+v z&9U0T%zEPRV1?VVi639N`b_z`0pCxn^+(KRNB_J;YzIze{Ao#AfOZErX-mM4<0?0( zQH0MHo)uiyH%-wCj1G+%uGhL&$@&HcchWIsp$V_BGa)xFKE2UVb+9eYy$lx)$5jP| zm4XPvb3g#(s9sq!slF;n|Igh~y>w{1^l&|pwIowyj<0LA%8_G2w>Z0QFY+lO9teYT z?w)K*zkDW|!05NA`If}roM+_kMWV!7Dt>Jbve^E4{Qk$cs!y{d@~uiIm79^c^V}*? za@CReOp{LLGbau|4vJ6^_5S@MoY6stQ|q#@u5{roQ3y!Rhask9%31l1V=P6E%}zlNYvlaL7E;>p>rCN3}-~w$Lh^ zU@EN0iF6wf1+i}&&JZjL{2auQ;00}Mza@daibZHb{v18+SEu}> z&qV%C8RUPztE{M46GAEIO>YyCd0yYvDzVq%)}m)uqlIh-1TqLhi4`gp+neXHbnzA1 z?&%iFjV%kW7wRv~QFpBxRXo_ag4olEc{X_y;S^KBclzjkvimPr)N#)xGZ{LQ*~76~ z@<3D*)Rxw5H*&s%1c0lRcjf>25Gq9*gktH<;er3*V-+1$?N9v=ISY9p|C`QbcX&j1 z-wRl0D1x1z`OIFds&@I`KNKt+&T--2$3WNW9H1Ov{(b$QJ0w?+MD6tP7&X-}h_E}TBf_A8B*m^P}SCxSvF z1JDtsfT6m9A;?>SOxuqEcm=2pX~L1QyR$=wI%|04y9$<6{dF;jbnZD}RARN=%gT+A zmLwXa;gQGhM`bT2D4`eaB8C;n?=a5#7fzcjkjP9BR!Lq71lb>pEKEz11T6Ow2~p?g zqBG)zF+NlP61FR9NBs2B`tv6a zVsFCCb7Kn&|2T~E3ykw)g3tcFj--2Rt!jEkMg!__qO{jiRXoZfIqt4c$wO;Lwn=Y# zb*)Z}pIfLfgmV*1EDt2)PH@eQ+-Y46xLYKz*b|C&n(!sk1ddg?5`pd{@TCy5 za3k|1npy`&?%RILTaN}RkZA(4Zwsc1rN^0L&mBED(FWms`P1zviIz2q7JthAvBC`g z6CYjhsFbCKP{Tb9M+(4mrp?x4obz#Bg_U=`Gd4XIYyMrj4X?hOtW>fUiCs&s+<;8- zfbSE`vhSl`m)(B>`Ia_C4XB=n*yT+*Vk2GQ3O8X)C{$~!Q3UlDdPyBy48y3fG6*v1 zaAOkP-h{DsEDKVxuyPzZ&NXL4urSkK0P|T~I&f{)XQEGO&;-4TIICW(r04mla-qb} zx`!PsWMupJ@VVn(thScKwYx)!JWg;Qg5tbe9s=#f)jhI9u&a!J;~YXkhdje%x7eAHTV8EuJ$I2W_FeI>-4P z9vuJABq)2}j(pKUJw`gkt-TbTQM3J~eYR$JEds$icN?YMm8sCw9l4Q`lH#t6;UMTai z`~}k9_fUeZX{>uhYsi?v)?O{_=V?iL!KHAfJq4M61u=ji5bz z;Nc#^&NoByJFuXTkK@yl#HsG9(c=SbKmdBFttdGN1T^;mRPsFi_;U-V2#>;wbrJ8& z61htFF^D~`9XIrvNfyDq6tjFCM#@Dgs7YIAS|YFpCy$gz7cKSQI64P^tTso>3{BH1 z?J4vR@%ysZ19#9U8OM*ELGnF*kXyNN7U8;3Jq(1v`|?J$JQBXCvGtbU1= z8@i~VSn*N_qL{GGi;8JWGd@;2daklU)xgbPu|1`P*Ci`-)*M0nLe=W`bi0WL7JcbF zVu~(F1Rk6dbk91s4#Ba0R6_nSC>uI{_;EDi*eA2P0$c$i{d|x!kcqP`-LSu>&JzSdPTCIIyJ|ga+)re>l z--8-_SdMlk*=hGsOHycOO#|bwX1uHMg?~KHca9~kU;r|_X78r8lo>9FwJb9D*-+wG z#9m?E!wiD_S)p|IVBF17R$KkT%A1I#vqukpXe5dN{ZROJaP~wu2b;DT+9fs)a2K5Q z%=kX4xNN=W9Hx?@7N~j>6^|~g^!l6$*(mSSVtTAQnOA!O{kiL}f*?^4*BrztPhmAl zIED5zW129_%*q+7#VdAwHrtKXO{6JXFxC$3GG#!LKZ9lU{-NUS*F=)FPeygW=3-U( zKn}1dGy!-b`_kN>Kumz!JSBbqE?AsE?17e~lHAJw{0>hEK7wXpf~Suz5=null(7Yz?s}(QZh35AD+;(|BNC9R%~h>(D22-{ zFhsZA7DFL>Di>-!1p=U`Co+&M-(`NkXzw8|NZpr`kIBst@7wmTIj#(`z7xzd4y z9+1%Q6`l}`#o>K22B(E1yeat4w5M$SXA3dE77_xC%+bUb28(HRikiHN3F>BCbGtfx z?nPXv)mv$pb+-HMXkD%EvgL$W61gX^^E-3~%jvedn^#Fafa#RaQDqPsWX4ow)mcoM zqG_<5QP=!m7A=^ddm}}Sr3uA)(=!hOh-XdFiRwG*a4O+cb~3rB60i1Ev?Y!H#9^jS zYzn$De=L7tZ-Mm^np4AXl0JPSnL-@74KTn(g1#$w79(#Sm+H_=|H2 zQLc-%KY`#g6)8zqTu_k8KX*xDd05Z3s6nO2BZJ`N+@2N+#49^7Z56>@oW$TaFw(_1 zXDSMWy2pC!U0_tItExP6aH|3M=*R*%KFh_~bgkx34VDcQ$Hl>F<^egt-;ux;SQV(Fiqa6TG#(b7H7fG#VY0r>dQPD=ReQitWr^o>?*#q}9pj_h?}U2-DMu#b3Q~ zFw1EOZijY&_ttP+$CM>Xw9?ZPD@^9#ltjsB_w0kIf$q$`IYmVZ^m{vz@oV<>_A}_p z%Jhs?$4_RYdb31>rq)%tuMhq)l#4%PdT4N{7UtJqI&PtSg_utWJGY8|e7$cuAgw!x zK)DF~DV~YMUW+y0=f4?~vJv|AlAZc|(LRqX_5-s%K6r=-yt@j6AYOT&bQA4lFWbU- z$>Fwmj*pPV=*8}FCT%sniW5fqQ3h-5dr$*?s>(Kxl!bicsf#<<^%|QITVWQ%enKBW zZ_B61Ib>cnMwol!r6|wMn9RiM*a^?hvjTtKu0G|Wl}E8GlgJp!3Gb=qEyXNi?S3Ne z_}O9UGJ_rkL;&tfBq{v$>ShGzC>wgo3JhBK*}1uL-IyMAFM%GW4~g!{I3_|zYGU`= zB_ToJQYtaa$|x1pd>vd<*8yeUxf8~BREDB$Cg+XK%}KRuP-;%RoR`1)a0>5LRqD?F zXsGUaL-mlYWSLE$(wW$MS+u%Y)Q3Df(@gVOLT$uTIBY}Th?4J@*@_G?Se72=Q@2d{ zx?GOI<2ebPVkfSQnkaUVd^j?aYbZ%g6?U8ToAn}uGY8V6X}nI)e|M+3MRf{NkMqtH zEGT=Q+9=G+^Pzbc^V@V*J88}3ShFwD-uZS)z7_NS*y81UUwePA2Wf!?LY@&W z3e0let~siyInADo%8$b;E(&AGL5hRVo;?d+^*lv$I>yb34L_ozwp+v1S1Q)RYzt6} z^26GVz3KoiKi^ToaOueXbhYe2#UvB|;=;nk!m6BQ%34j*xy?lH^XBohcgR;Jo320j z2^NgGG_?#{=Ut08$tvzPTZ?d;xjTn`fS zmuVNN=15K@*1-XFf6r7k`!@RpDaK_kk;W8LjZzd?;NLZc$cLQn6({WLM5QM}~Q*qIPY zMRc&>v2ncB$Oh z?VzUzkzdlM&CJb-%oDpwFB*%lTx{NKe7>8fD)Uijax}}~hhAP^IW#_{rZpVTGLa2d z;u5_UmgPdDkb3#A4~8E@PFcgSo|QVcRf1V2L(bQRQwK)B|7QKBP|*nsq2{AM(qxN= zs3%C~M+FThc(w5N{#_WbIvPi0E>STkcSk;HlQ??jYts;9p}X8`f5P>IYgCufl2yUK zS9;S`Z1|$b7b5jx!hp4FX8?U}iA=`j6@QMOUzbFlddIgM{ek!pzvHaAv(R5KC;>&P3yZ$$UK4Lh_1gx^6W=QZotvWgz=C!r(cCyK2C z)Gxg4ntyEll^UK&IOsmnb}~>=e=nZDIquyT4|9L&#W-tgu4E1JsNcTSUlKhJYe@B* zA*T;Grl=ycAl=*|J0TR~{BV=(Gr~-j3@H5klN3(k0fkO&-d|~?%jsItM*Ry%1(in5 zQe8YKdGOt+^k%^r`$|_ZsbMoZE+N7B=w+xbXAkbBVhH_o>cL~qm3JBI6Z>JMVhaS2 z5@lBK-};R_)Jd{Hq1v`z--=90XyT?LOHt9+Tu#=QY0Bw_Qq=8&U+syf4p$Wy7hhxc z&ac$={v39;^;6gO!?X?pgVAZZG}hhcU6Q?iO>#|~h5^Ejbt3GHR51B8lWs5b&$Q9j ze)6TJF7Z7y0fg` z%%7SfU$j_ic$%NVrjQW}HewW(S;@EKx9#*rDkajj&Jg#Kx%3ttSG+JKx4b$fz;yEV zu}io61t~B4nE;Q=_7|6z4;(*_JF$o7+Z#9DUueLOOK;wK<@wZ6r{ZN}^5lpCVRij^1Oe z(__|(M|I>6_>WbhjVUEnUR(z+XdP)Z*VkXAE;wxR_IgwQfvY}^RJ8?;=tobc9^N!u z$AXG5Uj2>A>U&7gCwGV0Vl)q3b9~i7U&yh>|0X|wUdON@?8U}>h}&1;|24}J-~Xb9 zW6Y<+BsZ3%g@TMt8nWXx6gUq& zJ#e8Toz&pXg(;|F8+Dg*aJ?rR-8161{!HM76g6>5ce+Jxc2+&)24QJ&^E40x)u)p&0wQ{qKKx!itTwZ1=zjvc+ZwLzL7xiC4z7VYWY zNRsM0$KQ0rP*TWUahLsDBhxTO{FZKC{*TCf`|x*6f@$fNuOwK9ZYX)aa;3t(;R`Dl z?DalroIbLl~HeRiPdNHHz4#(lI zO4IouMaUR~N5-}(Tpi@G67o<~5AY#M9wJ}gqO0 z9;Wr|rxo&Uzo!PDn6aIw-~LN1`I7f%PiTzK{wnAC`=ET80`{93O!$Pe{O{_8FVV+b zDc?V8+(dKY+Z{2#lE^bMgnXzAc+hzgk}+;2?Or?PeZ~1f*7NC^Z<(Cw#A@x6ZrP=UbsH-hp{lw8(wQ zU6f#UDWSn8$TMbdsb98nNrew*HH)`z=DH14Ag0bvPf7e_D~UtA$~a^H&9~n1D(H%h z?asqG{U^=t8LMv8cx7#2@F}GXcJ!rLikuzWCtl)kICN*#iQwlIJA^M#6H@*#ZsXv} zv9K&YNoC9TnXCEvTn_?vO9_*o!!ZgA!&7yPvMLr84WA86eF*J`OC*mtQu>}GCPbN= zPiC%r(d#YBU%U7HOf+&1O$A#hrfp48NT|e0}t&ely!`q+s>v=ZL06 z4IZMvz_rGn{Rlb^XCHs_CLZOMK^;r6srvPZM*TF6f^OqM-h2Pq{i;a?SGQ? zGJh+yI$b>P7?p3|I`PrZdgAK^RnO0g>IEF-q|uaTC+PE{jXfLY(#%<}fAXP9*084% zG%oi)@G^h2;#KCNKUHY!3kvW@sty&KMk}~LNp}Os(5WQqwBdnxzW<`fnRb_=LaH`htXJJJVgS>P zk=Lt7jZbIJrU|m_nuJ$Hx|n|zv{rpjsLGjq^eLByNS*$gZ^zgI{Z~=A@vS?&4^nxQ zK?-V*L9j$`f4G+UxFXn-q9_INmI^^1JY;b*i!F zufoHl!otrdUNM9!T^%31D4qJ&;eDVuWCs}rUiBs((Yx^S0+$~ZrIHD=O&Sr@l1|c; zeTOOY%pWlb=ZR4jFH)qBxo;Wo)UbJIAHW`i?6ll{!;$w=Uw(7b*VMy#gJk7QQssNU zAnMgOU@I034tK04>KLvzZTI9hq5+0S~pVPCnd?OT17{NyUN z!QJXsWAt7988!geO}#0Y+}=52Yi5Y&dFcn!mnJ9s@^{9e`^fzRZ0Cq%KR=RCi}c_N z4W9i&yZjS<2?g7u3&UF*-)$Ziry1xwttk1E#w+6|go;TqLZw!PovMwCtK-sS(^3}V z9{CgXW8k>%j>r_l=^6i%X47amzfPMNm@)^Hc>GC+s>PLb<1_K zlb7BdJVmV?8Lne6KKSoxTF?oG7KfA@DI&j>r!$^_ob z(9pv*CLkLM6q+9D>_1lGax2jj#n;n*k3C6=U?Xe;1&O|} zX54a|bXUmVF(&Rshp+!?z)$!E<>r&^pg9X#W;>&3)$N9@?UXic=C}j;PYo)!*Vvob z<;=quchcWom3n6e&dfCqpJOm$+=GH_N2a45=OB4)I`V zfpZ5}CWwm-O;z%?&>W09D3sI4$k1>p4sQ<}6cQqbyA!1Q7bgF@k&>-<+lK7*#n1Zs zRw1<h!#7?6ASan+oP6GYA+8$-gH$)$esVr)IgR*9`yqgM&-MHL_9SI zb-wbQn*3#|v=fWW)g((O>kD*S&^JvUvG;_rD{0v5NM8^pSdf+c&C`hucs(T!qkdDa z9z#Rz+jjCX*2Vzn#-EWn4h9}rgveLE9qKZhW+O|Yh?e_%IX*rkJ$SWIcdm(T;ahJ`L*&t*JrQu z&G-ifIx-W+CSi7Bv-o_Ibn1R=HtP`g_PG8u<|k0o1b=+EH}{h9uXI_jMn9PRCgeeT z;gAg`g)Y7R$lx-?uYL;Wz4>EQFX{FNt{86Tp0Nt?Jal-(21?%5VS{KJtaCOu>N4)N z`tAD�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

nl*oyeHV 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 - ESP32-C3-DevKitC-02 <../hw-reference/esp32c3/user-guide-devkitc-02> + ESP32-C3-DevKitM-1 + ESP32-C3-DevKitC-02 .. only:: esp32s3 diff --git a/docs/en/hw-reference/esp32c3/user-guide-devkitc-02.rst b/docs/en/hw-reference/esp32c3/user-guide-devkitc-02.rst deleted file mode 100644 index 857ae0bd6cc0..000000000000 --- a/docs/en/hw-reference/esp32c3/user-guide-devkitc-02.rst +++ /dev/null @@ -1,236 +0,0 @@ -=================== -ESP32-C3-DevKitC-02 -=================== - -:link_to_translation:`zh_CN:[中文]` - -This user guide will help you get started with ESP32-C3-DevKitC-02 and will also provide more in-depth information. - -ESP32-C3-DevKitC-02 is an entry-level development board based on `ESP32-C3-WROOM-02 `_, a general-purpose module with 4 MB SPI flash. This board integrates complete Wi-Fi and Bluetooth® Low Energy functions. - -Most of the I/O pins are broken out to the pin headers on both sides for easy interfacing. Developers can either connect peripherals with jumper wires or mount ESP32-C3-DevKitC-02 on a breadboard. - -.. figure:: ../../../_static/esp32-c3-devkitc-02-v1-isometric.png - :align: center - :alt: ESP32-C3-DevKitC-02 - :figclass: align-center - - ESP32-C3-DevKitC-02 - -The document consists of the following major sections: - -- `Getting Started`_: Overview of ESP32-C3-DevKitC-02 and hardware/software setup instructions to get started. -- `Hardware Reference`_: More detailed information about the ESP32-C3-DevKitC-02's hardware. -- `Hardware Revision Details`_: Revision history, known issues, and links to user guides for previous versions (if any) of ESP32-C3-DevKitC-02. -- `Related Documents`_: Links to related documentation. - - -Getting Started -=============== - -This section provides a brief introduction of ESP32-C3-DevKitC-02, instructions on how to do the initial hardware setup and how to flash firmware onto it. - - -Description of Components -------------------------- - -.. _user-guide-c3-devkitc-02-v1-board-front: - -.. figure:: ../../../_static/esp32-c3-devkitc-02-v1-annotated-photo.png - :align: center - :alt: ESP32-C3-DevKitC-02 - front - :figclass: align-center - - ESP32-C3-DevKitC-02 - front - -The key components of the board are described in a counter-clockwise direction. - -.. list-table:: - :widths: 30 70 - :header-rows: 1 - - * - Key Component - - Description - * - ESP32-C3-WROOM-02 - - ESP32-C3-WROOM-02 from Espressif is a powerful and general-purpose module that offers Wi-Fi and Bluetooth Low Energy coexistence. It has a PCB antenna and a 4 MB SPI flash. - * - 5 V to 3.3 V LDO - - Power regulator that converts a 5 V supply into a 3.3 V output. - * - 5 V Power On LED - - Turns on when the USB power is connected to the board. - * - Pin Headers - - All available GPIO pins (except for the SPI bus for flash) are broken out to the pin headers on the board. For details, please see :ref:`user-guide-c3-devkitc-02-v1-header-blocks`. - * - Boot Button - - Download button. Holding down **Boot** and then pressing **Reset** initiates Firmware Download mode for downloading firmware through the serial port. - * - Micro-USB Port - - USB interface. Power supply for the board as well as the communication interface between a computer and the ESP32-C3 chip. - * - Reset Button - - Press this button to restart the system. - * - USB-to-UART Bridge - - Single USB-to-UART bridge chip provides transfer rates up to 3 Mbps. - * - RGB LED - - Addressable RGB LED, driven by GPIO8. - -Start Application Development ------------------------------ - -Before powering up your ESP32-C3-DevKitC-02, please make sure that it is in good condition with no obvious signs of damage. - - -Required Hardware -^^^^^^^^^^^^^^^^^ - -- ESP32-C3-DevKitC-02 -- USB 2.0 cable (Standard-A to Micro-B) -- Computer running Windows, Linux, or macOS - -.. note:: - - Be sure to use an appropriate USB cable. Some cables are for charging only and do not provide the needed data lines nor work for programming the boards. - - -Software Setup -^^^^^^^^^^^^^^ - -Please proceed to :doc:`../../get-started/index`, where Section :ref:`get-started-step-by-step` will quickly help you set up the development environment and then flash an application example into your ESP32-C3-DevKitC-02. - - -Contents and Packaging ----------------------- - -Retail Orders -^^^^^^^^^^^^^ - -If you order a few samples, each ESP32-C3-DevKitC-02 comes in an individual package in either antistatic bag or any packaging depending on your retailer. - -For retail orders, please go to https://www.espressif.com/en/contact-us/get-samples. - -Wholesale Orders -^^^^^^^^^^^^^^^^ - -If you order in bulk, the boards come in large cardboard boxes. - -For wholesale orders, please go to https://www.espressif.com/en/contact-us/sales-questions. - - -Hardware Reference -================== - -Block Diagram -------------- - -The block diagram below shows the components of ESP32-C3-DevKitC-02 and their interconnections. - -.. figure:: ../../../_static/esp32-c3-devkitc-02-v1-block-diags.png - :align: center - :scale: 70% - :alt: ESP32-C3-DevKitC-02 (click to enlarge) - :figclass: align-center - - ESP32-C3-DevKitC-02 (click to enlarge) - - -Power Supply Options -^^^^^^^^^^^^^^^^^^^^ - -There are three mutually exclusive ways to provide power to the board: - -- Micro-USB Port, default power supply -- 5V and GND pin headers -- 3V3 and GND pin headers - -It is recommended to use the first option: Micro-USB Port. - - -.. _user-guide-c3-devkitc-02-v1-header-blocks: - -Header Block ------------- - -The two tables below provide the **Name** and **Function** of the pin headers on both sides of the board (J1 and J3). The pin header names are shown in :ref:`user-guide-c3-devkitc-02-v1-board-front`. The numbering is the same as in the `ESP32-C3-DevKitC-02 Schematic`_ (PDF). - - -J1 -^^^ - -=== ==== ========== =================================== -No. Name Type [1]_ Function -=== ==== ========== =================================== -1 G G Ground -2 3V3 P 3.3 V power supply -3 3V3 P 3.3 V power supply -4 RST I CHIP_PU -5 G G Ground -6 4 I/O/T GPIO4, ADC1_CH4, FSPIHD, MTMS -7 5 I/O/T GPIO5, ADC2_CH0, FSPIWP, MTDI -8 6 I/O/T GPIO6, FSPICLK, MTCK -9 7 I/O/T GPIO7, FSPID, MTDO -10 G G Ground -11 8 I/O/T GPIO8 [2]_, RGB LED -12 9 I/O/T GPIO9 [2]_ -13 5V P 5 V power supply -14 5V P 5 V power supply -15 G G Ground -=== ==== ========== =================================== - - -J3 -^^^ - -=== ==== ========== ==================================== -No. Name Type [1]_ Function -=== ==== ========== ==================================== -1 G G Ground -2 0 I/O/T GPIO0, ADC1_CH0, XTAL_32K_P -3 1 I/O/T GPIO1, ADC1_CH1, XTAL_32K_N -4 2 I/O/T GPIO2 [2]_, ADC1_CH2, FSPIQ -5 3 I/O/T GPIO3, ADC1_CH3 -6 G G Ground -7 10 I/O/T GPIO10, FSPICS0 -8 G G Ground -9 RX I/O/T GPIO20, U0RXD -10 TX I/O/T GPIO21, U0TXD -11 G G Ground -12 18 I/O/T GPIO18, USB_D- -13 19 I/O/T GPIO19, USB_D+ -14 G G Ground -15 G G Ground -=== ==== ========== ==================================== - -.. [1] P: Power supply; I: Input; O: Output; T: High impedance. -.. [2] GPIO2, GPIO8, and GPIO9 are strapping pins of the ESP32-C3 chip. These pins are used to control several chip functions depending on binary voltage values applied to the pins during chip power-up or system reset. For description and application of the strapping pins, please refer to Section Strapping Pins in `ESP32-C3 Datasheet`_. - - -Pin Layout -^^^^^^^^^^ - -.. figure:: ../../../_static/esp32-c3-devkitc-02-v1-pinout.png - :align: center - :scale: 45% - :alt: ESP32-C3-DevKitC-02 (click to enlarge) - :figclass: align-center - - ESP32-C3-DevKitC-02 Pin Layout (click to enlarge) - - -Hardware Revision Details -========================= - -No previous versions available. - - -Related Documents -================= - -* `Build Secure and Cost-effective Connected Devices with ESP32-C3 `_ -* `ESP32-C3 Datasheet`_ (PDF) -* `ESP32-C3-WROOM-02 Datasheet`_ (PDF) -* `ESP32-C3-DevKitC-02 Schematic`_ (PDF) -* `ESP32-C3-DevKitC-02 PCB Layout `_ (PDF) -* `ESP32-C3-DevKitC-02 Dimensions `_ (PDF) -* `ESP32-C3-DevKitC-02 Dimensions source file `_ (DXF) - You can view it with `Autodesk Viewer `_ online - -For further design documentation for the board, please contact us at `sales@espressif.com `_. - -.. _ESP32-C3 Datasheet: https://www.espressif.com/sites/default/files/documentation/esp32-c3_datasheet_en.pdf -.. _ESP32-C3-WROOM-02 Datasheet: https://www.espressif.com/sites/default/files/documentation/esp32-c3-wroom-02_datasheet_en.pdf -.. _ESP32-C3-DevKitC-02 Schematic: https://dl.espressif.com/dl/schematics/SCH_ESP32-C3-DEVKITC-02_V1_1_20210126A.pdf diff --git a/docs/en/hw-reference/esp32c3/user-guide-devkitm-1.rst b/docs/en/hw-reference/esp32c3/user-guide-devkitm-1.rst deleted file mode 100644 index 2e9cb14e42c8..000000000000 --- a/docs/en/hw-reference/esp32c3/user-guide-devkitm-1.rst +++ /dev/null @@ -1,240 +0,0 @@ -================== -ESP32-C3-DevKitM-1 -================== - -:link_to_translation:`zh_CN:[中文]` - -This user guide will help you get started with ESP32-C3-DevKitM-1 and will also provide more in-depth information. - -ESP32-C3-DevKitM-1 is an entry-level development board based on `ESP32-C3-MINI-1 `_, a module named for its small size. This board integrates complete Wi-Fi and Bluetooth® Low Energy functions. - -Most of the I/O pins on the ESP32-C3-MINI-1 module are broken out to the pin headers on both sides of this board for easy interfacing. Developers can either connect peripherals with jumper wires or mount ESP32-C3-DevKitM-1 on a breadboard. - -.. figure:: ../../../_static/esp32-c3-devkitm-1-v1-isometric.png - :align: center - :alt: ESP32-C3-DevKitM-1 - :figclass: align-center - - ESP32-C3-DevKitM-1 - -The document consists of the following major sections: - -- `Getting Started`_: Overview of ESP32-C3-DevKitM-1 and hardware/software setup instructions to get started. -- `Hardware Reference`_: More detailed information about the ESP32-C3-DevKitM-1's hardware. -- `Hardware Revision Details`_: Revision history, known issues, and links to user guides for previous versions (if any) of ESP32-C3-DevKitM-1. -- `Related Documents`_: Links to related documentation. - - -Getting Started -=============== - -This section provides a brief introduction of ESP32-C3-DevKitM-1, instructions on how to do the initial hardware setup and how to flash firmware onto it. - - -Description of Components -------------------------- - -.. _user-guide-c3-devkitm-1-v1-board-front: - -.. figure:: ../../../_static/esp32-c3-devkitm-1-v1-annotated-photo.png - :align: center - :alt: ESP32-C3-DevKitM-1 - front - :figclass: align-center - - ESP32-C3-DevKitM-1 - front - -The key components of the board are described in a counter-clockwise direction. - -.. list-table:: - :widths: 30 70 - :header-rows: 1 - - * - Key Component - - Description - * - ESP32-C3-MINI-1 - - ESP32-C3-MINI-1 is a general-purpose Wi-Fi and Bluetooth Low Energy combo module that comes with a PCB antenna. At the core of this module is `ESP32-C3FN4 `_, a chip that has an embedded flash of 4 MB. Since flash is packaged in the ESP32-C3FN4 chip, rather than integrated into the module, ESP32-C3-MINI-1 has a smaller package size. - * - 5 V to 3.3 V LDO - - Power regulator that converts a 5 V supply into a 3.3 V output. - * - 5 V Power On LED - - Turns on when the USB power is connected to the board. - * - Pin Headers - - All available GPIO pins (except for the SPI bus for flash) are broken out to the pin headers on the board. For details, please see :ref:`user-guide-c3-devkitm-1-v1-header-blocks`. - * - Boot Button - - Download button. Holding down **Boot** and then pressing **Reset** initiates Firmware Download mode for downloading firmware through the serial port. - * - Micro-USB Port - - USB interface. Power supply for the board as well as the communication interface between a computer and the ESP32-C3FN4 chip. - * - Reset Button - - Press this button to restart the system. - * - USB-to-UART Bridge - - Single USB-UART bridge chip provides transfer rates up to 3 Mbps. - * - RGB LED - - Addressable RGB LED, driven by GPIO8. - - -Start Application Development ------------------------------ - -Before powering up your ESP32-C3-DevKitM-1, please make sure that it is in good condition with no obvious signs of damage. - - -Required Hardware -^^^^^^^^^^^^^^^^^ - -- ESP32-C3-DevKitM-1 -- USB 2.0 cable (Standard-A to Micro-B) -- Computer running Windows, Linux, or macOS - -.. note:: - - Be sure to use an appropriate USB cable. Some cables are for charging only and do not provide the needed data lines nor work for programming the boards. - - -Software Setup -^^^^^^^^^^^^^^ - -Please proceed to :doc:`../../get-started/index`, where Section :ref:`get-started-step-by-step` will quickly help you set up the development environment and then flash an application example onto your ESP32-C3-DevKitM-1. - - -Contents and Packaging ----------------------- - -Retail Orders -^^^^^^^^^^^^^ - -If you order one or several samples, each ESP32-C3-DevKitM-1 comes in an individual package in either antistatic bag or any packaging depending on your retailer. - -For retail orders, please go to https://www.espressif.com/en/contact-us/get-samples. - - -Wholesale Orders -^^^^^^^^^^^^^^^^ - -If you order in bulk, the boards come in large cardboard boxes. - -For wholesale orders, please go to https://www.espressif.com/en/contact-us/sales-questions. - - -Hardware Reference -================== - -Block Diagram -------------- - -The block diagram below shows the components of ESP32-C3-DevKitM-1 and their interconnections. - -.. figure:: ../../../_static/esp32-c3-devkitm-1-v1-block-diagram.png - :align: center - :scale: 70% - :alt: ESP32-C3-DevKitM-1 (click to enlarge) - :figclass: align-center - - ESP32-C3-DevKitM-1 (click to enlarge) - - -Power Supply Options -^^^^^^^^^^^^^^^^^^^^ - -There are three mutually exclusive ways to provide power to the board: - -- Micro-USB Port, default power supply -- 5V and GND pin headers -- 3V3 and GND pin headers - -It is recommended to use the first option: Micro-USB Port. - - -.. _user-guide-c3-devkitm-1-v1-header-blocks: - -Header Block ------------- - -The two tables below provide the **Name** and **Function** of the pin headers on both sides of the board (J1 and J3). The pin header names are shown in :ref:`user-guide-c3-devkitm-1-v1-board-front`. The numbering is the same as in the `ESP32-C3-DevKitM-1 Schematic`_ (PDF). - - -J1 -^^^ - -=== ==== ========== =================================== -No. Name Type [1]_ Function -=== ==== ========== =================================== -1 GND G Ground -2 3V3 P 3.3 V power supply -3 3V3 P 3.3 V power supply -4 IO2 I/O/T GPIO2 [2]_, ADC1_CH2, FSPIQ -5 IO3 I/O/T GPIO3, ADC1_CH3 -6 GND G Ground -7 RST I CHIP_PU -8 GND G Ground -9 IO0 I/O/T GPIO0, ADC1_CH0, XTAL_32K_P -10 IO1 I/O/T GPIO1, ADC1_CH1, XTAL_32K_N -11 IO10 I/O/T GPIO10, FSPICS0 -12 GND G Ground -13 5V P 5 V power supply -14 5V P 5 V power supply -15 GND G Ground -=== ==== ========== =================================== - - -J3 -^^^ - -=== ==== ========== ==================================== -No. Name Type [1]_ Function -=== ==== ========== ==================================== -1 GND G Ground -2 TX I/O/T GPIO21, U0TXD -3 RX I/O/T GPIO20, U0RXD -4 GND G Ground -5 IO9 I/O/T GPIO9 [2]_ -6 IO8 I/O/T GPIO8 [2]_, RGB LED -7 GND G Ground -8 IO7 I/O/T GPIO7, FSPID, MTDO -9 IO6 I/O/T GPIO6, FSPICLK, MTCK -10 IO5 I/O/T GPIO5, ADC2_CH0, FSPIWP, MTDI -11 IO4 I/O/T GPIO4, ADC1_CH4, FSPIHD, MTMS -12 GND G Ground -13 IO18 I/O/T GPIO18, USB_D- -14 IO19 I/O/T GPIO19, USB_D+ -15 GND G Ground -=== ==== ========== ==================================== - -.. [1] P: Power supply; I: Input; O: Output; T: High impedance. -.. [2] GPIO2, GPIO8, and GPIO9 are strapping pins of the ESP32-C3FN4 chip. These pins are used to control several chip functions depending on binary voltage values applied to the pins during chip power-up or system reset. For description and application of the strapping pins, please refer to Section Strapping Pins in `ESP32-C3 Datasheet`_. - - -Pin Layout -^^^^^^^^^^ - -.. figure:: ../../../_static/esp32-c3-devkitm-1-v1-pinout.png - :align: center - :scale: 45% - :alt: ESP32-C3-DevKitM-1 (click to enlarge) - - ESP32-C3-DevKitM-1 Pin Layout (click to enlarge) - - -Hardware Revision Details -========================= - -No previous versions available. - - -Related Documents -================= - -* `Build Secure and Cost-effective Connected Devices with ESP32-C3 `_ -* `ESP32-C3 Datasheet`_ (PDF) -* `ESP32-C3-MINI-1 Datasheet`_ (PDF) -* `ESP32-C3-DevKitM-1 Schematic`_ (PDF) -* `ESP32-C3-DevKitM-1 PCB Layout`_ (PDF) -* `ESP32-C3-DevKitM-1 Dimensions`_ (PDF) -* `ESP32-C3-DevKitM-1 Dimensions source file`_ (DXF) - You can view it with `Autodesk Viewer `_ online - -For further design documentation for the board, please contact us at `sales@espressif.com `_. - -.. _ESP32-C3 Datasheet: https://www.espressif.com/sites/default/files/documentation/esp32-c3_datasheet_en.pdf -.. _ESP32-C3-MINI-1 Datasheet: https://www.espressif.com/sites/default/files/documentation/esp32-c3-mini-1_datasheet_en.pdf -.. _ESP32-C3-DevKitM-1 Schematic: https://dl.espressif.com/dl/schematics/SCH_ESP32-C3-DEVKITM-1_V1_20200915A.pdf -.. _ESP32-C3-DevKitM-1 PCB Layout: https://dl.espressif.com/dl/schematics/PCB_ESP32-C3-DEVKITM-1_V1_20200915AA.pdf -.. _ESP32-C3-DevKitM-1 Dimensions: https://dl.espressif.com/dl/schematics/DIMENSION_ESP32-C3-DEVKITM-1_V1_20200915AA.pdf -.. _ESP32-C3-DevKitM-1 Dimensions source file: https://dl.espressif.com/dl/schematics/DIMENSION_ESP32-C3-DEVKITM-1_V1_20200915AA.dxf diff --git a/docs/zh_CN/get-started/index.rst b/docs/zh_CN/get-started/index.rst index f036aaa12da7..d3644f306020 100644 --- a/docs/zh_CN/get-started/index.rst +++ b/docs/zh_CN/get-started/index.rst @@ -130,8 +130,8 @@ .. toctree:: :maxdepth: 1 - ESP32-C3-DevKitM-1 <../hw-reference/esp32c3/user-guide-devkitm-1> - ESP32-C3-DevKitC-02 <../hw-reference/esp32c3/user-guide-devkitc-02> + ESP32-C3-DevKitC-02 + ESP32-C3-DevKitM-1 .. only:: esp32s3 diff --git a/docs/zh_CN/hw-reference/esp32c3/user-guide-devkitc-02.rst b/docs/zh_CN/hw-reference/esp32c3/user-guide-devkitc-02.rst deleted file mode 100644 index c3388cb74b81..000000000000 --- a/docs/zh_CN/hw-reference/esp32c3/user-guide-devkitc-02.rst +++ /dev/null @@ -1,237 +0,0 @@ -=================== -ESP32-C3-DevKitC-02 -=================== - -:link_to_translation:`en: [English]` - -本指南将帮助你快速上手 ESP32-C3-DevKitC-02,并提供该款开发板的详细信息。 - -ESP32-C3-DevKitC-02 是一款入门级开发板,使用配置 4 MB SPI flash 的通用型模组 `ESP32-C3-WROOM-02 `_。该款开发板具备完整的 Wi-Fi 和低功耗蓝牙功能。 - -板上模组大部分管脚均已引出至两侧排针,开发人员可根据实际需求,轻松通过跳线连接多种外围设备,同时也可将开发板插在面包板上使用。 - -.. figure:: ../../../_static/esp32-c3-devkitc-02-v1-isometric.png - :align: center - :alt: ESP32-C3-DevKitC-02 - :figclass: align-center - - ESP32-C3-DevKitC-02 - -本指南包括如下内容: - -- `入门指南`_:简要介绍了 ESP32-C3-DevKitC-02 和硬件、软件设置指南。 -- `硬件参考`_:详细介绍了 ESP32-C3-DevKitC-02 的硬件。 -- `硬件版本`_:介绍硬件历史版本和已知问题,并提供链接至历史版本开发板的入门指南(如有)。 -- `相关文档`_:列出了相关文档的链接。 - - -入门指南 -======== - -本小节将简要介绍 ESP32-C3-DevKitC-02,说明如何在 ESP32-C3-DevKitC-02 上烧录固件及相关准备工作。 - - -组件介绍 --------- - -.. _user-guide-c3-devkitc-02-v1-board-front: - -.. figure:: ../../../_static/esp32-c3-devkitc-02-v1-annotated-photo.png - :align: center - :alt: ESP32-C3-DevKitC-02 - 正面 - :figclass: align-center - - ESP32-C3-DevKitC-02 - 正面 - -以下按照逆时针的顺序依次介绍开发板上的主要组件。 - -.. list-table:: - :widths: 30 70 - :header-rows: 1 - - * - 主要组件 - - 介绍 - * - ESP32-C3-WROOM-02 - - ESP32-C3-WROOM-02 是乐鑫推出的一款通用型 Wi-Fi 和低功耗蓝牙双模模组,功能强大。该模组采用 PCB 板载天线,配置了 4 MB SPI flash。 - * - 5 V to 3.3 V LDO(5 V 转 3.3 V LDO) - - 电源转换器,输入 5 V,输出 3.3 V。 - * - 5 V Power On LED(5 V 电源指示灯) - - 开发板连接 USB 电源后,该指示灯亮起。 - * - Pin Headers(排针) - - 所有可用 GPIO 管脚(除 Flash 的 SPI 总线)均已引出至开发板的排针。请查看 :ref:`user-guide-c3-devkitc-02-v1-header-blocks` 获取更多信息。 - * - Boot Button(Boot 键) - - 下载按键。按住 **Boot** 键的同时按一下 **Reset** 键进入“固件下载”模式,通过串口下载固件。 - * - Micro-USB Port(Micro-USB 接口) - - USB 接口。可用作开发板的供电电源或 PC 和 ESP32-C3 芯片的通信接口。 - * - Reset Button(Reset 键) - - 复位按键。 - * - USB-to-UART Bridge(USB 至 UART 桥接器) - - 单芯片 USB 至 UART 桥接器,可提供高达 3 Mbps 的传输速率。 - * - RGB LED - - 可寻址 RGB 发光二极管,由 GPIO8 驱动。 - - -开始开发应用 ------------- - -通电前,请确保 ESP32-C3-DevKitC-02 完好无损。 - - -必备硬件 -^^^^^^^^ - -- ESP32-C3-DevKitC-02 -- USB 2.0 数据线(标准 A 型转 Micro-B 型) -- 电脑(Windows、Linux 或 macOS) - -.. 注解:: - - 请确保使用适当的 USB 数据线。部分数据线仅可用于充电,无法用于数据传输和编程。 - - -软件设置 -^^^^^^^^ - -请前往 :doc:`../../get-started/index`,在 :ref:`get-started-step-by-step` 小节查看如何快速设置开发环境,将应用程序烧录至 ESP32-C3-DevKitC-02。 - - -内含组件和包装 --------------- - -零售订单 -^^^^^^^^ - -如购买样品,每个 ESP32-C3-DevKitC-02 开发板将以防静电袋或零售商选择的其他方式包装。 - -零售订单请前往 https://www.espressif.com/zh-hans/company/contact/buy-a-sample。 - - -批量订单 -^^^^^^^^ - -如批量购买,ESP32-C3-DevKitC-02 开发板将以大纸板箱包装。 - -批量订单请前往 https://www.espressif.com/zh-hans/contact-us/sales-questions。 - - -硬件参考 -======== - -功能框图 --------- - -ESP32-C3-DevKitC-02 的主要组件和连接方式如下图所示。 - -.. figure:: ../../../_static/esp32-c3-devkitc-02-v1-block-diags.png - :align: center - :scale: 70% - :alt: ESP32-C3-DevKitC-02(点击放大) - :figclass: align-center - - ESP32-C3-DevKitC-02(点击放大) - - -电源选项 -^^^^^^^^ - -以下任一供电方式均可为 ESP32-C3-DevKitC-02 供电: - -- Micro-USB 接口供电(默认) -- 5V 和 GND 排针供电 -- 3V3 和 GND 排针供电 - -建议选择第一种供电方式:Micro-USB 接口供电。 - - -.. _user-guide-c3-devkitc-02-v1-header-blocks: - -排针 ----- - -下表列出了开发板两侧排针(J1 和 J3)的 **名称** 和 **功能**,排针的名称如图 :ref:`user-guide-c3-devkitc-02-v1-board-front` 所示,排针的序号与 `ESP32-C3-DevKitC-02 原理图`_ (PDF) 一致。 - - -J1 -^^^ - -==== ==== ========== ================================ -序号 名称 类型 [1]_ 功能 -==== ==== ========== ================================ -1 G G 接地 -2 3V3 P 3.3 V 电源 -3 3V3 P 3.3 V 电源 -4 RST I CHIP_PU -5 G G 接地 -6 4 I/O/T GPIO4, ADC1_CH4, FSPIHD, MTMS -7 5 I/O/T GPIO5, ADC2_CH0, FSPIWP, MTDI -8 6 I/O/T GPIO6, FSPICLK, MTCK -9 7 I/O/T GPIO7, FSPID, MTDO -10 G G 接地 -11 8 I/O/T GPIO8 [2]_, RGB LED -12 9 I/O/T GPIO9 [2]_ -13 5V P 5 V 电源 -14 5V P 5 V 电源 -15 G G 接地 -==== ==== ========== ================================ - - -J3 -^^^ - -==== ==== ========== ================================ -序号 名称 类型 [1]_ 功能 -==== ==== ========== ================================ -1 G G 接地 -2 0 I/O/T GPIO0, ADC1_CH0, XTAL_32K_P -3 1 I/O/T GPIO1, ADC1_CH1, XTAL_32K_N -4 2 I/O/T GPIO2 [2]_, ADC1_CH2, FSPIQ -5 3 I/O/T GPIO3, ADC1_CH3 -6 G G 接地 -7 10 I/O/T GPIO10, FSPICS0 -8 G G 接地 -9 RX I/O/T GPIO20, U0RXD -10 TX I/O/T GPIO21, U0TXD -11 G G 接地 -12 18 I/O/T GPIO18, USB_D- -13 19 I/O/T GPIO19, USB_D+ -14 G G 接地 -15 G G 接地 -==== ==== ========== ================================ - -.. [1] P:电源;I:输入;O:输出;T:可设置为高阻。 -.. [2] GPIO2、GPIO8、GPIO9 为 ESP32-C3 芯片的 Strapping 管脚。在芯片上电和系统复位过程中,Strapping 管脚根据管脚的二进制电压值控制芯片功能。Strapping 管脚的具体描述和应用,请参考 `ESP32-C3 技术规格书`_ 的 Strapping 管脚章节。 - -管脚布局 -^^^^^^^^ - -.. figure:: ../../../_static/esp32-c3-devkitc-02-v1-pinout.png - :align: center - :scale: 45% - :alt: ESP32-C3-DevKitC-02 管脚布局(点击放大) - :figclass: align-center - - ESP32-C3-DevKitC-02 管脚布局(点击放大) - - -硬件版本 -========== - -该开发板为最新硬件,尚未有历史版本。 - - -相关文档 -======== - -* `使用 ESP32-C3 构建安全高性价比的互联设备 `_ -* `ESP32-C3 技术规格书`_ (PDF) -* `ESP32-C3-WROOM-02 规格书`_ (PDF) -* `ESP32-C3-DevKitC-02 原理图`_ (PDF) -* `ESP32-C3-DevKitC-02 PCB 布局图 `_ (PDF) -* `ESP32-C3-DevKitC-02 尺寸图 `_ (PDF) -* `ESP32-C3-DevKitC-02 尺寸图源文件 `_ (DXF) - 可使用 `Autodesk Viewer `_ 查看 - -有关本开发板的更多设计文档,请联系我们的商务部门 `sales@espressif.com `_。 - -.. _ESP32-C3 技术规格书: https://www.espressif.com/sites/default/files/documentation/esp32-c3_datasheet_cn.pdf -.. _ESP32-C3-WROOM-02 规格书: https://www.espressif.com/sites/default/files/documentation/esp32-c3-wroom-02_datasheet_cn.pdf -.. _ESP32-C3-DevKitC-02 原理图: https://dl.espressif.com/dl/schematics/SCH_ESP32-C3-DEVKITC-02_V1_1_20210126A.pdf diff --git a/docs/zh_CN/hw-reference/esp32c3/user-guide-devkitm-1.rst b/docs/zh_CN/hw-reference/esp32c3/user-guide-devkitm-1.rst deleted file mode 100644 index 76f4c71f152d..000000000000 --- a/docs/zh_CN/hw-reference/esp32c3/user-guide-devkitm-1.rst +++ /dev/null @@ -1,240 +0,0 @@ -================== -ESP32-C3-DevKitM-1 -================== - -:link_to_translation:`en: [English]` - -本指南将帮助你快速上手 ESP32-C3-DevKitM-1,并提供该款开发板的详细信息。 - -ESP32-C3-DevKitM-1 是一款入门级开发板,使用以尺寸小而得名的 `ESP32-C3-MINI-1 `_ 模组。该款开发板具备完整的 Wi-Fi 和低功耗蓝牙功能。 - -板上模组大部分管脚均已引出至两侧排针,开发人员可根据实际需求,轻松通过跳线连接多种外围设备,同时也可将开发板插在面包板上使用。 - -.. figure:: ../../../_static/esp32-c3-devkitm-1-v1-isometric.png - :align: center - :alt: ESP32-C3-DevKitM-1 - :figclass: align-center - - ESP32-C3-DevKitM-1 - -本指南包括如下内容: - -- `入门指南`_:简要介绍了 ESP32-C3-DevKitM-1 和硬件、软件设置指南。 -- `硬件参考`_:详细介绍了 ESP32-C3-DevKitM-1 的硬件。 -- `硬件版本`_:介绍硬件历史版本和已知问题,并提供链接至历史版本开发板的入门指南(如有)。 -- `相关文档`_:列出了相关文档的链接。 - - -入门指南 -======== - -本小节将简要介绍 ESP32-C3-DevKitM-1,说明如何在 ESP32-C3-DevKitM-1 上烧录固件及相关准备工作。 - - -组件介绍 --------- - -.. _user-guide-c3-devkitm-1-v1-board-front: - -.. figure:: ../../../_static/esp32-c3-devkitm-1-v1-annotated-photo.png - :align: center - :alt: ESP32-C3-DevKitM-1 - 正面 - :figclass: align-center - - ESP32-C3-DevKitM-1 - 正面 - -以下按照逆时针的顺序依次介绍开发板上的主要组件。 - -.. list-table:: - :widths: 30 70 - :header-rows: 1 - - * - 主要组件 - - 介绍 - * - ESP32-C3-MINI-1 - - ESP32-C3-MINI-1 是一款通用型 Wi-Fi 和低功耗蓝牙双模模组,采用 PCB 板载天线。该款模组集成配置 4 MB 嵌入式 flash 的 `ESP32-C3FN4 `_ 芯片。由于 flash 直接封装在芯片中,ESP32-C3-MINI-1 模组具有更小的封装尺寸。 - * - 5 V to 3.3 V LDO(5 V 转 3.3 V LDO) - - 电源转换器,输入 5 V,输出 3.3 V。 - * - 5 V Power On LED(5 V 电源指示灯) - - 开发板连接 USB 电源后,该指示灯亮起。 - * - Pin Headers(排针) - - 所有可用 GPIO 管脚(除 flash 的 SPI 总线)均已引出至开发板的排针。请查看 :ref:`user-guide-c3-devkitm-1-v1-header-blocks` 获取更多信息。 - * - Boot Button(Boot 键) - - 下载按键。按住 **Boot** 键的同时按一下 **Reset** 键进入“固件下载”模式,通过串口下载固件。 - * - Micro-USB Port(Micro-USB 接口) - - USB 接口。可用作开发板的供电电源或 PC 和 ESP32-C3FN4 芯片的通信接口。 - * - Reset Button(Reset 键) - - 复位按键。 - * - USB-to-UART Bridge(USB 至 UART 桥接器) - - 单芯片 USB 至 UART 桥接器,可提供高达 3 Mbps 的传输速率。 - * - RGB LED - - 可寻址 RGB 发光二极管,由 GPIO8 驱动。 - - -开始开发应用 ------------- - -通电前,请确保 ESP32-C3-DevKitM-1 完好无损。 - - -必备硬件 -^^^^^^^^ - -- ESP32-C3-DevKitM-1 -- USB 2.0 数据线(标准 A 型转 Micro-B 型) -- 电脑(Windows、Linux 或 macOS) - -.. 注解:: - - 请确保使用适当的 USB 数据线。部分数据线仅可用于充电,无法用于数据传输和编程。 - - -软件设置 -^^^^^^^^ - -请前往 :doc:`../../get-started/index`,在 :ref:`get-started-step-by-step` 小节查看如何快速设置开发环境,将应用程序烧录至 ESP32-C3-DevKitM-1。 - - -内含组件和包装 --------------- - -零售订单 -^^^^^^^^ - -如购买样品,每个 ESP32-C3-DevKitM-1 开发板将以防静电袋或零售商选择的其他方式包装。 - -零售订单请前往 https://www.espressif.com/zh-hans/company/contact/buy-a-sample。 - - -批量订单 -^^^^^^^^ - -如批量购买,ESP32-C3-DevKitM-1 开发板将以大纸板箱包装。 - -批量订单请前往 https://www.espressif.com/zh-hans/contact-us/sales-questions。 - - -硬件参考 -======== - -功能框图 --------- - -ESP32-C3-DevKitM-1 的主要组件和连接方式如下图所示。 - -.. figure:: ../../../_static/esp32-c3-devkitm-1-v1-block-diagram.png - :align: center - :scale: 70% - :alt: ESP32-C3-DevKitM-1 (点击放大) - :figclass: align-center - - ESP32-C3-DevKitM-1 (点击放大) - - -电源选项 -^^^^^^^^ - -以下任一供电方式均可为 ESP32-C3-DevKitM-1 供电: - -- Micro-USB 接口供电(默认) -- 5V 和 GND 排针供电 -- 3V3 和 GND 排针供电 - -建议选择第一种供电方式:Micro-USB 接口供电。 - - -.. _user-guide-c3-devkitm-1-v1-header-blocks: - -排针 ----- - -下表列出了开发板两侧排针(J1 和 J3)的 **名称** 和 **功能**,排针的名称如图 :ref:`user-guide-c3-devkitm-1-v1-board-front` 所示,排针的序号与 `ESP32-C3-DevKitM-1 原理图`_ (PDF) 一致。 - - -J1 -^^^ - -==== ==== ========== ================================ -序号 名称 类型 [1]_ 功能 -==== ==== ========== ================================ -1 GND G 接地 -2 3V3 P 3.3 V 电源 -3 3V3 P 3.3 V 电源 -4 IO2 I/O/T GPIO2 [2]_ , ADC1_CH2, FSPIQ -5 IO3 I/O/T GPIO3, ADC1_CH3 -6 GND G 接地 -7 RST I CHIP_PU -8 GND G 接地 -9 IO0 I/O/T GPIO0, ADC1_CH0, XTAL_32K_P -10 IO1 I/O/T GPIO1, ADC1_CH1, XTAL_32K_N -11 IO10 I/O/T GPIO10, FSPICS0 -12 GND G 接地 -13 5V P 5 V 电源 -14 5V P 5 V 电源 -15 GND G 接地 -==== ==== ========== ================================ - - -J3 -^^^ - -==== ==== ========== ================================ -序号 名称 类型 [1]_ 功能 -==== ==== ========== ================================ -1 GND G 接地 -2 TX I/O/T GPIO21, U0TXD -3 RX I/O/T GPIO20, U0RXD -4 GND G 接地 -5 IO9 I/O/T GPIO9 [2]_ -6 IO8 I/O/T GPIO8 [2]_, RGB LED -7 GND G 接地 -8 IO7 I/O/T GPIO7, FSPID, MTDO -9 IO6 I/O/T GPIO6, FSPICLK, MTCK -10 IO5 I/O/T GPIO5, ADC2_CH0, FSPIWP, MTDI -11 IO4 I/O/T GPIO4, ADC1_CH4, FSPIHD, MTMS -12 GND G 接地 -13 IO18 I/O/T GPIO18, USB_D- -14 IO19 I/O/T GPIO19, USB_D+ -15 GND G 接地 -==== ==== ========== ================================ - -.. [1] P:电源;I:输入;O:输出;T:可设置为高阻。 -.. [2] GPIO2、GPIO8、GPIO9 为 ESP32-C3FN4 芯片的 Strapping 管脚。在芯片上电和系统复位过程中,Strapping 管脚根据管脚的二进制电压值控制芯片功能。Strapping 管脚的具体描述和应用,请参考 `ESP32-C3 技术规格书`_ 的 Strapping 管脚章节。 - - -管脚布局 -^^^^^^^^ - -.. figure:: ../../../_static/esp32-c3-devkitm-1-v1-pinout.png - :align: center - :scale: 45% - :alt: ESP32-C3-DevKitM-1 管脚布局(点击放大) - - ESP32-C3-DevKitM-1 管脚布局(点击放大) - - -硬件版本 -========== - -该开发板为最新硬件,尚未有历史版本。 - - -相关文档 -======== - -* `使用 ESP32-C3 构建安全高性价比的互联设备 `_ -* `ESP32-C3 技术规格书`_ (PDF) -* `ESP32-C3-MINI-1 规格书`_ (PDF) -* `ESP32-C3-DevKitM-1 原理图`_ (PDF) -* `ESP32-C3-DevKitM-1 PCB 布局图 `_ (PDF) -* `ESP32-C3-DevKitM-1 尺寸图 `_ (PDF) -* `ESP32-C3-DevKitM-1 尺寸图源文件 `_ (DXF) - 可使用 `Autodesk Viewer `_ 查看 - -有关本开发板的更多设计文档,请联系我们的商务部门 `sales@espressif.com `_。 - -.. _ESP32-C3 技术规格书: https://www.espressif.com/sites/default/files/documentation/esp32-c3_datasheet_cn.pdf -.. _ESP32-C3-MINI-1 规格书: https://www.espressif.com/sites/default/files/documentation/esp32-c3-mini-1_datasheet_cn.pdf -.. _ESP32-C3-DevKitM-1 原理图: https://dl.espressif.com/dl/schematics/SCH_ESP32-C3-DEVKITM-1_V1_20200915A.pdf -.. _ESP32-C3-DevKitM-1 PCB 布局图: https://dl.espressif.com/dl/schematics/PCB_ESP32-C3-DEVKITM-1_V1_20200915AA.pdf -.. _ESP32-C3-DevKitM-1 尺寸图: https://dl.espressif.com/dl/schematics/DIMENSION_ESP32-C3-DEVKITM-1_V1_20200915AA.pdf -.. _ESP32-C3-DevKitM-1 尺寸图源文件: https://dl.espressif.com/dl/schematics/DIMENSION_ESP32-C3-DEVKITM-1_V1_20200915AA.dxf From 3e97a9f8666410e2a8290ede64b7633a5a9b1961 Mon Sep 17 00:00:00 2001 From: Aditya Patwardhan Date: Fri, 21 Jun 2024 15:32:29 +0530 Subject: [PATCH 05/73] fix(soc): Disable key manager and ECDSA peripheral support for esp32p4 The support is disabled only for ECO1 and below --- components/soc/esp32p4/include/soc/Kconfig.soc_caps.in | 4 ++-- components/soc/esp32p4/include/soc/soc_caps.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in b/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in index f45af2fc0b31..bcd43feae004 100644 --- a/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in @@ -189,11 +189,11 @@ config SOC_ECC_EXTENDED_MODES_SUPPORTED config SOC_ECDSA_SUPPORTED bool - default y + default n config SOC_KEY_MANAGER_SUPPORTED bool - default y + default n config SOC_FLASH_ENC_SUPPORTED bool diff --git a/components/soc/esp32p4/include/soc/soc_caps.h b/components/soc/esp32p4/include/soc/soc_caps.h index 9acb9c4e75bb..2ed3a772a9ef 100644 --- a/components/soc/esp32p4/include/soc/soc_caps.h +++ b/components/soc/esp32p4/include/soc/soc_caps.h @@ -64,8 +64,8 @@ #define SOC_DIG_SIGN_SUPPORTED 1 #define SOC_ECC_SUPPORTED 1 #define SOC_ECC_EXTENDED_MODES_SUPPORTED 1 -#define SOC_ECDSA_SUPPORTED 1 -#define SOC_KEY_MANAGER_SUPPORTED 1 +#define SOC_ECDSA_SUPPORTED 0 +#define SOC_KEY_MANAGER_SUPPORTED 0 #define SOC_FLASH_ENC_SUPPORTED 1 #define SOC_SECURE_BOOT_SUPPORTED 1 #define SOC_BOD_SUPPORTED 1 From 7ac331fea797c9cc464ad24feadfe3f89a87fb50 Mon Sep 17 00:00:00 2001 From: laokaiyao Date: Mon, 24 Jun 2024 15:29:52 +0800 Subject: [PATCH 06/73] refactor(lp_ana_periph): sync the reg names to TRM (part2) --- .../hal/esp32p4/include/hal/touch_sensor_ll.h | 6 ++-- .../esp32p4/include/soc/lp_analog_peri_reg.h | 30 +++++++++---------- .../include/soc/lp_analog_peri_struct.h | 14 ++++----- components/soc/esp32s3/include/soc/sens_reg.h | 24 +++++---------- .../soc/esp32s3/include/soc/sens_struct.h | 2 +- .../peripherals/touch_element.rst | 2 +- tools/ci/check_copyright_ignore.txt | 1 - 7 files changed, 35 insertions(+), 44 deletions(-) diff --git a/components/hal/esp32p4/include/hal/touch_sensor_ll.h b/components/hal/esp32p4/include/hal/touch_sensor_ll.h index e63fb9d465fa..37280c3b5d2b 100644 --- a/components/hal/esp32p4/include/hal/touch_sensor_ll.h +++ b/components/hal/esp32p4/include/hal/touch_sensor_ll.h @@ -755,10 +755,10 @@ static inline void touch_ll_filter_enable(bool enable) */ static inline void touch_ll_force_update_benchmark(uint32_t benchmark) { - HAL_FORCE_MODIFY_U32_REG_FIELD(LP_ANA_PERI.touch_filter3, touch_baseline_sw, benchmark); - LP_ANA_PERI.touch_filter3.touch_update_baseline_sw = 1; + HAL_FORCE_MODIFY_U32_REG_FIELD(LP_ANA_PERI.touch_filter3, touch_benchmark_sw, benchmark); + LP_ANA_PERI.touch_filter3.touch_update_benchmark_sw = 1; // waiting for update - while (LP_ANA_PERI.touch_filter3.touch_update_baseline_sw); + while (LP_ANA_PERI.touch_filter3.touch_update_benchmark_sw); } /************************ Waterproof register setting ************************/ diff --git a/components/soc/esp32p4/include/soc/lp_analog_peri_reg.h b/components/soc/esp32p4/include/soc/lp_analog_peri_reg.h index cfd26fd01649..b9064e20c2b8 100644 --- a/components/soc/esp32p4/include/soc/lp_analog_peri_reg.h +++ b/components/soc/esp32p4/include/soc/lp_analog_peri_reg.h @@ -619,13 +619,13 @@ extern "C" { * need_des */ #define LP_ANALOG_PERI_TOUCH_FILTER1_REG (DR_REG_LP_ANALOG_PERI_BASE + 0x110) -/** LP_ANALOG_PERI_TOUCH_NN_DISUPDATE_BASELINE_EN : R/W; bitpos: [0]; default: 0; +/** LP_ANALOG_PERI_TOUCH_NN_DISUPDATE_BENCHMARK_EN : R/W; bitpos: [0]; default: 0; * Reserved */ -#define LP_ANALOG_PERI_TOUCH_NN_DISUPDATE_BASELINE_EN (BIT(0)) -#define LP_ANALOG_PERI_TOUCH_NN_DISUPDATE_BASELINE_EN_M (LP_ANALOG_PERI_TOUCH_NN_DISUPDATE_BASELINE_EN_V << LP_ANALOG_PERI_TOUCH_NN_DISUPDATE_BASELINE_EN_S) -#define LP_ANALOG_PERI_TOUCH_NN_DISUPDATE_BASELINE_EN_V 0x00000001U -#define LP_ANALOG_PERI_TOUCH_NN_DISUPDATE_BASELINE_EN_S 0 +#define LP_ANALOG_PERI_TOUCH_NN_DISUPDATE_BENCHMARK_EN (BIT(0)) +#define LP_ANALOG_PERI_TOUCH_NN_DISUPDATE_BENCHMARK_EN_M (LP_ANALOG_PERI_TOUCH_NN_DISUPDATE_BENCHMARK_EN_V << LP_ANALOG_PERI_TOUCH_NN_DISUPDATE_BENCHMARK_EN_S) +#define LP_ANALOG_PERI_TOUCH_NN_DISUPDATE_BENCHMARK_EN_V 0x00000001U +#define LP_ANALOG_PERI_TOUCH_NN_DISUPDATE_BENCHMARK_EN_S 0 /** LP_ANALOG_PERI_TOUCH_HYSTERESIS : R/W; bitpos: [2:1]; default: 0; * need_des */ @@ -727,20 +727,20 @@ extern "C" { * need_des */ #define LP_ANALOG_PERI_TOUCH_FILTER3_REG (DR_REG_LP_ANALOG_PERI_BASE + 0x118) -/** LP_ANALOG_PERI_TOUCH_BASELINE_SW : R/W; bitpos: [15:0]; default: 0; +/** LP_ANALOG_PERI_TOUCH_BENCHMARK_SW : R/W; bitpos: [15:0]; default: 0; * need_des */ -#define LP_ANALOG_PERI_TOUCH_BASELINE_SW 0x0000FFFFU -#define LP_ANALOG_PERI_TOUCH_BASELINE_SW_M (LP_ANALOG_PERI_TOUCH_BASELINE_SW_V << LP_ANALOG_PERI_TOUCH_BASELINE_SW_S) -#define LP_ANALOG_PERI_TOUCH_BASELINE_SW_V 0x0000FFFFU -#define LP_ANALOG_PERI_TOUCH_BASELINE_SW_S 0 -/** LP_ANALOG_PERI_TOUCH_UPDATE_BASELINE_SW : WT; bitpos: [16]; default: 0; +#define LP_ANALOG_PERI_TOUCH_BENCHMARK_SW 0x0000FFFFU +#define LP_ANALOG_PERI_TOUCH_BENCHMARK_SW_M (LP_ANALOG_PERI_TOUCH_BENCHMARK_SW_V << LP_ANALOG_PERI_TOUCH_BENCHMARK_SW_S) +#define LP_ANALOG_PERI_TOUCH_BENCHMARK_SW_V 0x0000FFFFU +#define LP_ANALOG_PERI_TOUCH_BENCHMARK_SW_S 0 +/** LP_ANALOG_PERI_TOUCH_UPDATE_BENCHMARK_SW : WT; bitpos: [16]; default: 0; * need_des */ -#define LP_ANALOG_PERI_TOUCH_UPDATE_BASELINE_SW (BIT(16)) -#define LP_ANALOG_PERI_TOUCH_UPDATE_BASELINE_SW_M (LP_ANALOG_PERI_TOUCH_UPDATE_BASELINE_SW_V << LP_ANALOG_PERI_TOUCH_UPDATE_BASELINE_SW_S) -#define LP_ANALOG_PERI_TOUCH_UPDATE_BASELINE_SW_V 0x00000001U -#define LP_ANALOG_PERI_TOUCH_UPDATE_BASELINE_SW_S 16 +#define LP_ANALOG_PERI_TOUCH_UPDATE_BENCHMARK_SW (BIT(16)) +#define LP_ANALOG_PERI_TOUCH_UPDATE_BENCHMARK_SW_M (LP_ANALOG_PERI_TOUCH_UPDATE_BENCHMARK_SW_V << LP_ANALOG_PERI_TOUCH_UPDATE_BENCHMARK_SW_S) +#define LP_ANALOG_PERI_TOUCH_UPDATE_BENCHMARK_SW_V 0x00000001U +#define LP_ANALOG_PERI_TOUCH_UPDATE_BENCHMARK_SW_S 16 /** LP_ANALOG_PERI_TOUCH_SLP0_REG register * need_des diff --git a/components/soc/esp32p4/include/soc/lp_analog_peri_struct.h b/components/soc/esp32p4/include/soc/lp_analog_peri_struct.h index 2819658d26e8..54b0eb9f81be 100644 --- a/components/soc/esp32p4/include/soc/lp_analog_peri_struct.h +++ b/components/soc/esp32p4/include/soc/lp_analog_peri_struct.h @@ -510,10 +510,10 @@ typedef union { */ typedef union { struct { - /** touch_nn_disupdate_baseline_en : R/W; bitpos: [0]; default: 0; + /** touch_nn_disupdate_benchmark_en : R/W; bitpos: [0]; default: 0; * Reserved */ - uint32_t touch_nn_disupdate_baseline_en:1; + uint32_t touch_nn_disupdate_benchmark_en:1; /** touch_hysteresis : R/W; bitpos: [2:1]; default: 0; * need_des */ @@ -585,14 +585,14 @@ typedef union { */ typedef union { struct { - /** touch_baseline_sw : R/W; bitpos: [15:0]; default: 0; + /** touch_benchmark_sw : R/W; bitpos: [15:0]; default: 0; * need_des */ - uint32_t touch_baseline_sw:16; - /** touch_update_baseline_sw : WT; bitpos: [16]; default: 0; + uint32_t touch_benchmark_sw:16; + /** touch_update_benchmark_sw : WT; bitpos: [16]; default: 0; * need_des */ - uint32_t touch_update_baseline_sw:1; + uint32_t touch_update_benchmark_sw:1; uint32_t reserved_17:15; }; uint32_t val; @@ -750,7 +750,7 @@ typedef union { /** touch_data_sel : R/W; bitpos: [9:8]; default: 0; * The type of the output data for debugging * 0/1: raw data - * 2: baseline + * 2: benchmark * 3: smooth data */ uint32_t touch_data_sel:2; diff --git a/components/soc/esp32s3/include/soc/sens_reg.h b/components/soc/esp32s3/include/soc/sens_reg.h index 666f3a9c1282..ca14d862dc92 100644 --- a/components/soc/esp32s3/include/soc/sens_reg.h +++ b/components/soc/esp32s3/include/soc/sens_reg.h @@ -1,16 +1,8 @@ -// Copyright 2017-2021 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2017-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef _SOC_SENS_REG_H_ #define _SOC_SENS_REG_H_ @@ -602,7 +594,7 @@ extern "C" { #define SENS_TOUCH_DENOISE_END_V 0x1 #define SENS_TOUCH_DENOISE_END_S 18 /* SENS_TOUCH_DATA_SEL : R/W ;bitpos:[17:16] ;default: 2'd0 ; */ -/*description: 3: smooth data 2: baseline 1,0: raw_data.*/ +/*description: 3: smooth data 2: benchmark 1,0: raw_data.*/ #define SENS_TOUCH_DATA_SEL 0x00000003 #define SENS_TOUCH_DATA_SEL_M ((SENS_TOUCH_DATA_SEL_V)<<(SENS_TOUCH_DATA_SEL_S)) #define SENS_TOUCH_DATA_SEL_V 0x3 @@ -1378,8 +1370,8 @@ extern "C" { #define SENS_SAR_HALL_CTRL_REG (DR_REG_SENS_BASE + 0xFC) /* SENS_HALL_PHASE_FORCE : R/W ;bitpos:[31] ;default: 1'b1 ; */ -/*description: 1: HALL PHASE is controlled by SW 0: HALL PHASE is controlled by FSM in ULP-cop -rocessor.*/ +/*description: 1: HALL PHASE is controlled by SW 0: HALL PHASE is controlled by FSM in +ULP-coprocessor.*/ #define SENS_HALL_PHASE_FORCE (BIT(31)) #define SENS_HALL_PHASE_FORCE_M (BIT(31)) #define SENS_HALL_PHASE_FORCE_V 0x1 diff --git a/components/soc/esp32s3/include/soc/sens_struct.h b/components/soc/esp32s3/include/soc/sens_struct.h index c2a104d4ccf7..3fb730f3c953 100644 --- a/components/soc/esp32s3/include/soc/sens_struct.h +++ b/components/soc/esp32s3/include/soc/sens_struct.h @@ -217,7 +217,7 @@ typedef volatile struct sens_dev_s { struct { uint32_t touch_outen : 15; /*touch controller output enable*/ uint32_t touch_status_clr : 1; /*clear all touch active status*/ - uint32_t touch_data_sel : 2; /*3: smooth data 2: baseline 1,0: raw_data*/ + uint32_t touch_data_sel : 2; /*3: smooth data 2: benchmark 1,0: raw_data*/ uint32_t touch_denoise_end : 1; /*touch_denoise_done*/ uint32_t touch_unit_end : 1; /*touch_unit_done*/ uint32_t touch_approach_pad2 : 4; /*indicate which pad is approach pad2*/ diff --git a/docs/en/api-reference/peripherals/touch_element.rst b/docs/en/api-reference/peripherals/touch_element.rst index 18bc2a377b25..8be2d2ecdccc 100644 --- a/docs/en/api-reference/peripherals/touch_element.rst +++ b/docs/en/api-reference/peripherals/touch_element.rst @@ -443,7 +443,7 @@ The Touch Element Wakeup example is available in `system/light_sleep` directory. // ESP_ERROR_CHECK(touch_element_enable_light_sleep(&sleep_config)); ESP_ERROR_CHECK(touch_element_enable_deep_sleep(button_handle[0], &sleep_config)); - // ESP_ERROR_CHECK(touch_element_sleep_enable_wakeup_calibration(button_handle[0], false)); // (optional) Disable wakeup calibration to prevent updating the baseline to a wrong value + // ESP_ERROR_CHECK(touch_element_sleep_enable_wakeup_calibration(button_handle[0], false)); // (optional) Disable wakeup calibration to prevent updating the benchmark to a wrong value touch_element_start(); diff --git a/tools/ci/check_copyright_ignore.txt b/tools/ci/check_copyright_ignore.txt index 287137abcb9e..713934c48f14 100644 --- a/tools/ci/check_copyright_ignore.txt +++ b/tools/ci/check_copyright_ignore.txt @@ -687,7 +687,6 @@ components/soc/esp32s3/include/soc/rtc_io_reg.h components/soc/esp32s3/include/soc/rtc_io_struct.h components/soc/esp32s3/include/soc/sdmmc_pins.h components/soc/esp32s3/include/soc/sdmmc_reg.h -components/soc/esp32s3/include/soc/sens_reg.h components/soc/esp32s3/include/soc/sensitive_reg.h components/soc/esp32s3/include/soc/sensitive_struct.h components/soc/esp32s3/include/soc/soc_ulp.h From d81546628a06eb4d561de714ff295b7e7d3a5e23 Mon Sep 17 00:00:00 2001 From: Chen Jichang Date: Wed, 19 Jun 2024 21:42:03 +0800 Subject: [PATCH 07/73] feat(pcnt): add support for step notify PCNT can add watch of value increment that we call step notify. This commit add a step notify driver and a test for the driver. Closes https://github.com/espressif/esp-idf/issues/9604 Closes https://github.com/espressif/esp-idf/issues/12136 --- .../include/driver/pulse_cnt.h | 34 +++++- components/esp_driver_pcnt/src/pulse_cnt.c | 86 +++++++++++++- .../test_apps/pulse_cnt/main/test_pulse_cnt.c | 110 +++++++++++++++++- components/hal/esp32c5/include/hal/pcnt_ll.h | 6 + components/hal/include/hal/pcnt_types.h | 2 +- .../esp32c5/include/soc/Kconfig.soc_caps.in | 4 + components/soc/esp32c5/include/soc/soc_caps.h | 2 +- docs/en/api-reference/peripherals/pcnt.rst | 61 ++++++++-- docs/zh_CN/api-reference/peripherals/pcnt.rst | 61 ++++++++-- 9 files changed, 340 insertions(+), 26 deletions(-) diff --git a/components/esp_driver_pcnt/include/driver/pulse_cnt.h b/components/esp_driver_pcnt/include/driver/pulse_cnt.h index f1a66c6c3d4a..24123b11ff2b 100644 --- a/components/esp_driver_pcnt/include/driver/pulse_cnt.h +++ b/components/esp_driver_pcnt/include/driver/pulse_cnt.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -52,7 +52,7 @@ typedef bool (*pcnt_watch_cb_t)(pcnt_unit_handle_t unit, const pcnt_watch_event_ * @note When CONFIG_PCNT_ISR_IRAM_SAFE is enabled, the callback itself and functions callbed by it should be placed in IRAM. */ typedef struct { - pcnt_watch_cb_t on_reach; /*!< Called when PCNT unit counter reaches any watch point */ + pcnt_watch_cb_t on_reach; /*!< Called when PCNT unit counter reaches any watch point or step notify*/ } pcnt_event_callbacks_t; /** @@ -65,6 +65,10 @@ typedef struct { if set to 0, the driver will try to allocate an interrupt with a relative low priority (1,2,3) */ struct { uint32_t accum_count: 1; /*!< Whether to accumulate the count value when overflows at the high/low limit */ +#if SOC_PCNT_SUPPORT_STEP_NOTIFY + uint32_t en_step_notify_up: 1; /*!< Enable step notify in the positive direction*/ + uint32_t en_step_notify_down: 1; /*!< Enable step notify in the negative direction*/ +#endif } flags; /*!< Extra flags */ } pcnt_unit_config_t; @@ -283,7 +287,6 @@ esp_err_t pcnt_unit_register_event_callbacks(pcnt_unit_handle_t unit, const pcnt /** * @brief Add a watch point for PCNT unit, PCNT will generate an event when the counter value reaches the watch point value * - * * @param[in] unit PCNT unit handle created by `pcnt_new_unit()` * @param[in] watch_point Value to be watched * @return @@ -308,6 +311,31 @@ esp_err_t pcnt_unit_add_watch_point(pcnt_unit_handle_t unit, int watch_point); */ esp_err_t pcnt_unit_remove_watch_point(pcnt_unit_handle_t unit, int watch_point); +/** + * @brief Add a step notify for PCNT unit, PCNT will generate an event when the incremental(can be positive or negative) of counter value reaches the step interval + * + * @param[in] unit PCNT unit handle created by `pcnt_new_unit()` + * @param[in] step_interval PCNT step notify interval value + * @return + * - ESP_OK: Add step notify successfully + * - ESP_ERR_INVALID_ARG: Add step notify failed because of invalid argument (e.g. the value incremental to be watched is out of the limitation set in `pcnt_unit_config_t`) + * - ESP_ERR_INVALID_STATE: Add step notify failed because the step notify has already been added + * - ESP_FAIL: Add step notify failed because of other error + */ +esp_err_t pcnt_unit_add_watch_step(pcnt_unit_handle_t unit, int step_interval); + +/** + * @brief Remove a step notify for PCNT unit + * + * @param[in] unit PCNT unit handle created by `pcnt_new_unit()` + * @return + * - ESP_OK: Remove step notify successfully + * - ESP_ERR_INVALID_ARG: Remove step notify failed because of invalid argument + * - ESP_ERR_INVALID_STATE: Remove step notify failed because the step notify was not added by `pcnt_unit_add_watch_step()` yet + * - ESP_FAIL: Remove step notify failed because of other error + */ +esp_err_t pcnt_unit_remove_watch_step(pcnt_unit_handle_t unit); + /** * @brief Create PCNT channel for specific unit, each PCNT has several channels associated with it * diff --git a/components/esp_driver_pcnt/src/pulse_cnt.c b/components/esp_driver_pcnt/src/pulse_cnt.c index ce9619de23ae..2d4b22231bea 100644 --- a/components/esp_driver_pcnt/src/pulse_cnt.c +++ b/components/esp_driver_pcnt/src/pulse_cnt.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -93,8 +93,10 @@ struct pcnt_unit_t { int unit_id; // allocated unit numerical ID int low_limit; // low limit value int high_limit; // high limit value - int clear_signal_gpio_num; // which gpio clear signal input + int step_limit; // step limit value + int clear_signal_gpio_num; // which gpio clear signal input int accum_value; // accumulated count value + int step_interval; // PCNT step notify interval value pcnt_chan_t *channels[SOC_PCNT_CHANNELS_PER_UNIT]; // array of PCNT channels pcnt_watch_point_t watchers[PCNT_LL_WATCH_EVENT_MAX]; // array of PCNT watchers intr_handle_t intr; // interrupt handle @@ -107,6 +109,10 @@ struct pcnt_unit_t { void *user_data; // user data registered by user, which would be passed to the right callback function struct { uint32_t accum_count: 1; /*!< Whether to accumulate the count value when overflows at the high/low limit */ +#if SOC_PCNT_SUPPORT_STEP_NOTIFY + uint32_t en_step_notify_up: 1; /*!< Enable step notify in the positive direction*/ + uint32_t en_step_notify_down: 1; /*!< Enable step notify in the negative direction*/ +#endif } flags; }; @@ -194,7 +200,9 @@ esp_err_t pcnt_new_unit(const pcnt_unit_config_t *config, pcnt_unit_handle_t *re ESP_GOTO_ON_FALSE(1 << (config->intr_priority) & PCNT_ALLOW_INTR_PRIORITY_MASK, ESP_ERR_INVALID_ARG, err, TAG, "invalid interrupt priority:%d", config->intr_priority); } - +#if PCNT_LL_STEP_NOTIFY_DIR_LIMIT + ESP_GOTO_ON_FALSE(!(config->flags.en_step_notify_up && config->flags.en_step_notify_down), ESP_ERR_NOT_SUPPORTED, err, TAG, "This target can only notify in one direction"); +#endif unit = heap_caps_calloc(1, sizeof(pcnt_unit_t), PCNT_MEM_ALLOC_CAPS); ESP_GOTO_ON_FALSE(unit, ESP_ERR_NO_MEM, err, TAG, "no mem for unit"); // register unit to the group (because one group can have several units) @@ -244,6 +252,19 @@ esp_err_t pcnt_new_unit(const pcnt_unit_config_t *config, pcnt_unit_handle_t *re unit->clear_signal_gpio_num = -1; unit->flags.accum_count = config->flags.accum_count; +#if SOC_PCNT_SUPPORT_STEP_NOTIFY + unit->flags.en_step_notify_down = config->flags.en_step_notify_down; + unit->flags.en_step_notify_up = config->flags.en_step_notify_up; +#if PCNT_LL_STEP_NOTIFY_DIR_LIMIT + if (config->flags.en_step_notify_up) { + unit->step_limit = config->high_limit; + } else if (config->flags.en_step_notify_down) { + unit->step_limit = config->low_limit; + } + pcnt_ll_set_step_limit_value(group->hal.dev, unit_id, unit->step_limit); +#endif +#endif + // clear/pause register is shared by all units, so using group's spinlock portENTER_CRITICAL(&group->spinlock); pcnt_ll_stop_count(group->hal.dev, unit_id); @@ -622,6 +643,51 @@ esp_err_t pcnt_unit_remove_watch_point(pcnt_unit_handle_t unit, int watch_point) return ESP_OK; } +#if SOC_PCNT_SUPPORT_STEP_NOTIFY +esp_err_t pcnt_unit_add_watch_step(pcnt_unit_handle_t unit, int step_interval) +{ + pcnt_group_t *group = NULL; + + ESP_RETURN_ON_FALSE(unit, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + ESP_RETURN_ON_FALSE((step_interval > 0 && unit->flags.en_step_notify_up) || (step_interval < 0 && unit->flags.en_step_notify_down), + ESP_ERR_INVALID_ARG, TAG, "invalid step interval"); + ESP_RETURN_ON_FALSE(unit->flags.en_step_notify_up || unit->flags.en_step_notify_down, + ESP_ERR_INVALID_STATE, TAG, "step limit is not enabled yet"); + ESP_RETURN_ON_FALSE(unit->step_interval == 0, + ESP_ERR_INVALID_STATE, TAG, "watch step has been set to %d already", unit->step_interval); + ESP_RETURN_ON_FALSE(step_interval >= unit->low_limit && step_interval <= unit->high_limit, + ESP_ERR_INVALID_ARG, TAG, "step interval out of range [%d,%d]", unit->low_limit, unit->high_limit); + ESP_RETURN_ON_FALSE(unit->step_limit % step_interval == 0, + ESP_ERR_INVALID_ARG, TAG, "step interval should be a divisor of step limit"); + + group = unit->group; + unit->step_interval = step_interval; + pcnt_ll_set_step_value(group->hal.dev, unit->unit_id, step_interval); + // different units are mixing in the same register, so we use the group's spinlock here + portENTER_CRITICAL(&group->spinlock); + pcnt_ll_enable_step_notify(group->hal.dev, unit->unit_id, true); + portEXIT_CRITICAL(&group->spinlock); + + return ESP_OK; +} + +esp_err_t pcnt_unit_remove_watch_step(pcnt_unit_handle_t unit) +{ + pcnt_group_t *group = NULL; + ESP_RETURN_ON_FALSE(unit, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + group = unit->group; + ESP_RETURN_ON_FALSE(unit->step_interval != 0, ESP_ERR_INVALID_STATE, TAG, "watch step not added yet"); + + unit->step_interval = 0; + + portENTER_CRITICAL(&group->spinlock); + pcnt_ll_enable_step_notify(group->hal.dev, unit->unit_id, false); + portEXIT_CRITICAL(&group->spinlock); + + return ESP_OK; +} +#endif //SOC_PCNT_SUPPORT_STEP_NOTIFY + esp_err_t pcnt_new_channel(pcnt_unit_handle_t unit, const pcnt_chan_config_t *config, pcnt_channel_handle_t *ret_chan) { esp_err_t ret = ESP_OK; @@ -841,13 +907,21 @@ IRAM_ATTR static void pcnt_default_isr(void *args) } else if (event_id == PCNT_LL_WATCH_EVENT_HIGH_LIMIT) { unit->accum_value += unit->high_limit; } +#if SOC_PCNT_SUPPORT_STEP_NOTIFY + // zero cross event priority is higher than step limit event, ensure to accumulate the value when the zero cross is caused by step limit + if ((event_id == PCNT_LL_WATCH_EVENT_ZERO_CROSS) && (event_status & 1 << PCNT_LL_STEP_EVENT_REACH_LIMIT)) { + unit->accum_value += unit->step_limit; + } else if (event_id == PCNT_LL_STEP_EVENT_REACH_LIMIT) { + unit->accum_value += unit->step_limit; + } +#endif } portEXIT_CRITICAL_ISR(&unit->spinlock); // invoked user registered callback if (on_reach) { pcnt_watch_event_data_t edata = { - .watch_point_value = unit->watchers[event_id].watch_point_value, + .watch_point_value = event_id < PCNT_LL_WATCH_EVENT_MAX ? unit->watchers[event_id].watch_point_value : pcnt_ll_get_count(group->hal.dev, unit_id), .zero_cross_mode = pcnt_ll_get_zero_cross_mode(group->hal.dev, unit_id), }; if (on_reach(unit, &edata, unit->user_data)) { @@ -855,6 +929,10 @@ IRAM_ATTR static void pcnt_default_isr(void *args) need_yield = true; } } +#if SOC_PCNT_SUPPORT_STEP_NOTIFY + // The priority of step and step limit event is lowest. Clear the step and step limit event to ensure that in a particular point, event can only be triggered once + event_status &= ~(1 << PCNT_LL_STEP_EVENT_REACH_INTERVAL | 1 << PCNT_LL_STEP_EVENT_REACH_LIMIT); +#endif } } if (need_yield) { diff --git a/components/esp_driver_pcnt/test_apps/pulse_cnt/main/test_pulse_cnt.c b/components/esp_driver_pcnt/test_apps/pulse_cnt/main/test_pulse_cnt.c index 6257202c27b3..4fcdbeaafa9e 100644 --- a/components/esp_driver_pcnt/test_apps/pulse_cnt/main/test_pulse_cnt.c +++ b/components/esp_driver_pcnt/test_apps/pulse_cnt/main/test_pulse_cnt.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -581,3 +581,111 @@ TEST_CASE("pcnt_zero_input_signal", "[pcnt]") TEST_ESP_OK(pcnt_del_unit(unit)); } #endif // SOC_PCNT_SUPPORT_CLEAR_SIGNAL + +#if SOC_PCNT_SUPPORT_STEP_NOTIFY +TEST_CASE("pcnt_step_notify_event", "[pcnt]") +{ + pcnt_unit_config_t unit_config = { + .low_limit = -100, + .high_limit = 100, + .flags.accum_count = true, + .flags.en_step_notify_down = true, + }; + + printf("install pcnt unit\r\n"); + pcnt_unit_handle_t unit = NULL; + TEST_ESP_OK(pcnt_new_unit(&unit_config, &unit)); + pcnt_glitch_filter_config_t filter_config = { + .max_glitch_ns = 1000, + }; + TEST_ESP_OK(pcnt_unit_set_glitch_filter(unit, &filter_config)); + + printf("install two pcnt channels with different edge/level action\r\n"); + pcnt_chan_config_t channel_config = { + .edge_gpio_num = TEST_PCNT_GPIO_A, + .level_gpio_num = TEST_PCNT_GPIO_B, + .flags.io_loop_back = true, + }; + pcnt_channel_handle_t channelA = NULL; + TEST_ESP_OK(pcnt_new_channel(unit, &channel_config, &channelA)); + TEST_ESP_OK(pcnt_channel_set_edge_action(channelA, PCNT_CHANNEL_EDGE_ACTION_DECREASE, PCNT_CHANNEL_EDGE_ACTION_HOLD)); + TEST_ESP_OK(pcnt_channel_set_level_action(channelA, PCNT_CHANNEL_LEVEL_ACTION_KEEP, PCNT_CHANNEL_LEVEL_ACTION_HOLD)); + + // ensure the simulation signal in a stable state + TEST_ESP_OK(gpio_set_level(TEST_PCNT_GPIO_A, 1)); + TEST_ESP_OK(gpio_set_level(TEST_PCNT_GPIO_B, 1)); + + pcnt_event_callbacks_t cbs = { + .on_reach = test_pcnt_quadrature_reach_watch_point, + }; + test_pcnt_quadrature_context_t user_data = { + .index = 0, + .triggered_watch_values = {0}, + }; + TEST_ESP_OK(pcnt_unit_register_event_callbacks(unit, &cbs, &user_data)); + + printf("add step notify\r\n"); + TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, pcnt_unit_add_watch_step(unit, 0)); + TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, pcnt_unit_add_watch_step(unit, 20)); + TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, pcnt_unit_add_watch_step(unit, -120)); + TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, pcnt_unit_add_watch_step(unit, -30)); + TEST_ESP_OK(pcnt_unit_add_watch_step(unit, -50)); + TEST_ASSERT_EQUAL(ESP_ERR_INVALID_STATE, pcnt_unit_add_watch_step(unit, -100)); + TEST_ESP_OK(pcnt_unit_add_watch_point(unit, -100)); + TEST_ESP_OK(pcnt_unit_add_watch_point(unit, 0)); + TEST_ESP_OK(pcnt_unit_add_watch_point(unit, -50)); +#if !SOC_PCNT_SUPPORT_RUNTIME_THRES_UPDATE + // the above added watch point won't take effect at once, unless we clear the internal counter manually + TEST_ESP_OK(pcnt_unit_clear_count(unit)); +#endif + + TEST_ESP_OK(pcnt_unit_enable(unit)); + TEST_ESP_OK(pcnt_unit_start(unit)); + int count_value; + + // trigger 150 rising edge on GPIO + test_gpio_simulate_rising_edge(TEST_PCNT_GPIO_A, 150); + + printf("checking count value\r\n"); + TEST_ESP_OK(pcnt_unit_get_count(unit, &count_value)); + printf("count_value=%d\r\n", count_value); + + for (int i = 0 ; i < user_data.index; i++) { + printf("%d:%d\r\n", i, user_data.triggered_watch_values[i]); + } + TEST_ASSERT_EQUAL(-150, count_value); + TEST_ASSERT_EQUAL(4, user_data.index); + TEST_ASSERT_EQUAL(-50, user_data.triggered_watch_values[0]); + TEST_ASSERT_EQUAL(-100, user_data.triggered_watch_values[1]); + TEST_ASSERT_EQUAL(-0, user_data.triggered_watch_values[2]); + TEST_ASSERT_EQUAL(-50, user_data.triggered_watch_values[3]); + + printf("add a new step interval\r\n"); + TEST_ESP_OK(pcnt_unit_remove_watch_step(unit)); + TEST_ESP_OK(pcnt_unit_clear_count(unit)); + TEST_ESP_OK(pcnt_unit_add_watch_step(unit, -100)); + user_data.index = 0; + + test_gpio_simulate_rising_edge(TEST_PCNT_GPIO_A, 120); + + printf("checking count value\r\n"); + TEST_ESP_OK(pcnt_unit_get_count(unit, &count_value)); + printf("count_value=%d\r\n", count_value); + for (int i = 0 ; i < user_data.index; i++) { + printf("%d:%d\r\n", i, user_data.triggered_watch_values[i]); + } + + TEST_ASSERT_EQUAL(-120, count_value); + TEST_ASSERT_EQUAL(3, user_data.index); + TEST_ASSERT_EQUAL(-50, user_data.triggered_watch_values[0]); + TEST_ASSERT_EQUAL(-100, user_data.triggered_watch_values[1]); + TEST_ASSERT_EQUAL(0, user_data.triggered_watch_values[2]); + printf("remove step_notify and uninstall channels\r\n"); + TEST_ESP_OK(pcnt_unit_remove_watch_step(unit)); + TEST_ASSERT_EQUAL(ESP_ERR_INVALID_STATE, pcnt_unit_remove_watch_step(unit)); + TEST_ESP_OK(pcnt_del_channel(channelA)); + TEST_ESP_OK(pcnt_unit_stop(unit)); + TEST_ESP_OK(pcnt_unit_disable(unit)); + TEST_ESP_OK(pcnt_del_unit(unit)); +} +#endif // SOC_PCNT_SUPPORT_STEP_NOTIFY diff --git a/components/hal/esp32c5/include/hal/pcnt_ll.h b/components/hal/esp32c5/include/hal/pcnt_ll.h index ddf151b677f0..adce89648885 100644 --- a/components/hal/esp32c5/include/hal/pcnt_ll.h +++ b/components/hal/esp32c5/include/hal/pcnt_ll.h @@ -33,6 +33,12 @@ typedef enum { PCNT_LL_WATCH_EVENT_MAX } pcnt_ll_watch_event_id_t; +typedef enum { + PCNT_LL_STEP_EVENT_REACH_LIMIT = PCNT_LL_WATCH_EVENT_MAX, + PCNT_LL_STEP_EVENT_REACH_INTERVAL +} pcnt_ll_step_event_id_t; + +#define PCNT_LL_STEP_NOTIFY_DIR_LIMIT 1 #define PCNT_LL_WATCH_EVENT_MASK ((1 << PCNT_LL_WATCH_EVENT_MAX) - 1) #define PCNT_LL_UNIT_WATCH_EVENT(unit_id) (1 << (unit_id)) diff --git a/components/hal/include/hal/pcnt_types.h b/components/hal/include/hal/pcnt_types.h index 8af94e879ebe..78372a3171d3 100644 --- a/components/hal/include/hal/pcnt_types.h +++ b/components/hal/include/hal/pcnt_types.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ diff --git a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in index 350028fc22ef..74c3b830866c 100644 --- a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in @@ -467,6 +467,10 @@ config SOC_PCNT_SUPPORT_CLEAR_SIGNAL bool default y +config SOC_PCNT_SUPPORT_STEP_NOTIFY + bool + default y + config SOC_RMT_GROUPS int default 1 diff --git a/components/soc/esp32c5/include/soc/soc_caps.h b/components/soc/esp32c5/include/soc/soc_caps.h index 2d20f280f9a4..2fc116b0dd82 100644 --- a/components/soc/esp32c5/include/soc/soc_caps.h +++ b/components/soc/esp32c5/include/soc/soc_caps.h @@ -303,7 +303,7 @@ #define SOC_PCNT_THRES_POINT_PER_UNIT 2 #define SOC_PCNT_SUPPORT_RUNTIME_THRES_UPDATE 1 #define SOC_PCNT_SUPPORT_CLEAR_SIGNAL 1 -// #define SOC_PCNT_SUPPORT_STEP_NOTIFY 1 // IDF-7984 +#define SOC_PCNT_SUPPORT_STEP_NOTIFY 1 /*--------------------------- RMT CAPS ---------------------------------------*/ #define SOC_RMT_GROUPS 1U /*!< One RMT group */ diff --git a/docs/en/api-reference/peripherals/pcnt.rst b/docs/en/api-reference/peripherals/pcnt.rst index 688417ffc59a..a91693eb3315 100644 --- a/docs/en/api-reference/peripherals/pcnt.rst +++ b/docs/en/api-reference/peripherals/pcnt.rst @@ -25,6 +25,7 @@ Description of the PCNT functionality is divided into the following sections: - :ref:`pcnt-resource-allocation` - covers how to allocate PCNT units and channels with properly set of configurations. It also covers how to recycle the resources when they finished working. - :ref:`pcnt-setup-channel-actions` - covers how to configure the PCNT channel to behave on different signal edges and levels. - :ref:`pcnt-watch-points` - describes how to configure PCNT watch points (i.e., tell PCNT unit to trigger an event when the count reaches a certain value). + :SOC_PCNT_SUPPORT_STEP_NOTIFY: - :ref:`pcnt-step-notify` - describes how to configure PCNT watch step (i.e., tell PCNT unit to trigger an event when the count increment reaches a certain value). - :ref:`pcnt-register-event-callbacks` - describes how to hook your specific code to the watch point event callback function. - :ref:`pcnt-set-glitch-filter` - describes how to enable and set the timing parameters for the internal glitch filter. :SOC_PCNT_SUPPORT_CLEAR_SIGNAL: - :ref:`pcnt-set-clear-signal` - describes how to set the parameters for the external clear signal. @@ -47,9 +48,13 @@ Install PCNT Unit To install a PCNT unit, there is a configuration structure that needs to be given in advance: :cpp:type:`pcnt_unit_config_t`: -- :cpp:member:`pcnt_unit_config_t::low_limit` and :cpp:member:`pcnt_unit_config_t::high_limit` specify the range for the internal hardware counter. The counter will reset to zero automatically when it crosses either the high or low limit. -- :cpp:member:`pcnt_unit_config_t::accum_count` sets whether to create an internal accumulator for the counter. This is helpful when you want to extend the counter's width, which by default is 16 bit at most, defined in the hardware. See also :ref:`pcnt-compensate-overflow-loss` for how to use this feature to compensate the overflow loss. -- :cpp:member:`pcnt_unit_config_t::intr_priority` sets the priority of the interrupt. If it is set to ``0``, the driver will allocate an interrupt with a default priority. Otherwise, the driver will use the given priority. +.. list:: + + - :cpp:member:`pcnt_unit_config_t::low_limit` and :cpp:member:`pcnt_unit_config_t::high_limit` specify the range for the internal hardware counter. The counter will reset to zero automatically when it crosses either the high or low limit. + - :cpp:member:`pcnt_unit_config_t::accum_count` sets whether to create an internal accumulator for the counter. This is helpful when you want to extend the counter's width, which by default is 16 bit at most, defined in the hardware. See also :ref:`pcnt-compensate-overflow-loss` for how to use this feature to compensate the overflow loss. + :SOC_PCNT_SUPPORT_STEP_NOTIFY: - :cpp:member:`pcnt_unit_config_t::en_step_notify_up` Configure whether to enable watch step to count in the positive direction. + :SOC_PCNT_SUPPORT_STEP_NOTIFY: - :cpp:member:`pcnt_unit_config_t::en_step_notify_down` Configure whether to enable watch step to count in the negative direction. + - :cpp:member:`pcnt_unit_config_t::intr_priority` sets the priority of the interrupt. If it is set to ``0``, the driver will allocate an interrupt with a default priority. Otherwise, the driver will use the given priority. .. note:: @@ -141,7 +146,36 @@ It is recommended to remove the unused watch point by :cpp:func:`pcnt_unit_remov Due to the hardware limitation, after adding a watch point, you should call :cpp:func:`pcnt_unit_clear_count` to make it take effect. -.. _pcnt-register-event-callbacks: +.. only:: SOC_PCNT_SUPPORT_STEP_NOTIFY + + .. _pcnt-step-notify: + + Watch Step + ^^^^^^^^^^^ + + PCNT unit can be configured to watch a specific value increment(can be positive or negative) that you are interested in. The function of watching value increment is also called **Watch Step**. To install watch step requires enabling :cpp:member:`pcnt_unit_config_t::en_step_notify_up` or :cpp:member:`pcnt_unit_config_t::en_step_notify_down`. The step interval itself can not exceed the range set in :cpp:type:`pcnt_unit_config_t` by :cpp:member:`pcnt_unit_config_t::low_limit` and :cpp:member:`pcnt_unit_config_t::high_limit`.When the counter increment reaches step interval, a watch event will be triggered and notify you by interrupt if any watch event callback has ever registered in :cpp:func:`pcnt_unit_register_event_callbacks`. See :ref:`pcnt-register-event-callbacks` for how to register event callbacks. + + The watch step can be added and removed by :cpp:func:`pcnt_unit_add_watch_step` and :cpp:func:`pcnt_unit_remove_watch_step`. You can not add multiple watch step, otherwise it will return error :c:macro:`ESP_ERR_INVALID_STATE`。 + + It is recommended to remove the unused watch step by :cpp:func:`pcnt_unit_remove_watch_step` to recycle the watch step resources. + + .. note:: + + When a watch step and a watch point are triggered at the same time, only one interrupt event will be generated. + The step interval must be a divisor of :cpp:member:`pcnt_unit_config_t::low_limit` or :cpp:member:`pcnt_unit_config_t::high_limit`. + + .. code:: c + + // add positive direction watch step with 100 step intervals + ESP_ERROR_CHECK(pcnt_unit_add_watch_step(pcnt_unit, 100)); + + .. _pcnt-register-event-callbacks: + +.. only:: not SOC_PCNT_SUPPORT_STEP_NOTIFY + + .. _pcnt-register-event-callbacks: + + Register Event Callbacks ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -152,10 +186,18 @@ When PCNT unit reaches any enabled watch point, specific event will be generated You can save their own context to :cpp:func:`pcnt_unit_register_event_callbacks` as well, via the parameter ``user_ctx``. This user data will be directly passed to the callback functions. -In the callback function, the driver will fill in the event data of specific event. For example, the watch point event data is declared as :cpp:type:`pcnt_watch_event_data_t`: +.. only:: SOC_PCNT_SUPPORT_STEP_NOTIFY -- :cpp:member:`pcnt_watch_event_data_t::watch_point_value` saves the watch point value that triggers the event. -- :cpp:member:`pcnt_watch_event_data_t::zero_cross_mode` saves how the PCNT unit crosses the zero point in the latest time. The possible zero cross modes are listed in the :cpp:type:`pcnt_unit_zero_cross_mode_t`. Usually different zero cross mode means different **counting direction** and **counting step size**. + In the callback function, the driver will fill in the event data of specific event. For example, the watch point event or watch step event data is declared as :cpp:type:`pcnt_watch_event_data_t`: + +.. only:: not SOC_PCNT_SUPPORT_STEP_NOTIFY + + In the callback function, the driver will fill in the event data of specific event. For example, the watch point event data is declared as :cpp:type:`pcnt_watch_event_data_t`: + +.. list:: + :SOC_PCNT_SUPPORT_STEP_NOTIFY: - :cpp:member:`pcnt_watch_event_data_t::watch_point_value` saves the watch point value or watch step value that triggers the event. + :not SOC_PCNT_SUPPORT_STEP_NOTIFY: - :cpp:member:`pcnt_watch_event_data_t::watch_point_value` saves the watch point value that triggers the event. + - :cpp:member:`pcnt_watch_event_data_t::zero_cross_mode` saves how the PCNT unit crosses the zero point in the latest time. The possible zero cross modes are listed in the :cpp:type:`pcnt_unit_zero_cross_mode_t`. Usually different zero cross mode means different **counting direction** and **counting step size**. Registering callback function results in lazy installation of interrupt service, thus this function should only be called before the unit is enabled by :cpp:func:`pcnt_unit_enable`. Otherwise, it can return :c:macro:`ESP_ERR_INVALID_STATE` error. @@ -284,7 +326,10 @@ The internal hardware counter will be cleared to zero automatically when it reac .. note:: - :cpp:func:`pcnt_unit_clear_count` resets the accumulated count value as well. + .. list:: + + - :cpp:func:`pcnt_unit_clear_count` resets the accumulated count value as well. + :SOC_PCNT_SUPPORT_STEP_NOTIFY: - setting the watch step will also enable the accumulator. .. _pcnt-power-management: diff --git a/docs/zh_CN/api-reference/peripherals/pcnt.rst b/docs/zh_CN/api-reference/peripherals/pcnt.rst index 3de14ab0d9eb..4876b37bd05c 100644 --- a/docs/zh_CN/api-reference/peripherals/pcnt.rst +++ b/docs/zh_CN/api-reference/peripherals/pcnt.rst @@ -25,6 +25,7 @@ PCNT 的功能从以下几个方面进行说明: - :ref:`pcnt-resource-allocation` - 说明如何通过配置分配 PCNT 单元和通道,以及在相应操作完成之后,如何回收单元和通道。 - :ref:`pcnt-setup-channel-actions` - 说明如何设置通道针对不同信号沿和电平进行操作。 - :ref:`pcnt-watch-points` - 说明如何配置观察点,即当计数达到某个数值时,命令 PCNT 单元触发某个事件。 + :SOC_PCNT_SUPPORT_STEP_NOTIFY: - :ref:`pcnt-step-notify` - 说明如何配置观察步进,即当计数增量达到某个数值时,命令 PCNT 单元触发某个事件。 - :ref:`pcnt-register-event-callbacks` - 说明如何将您的代码挂载到观察点事件的回调函数上。 - :ref:`pcnt-set-glitch-filter` - 说明如何使能毛刺滤波器并设置其时序参数。 :SOC_PCNT_SUPPORT_CLEAR_SIGNAL: - :ref:`pcnt-set-clear-signal` - 说明如何使能外部清零信号并设置其参数。 @@ -47,9 +48,13 @@ PCNT 单元和通道分别用 :cpp:type:`pcnt_unit_handle_t` 与 :cpp:type:`pcnt 安装 PCNT 单元时,需要先完成配置 :cpp:type:`pcnt_unit_config_t`: -- :cpp:member:`pcnt_unit_config_t::low_limit` 与 :cpp:member:`pcnt_unit_config_t::high_limit` 用于指定内部计数器的最小值和最大值。当计数器超过任一限值时,计数器将归零。 -- :cpp:member:`pcnt_unit_config_t::accum_count` 用于设置是否需要软件在硬件计数值溢出的时候进行累加保存,这有助于“拓宽”计数器的实际位宽。默认情况下,计数器的位宽最高只有 16 比特。请参考 :ref:`pcnt-compensate-overflow-loss` 了解如何利用此功能来补偿硬件计数器的溢出损失。 -- :cpp:member:`pcnt_unit_config_t::intr_priority` 设置中断的优先级。如果设置为 ``0``,则会分配一个默认优先级的中断,否则会使用指定的优先级。 +.. list:: + + - :cpp:member:`pcnt_unit_config_t::low_limit` 与 :cpp:member:`pcnt_unit_config_t::high_limit` 用于指定内部计数器的最小值和最大值。当计数器超过任一限值时,计数器将归零。 + - :cpp:member:`pcnt_unit_config_t::accum_count` 用于设置是否需要软件在硬件计数值溢出的时候进行累加保存,这有助于“拓宽”计数器的实际位宽。默认情况下,计数器的位宽最高只有 16 比特。请参考 :ref:`pcnt-compensate-overflow-loss` 了解如何利用此功能来补偿硬件计数器的溢出损失。 + :SOC_PCNT_SUPPORT_STEP_NOTIFY: - :cpp:member:`pcnt_unit_config_t::en_step_notify_up` 配置是否使能观察正方向步进。 + :SOC_PCNT_SUPPORT_STEP_NOTIFY: - :cpp:member:`pcnt_unit_config_t::en_step_notify_down` 配置是否使能观察负方向步进。 + - :cpp:member:`pcnt_unit_config_t::intr_priority` 设置中断的优先级。如果设置为 ``0``,则会分配一个默认优先级的中断,否则会使用指定的优先级。 .. note:: @@ -141,7 +146,36 @@ PCNT 单元可被设置为观察几个特定的数值,这些被观察的数值 由于硬件上的限制,在添加一个新的观察点后,你需要调用 :cpp:func:`pcnt_unit_clear_count` 函数来使之生效。 -.. _pcnt-register-event-callbacks: +.. only:: SOC_PCNT_SUPPORT_STEP_NOTIFY + + .. _pcnt-step-notify: + + PCNT 观察步进 + ^^^^^^^^^^^^^^^^ + + PCNT 单元可被设置为观察一个特定的数值增量(可以是正方向或负方向),这个观察数值增量的功能被称为 **观察步进**。启用观察步进需要使能 :cpp:member:`pcnt_unit_config_t::en_step_notify_up` 或 :cpp:member:`pcnt_unit_config_t::en_step_notify_down` 选项。 步进间隔不能超过 :cpp:type:`pcnt_unit_config_t` 设置的范围,最小值和最大值分别为 :cpp:member:`pcnt_unit_config_t::low_limit` 和 :cpp:member:`pcnt_unit_config_t::high_limit`。当计数器增量到达步进间隔时,会触发一个观察事件,如果在 :cpp:func:`pcnt_unit_register_event_callbacks` 注册过事件回调函数,该事件就会通过中断发送通知。关于如何注册事件回调函数,请参考 :ref:`pcnt-register-event-callbacks`。 + + 观察步进分别可以通过 :cpp:func:`pcnt_unit_add_watch_step` 和 :cpp:func:`pcnt_unit_remove_watch_step` 进行添加和删除。不能同时添加多个观察步进,否则将返回错误 :c:macro:`ESP_ERR_INVALID_STATE`。 + + 建议通过 :cpp:func:`pcnt_unit_remove_watch_step` 删除未使用的观察步进来回收资源。 + + .. note:: + + 当观察步进和观察点同时被触发时,只会产生一次中断事件。 + 步进间隔必须是 :cpp:member:`pcnt_unit_config_t::low_limit` 或 :cpp:member:`pcnt_unit_config_t::high_limit` 的因数。 + + .. code:: c + + // add positive direction step notify with 100 step intervals + ESP_ERROR_CHECK(pcnt_unit_add_watch_step(pcnt_unit, 100)); + + .. _pcnt-register-event-callbacks: + +.. only:: not SOC_PCNT_SUPPORT_STEP_NOTIFY + + .. _pcnt-register-event-callbacks: + + 注册事件回调函数 ^^^^^^^^^^^^^^^^^^^^ @@ -152,10 +186,18 @@ PCNT 单元可被设置为观察几个特定的数值,这些被观察的数值 可通过 ``user_ctx`` 将函数上下文保存到 :cpp:func:`pcnt_unit_register_event_callbacks` 中,这些数据会直接传递给回调函数。 -驱动程序会将特定事件的数据写入回调函数中,例如,观察点事件数据被声明为 :cpp:type:`pcnt_watch_event_data_t`: +.. only:: SOC_PCNT_SUPPORT_STEP_NOTIFY + + 驱动程序会将特定事件的数据写入回调函数中,例如,观察点事件或观察步进事件数据被声明为 :cpp:type:`pcnt_watch_event_data_t`: + +.. only:: not SOC_PCNT_SUPPORT_STEP_NOTIFY -- :cpp:member:`pcnt_watch_event_data_t::watch_point_value` 用于保存触发该事件的观察点数值。 -- :cpp:member:`pcnt_watch_event_data_t::zero_cross_mode` 用于保存上一次 PCNT 单元的过零模式,:cpp:type:`pcnt_unit_zero_cross_mode_t` 中列出了所有可能的过零模式。通常,不同的过零模式意味着不同的 **计数方向** 和 **计数步长**。 + 驱动程序会将特定事件的数据写入回调函数中,例如,观察点事件数据被声明为 :cpp:type:`pcnt_watch_event_data_t`: + +.. list:: + :SOC_PCNT_SUPPORT_STEP_NOTIFY: - :cpp:member:`pcnt_watch_event_data_t::watch_point_value` 用于保存触发该事件的观察点或观察步进的数值。 + :not SOC_PCNT_SUPPORT_STEP_NOTIFY: - :cpp:member:`pcnt_watch_event_data_t::watch_point_value` 用于保存触发该事件的观察点数值。 + - :cpp:member:`pcnt_watch_event_data_t::zero_cross_mode` 用于保存上一次 PCNT 单元的过零模式,:cpp:type:`pcnt_unit_zero_cross_mode_t` 中列出了所有可能的过零模式。通常,不同的过零模式意味着不同的 **计数方向** 和 **计数步长**。 注册回调函数会导致中断服务延迟安装,因此回调函数只能在 PCNT 单元被 :cpp:func:`pcnt_unit_enable` 使能之前调用。否则,回调函数会返回错误 :c:macro:`ESP_ERR_INVALID_STATE`。 @@ -284,7 +326,10 @@ PCNT 内部的硬件计数器会在计数达到高/低门限的时候自动清 .. note:: - :cpp:func:`pcnt_unit_clear_count` 会复位该软件累加器。 + .. list:: + + - :cpp:func:`pcnt_unit_clear_count` 会复位该软件累加器。 + :SOC_PCNT_SUPPORT_STEP_NOTIFY: - 设置观察步进后,同时也会启用软件累加器。 .. _pcnt-power-management: From 992d8bc5f20556adb62571d55a1517a9848d4b51 Mon Sep 17 00:00:00 2001 From: "C.S.M" Date: Wed, 19 Jun 2024 11:47:14 +0800 Subject: [PATCH 08/73] feat(i2c_master): Add an api for retrieveing handle via port, Closes https://github.com/espressif/esp-idf/issues/13968 --- components/esp_driver_i2c/i2c_common.c | 2 +- components/esp_driver_i2c/i2c_master.c | 22 ++++++++++++ components/esp_driver_i2c/i2c_private.h | 8 +++++ .../include/esp_private/i2c_platform.h | 36 +++++++++++++++++++ .../i2c_test_apps/main/test_i2c_common.c | 17 +++++++++ docs/en/api-reference/peripherals/i2c.rst | 21 +++++++++++ 6 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 components/esp_driver_i2c/include/esp_private/i2c_platform.h diff --git a/components/esp_driver_i2c/i2c_common.c b/components/esp_driver_i2c/i2c_common.c index 8c3f86952e00..19af0a2977a6 100644 --- a/components/esp_driver_i2c/i2c_common.c +++ b/components/esp_driver_i2c/i2c_common.c @@ -127,7 +127,7 @@ static esp_err_t s_i2c_bus_handle_acquire(i2c_port_num_t port_num, i2c_bus_handl return ret; } -static bool i2c_bus_occupied(i2c_port_num_t port_num) +bool i2c_bus_occupied(i2c_port_num_t port_num) { return s_i2c_platform.buses[port_num] != NULL; } diff --git a/components/esp_driver_i2c/i2c_master.c b/components/esp_driver_i2c/i2c_master.c index 66d2454a0df6..68fdd60cbede 100644 --- a/components/esp_driver_i2c/i2c_master.c +++ b/components/esp_driver_i2c/i2c_master.c @@ -46,6 +46,15 @@ static const char *TAG = "i2c.master"; #define I2C_FIFO_LEN(port_num) (SOC_I2C_FIFO_LEN) #endif +// Use the platform to same master bus handle +typedef struct i2c_master_bus_platform_t i2c_master_bus_platform_t; + +struct i2c_master_bus_platform_t { + i2c_master_bus_handle_t handle[SOC_I2C_NUM]; +}; + +static i2c_master_bus_platform_t s_platform; + static esp_err_t s_i2c_master_clear_bus(i2c_bus_handle_t handle) { #if !SOC_I2C_SUPPORT_HW_CLR_BUS @@ -989,6 +998,7 @@ esp_err_t i2c_new_master_bus(const i2c_master_bus_config_t *bus_config, i2c_mast xSemaphoreGive(i2c_master->cmd_semphr); *ret_bus_handle = i2c_master; + s_platform.handle[i2c_port_num] = i2c_master; return ESP_OK; err: @@ -1075,6 +1085,18 @@ esp_err_t i2c_master_bus_reset(i2c_master_bus_handle_t bus_handle) return ESP_OK; } +esp_err_t i2c_master_get_bus_handle(i2c_port_num_t port_num, i2c_master_bus_handle_t *ret_handle) +{ + ESP_RETURN_ON_FALSE((port_num < SOC_I2C_NUM), ESP_ERR_INVALID_ARG, TAG, "invalid i2c port number"); + if (i2c_bus_occupied(port_num) == false) { + ESP_LOGE(TAG, "this port has not been initialized, please initialize it first"); + return ESP_ERR_INVALID_STATE; + } else { + *ret_handle = s_platform.handle[port_num]; + } + return ESP_OK; +} + esp_err_t i2c_master_multi_buffer_transmit(i2c_master_dev_handle_t i2c_dev, i2c_master_transmit_multi_buffer_info_t *buffer_info_array, size_t array_size, int xfer_timeout_ms) { ESP_RETURN_ON_FALSE(i2c_dev != NULL, ESP_ERR_INVALID_ARG, TAG, "i2c handle not initialized"); diff --git a/components/esp_driver_i2c/i2c_private.h b/components/esp_driver_i2c/i2c_private.h index ae33a26ea6a0..a78dfdd06743 100644 --- a/components/esp_driver_i2c/i2c_private.h +++ b/components/esp_driver_i2c/i2c_private.h @@ -252,6 +252,14 @@ esp_err_t i2c_select_periph_clock(i2c_bus_handle_t handle, soc_module_clk_t clk_ */ esp_err_t i2c_common_set_pins(i2c_bus_handle_t handle); +/** + * @brief Check whether bus is acquired + * + * @param port_num number of port + * @return true if the bus is occupied, false if the bus is not occupied. +*/ +bool i2c_bus_occupied(i2c_port_num_t port_num); + #ifdef __cplusplus } #endif diff --git a/components/esp_driver_i2c/include/esp_private/i2c_platform.h b/components/esp_driver_i2c/include/esp_private/i2c_platform.h new file mode 100644 index 000000000000..f18cf53c99c0 --- /dev/null +++ b/components/esp_driver_i2c/include/esp_private/i2c_platform.h @@ -0,0 +1,36 @@ +/* + * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include +#include "esp_err.h" +#include "driver/i2c_types.h" +#include "hal/gpio_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Retrieves the I2C master bus handle for a specified I2C port number. + * + * This function retrieves the I2C master bus handle for the + * given I2C port number. Please make sure the handle has already been initialized, and this + * function would simply returns the existing handle. Note that the returned handle still can't be used concurrently + * + * @param port_num I2C port number for which the handle is to be retrieved. + * @param ret_handle Pointer to a variable where the retrieved handle will be stored. + * @return + * - ESP_OK: Success. The handle is retrieved successfully. + * - ESP_ERR_INVALID_ARG: Invalid argument, such as invalid port number + * - ESP_ERR_INVALID_STATE: Invalid state, such as the I2C port is not initialized. + */ +esp_err_t i2c_master_get_bus_handle(i2c_port_num_t port_num, i2c_master_bus_handle_t *ret_handle); + +#ifdef __cplusplus +} +#endif diff --git a/components/esp_driver_i2c/test_apps/i2c_test_apps/main/test_i2c_common.c b/components/esp_driver_i2c/test_apps/i2c_test_apps/main/test_i2c_common.c index 45ec47b06b04..91296a6eedd5 100644 --- a/components/esp_driver_i2c/test_apps/i2c_test_apps/main/test_i2c_common.c +++ b/components/esp_driver_i2c/test_apps/i2c_test_apps/main/test_i2c_common.c @@ -19,6 +19,7 @@ #include "esp_private/periph_ctrl.h" #include "driver/gpio.h" #include "driver/i2c_master.h" +#include "esp_private/i2c_platform.h" #include "esp_rom_gpio.h" #include "esp_log.h" #include "test_utils.h" @@ -345,3 +346,19 @@ TEST_CASE("I2C master transaction receive check nack return value", "[i2c]") TEST_ESP_ERR(ESP_ERR_INVALID_STATE, i2c_master_receive(dev_handle, data_rd, DATA_LENGTH, -1)); _test_i2c_del_bus_device(bus_handle, dev_handle); } + +TEST_CASE("Test get handle with known port", "[i2c]") +{ + i2c_master_bus_handle_t handle; + TEST_ESP_ERR(ESP_ERR_INVALID_ARG, i2c_master_get_bus_handle(10, &handle)); + TEST_ESP_ERR(ESP_ERR_INVALID_STATE, i2c_master_get_bus_handle(0, &handle)); + + i2c_master_bus_handle_t bus_handle; + i2c_master_dev_handle_t dev_handle; + _test_i2c_new_bus_device(&bus_handle, &dev_handle); + TEST_ESP_OK(i2c_master_get_bus_handle(0, &handle)); + + // Check the handle retrieved is as same as original handle + TEST_ASSERT((uint32_t)bus_handle == (uint32_t)handle); + _test_i2c_del_bus_device(bus_handle, dev_handle); +} diff --git a/docs/en/api-reference/peripherals/i2c.rst b/docs/en/api-reference/peripherals/i2c.rst index c1084ffeb48c..c0918c7dc7b5 100644 --- a/docs/en/api-reference/peripherals/i2c.rst +++ b/docs/en/api-reference/peripherals/i2c.rst @@ -150,6 +150,27 @@ Once the :cpp:type:`i2c_device_config_t` structure is populated with mandatory p i2c_master_dev_handle_t dev_handle; ESP_ERROR_CHECK(i2c_master_bus_add_device(bus_handle, &dev_cfg, &dev_handle)); +Get I2C master handle via port +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Given that i2c master handle has been initialized in some module(e.g. an audio module), an another module(e.g. a video module) is not convenient to reused the handle. We have a helper function, :cpp:func:`i2c_master_get_bus_handle` for getting the initialized handle via port. However, please make sure the handle has already been initialized ahead of time. Otherwise an error would be reported. + +.. code:: c + + // Source File 1 + #include "driver/i2c_master.h" + i2c_master_bus_handle_t bus_handle; + i2c_master_bus_config_t i2c_mst_config = { + ... // same as others + }; + ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_mst_config, &bus_handle)); + + // Source File 2 + #include "esp_private/i2c_platform.h" + #include "driver/i2c_master.h" + i2c_master_bus_handle_t handle; + ESP_ERROR_CHECK(i2c_master_get_bus_handle(0, &handle)); + .. only:: SOC_LP_I2C_SUPPORTED Install I2C master bus with LP I2C Peripheral From b286105d5fd2ce71b028eb0a5ac8d494cd78a024 Mon Sep 17 00:00:00 2001 From: Jan Beran Date: Mon, 17 Jun 2024 11:25:39 +0200 Subject: [PATCH 09/73] feat: Add unit tests for new wrapper commands --- .codespellrc | 2 +- tools/idf_py_actions/serial_ext.py | 40 ++++--- tools/test_idf_py/test_idf_py.py | 177 +++++++++++++++++++++++++++++ 3 files changed, 204 insertions(+), 15 deletions(-) diff --git a/.codespellrc b/.codespellrc index b79ebe6b0ad5..211f5a227267 100644 --- a/.codespellrc +++ b/.codespellrc @@ -1,4 +1,4 @@ [codespell] skip = build,*.yuv,components/fatfs/src/*,alice.txt,*.rgb,components/wpa_supplicant/*,components/esp_wifi/* -ignore-words-list = ser,dout,rsource,fram,inout,shs,ans,aci,unstall,unstalling,hart,wheight,wel,ot,fane +ignore-words-list = ser,dout,rsource,fram,inout,shs,ans,aci,unstall,unstalling,hart,wheight,wel,ot,fane,assertIn write-changes = true diff --git a/tools/idf_py_actions/serial_ext.py b/tools/idf_py_actions/serial_ext.py index 71b649b7c9f4..96f10258985d 100644 --- a/tools/idf_py_actions/serial_ext.py +++ b/tools/idf_py_actions/serial_ext.py @@ -9,7 +9,6 @@ from typing import Dict from typing import List from typing import Optional -from typing import Tuple import click from idf_py_actions.global_options import global_options @@ -405,7 +404,7 @@ def secure_generate_signing_key(action: str, ctx: click.core.Context, args: Prop if version: generate_signing_key_args += ['--version', version] if scheme: - generate_signing_key_args += ['--scheme', '2'] + generate_signing_key_args += ['--scheme', scheme] if extra_args['keyfile']: generate_signing_key_args += [extra_args['keyfile']] RunTool('espsecure', generate_signing_key_args, args.build_dir)() @@ -440,10 +439,13 @@ def secure_sign_data(action: str, def _parse_efuse_args(ctx: click.core.Context, args: PropertyDict, extra_args: Dict) -> List: efuse_args = [] - efuse_args += ['-p', args.port or get_default_serial_port()] - if args.baud: - efuse_args += ['-b', str(args.baud)] + if args.port: + efuse_args += ['-p', args.port] + elif not args.port and not extra_args['virt']: # if --virt, no port will be found and it would cause error + efuse_args += ['-p', get_default_serial_port()] efuse_args += ['--chip', _get_project_desc(ctx, args)['target']] + if extra_args['virt']: + efuse_args += ['--virt'] if extra_args['before']: efuse_args += ['--before', extra_args['before'].replace('-', '_')] if extra_args['debug']: @@ -470,8 +472,8 @@ def efuse_burn_key(action: str, ctx: click.core.Context, args: PropertyDict, **e burn_key_args += ['--force-write-always'] if extra_args['show_sensitive_info']: burn_key_args += ['--show-sensitive-info'] - if extra_args['image']: - burn_key_args.append(extra_args['image']) + if extra_args['efuse_positional_args']: + burn_key_args += extra_args['efuse_positional_args'] RunTool('espefuse.py', burn_key_args, args.project_dir, build_dir=args.build_dir)() def efuse_dump(action: str, ctx: click.core.Context, args: PropertyDict, file_name: str, **extra_args: Dict) -> None: @@ -490,14 +492,14 @@ def efuse_read_protect(action: str, ctx: click.core.Context, args: PropertyDict, read_protect_args += list(extra_args['efuse_positional_args']) RunTool('espefuse', read_protect_args, args.build_dir)() - def efuse_summary(action: str, ctx: click.core.Context, args: PropertyDict, format: str, **extra_args: Tuple) -> None: + def efuse_summary(action: str, ctx: click.core.Context, args: PropertyDict, format: str, **extra_args: Dict) -> None: ensure_build_directory(args, ctx.info_name) summary_args = [PYTHON, '-m' 'espefuse', 'summary'] summary_args += _parse_efuse_args(ctx, args, extra_args) if format: - summary_args += ['--format', format.replace('-', '_')] - if extra_args['efuses']: - summary_args += extra_args['efuse_name'] + summary_args += [f'--format={format.replace("-", "_")}'] + if extra_args['efuse_name']: + summary_args += [str(extra_args['efuse_name'])] RunTool('espefuse', summary_args, args.build_dir)() def efuse_write_protect(action: str, ctx: click.core.Context, args: PropertyDict, **extra_args: Dict) -> None: @@ -524,7 +526,13 @@ def efuse_write_protect(action: str, ctx: click.core.Context, args: PropertyDict } ] - EFUSE_OPTS = BAUD_AND_PORT + [ + EFUSE_OPTS = [PORT] + [ + { + 'names': ['--virt'], + 'is_flag': True, + 'hidden': True, + 'help': 'For host tests, the tool will work in the virtual mode (without connecting to a chip).', + }, { 'names': ['--before'], 'help': 'What to do before connecting to the chip.', @@ -802,6 +810,7 @@ def efuse_write_protect(action: str, ctx: click.core.Context, args: PropertyDict 'options': EFUSE_OPTS + [ { 'names': ['--no-protect-key'], + 'is_flag': True, 'help': ( 'Disable default read- and write-protecting of the key.' 'If this option is not set, once the key is flashed it cannot be read back or changed.' @@ -809,6 +818,7 @@ def efuse_write_protect(action: str, ctx: click.core.Context, args: PropertyDict }, { 'names': ['--force-write-always'], + 'is_flag': True, 'help': ( "Write the eFuse even if it looks like it's already been written, or is write protected." "Note that this option can't disable write protection, or clear any bit which has already been set." @@ -816,6 +826,7 @@ def efuse_write_protect(action: str, ctx: click.core.Context, args: PropertyDict }, { 'names': ['--show-sensitive-info'], + 'is_flag': True, 'help': ( 'Show data to be burned (may expose sensitive data). Enabled if --debug is used.' ), @@ -823,8 +834,8 @@ def efuse_write_protect(action: str, ctx: click.core.Context, args: PropertyDict ], 'arguments': [ { - 'names': ['image'], - 'nargs': 1, + 'names': ['efuse-positional-args'], + 'nargs': -1, }, ], }, @@ -866,6 +877,7 @@ def efuse_write_protect(action: str, ctx: click.core.Context, args: PropertyDict { 'names': ['efuse-name'], 'nargs': 1, + 'required': False, }, ], }, diff --git a/tools/test_idf_py/test_idf_py.py b/tools/test_idf_py/test_idf_py.py index 0a77a0ab9735..e10465174807 100755 --- a/tools/test_idf_py/test_idf_py.py +++ b/tools/test_idf_py/test_idf_py.py @@ -360,5 +360,182 @@ def test_missing_file(self): self.assertIn('(expansion of @args_non_existent) could not be opened', cm.exception.output.decode('utf-8', 'ignore')) +class TestWrapperCommands(TestCase): + @classmethod + def setUpClass(cls): + cls.sample_project_dir = os.path.join(current_dir, '..', 'test_build_system', 'build_test_app') + os.chdir(cls.sample_project_dir) + super().setUpClass() + + def call_command(self, command: List[str]) -> str: + try: + output = subprocess.check_output( + command, + env=os.environ, + stderr=subprocess.STDOUT).decode('utf-8', 'ignore') + return output + except subprocess.CalledProcessError as e: + self.fail(f'Process should have exited normally, but it exited with a return code of {e.returncode}') + + @classmethod + def tearDownClass(cls): + subprocess.run([sys.executable, idf_py_path, 'fullclean'], stdout=subprocess.DEVNULL) + os.chdir(current_dir) + super().tearDownClass() + + +class TestEFuseCommands(TestWrapperCommands): + """ + Test if wrapper commands for espefuse.py are working as expected. + The goal is NOT to test the functionality of espefuse.py, but to test if the wrapper commands are working as expected. + """ + + def test_efuse_summary(self): + summary_command = [sys.executable, idf_py_path, 'efuse-summary', '--virt'] + output = self.call_command(summary_command) + self.assertIn('EFUSE_NAME (Block) Description = [Meaningful Value] [Readable/Writeable] (Hex Value)', output) + + output = self.call_command(summary_command + ['--format','summary']) + self.assertIn('00:00:00:00:00:00', output) + self.assertIn('MAC address', output) + + output = self.call_command(summary_command + ['--format','value-only', 'WR_DIS']) + self.assertIn('0', output) + + def test_efuse_burn(self): + burn_command = [sys.executable, idf_py_path, 'efuse-burn', '--virt', '--do-not-confirm'] + output = self.call_command(burn_command + ['WR_DIS', '1']) + self.assertIn('\'WR_DIS\' (Efuse write disable mask) 0x0000 -> 0x0001', output) + self.assertIn('Successful', output) + + output = self.call_command(burn_command + ['WR_DIS', '1', 'RD_DIS', '1']) + self.assertIn('WR_DIS', output) + self.assertIn('RD_DIS', output) + self.assertIn('Successful', output) + + def test_efuse_burn_key(self): + key_name = 'efuse_test_key.bin' + subprocess.run([sys.executable, idf_py_path, 'secure-generate-flash-encryption-key', os.path.join(current_dir, key_name)], stdout=subprocess.DEVNULL) + burn_key_command = [sys.executable, idf_py_path, 'efuse-burn-key', '--virt', '--do-not-confirm'] + output = self.call_command(burn_key_command + ['--show-sensitive-info', 'secure_boot_v1', os.path.join(current_dir, key_name)]) + self.assertIn('Burn keys to blocks:', output) + self.assertIn('Successful', output) + + def test_efuse_dump(self): + dump_command = [sys.executable, idf_py_path, 'efuse-dump', '--virt'] + output = self.call_command(dump_command) + self.assertIn('BLOCK0', output) + self.assertIn('BLOCK1', output) + self.assertIn('BLOCK2', output) + self.assertIn('BLOCK3', output) + self.assertIn('read_regs', output) + + def test_efuse_read_protect(self): + read_protect_command = [sys.executable, idf_py_path, 'efuse-read-protect', '--virt', '--do-not-confirm'] + output = self.call_command(read_protect_command + ['MAC_VERSION']) + self.assertIn('MAC_VERSION', output) + self.assertIn('Successful', output) + + def test_efuse_write_protect(self): + write_protect_command = [sys.executable, idf_py_path, 'efuse-write-protect', '--virt', '--do-not-confirm'] + output = self.call_command(write_protect_command + ['WR_DIS']) + self.assertIn('WR_DIS', output) + self.assertIn('Successful', output) + + +class TestSecureCommands(TestWrapperCommands): + """ + Test if wrapper commands for espsecure.py are working as expected. + The goal is NOT to test the functionality of espsecure.py, but to test if the wrapper commands are working as expected. + """ + @classmethod + def setUpClass(cls): + super().setUpClass() + subprocess.run([sys.executable, idf_py_path, 'build'], stdout=subprocess.DEVNULL) + cls.flash_encryption_key = 'test_key.bin' + cls.signing_key = 'test_signing_key.pem' + + def secure_generate_flash_encryption_key(self): + generate_key_command = [sys.executable, idf_py_path, 'secure-generate-flash-encryption-key', self.flash_encryption_key] + output = self.call_command(generate_key_command) + self.assertIn(f'Writing 256 random bits to key file {self.flash_encryption_key}', output) + + def secure_encrypt_flash_data(self): + self.secure_generate_flash_encryption_key() + encrypt_command = [sys.executable, + idf_py_path, + 'secure-encrypt-flash-data', + '--aes-xts', + '--keyfile', + f'{self.flash_encryption_key}', + '--address', + '0x1000', + '--output', + 'bootloader-enc.bin', + 'bootloader/bootloader.bin'] + output = self.call_command(encrypt_command) + self.assertIn('Using 256-bit key', output) + self.assertIn('Done', output) + + def test_secure_decrypt_flash_data(self): + self.secure_encrypt_flash_data() + decrypt_command = [sys.executable, + idf_py_path, + 'secure-decrypt-flash-data', + '--aes-xts', + '--keyfile', + f'{self.flash_encryption_key}', + '--address', + '0x1000', + '--output', + 'bootloader-dec.bin', + 'bootloader-enc.bin'] + output = self.call_command(decrypt_command) + self.assertIn('Using 256-bit key', output) + self.assertIn('Done', output) + + def secure_generate_signing_key(self): + generate_key_command = [sys.executable, + idf_py_path, + 'secure-generate-signing-key', + '--version', + '2', + '--scheme', + 'rsa3072', + self.signing_key] + output = self.call_command(generate_key_command) + self.assertIn(f'RSA 3072 private key in PEM format written to {self.signing_key}', output) + self.assertIn('Done', output) + + def secure_sign_data(self): + self.secure_generate_signing_key() + sign_command = [sys.executable, + idf_py_path, + 'secure-sign-data', + '--version', + '2', + '--keyfile', + self.signing_key, + '--output', + 'bootloader-signed.bin', + 'bootloader/bootloader.bin'] + output = self.call_command(sign_command) + self.assertIn('Signed', output) + + +class TestMergeBinCommands(TestWrapperCommands): + """ + Test if merge-bin command is invoked as expected. + This test is not testing the functionality of esptool.py merge_bin command, but the invocation of the command from idf.py. + """ + + def test_merge_bin(self): + merge_bin_command = [sys.executable, idf_py_path, 'merge-bin'] + merged_binary_name = 'test-merge-binary.bin' + output = self.call_command(merge_bin_command + ['--output', merged_binary_name]) + self.assertIn(f'file {merged_binary_name}, ready to flash to offset 0x0', output) + self.assertIn(f'Merged binary {merged_binary_name} will be created in the build directory...', output) + + if __name__ == '__main__': main() From 986f6246fdf03c408d3c2d67d52a3c6e48e0ed4c Mon Sep 17 00:00:00 2001 From: Rahul Tank Date: Thu, 20 Jun 2024 12:44:36 +0530 Subject: [PATCH 10/73] fix(nimble): Pass the correct cb arg during reconnection attempt --- components/bt/host/nimble/nimble | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/host/nimble/nimble b/components/bt/host/nimble/nimble index 73112f9b4068..4486eee18602 160000 --- a/components/bt/host/nimble/nimble +++ b/components/bt/host/nimble/nimble @@ -1 +1 @@ -Subproject commit 73112f9b4068ef7dc541c88c555ff829bebb9f8f +Subproject commit 4486eee186023a51426401178bddce9a141eafdb From 980ac9bcf5a4e2c66a12a741e7f566e5255c1a5e Mon Sep 17 00:00:00 2001 From: "harshal.patil" Date: Fri, 31 May 2024 21:59:54 +0530 Subject: [PATCH 11/73] fix(soc): Fix ESP32-C5's rom mask high and subsystem high memory addresses --- .../esp_hw_support/port/esp32c5/cpu_region_protect.c | 10 +++++----- components/soc/esp32c5/include/soc/soc.h | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/components/esp_hw_support/port/esp32c5/cpu_region_protect.c b/components/esp_hw_support/port/esp32c5/cpu_region_protect.c index fb9c2053f5d8..2936e59d4724 100644 --- a/components/esp_hw_support/port/esp32c5/cpu_region_protect.c +++ b/components/esp_hw_support/port/esp32c5/cpu_region_protect.c @@ -31,10 +31,10 @@ static void esp_cpu_configure_invalid_regions(void) __attribute__((unused)) const unsigned PMA_RWX = PMA_L | PMA_EN | PMA_R | PMA_W | PMA_X; // 1. Gap at bottom of address space - PMA_ENTRY_SET_TOR(0, SOC_DEBUG_LOW, PMA_TOR | PMA_NONE); + PMA_ENTRY_SET_TOR(0, SOC_CPU_SUBSYSTEM_LOW, PMA_TOR | PMA_NONE); // 2. Gap between debug region & IROM - PMA_ENTRY_SET_TOR(1, SOC_DEBUG_HIGH, PMA_NONE); + PMA_ENTRY_SET_TOR(1, SOC_CPU_SUBSYSTEM_HIGH, PMA_NONE); PMA_ENTRY_SET_TOR(2, SOC_IROM_MASK_LOW, PMA_TOR | PMA_NONE); // 3. Gap between ROM & RAM @@ -66,7 +66,7 @@ void esp_cpu_configure_region_protection(void) // Configure just the area around 0x0 for now so that we at least get exceptions for // writes/reads to NULL pointers, as well as code that relies on writes to 0x0 // to abort/assert - PMA_ENTRY_SET_NAPOT(1, 0, SOC_DEBUG_LOW, PMA_NAPOT | PMA_EN); + PMA_ENTRY_SET_NAPOT(1, 0, SOC_CPU_SUBSYSTEM_LOW, PMA_NAPOT | PMA_EN); return; /* Notes on implementation: @@ -120,9 +120,9 @@ void esp_cpu_configure_region_protection(void) // // 1. Debug region - const uint32_t pmpaddr0 = PMPADDR_NAPOT(SOC_DEBUG_LOW, SOC_DEBUG_HIGH); + const uint32_t pmpaddr0 = PMPADDR_NAPOT(SOC_CPU_SUBSYSTEM_LOW, SOC_CPU_SUBSYSTEM_HIGH); PMP_ENTRY_SET(0, pmpaddr0, PMP_NAPOT | RWX); - _Static_assert(SOC_DEBUG_LOW < SOC_DEBUG_HIGH, "Invalid CPU debug region"); + _Static_assert(SOC_CPU_SUBSYSTEM_LOW < SOC_CPU_SUBSYSTEM_HIGH, "Invalid CPU debug region"); // 2.1 I-ROM PMP_ENTRY_SET(1, SOC_IROM_MASK_LOW, NONE); diff --git a/components/soc/esp32c5/include/soc/soc.h b/components/soc/esp32c5/include/soc/soc.h index 8185b1fccc23..7f4536f0d8a5 100644 --- a/components/soc/esp32c5/include/soc/soc.h +++ b/components/soc/esp32c5/include/soc/soc.h @@ -154,9 +154,9 @@ #define SOC_DROM_LOW SOC_IROM_LOW #define SOC_DROM_HIGH SOC_IROM_HIGH #define SOC_IROM_MASK_LOW 0x40000000 -#define SOC_IROM_MASK_HIGH 0x40040000 +#define SOC_IROM_MASK_HIGH 0x40050000 #define SOC_DROM_MASK_LOW 0x40000000 -#define SOC_DROM_MASK_HIGH 0x40040000 +#define SOC_DROM_MASK_HIGH 0x40050000 #define SOC_IRAM_LOW 0x40800000 #define SOC_IRAM_HIGH 0x40860000 #define SOC_DRAM_LOW 0x40800000 @@ -198,9 +198,9 @@ #define SOC_PERIPHERAL_LOW 0x60000000 #define SOC_PERIPHERAL_HIGH 0x60100000 -// Debug region, not used by software -#define SOC_DEBUG_LOW 0x20000000 -#define SOC_DEBUG_HIGH 0x28000000 +// CPU sub-system region, contains interrupt config registers +#define SOC_CPU_SUBSYSTEM_LOW 0x20000000 +#define SOC_CPU_SUBSYSTEM_HIGH 0x30000000 // Start (highest address) of ROM boot stack, only relevant during early boot #define SOC_ROM_STACK_START 0x4085e9a0 From 84afc6a9557bd630886635a1ab965ccf828a7fbe Mon Sep 17 00:00:00 2001 From: "harshal.patil" Date: Fri, 31 May 2024 22:31:57 +0530 Subject: [PATCH 12/73] feat(esp_hw_support): Support memory protection using PMA and PMP for ESP32-C5 --- components/bootloader/Kconfig.projbuild | 2 + .../bootloader_support/src/bootloader_mem.c | 2 +- .../port/esp32c5/cpu_region_protect.c | 144 +++++++++--------- .../esp_system/ld/esp32c5/sections.ld.in | 6 + .../esp32c5/include/soc/Kconfig.soc_caps.in | 4 + components/soc/esp32c5/include/soc/soc_caps.h | 1 + 6 files changed, 86 insertions(+), 73 deletions(-) diff --git a/components/bootloader/Kconfig.projbuild b/components/bootloader/Kconfig.projbuild index ca817d0c6a5e..3e094cfc7818 100644 --- a/components/bootloader/Kconfig.projbuild +++ b/components/bootloader/Kconfig.projbuild @@ -248,6 +248,8 @@ menu "Bootloader config" Protects the unmapped memory regions of the entire address space from unintended accesses. This will ensure that an exception will be triggered whenever the CPU performs a memory operation on unmapped regions of the address space. + NOTE: Disabling this config on some targets (ESP32-C6, ESP32-H2, ESP32-C5) would not generate + an exception when reading from or writing to 0x0. config BOOTLOADER_WDT_ENABLE bool "Use RTC watchdog in start code" diff --git a/components/bootloader_support/src/bootloader_mem.c b/components/bootloader_support/src/bootloader_mem.c index d9f8466a1c53..4edfa82526ab 100644 --- a/components/bootloader_support/src/bootloader_mem.c +++ b/components/bootloader_support/src/bootloader_mem.c @@ -47,6 +47,6 @@ void bootloader_init_mem(void) #ifdef CONFIG_BOOTLOADER_REGION_PROTECTION_ENABLE // protect memory region - esp_cpu_configure_region_protection(); // TODO: [ESP32C5] IDF-8833 PSRAM support write + esp_cpu_configure_region_protection(); #endif } diff --git a/components/esp_hw_support/port/esp32c5/cpu_region_protect.c b/components/esp_hw_support/port/esp32c5/cpu_region_protect.c index 2936e59d4724..e0a987358850 100644 --- a/components/esp_hw_support/port/esp32c5/cpu_region_protect.c +++ b/components/esp_hw_support/port/esp32c5/cpu_region_protect.c @@ -23,6 +23,9 @@ #define CONDITIONAL_RWX RWX #endif +#define ALIGN_UP_TO_MMU_PAGE_SIZE(addr) (((addr) + (SOC_MMU_PAGE_SIZE) - 1) & ~((SOC_MMU_PAGE_SIZE) - 1)) +#define ALIGN_DOWN_TO_MMU_PAGE_SIZE(addr) ((addr) & ~((SOC_MMU_PAGE_SIZE) - 1)) + static void esp_cpu_configure_invalid_regions(void) { const unsigned PMA_NONE = PMA_L | PMA_EN; @@ -30,50 +33,50 @@ static void esp_cpu_configure_invalid_regions(void) __attribute__((unused)) const unsigned PMA_RX = PMA_L | PMA_EN | PMA_R | PMA_X; __attribute__((unused)) const unsigned PMA_RWX = PMA_L | PMA_EN | PMA_R | PMA_W | PMA_X; - // 1. Gap at bottom of address space - PMA_ENTRY_SET_TOR(0, SOC_CPU_SUBSYSTEM_LOW, PMA_TOR | PMA_NONE); + // 0. Gap at bottom of address space + PMA_ENTRY_SET_NAPOT(0, 0, SOC_CPU_SUBSYSTEM_LOW, PMA_NAPOT | PMA_NONE); - // 2. Gap between debug region & IROM + // 1. Gap between debug region & IROM PMA_ENTRY_SET_TOR(1, SOC_CPU_SUBSYSTEM_HIGH, PMA_NONE); PMA_ENTRY_SET_TOR(2, SOC_IROM_MASK_LOW, PMA_TOR | PMA_NONE); + // 2. ROM has configured the ROM region to be cacheable, so we just need to lock the configuration + PMA_ENTRY_SET_TOR(3, SOC_IROM_MASK_LOW, PMA_NONE); + PMA_ENTRY_SET_TOR(4, SOC_DROM_MASK_HIGH, PMA_TOR | PMA_RX); + // 3. Gap between ROM & RAM - PMA_ENTRY_SET_TOR(3, SOC_DROM_MASK_HIGH, PMA_NONE); - PMA_ENTRY_SET_TOR(4, SOC_IRAM_LOW, PMA_TOR | PMA_NONE); + PMA_ENTRY_SET_TOR(5, SOC_DROM_MASK_HIGH, PMA_NONE); + PMA_ENTRY_SET_TOR(6, SOC_IRAM_LOW, PMA_TOR | PMA_NONE); // 4. Gap between DRAM and I_Cache - PMA_ENTRY_SET_TOR(5, SOC_IRAM_HIGH, PMA_NONE); - PMA_ENTRY_SET_TOR(6, SOC_IROM_LOW, PMA_TOR | PMA_NONE); + PMA_ENTRY_SET_TOR(7, SOC_IRAM_HIGH, PMA_NONE); + PMA_ENTRY_SET_TOR(8, SOC_IROM_LOW, PMA_TOR | PMA_NONE); + + // 5. ROM has configured the MSPI region with RX permission, we should add W attribute for psram and lock the configuration + // This function sets invalid regions but this is a valid memory region configuration that could have + // been configured using PMP as well, but due to insufficient PMP entries we are configuring this using PMA. + PMA_ENTRY_SET_NAPOT(9, SOC_IROM_LOW, (SOC_IROM_HIGH - SOC_IROM_LOW), PMA_NAPOT | PMA_RWX); - // 5. Gap between D_Cache & LP_RAM - PMA_ENTRY_SET_TOR(7, SOC_DROM_HIGH, PMA_NONE); - PMA_ENTRY_SET_TOR(8, SOC_RTC_IRAM_LOW, PMA_TOR | PMA_NONE); + // 6. Gap between D_Cache & LP_RAM + PMA_ENTRY_SET_TOR(10, SOC_DROM_HIGH, PMA_NONE); + PMA_ENTRY_SET_TOR(11, SOC_RTC_IRAM_LOW, PMA_TOR | PMA_NONE); - // 6. Gap between LP memory & peripheral addresses - PMA_ENTRY_SET_TOR(9, SOC_RTC_IRAM_HIGH, PMA_NONE); - PMA_ENTRY_SET_TOR(10, SOC_PERIPHERAL_LOW, PMA_TOR | PMA_NONE); + // 7. Gap between LP memory & peripheral addresses + PMA_ENTRY_SET_TOR(12, SOC_RTC_IRAM_HIGH, PMA_NONE); + PMA_ENTRY_SET_TOR(13, SOC_PERIPHERAL_LOW, PMA_TOR | PMA_NONE); - // 7. End of address space - PMA_ENTRY_SET_TOR(11, SOC_PERIPHERAL_HIGH, PMA_NONE); - PMA_ENTRY_SET_TOR(12, UINT32_MAX, PMA_TOR | PMA_NONE); + // 8. End of address space + PMA_ENTRY_SET_TOR(14, SOC_PERIPHERAL_HIGH, PMA_NONE); + PMA_ENTRY_SET_TOR(15, UINT32_MAX, PMA_TOR | PMA_NONE); } void esp_cpu_configure_region_protection(void) { - // ROM has configured the MSPI region with RX permission, we should add W attribute for psram - PMA_ENTRY_SET_NAPOT(0, SOC_IROM_LOW, (SOC_IROM_HIGH - SOC_IROM_LOW), PMA_NAPOT | PMA_EN | PMA_R | PMA_W | PMA_X); - - // Configure just the area around 0x0 for now so that we at least get exceptions for - // writes/reads to NULL pointers, as well as code that relies on writes to 0x0 - // to abort/assert - PMA_ENTRY_SET_NAPOT(1, 0, SOC_CPU_SUBSYSTEM_LOW, PMA_NAPOT | PMA_EN); - - return; /* Notes on implementation: * - * 1) Note: ESP32-C6 CPU doesn't support overlapping PMP regions + * 1) Note: ESP32-C5 CPU support overlapping PMP regions // TODO: verify this statement? * - * 2) ESP32-C6 supports 16 PMA regions so we use this feature to block all the invalid address ranges + * 2) ESP32-C5 supports 16 PMA regions so we use this feature to block all the invalid address ranges * * 3) We use combination of NAPOT (Naturally Aligned Power Of Two) and TOR (top of range) * entries to map all the valid address space, bottom to top. This leaves us with some extra PMP entries @@ -105,10 +108,10 @@ void esp_cpu_configure_region_protection(void) * We also lock these entries so the R/W/X permissions are enforced even for machine mode */ const unsigned NONE = PMP_L; - const unsigned R = PMP_L | PMP_R; - const unsigned RW = PMP_L | PMP_R | PMP_W; - const unsigned RX = PMP_L | PMP_R | PMP_X; - const unsigned RWX = PMP_L | PMP_R | PMP_W | PMP_X; + __attribute__((unused)) const unsigned R = PMP_L | PMP_R; + __attribute__((unused)) const unsigned RW = PMP_L | PMP_R | PMP_W; + __attribute__((unused)) const unsigned RX = PMP_L | PMP_R | PMP_X; + __attribute__((unused)) const unsigned RWX = PMP_L | PMP_R | PMP_W | PMP_X; // // Configure all the invalid address regions using PMA @@ -119,36 +122,27 @@ void esp_cpu_configure_region_protection(void) // Configure all the valid address regions using PMP // - // 1. Debug region + // 1. CPU Subsystem region - contains interrupt config registers const uint32_t pmpaddr0 = PMPADDR_NAPOT(SOC_CPU_SUBSYSTEM_LOW, SOC_CPU_SUBSYSTEM_HIGH); PMP_ENTRY_SET(0, pmpaddr0, PMP_NAPOT | RWX); - _Static_assert(SOC_CPU_SUBSYSTEM_LOW < SOC_CPU_SUBSYSTEM_HIGH, "Invalid CPU debug region"); + _Static_assert(SOC_CPU_SUBSYSTEM_LOW < SOC_CPU_SUBSYSTEM_HIGH, "Invalid CPU subsystem region"); - // 2.1 I-ROM + // 2. I/D-ROM PMP_ENTRY_SET(1, SOC_IROM_MASK_LOW, NONE); PMP_ENTRY_SET(2, SOC_IROM_MASK_HIGH, PMP_TOR | RX); - _Static_assert(SOC_IROM_MASK_LOW < SOC_IROM_MASK_HIGH, "Invalid I-ROM region"); - - // 2.2 D-ROM - PMP_ENTRY_SET(3, SOC_DROM_MASK_LOW, NONE); - PMP_ENTRY_SET(4, SOC_DROM_MASK_HIGH, PMP_TOR | R); - _Static_assert(SOC_DROM_MASK_LOW < SOC_DROM_MASK_HIGH, "Invalid D-ROM region"); + _Static_assert(SOC_IROM_MASK_LOW < SOC_IROM_MASK_HIGH, "Invalid I/D-ROM region"); + // 3. IRAM and DRAM if (esp_cpu_dbgr_is_attached()) { // Anti-FI check that cpu is really in ocd mode ESP_FAULT_ASSERT(esp_cpu_dbgr_is_attached()); - // 5. IRAM and DRAM - // const uint32_t pmpaddr5 = PMPADDR_NAPOT(SOC_IRAM_LOW, SOC_IRAM_HIGH); - // PMP_ENTRY_SET(5, pmpaddr5, PMP_NAPOT | RWX); - // _Static_assert(SOC_IRAM_LOW < SOC_IRAM_HIGH, "Invalid RAM region"); PMP_ENTRY_SET(5, SOC_IRAM_LOW, NONE); PMP_ENTRY_SET(6, SOC_IRAM_HIGH, PMP_TOR | RWX); _Static_assert(SOC_IRAM_LOW < SOC_IRAM_HIGH, "Invalid RAM region"); } else { #if CONFIG_ESP_SYSTEM_PMP_IDRAM_SPLIT && !BOOTLOADER_BUILD extern int _iram_end; - // 5. IRAM and DRAM /* Reset the corresponding PMP config because PMP_ENTRY_SET only sets the given bits * Bootloader might have given extra permissions and those won't be cleared */ @@ -159,55 +153,61 @@ void esp_cpu_configure_region_protection(void) PMP_ENTRY_SET(6, (int)&_iram_end, PMP_TOR | RX); PMP_ENTRY_SET(7, SOC_DRAM_HIGH, PMP_TOR | RW); #else - // 5. IRAM and DRAM - // const uint32_t pmpaddr5 = PMPADDR_NAPOT(SOC_IRAM_LOW, SOC_IRAM_HIGH); - // PMP_ENTRY_SET(5, pmpaddr5, PMP_NAPOT | CONDITIONAL_RWX); - // _Static_assert(SOC_IRAM_LOW < SOC_IRAM_HIGH, "Invalid RAM region"); - PMP_ENTRY_SET(5, SOC_IRAM_LOW, NONE); - PMP_ENTRY_SET(6, SOC_IRAM_HIGH, PMP_TOR | RWX); + PMP_ENTRY_SET(5, SOC_IRAM_LOW, CONDITIONAL_NONE); + PMP_ENTRY_SET(6, SOC_IRAM_HIGH, PMP_TOR | CONDITIONAL_RWX); _Static_assert(SOC_IRAM_LOW < SOC_IRAM_HIGH, "Invalid RAM region"); #endif } - // 4. I_Cache (flash) - const uint32_t pmpaddr8 = PMPADDR_NAPOT(SOC_IROM_LOW, SOC_IROM_HIGH); - PMP_ENTRY_SET(8, pmpaddr8, PMP_NAPOT | RX); - _Static_assert(SOC_IROM_LOW < SOC_IROM_HIGH, "Invalid I_Cache region"); + // 4. I_Cache / D_Cache (flash) +#if CONFIG_ESP_SYSTEM_PMP_IDRAM_SPLIT && !BOOTLOADER_BUILD + extern int _instruction_reserved_end; + extern int _rodata_reserved_end; - // 5. D_Cache (flash) - const uint32_t pmpaddr9 = PMPADDR_NAPOT(SOC_DROM_LOW, SOC_DROM_HIGH); - PMP_ENTRY_SET(9, pmpaddr9, PMP_NAPOT | R); - _Static_assert(SOC_DROM_LOW < SOC_DROM_HIGH, "Invalid D_Cache region"); + const uint32_t irom_resv_end = ALIGN_UP_TO_MMU_PAGE_SIZE((uint32_t)(&_instruction_reserved_end)); + const uint32_t drom_resv_end = ALIGN_UP_TO_MMU_PAGE_SIZE((uint32_t)(&_rodata_reserved_end)); - // 6. LP memory + PMP_ENTRY_CFG_RESET(8); + PMP_ENTRY_CFG_RESET(9); + PMP_ENTRY_CFG_RESET(10); + PMP_ENTRY_SET(8, SOC_IROM_LOW, NONE); + PMP_ENTRY_SET(9, irom_resv_end, PMP_TOR | RX); + PMP_ENTRY_SET(10, drom_resv_end, PMP_TOR | R); +#else + const uint32_t pmpaddr8 = PMPADDR_NAPOT(SOC_IROM_LOW, SOC_IROM_HIGH); + // Add the W attribute in the case of PSRAM + PMP_ENTRY_SET(8, pmpaddr8, PMP_NAPOT | CONDITIONAL_RWX); + _Static_assert(SOC_IROM_LOW < SOC_IROM_HIGH, "Invalid I/D_Cache region"); +#endif + + // 5. LP memory #if CONFIG_ESP_SYSTEM_PMP_IDRAM_SPLIT && !BOOTLOADER_BUILD extern int _rtc_text_end; /* Reset the corresponding PMP config because PMP_ENTRY_SET only sets the given bits * Bootloader might have given extra permissions and those won't be cleared */ - PMP_ENTRY_CFG_RESET(10); PMP_ENTRY_CFG_RESET(11); PMP_ENTRY_CFG_RESET(12); PMP_ENTRY_CFG_RESET(13); - PMP_ENTRY_SET(10, SOC_RTC_IRAM_LOW, NONE); + PMP_ENTRY_CFG_RESET(14); + PMP_ENTRY_SET(11, SOC_RTC_IRAM_LOW, NONE); #if CONFIG_ULP_COPROC_RESERVE_MEM // First part of LP mem is reserved for coprocessor - PMP_ENTRY_SET(11, SOC_RTC_IRAM_LOW + CONFIG_ULP_COPROC_RESERVE_MEM, PMP_TOR | RW); + PMP_ENTRY_SET(12, SOC_RTC_IRAM_LOW + CONFIG_ULP_COPROC_RESERVE_MEM, PMP_TOR | RW); #else // CONFIG_ULP_COPROC_RESERVE_MEM // Repeat same previous entry, to ensure next entry has correct base address (TOR) - PMP_ENTRY_SET(11, SOC_RTC_IRAM_LOW, NONE); + PMP_ENTRY_SET(12, SOC_RTC_IRAM_LOW, NONE); #endif // !CONFIG_ULP_COPROC_RESERVE_MEM - PMP_ENTRY_SET(12, (int)&_rtc_text_end, PMP_TOR | RX); - PMP_ENTRY_SET(13, SOC_RTC_IRAM_HIGH, PMP_TOR | RW); + PMP_ENTRY_SET(13, (int)&_rtc_text_end, PMP_TOR | RX); + PMP_ENTRY_SET(14, SOC_RTC_IRAM_HIGH, PMP_TOR | RW); #else - const uint32_t pmpaddr10 = PMPADDR_NAPOT(SOC_RTC_IRAM_LOW, SOC_RTC_IRAM_HIGH); - PMP_ENTRY_SET(10, pmpaddr10, PMP_NAPOT | CONDITIONAL_RWX); + const uint32_t pmpaddr11 = PMPADDR_NAPOT(SOC_RTC_IRAM_LOW, SOC_RTC_IRAM_HIGH); + PMP_ENTRY_SET(11, pmpaddr11, PMP_NAPOT | CONDITIONAL_RWX); _Static_assert(SOC_RTC_IRAM_LOW < SOC_RTC_IRAM_HIGH, "Invalid RTC IRAM region"); #endif - - // 7. Peripheral addresses - const uint32_t pmpaddr14 = PMPADDR_NAPOT(SOC_PERIPHERAL_LOW, SOC_PERIPHERAL_HIGH); - PMP_ENTRY_SET(14, pmpaddr14, PMP_NAPOT | RW); + // 6. Peripheral addresses + const uint32_t pmpaddr15 = PMPADDR_NAPOT(SOC_PERIPHERAL_LOW, SOC_PERIPHERAL_HIGH); + PMP_ENTRY_SET(15, pmpaddr15, PMP_NAPOT | RW); _Static_assert(SOC_PERIPHERAL_LOW < SOC_PERIPHERAL_HIGH, "Invalid peripheral region"); } diff --git a/components/esp_system/ld/esp32c5/sections.ld.in b/components/esp_system/ld/esp32c5/sections.ld.in index 54673f7a822a..4059d97d3623 100644 --- a/components/esp_system/ld/esp32c5/sections.ld.in +++ b/components/esp_system/ld/esp32c5/sections.ld.in @@ -27,6 +27,9 @@ SECTIONS *rtc_wake_stub*.*(.text .text.*) *(.rtc_text_end_test) + /* Align the end of RTC code region as per PMP granularity */ + . = ALIGN(_esp_pmp_align_size); + _rtc_text_end = ABSOLUTE(.); } > lp_ram_seg @@ -166,6 +169,9 @@ SECTIONS /* Marks the end of IRAM code segment */ .iram0.text_end (NOLOAD) : { + /* Align the end of code region as per PMP region granularity */ + . = ALIGN(_esp_pmp_align_size); + ALIGNED_SYMBOL(4, _iram_text_end) } > sram_seg diff --git a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in index a9d6abc8e664..027e0d7e1f62 100644 --- a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in @@ -235,6 +235,10 @@ config SOC_CPU_IDRAM_SPLIT_USING_PMP bool default y +config SOC_CPU_PMP_REGION_GRANULARITY + int + default 128 + config SOC_DS_SIGNATURE_MAX_BIT_LEN int default 3072 diff --git a/components/soc/esp32c5/include/soc/soc_caps.h b/components/soc/esp32c5/include/soc/soc_caps.h index 155000b197b9..07d38f623fc6 100644 --- a/components/soc/esp32c5/include/soc/soc_caps.h +++ b/components/soc/esp32c5/include/soc/soc_caps.h @@ -154,6 +154,7 @@ #define SOC_CPU_HAS_PMA 1 #define SOC_CPU_IDRAM_SPLIT_USING_PMP 1 +#define SOC_CPU_PMP_REGION_GRANULARITY 128 /*-------------------------- DIGITAL SIGNATURE CAPS ----------------------------------------*/ /** The maximum length of a Digital Signature in bits. */ From bd4e48d0d92c0fab34d12b81a00c619153c9b2bc Mon Sep 17 00:00:00 2001 From: "harshal.patil" Date: Wed, 19 Jun 2024 17:36:14 +0530 Subject: [PATCH 13/73] feat(cpu): Configure panic exception generation using asm illegal instruction --- components/esp_system/panic.c | 9 ++++++--- tools/test_apps/system/panic/pytest_panic.py | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/components/esp_system/panic.c b/components/esp_system/panic.c index 20851d554c3e..4abdac043783 100644 --- a/components/esp_system/panic.c +++ b/components/esp_system/panic.c @@ -461,9 +461,12 @@ void IRAM_ATTR __attribute__((noreturn, no_sanitize_undefined)) panic_abort(cons #endif #endif - ESP_COMPILER_DIAGNOSTIC_PUSH_IGNORE("-Wanalyzer-null-dereference") - *((volatile int *) 0) = 0; // NOLINT(clang-analyzer-core.NullDereference) should be an invalid operation on targets - ESP_COMPILER_DIAGNOSTIC_POP("-Wanalyzer-null-dereference") +#ifdef __XTENSA__ + asm("ill"); // should be an invalid operation on xtensa targets +#elif __riscv + asm("unimp"); // should be an invalid operation on RISC-V targets +#endif + while (1); } diff --git a/tools/test_apps/system/panic/pytest_panic.py b/tools/test_apps/system/panic/pytest_panic.py index a5269a0c6edf..3339147b2022 100644 --- a/tools/test_apps/system/panic/pytest_panic.py +++ b/tools/test_apps/system/panic/pytest_panic.py @@ -1050,9 +1050,9 @@ def _test_coredump_summary(dut: PanicTestDut, flash_encrypted: bool, coredump_en dut.expect_elf_sha256('App ELF file SHA256: ') dut.expect_exact('Crashed task: main') if dut.is_xtensa: - dut.expect_exact('Exception cause: 29') + dut.expect_exact('Exception cause: 0') else: - dut.expect_exact('Exception cause: 7') + dut.expect_exact('Exception cause: 2') dut.expect(PANIC_ABORT_PREFIX + r'assert failed:[\s\w()]*?\s[.\w/]*\.(?:c|cpp|h|hpp):\d.*$') From dcfcf831092d877ca1c132a2ff4cdb91d500b316 Mon Sep 17 00:00:00 2001 From: morris Date: Mon, 24 Jun 2024 18:17:28 +0800 Subject: [PATCH 14/73] fix(rmt): fix gcc static analyzer warnings --- components/esp_driver_rmt/src/rmt_private.h | 2 +- components/esp_driver_rmt/src/rmt_tx.c | 43 +++++++++++---------- 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/components/esp_driver_rmt/src/rmt_private.h b/components/esp_driver_rmt/src/rmt_private.h index 2cbe57e7a3cb..f61082ee8eea 100644 --- a/components/esp_driver_rmt/src/rmt_private.h +++ b/components/esp_driver_rmt/src/rmt_private.h @@ -65,7 +65,7 @@ extern "C" { typedef dma_descriptor_align4_t rmt_dma_descriptor_t; #ifdef CACHE_LL_L2MEM_NON_CACHE_ADDR -#define RMT_GET_NON_CACHE_ADDR(addr) ((addr) ? CACHE_LL_L2MEM_NON_CACHE_ADDR(addr) : 0) +#define RMT_GET_NON_CACHE_ADDR(addr) (CACHE_LL_L2MEM_NON_CACHE_ADDR(addr)) #else #define RMT_GET_NON_CACHE_ADDR(addr) (addr) #endif diff --git a/components/esp_driver_rmt/src/rmt_tx.c b/components/esp_driver_rmt/src/rmt_tx.c index 915b68d0d3e7..ae61213dceb5 100644 --- a/components/esp_driver_rmt/src/rmt_tx.c +++ b/components/esp_driver_rmt/src/rmt_tx.c @@ -1106,32 +1106,33 @@ static void IRAM_ATTR rmt_tx_default_isr(void *args) } #if SOC_RMT_SUPPORT_DMA -ESP_COMPILER_DIAGNOSTIC_PUSH_IGNORE("-Wanalyzer-null-dereference") // TODO IDF-10235 static bool IRAM_ATTR rmt_dma_tx_eof_cb(gdma_channel_handle_t dma_chan, gdma_event_data_t *event_data, void *user_data) { rmt_tx_channel_t *tx_chan = (rmt_tx_channel_t *)user_data; + // tx_eof_desc_addr must be non-zero, guaranteed by the hardware rmt_dma_descriptor_t *eof_desc_nc = (rmt_dma_descriptor_t *)RMT_GET_NON_CACHE_ADDR(event_data->tx_eof_desc_addr); - rmt_dma_descriptor_t *n = (rmt_dma_descriptor_t *)RMT_GET_NON_CACHE_ADDR(eof_desc_nc->next); // next points to a cache address, needs to convert it to a non-cached one - if (n) { - rmt_dma_descriptor_t *nn = (rmt_dma_descriptor_t *)RMT_GET_NON_CACHE_ADDR(n->next); - // if the DMA descriptor link is still a ring (i.e. hasn't broken down by `rmt_tx_mark_eof()`), then we treat it as a valid ping-pong event - if (nn) { - // continue ping-pong transmission - rmt_tx_trans_desc_t *t = tx_chan->cur_trans; - size_t encoded_symbols = t->transmitted_symbol_num; - if (t->flags.encoding_done) { - rmt_tx_mark_eof(tx_chan); - encoded_symbols += 1; - } else { - encoded_symbols += rmt_encode_check_result(tx_chan, t); - } - t->transmitted_symbol_num = encoded_symbols; - tx_chan->mem_end = tx_chan->ping_pong_symbols * 3 - tx_chan->mem_end; // mem_end equals to either ping_pong_symbols or ping_pong_symbols*2 - // tell DMA that we have a new descriptor attached - gdma_append(dma_chan); - } + if (!eof_desc_nc->next) { + return false; + } + // next points to a cache address, convert it to a non-cached one + rmt_dma_descriptor_t *n = (rmt_dma_descriptor_t *)RMT_GET_NON_CACHE_ADDR(eof_desc_nc->next); + if (!n->next) { + return false; } + // if the DMA descriptor link is still a ring (i.e. hasn't broken down by `rmt_tx_mark_eof()`), then we treat it as a valid ping-pong event + // continue ping-pong transmission + rmt_tx_trans_desc_t *t = tx_chan->cur_trans; + size_t encoded_symbols = t->transmitted_symbol_num; + if (t->flags.encoding_done) { + rmt_tx_mark_eof(tx_chan); + encoded_symbols += 1; + } else { + encoded_symbols += rmt_encode_check_result(tx_chan, t); + } + t->transmitted_symbol_num = encoded_symbols; + tx_chan->mem_end = tx_chan->ping_pong_symbols * 3 - tx_chan->mem_end; // mem_end equals to either ping_pong_symbols or ping_pong_symbols*2 + // tell DMA that we have a new descriptor attached + gdma_append(dma_chan); return false; } -ESP_COMPILER_DIAGNOSTIC_POP("-Wanalyzer-null-dereference") #endif // SOC_RMT_SUPPORT_DMA From 0dcbbb8eb97d39cc620c990b75878224fcd92ed9 Mon Sep 17 00:00:00 2001 From: liuning Date: Tue, 25 Jun 2024 15:34:34 +0800 Subject: [PATCH 15/73] fix(coex): fix ESP32 Wi-Fi cant tx after sw_reset with BLE scan Closes https://github.com/espressif/esp-idf/issues/13598 --- components/esp_coex/lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/esp_coex/lib b/components/esp_coex/lib index 2363239ddeda..56d324c3fe3f 160000 --- a/components/esp_coex/lib +++ b/components/esp_coex/lib @@ -1 +1 @@ -Subproject commit 2363239ddeda69523a4ed79e55815be21115200f +Subproject commit 56d324c3fe3fb7649f8736bbb3b9f00b7f612449 From 548b03c69f30cd76f150fa5ff53e012480025a5d Mon Sep 17 00:00:00 2001 From: Roman Leonov Date: Tue, 2 Apr 2024 14:25:11 +0200 Subject: [PATCH 16/73] feat(ext_hub): Added External Hub driver --- components/usb/CMakeLists.txt | 4 + components/usb/Kconfig | 120 +- components/usb/ext_hub.c | 1598 +++++++++++++++++++ components/usb/hub.c | 161 +- components/usb/include/usb/usb_types_ch11.h | 41 +- components/usb/include/usb/usb_types_ch9.h | 30 +- components/usb/private_include/ext_hub.h | 248 +++ components/usb/private_include/hub.h | 49 + components/usb/usb_host.c | 23 +- 9 files changed, 2191 insertions(+), 83 deletions(-) create mode 100644 components/usb/ext_hub.c create mode 100644 components/usb/private_include/ext_hub.h diff --git a/components/usb/CMakeLists.txt b/components/usb/CMakeLists.txt index 8eca16596fea..8f2ab8dc12ba 100644 --- a/components/usb/CMakeLists.txt +++ b/components/usb/CMakeLists.txt @@ -29,6 +29,10 @@ if(CONFIG_SOC_USB_OTG_SUPPORTED) list(APPEND priv_includes "private_include") endif() +if(CONFIG_USB_HOST_HUBS_SUPPORTED) + list(APPEND srcs "ext_hub.c") +endif() + idf_component_register(SRCS ${srcs} INCLUDE_DIRS ${include} PRIV_INCLUDE_DIRS ${priv_includes} diff --git a/components/usb/Kconfig b/components/usb/Kconfig index ac71a7125e6c..1c333f870b82 100644 --- a/components/usb/Kconfig +++ b/components/usb/Kconfig @@ -46,73 +46,85 @@ menu "USB-OTG" bool "Periodic OUT" endchoice - menu "Root Hub configuration" - - config USB_HOST_DEBOUNCE_DELAY_MS - int "Debounce delay in ms" - default 250 + menu "Hub Driver Configuration" + + menu "Root Port configuration" + + config USB_HOST_DEBOUNCE_DELAY_MS + int "Debounce delay in ms" + default 250 + help + On connection of a USB device, the USB 2.0 specification requires + a "debounce interval with a minimum duration of 100ms" to allow the connection to stabilize + (see USB 2.0 chapter 7.1.7.3 for more details). + During the debounce interval, no new connection/disconnection events are registered. + + The default value is set to 250 ms to be safe. + + config USB_HOST_RESET_HOLD_MS + int "Reset hold in ms" + default 30 + help + The reset signaling can be generated on any Hub or Host Controller port by request from + the USB System Software. The USB 2.0 specification requires that "the reset signaling must + be driven for a minimum of 10ms" (see USB 2.0 chapter 7.1.7.5 for more details). + After the reset, the hub port will transition to the Enabled state (refer to Section 11.5). + + The default value is set to 30 ms to be safe. + + config USB_HOST_RESET_RECOVERY_MS + int "Reset recovery delay in ms" + default 30 + help + After a port stops driving the reset signal, the USB 2.0 specification requires that + the "USB System Software guarantees a minimum of 10 ms for reset recovery" before the + attached device is expected to respond to data transfers (see USB 2.0 chapter 7.1.7.3 for + more details). + The device may ignore any data transfers during the recovery interval. + + The default value is set to 30 ms to be safe. + + + config USB_HOST_SET_ADDR_RECOVERY_MS + int "SetAddress() recovery time in ms" + default 10 + help + "After successful completion of the Status stage, the device is allowed a SetAddress() + recovery interval of 2 ms. At the end of this interval, the device must be able to accept + Setup packets addressed to the new address. Also, at the end of the recovery interval, the + device must not respond to tokens sent to the old address (unless, of course, the old and new + address is the same)." See USB 2.0 chapter 9.2.6.3 for more details. + + The default value is set to 10 ms to be safe. + + endmenu #Root Hub configuration + + config USB_HOST_HUBS_SUPPORTED + bool "Support Hubs" + default n help - On connection of a USB device, the USB 2.0 specification requires a "debounce interval with a minimum - duration of 100ms" to allow the connection to stabilize (see USB 2.0 chapter 7.1.7.3 for more details). - During the debounce interval, no new connection/disconnection events are registered. - - The default value is set to 250 ms to be safe. + Enables support of external Hubs. - config USB_HOST_RESET_HOLD_MS - int "Reset hold in ms" - default 30 + config USB_HOST_HUB_MULTI_LEVEL + depends on USB_HOST_HUBS_SUPPORTED + bool "Support multiple Hubs" + default y help - The reset signaling can be generated on any Hub or Host Controller port by request from the USB System - Software. The USB 2.0 specification requires that "the reset signaling must be driven for a minimum of - 10ms" (see USB 2.0 chapter 7.1.7.5 for more details). After the reset, the hub port will transition to - the Enabled state (refer to Section 11.5). + Enables support for connecting multiple Hubs simultaneously. - The default value is set to 30 ms to be safe. - - config USB_HOST_RESET_RECOVERY_MS - int "Reset recovery delay in ms" - default 30 - help - After a port stops driving the reset signal, the USB 2.0 specification requires that the "USB System - Software guarantees a minimum of 10 ms for reset recovery" before the attached device is expected to - respond to data transfers (see USB 2.0 chapter 7.1.7.3 for more details). The device may ignore any - data transfers during the recovery interval. - - The default value is set to 30 ms to be safe. - - - config USB_HOST_SET_ADDR_RECOVERY_MS - int "SetAddress() recovery time in ms" - default 10 - help - "After successful completion of the Status stage, the device is allowed a SetAddress() recovery - interval of 2 ms. At the end of this interval, the device must be able to accept Setup packets - addressed to the new address. Also, at the end of the recovery interval, the device must not respond to - tokens sent to the old address (unless, of course, the old and new address is the same)." See USB 2.0 - chapter 9.2.6.3 for more details. - - The default value is set to 10 ms to be safe. - - endmenu #Root Hub configuration + endmenu #Hub Driver Configuration config USB_HOST_ENABLE_ENUM_FILTER_CALLBACK bool "Enable enumeration filter callback" default n help - The enumeration filter callback is called before enumeration of each newly attached device. This callback - allows users to control whether a device should be enumerated, and what configuration number to use when - enumerating a device. + The enumeration filter callback is called before enumeration of each newly attached device. + This callback allows users to control whether a device should be enumerated, and what configuration + number to use when enumerating a device. If enabled, the enumeration filter callback can be set via 'usb_host_config_t' when calling 'usb_host_install()'. - config USB_HOST_EXT_HUB_SUPPORT - depends on IDF_EXPERIMENTAL_FEATURES - bool "Support USB HUB (Experimental)" - default n - help - Feature is under development. - # Hidden or compatibility options config USB_OTG_SUPPORTED # Invisible config kept for compatibility diff --git a/components/usb/ext_hub.c b/components/usb/ext_hub.c new file mode 100644 index 000000000000..fe5692ba79ae --- /dev/null +++ b/components/usb/ext_hub.c @@ -0,0 +1,1598 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include +#include "esp_err.h" +#include "esp_log.h" +#include "esp_heap_caps.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "hal/usb_dwc_hal.h" // for OTG_HSPHY_INTERFACE +#include "usb_private.h" +#include "ext_hub.h" +#include "usb/usb_helpers.h" + +typedef struct ext_port_s *ext_port_hdl_t; /* This will be implemented during ext_port driver implementation */ + +#define EXT_HUB_STATUS_CHANGE_FLAG (1 << 0) +#define EXT_HUB_STATUS_PORT1_CHANGE_FLAG (1 << 1) +#define EXT_HUB_CTRL_TRANSFER_MAX_DATA_LEN CONFIG_USB_HOST_CONTROL_TRANSFER_MAX_SIZE + +/** + * @brief Device state + * + * Global state of the Device + */ +typedef enum { + EXT_HUB_STATE_ATTACHED, /**< Device attached, but not state is unknown (no: Hub Descriptor, Device status and Hub status) */ + EXT_HUB_STATE_CONFIGURED, /**< Device attached and configured (has Hub Descriptor, Device status and Hub status were requested )*/ + EXT_HUB_STATE_SUSPENDED, /**< Device suspended */ + EXT_HUB_STATE_RELEASED, /**< Device released by USB Host driver (device could still be present on bus) */ + EXT_HUB_STATE_FAILED /**< Device has internal error */ +} ext_hub_state_t; + +/** + * @brief Device stages + * + * During the lifecycle, Hub requires different actions. To implement interaction with external Hub the FSM, based on these stages is using. + * + * Entry: + * - Every new attached external Hub should start from EXT_HUB_STAGE_GET_HUB_DESCRIPTOR. Without Fetching Hub Descriptor, device is not configured and doesn't have any ports. + * - After handling the response during EXT_HUB_STAGE_CHECK_HUB_DESCRIPTOR, the External Hub Driver configures the Device according to the data from Hub Descriptor. + * - After completion of any stage, the Device does back to the IDLE stage and waits for another request. Source of the request could be: EP1 INT callback (the Hub or Ports changes) or external call. + * - Stages, that don't required response handling could not end up with fail. + */ +typedef enum { + // Device in IDLE state + EXT_HUB_STAGE_IDLE = 0, /**< Device in idle state and do not fulfill any actions */ + // Stages, required response handling + EXT_HUB_STAGE_GET_DEVICE_STATUS, /**< Device requests Device Status. For more details, refer to 9.4.5 Get Status of usb_20 */ + EXT_HUB_STAGE_CHECK_DEVICE_STATUS, /**< Device received the Device Status and required its' handling */ + EXT_HUB_STAGE_GET_HUB_DESCRIPTOR, /**< Device requests Hub Descriptor. For more details, refer to 11.24.2.5 Get Hub Descriptor of usb_20 */ + EXT_HUB_STAGE_CHECK_HUB_DESCRIPTOR, /**< Device received the Hub Descriptor and requires its' handling */ + EXT_HUB_STAGE_GET_HUB_STATUS, /**< Device requests Hub Status. For more details, refer to 11.24.2.6 Get Hub Status of usb_20 */ + EXT_HUB_STAGE_CHECK_HUB_STATUS, /**< Device received the Hub Status and requires its' handling */ + // Stages, don't required response handling + EXT_HUB_STAGE_PORT_FEATURE, /**< Device completed the Port Feature class-specific request (Set Feature or Clear Feature). For more details, refer to 11.24.2 Class-specific Requests of usb_20 */ + EXT_HUB_STAGE_PORT_STATUS_REQUEST, /**< Device completed the Port Get Status class-specific request. For more details, refer to 11.24.2 Class-specific Requests of usb_20 */ + EXT_HUB_STAGE_FAILURE /**< Device has internal error and requires handling */ +} ext_hub_stage_t; + +const char *const ext_hub_stage_strings[] = { + "IDLE", + "GET_DEVICE_STATUS", + "CHECK_DEVICE_STATUS", + "GET_HUB_DESCRIPTOR", + "CHECK_HUB_DESCRIPTOR", + "GET_HUB_STATUS", + "CHECK_HUB_STATUS", + "PORT_FEATURE", + "PORT_STATUS_REQUEST", + "FAILURE" +}; + +/** + * @brief Device action flags + */ +typedef enum { + DEV_ACTION_EP0_COMPLETE = (1 << 1), /**< Device complete one of stages, requires handling */ + DEV_ACTION_EP1_FLUSH = (1 << 2), /**< Device's Interrupt EP needs to be flushed */ + DEV_ACTION_EP1_DEQUEUE = (1 << 3), /**< Device's Interrupt EP needs to be dequeued */ + DEV_ACTION_EP1_CLEAR = (1 << 4), /**< Device's Interrupt EP needs to be cleared */ + DEV_ACTION_REQ = (1 << 5), /**< Device has new actions and required handling */ + DEV_ACTION_ERROR = (1 << 6), /**< Device encounters an error */ + DEV_ACTION_GONE = (1 << 7), /**< Device was gone */ + DEV_ACTION_RELEASE = (1 << 8), /**< Device was released */ + DEV_ACTION_FREE = (1 << 9), /**< Device should be freed */ +} dev_action_t; + +typedef struct ext_hub_s ext_hub_dev_t; + +/** + * @brief External Hub device configuration parameters for device allocation + */ +typedef struct { + usb_device_handle_t dev_hdl; /**< Device's handle */ + uint8_t dev_addr; /**< Device's bus address */ + const usb_intf_desc_t *iface_desc; /**< Device's Interface Descriptor pointer */ + const usb_ep_desc_t *ep_in_desc; /**< Device's IN Endpoint Descriptor pointer */ +} device_config_t; + +struct ext_hub_s { + struct { + TAILQ_ENTRY(ext_hub_s) tailq_entry; + union { + struct { + uint32_t in_pending_list: 1; /**< Device is in pending list */ + uint32_t waiting_free: 1; /**< Device waiting to be freed */ + uint32_t is_gone: 1; /**< Device is gone */ + uint32_t reserved29: 29; /**< Reserved */ + }; + uint32_t val; /**< Device's flags value */ + } flags; + uint32_t action_flags; /**< Device's action flags */ + ext_hub_state_t state; /**< Device's state */ + ext_hub_stage_t stage; /**< Device's stage */ + } dynamic; /**< Dynamic members require a critical section */ + + struct { + // For optimisation & debug only + uint8_t iface_num; /**< Device's bInterfaceNum */ + // Driver purpose + uint8_t dev_addr; /**< Device's bus address */ + usb_device_handle_t dev_hdl; /**< Device's handle */ + urb_t *ctrl_urb; /**< Device's Control pipe transfer URB */ + urb_t *in_urb; /**< Device's Interrupt pipe URB */ + usbh_ep_handle_t ep_in_hdl; /**< Device's Interrupt EP handle */ + + usb_hub_descriptor_t *hub_desc; /**< Device's Hub descriptor pointer. Could be NULL when not requested */ + uint8_t maxchild; /**< Number of ports. Could be 0 for some Hubs. */ + ext_port_hdl_t *ports; /**< Flexible array of Ports. Could be NULL, when maxchild is 0 */ + } constant; /**< Constant members. Do not change after installation thus do not require a critical section or mutex */ +}; + +typedef struct { + struct { + TAILQ_HEAD(ext_hubs, ext_hub_s) ext_hubs_tailq; /**< Idle tailq */ + TAILQ_HEAD(ext_hubs_cb, ext_hub_s) ext_hubs_pending_tailq; /**< Pending tailq */ + } dynamic; /**< Dynamic members require a critical section */ + + struct { + ext_hub_cb_t proc_req_cb; /**< Process callback */ + void *proc_req_cb_arg; /**< Process callback argument */ + const ext_hub_port_driver_t* port_driver; /**< External Port Driver */ + } constant; /**< Constant members. Do not change after installation thus do not require a critical section or mutex */ +} ext_hub_driver_t; + +static ext_hub_driver_t *p_ext_hub_driver = NULL; +static portMUX_TYPE ext_hub_driver_lock = portMUX_INITIALIZER_UNLOCKED; + +const char *EXT_HUB_TAG = "EXT_HUB"; + +// ----------------------------------------------------------------------------- +// ------------------------------- Helpers ------------------------------------- +// ----------------------------------------------------------------------------- + +#define EXT_HUB_ENTER_CRITICAL() portENTER_CRITICAL(&ext_hub_driver_lock) +#define EXT_HUB_EXIT_CRITICAL() portEXIT_CRITICAL(&ext_hub_driver_lock) +#define EXT_HUB_ENTER_CRITICAL_SAFE() portENTER_CRITICAL_SAFE(&ext_hub_driver_lock) +#define EXT_HUB_EXIT_CRITICAL_SAFE() portEXIT_CRITICAL_SAFE(&ext_hub_driver_lock) + +#define EXT_HUB_CHECK(cond, ret_val) ({ \ + if (!(cond)) { \ + return (ret_val); \ + } \ +}) +#define EXT_HUB_CHECK_FROM_CRIT(cond, ret_val) ({ \ + if (!(cond)) { \ + EXT_HUB_EXIT_CRITICAL(); \ + return ret_val; \ + } \ +}) + +// ----------------------------------------------------------------------------- +// ----------------------- Forward declaration --------------------------------- +// ----------------------------------------------------------------------------- +static bool _device_set_actions(ext_hub_dev_t *ext_hub_dev, uint32_t action_flags); +static void device_disable(ext_hub_dev_t *ext_hub_dev); +static void device_error(ext_hub_dev_t *ext_hub_dev); +static void device_status_change_handle(ext_hub_dev_t *ext_hub_dev, const uint8_t* data, const int length); + +// ----------------------------------------------------------------------------- +// ---------------------- Callbacks (implementation) --------------------------- +// ----------------------------------------------------------------------------- + +static bool interrupt_pipe_cb(usbh_ep_handle_t ep_hdl, usbh_ep_event_t ep_event, void *user_arg, bool in_isr) +{ + uint32_t action_flags; + ext_hub_dev_t *ext_hub_dev = (ext_hub_dev_t *)user_arg; + + switch (ep_event) { + case USBH_EP_EVENT_URB_DONE: { + // A interrupt transfer completed on EP1's pipe . We need to dequeue it + action_flags = DEV_ACTION_EP1_DEQUEUE; + break; + case USBH_EP_EVENT_ERROR_XFER: + case USBH_EP_EVENT_ERROR_URB_NOT_AVAIL: + case USBH_EP_EVENT_ERROR_OVERFLOW: + // EP1's pipe has encountered an error. We need to retire all URBs, dequeue them, then make the pipe active again + action_flags = DEV_ACTION_EP1_FLUSH | + DEV_ACTION_EP1_DEQUEUE | + DEV_ACTION_EP1_CLEAR; + if (in_isr) { + ESP_EARLY_LOGE(EXT_HUB_TAG, "Device %d EP1 Error", ext_hub_dev->constant.dev_addr); + } else { + ESP_LOGE(EXT_HUB_TAG, "Device %d EP1 Error", ext_hub_dev->constant.dev_addr); + } + break; + case USBH_EP_EVENT_ERROR_STALL: + // EP1's pipe encountered a "protocol stall". We just need to dequeue URBs then make the pipe active again + action_flags = DEV_ACTION_EP1_DEQUEUE | DEV_ACTION_EP1_CLEAR; + if (in_isr) { + ESP_EARLY_LOGE(EXT_HUB_TAG, "Device %d EP1 STALL", ext_hub_dev->constant.dev_addr); + } else { + ESP_LOGE(EXT_HUB_TAG, "Device %d EP1 STALL", ext_hub_dev->constant.dev_addr); + } + break; + } + default: + action_flags = 0; + break; + } + + EXT_HUB_ENTER_CRITICAL_SAFE(); + bool call_proc_req_cb = _device_set_actions(ext_hub_dev, action_flags); + EXT_HUB_EXIT_CRITICAL_SAFE(); + + bool yield = false; + if (call_proc_req_cb) { + yield = p_ext_hub_driver->constant.proc_req_cb(in_isr, p_ext_hub_driver->constant.proc_req_cb_arg); + } + return yield; +} + +/** + * @brief Control transfer completion callback + * + * Is called by lower logic when transfer is completed with or without error + * + * @param[in] ctrl_xfer Pointer to a transfer buffer + */ +static void control_transfer_complete_cb(usb_transfer_t *ctrl_xfer) +{ + bool call_proc_req_cb = false; + ext_hub_dev_t *ext_hub_dev = (ext_hub_dev_t *) ctrl_xfer->context; + + EXT_HUB_ENTER_CRITICAL(); + call_proc_req_cb = _device_set_actions(ext_hub_dev, DEV_ACTION_EP0_COMPLETE); + EXT_HUB_EXIT_CRITICAL(); + + if (call_proc_req_cb) { + p_ext_hub_driver->constant.proc_req_cb(false, p_ext_hub_driver->constant.proc_req_cb_arg); + } +} + +static void interrupt_transfer_complete_cb(usb_transfer_t *intr_xfer) +{ + assert(intr_xfer); + ext_hub_dev_t *ext_hub_dev = (ext_hub_dev_t *)intr_xfer->context; + assert(ext_hub_dev); + + switch (intr_xfer->status) { + case USB_TRANSFER_STATUS_COMPLETED: + ESP_LOG_BUFFER_HEXDUMP(EXT_HUB_TAG, intr_xfer->data_buffer, intr_xfer->actual_num_bytes, ESP_LOG_VERBOSE); + device_status_change_handle(ext_hub_dev, intr_xfer->data_buffer, intr_xfer->actual_num_bytes); + break; + case USB_TRANSFER_STATUS_NO_DEVICE: + // Device was removed, nothing to do + break; + case USB_TRANSFER_STATUS_CANCELED: + // Cancellation due to USB Host uninstall routine + device_disable(ext_hub_dev); + break; + default: + // Any other error + ESP_LOGE(EXT_HUB_TAG, "[%d] Interrupt transfer failed, status %d", ext_hub_dev->constant.dev_addr, intr_xfer->status); + device_error(ext_hub_dev); + break; + } + +} + +// ----------------------------------------------------------------------------- +// --------------------------- Internal Logic --------------------------------- +// ----------------------------------------------------------------------------- + +static bool _device_set_actions(ext_hub_dev_t *ext_hub_dev, uint32_t action_flags) +{ + /* + THIS FUNCTION MUST BE CALLED FROM A CRITICAL SECTION + */ + if (action_flags == 0) { + return false; + } + bool call_proc_req_cb; + // Check if device is already on the callback list + if (!ext_hub_dev->dynamic.flags.in_pending_list) { + // Move device form idle device list to callback device list + TAILQ_REMOVE(&p_ext_hub_driver->dynamic.ext_hubs_tailq, ext_hub_dev, dynamic.tailq_entry); + TAILQ_INSERT_TAIL(&p_ext_hub_driver->dynamic.ext_hubs_pending_tailq, ext_hub_dev, dynamic.tailq_entry); + ext_hub_dev->dynamic.action_flags |= action_flags; + ext_hub_dev->dynamic.flags.in_pending_list = 1; + call_proc_req_cb = true; + } else { + // The device is already on the callback list, thus a processing request is already pending. + ext_hub_dev->dynamic.action_flags |= action_flags; + call_proc_req_cb = false; + } + return call_proc_req_cb; +} + +static esp_err_t device_enable_int_ep(ext_hub_dev_t *ext_hub_dev) +{ + esp_err_t ret = ESP_OK; + ret = usbh_ep_enqueue_urb(ext_hub_dev->constant.ep_in_hdl, ext_hub_dev->constant.in_urb); + if (ret != ESP_OK) { + ESP_LOGE(EXT_HUB_TAG, "Failed to submit in urb (%#x)", ret); + return ret; + } + return ret; +} + +static void device_has_changed(ext_hub_dev_t *ext_hub_dev) +{ + // TODO: IDF-10053 Hub status change handling + // After getting the IRQ about Hub status change we need to request status + // device_get_status(ext_hub_dev); + ESP_LOGW(EXT_HUB_TAG, "Hub status change has not been implemented yet"); + device_enable_int_ep(ext_hub_dev); +} + +// Figure 11-22. Hub and Port Status Change Bitmap +static void device_status_change_handle(ext_hub_dev_t *ext_hub_dev, const uint8_t* data, const int length) +{ + uint8_t port_idx = 0; + uint8_t max_port_num = (sizeof(uint8_t) * 8) - 1; // Maximal Port number in one uint8_t byte + // Hub status change + if (data[0] & EXT_HUB_STATUS_CHANGE_FLAG) { + device_has_changed(ext_hub_dev); + } + // Ports status change + for (uint8_t i = 0; i < length; i++) { + for (uint8_t j = 0; j < max_port_num; j++) { + if (data[i] & (EXT_HUB_STATUS_PORT1_CHANGE_FLAG << j)) { + // Notify Hub driver + port_idx = (j + (i * max_port_num)); + if (p_ext_hub_driver->constant.port_driver) { + p_ext_hub_driver->constant.port_driver->get_status(ext_hub_dev->constant.ports[port_idx]); + } + } + } + } +} + +static void device_disable(ext_hub_dev_t *ext_hub_dev) +{ + bool call_proc_req_cb = false; + + ESP_LOGD(EXT_HUB_TAG, "[%d] Device disable", ext_hub_dev->constant.dev_addr); + + if (ext_hub_dev->dynamic.state == EXT_HUB_STATE_RELEASED || ext_hub_dev->dynamic.flags.is_gone) { + ESP_LOGD(EXT_HUB_TAG, "Device in release state or already gone"); + return; + } + + // Mark all Ports are disable and then gone + for (uint8_t i = 0; i < ext_hub_dev->constant.maxchild; i++) { + if (p_ext_hub_driver->constant.port_driver) { + // TODO: IDF-10054 Hubs should disable their ports power + // Meanwhile, mark the port as gone + p_ext_hub_driver->constant.port_driver->gone(ext_hub_dev->constant.ports[i]); + } + } + + // Close the device + ESP_ERROR_CHECK(usbh_dev_close(ext_hub_dev->constant.dev_hdl)); + + EXT_HUB_ENTER_CRITICAL(); + call_proc_req_cb = _device_set_actions(ext_hub_dev, DEV_ACTION_FREE); + EXT_HUB_EXIT_CRITICAL(); + + if (call_proc_req_cb) { + p_ext_hub_driver->constant.proc_req_cb(false, p_ext_hub_driver->constant.proc_req_cb_arg); + } +} + +static void device_error(ext_hub_dev_t *ext_hub_dev) +{ + bool call_proc_req_cb = false; + + EXT_HUB_ENTER_CRITICAL(); + call_proc_req_cb = _device_set_actions(ext_hub_dev, DEV_ACTION_ERROR); + EXT_HUB_EXIT_CRITICAL(); + + if (call_proc_req_cb) { + p_ext_hub_driver->constant.proc_req_cb(false, p_ext_hub_driver->constant.proc_req_cb_arg); + } +} + +static void device_release(ext_hub_dev_t *ext_hub_dev) +{ + bool call_proc_req_cb = false; + + ESP_LOGD(EXT_HUB_TAG, "[%d] Device release", ext_hub_dev->constant.dev_addr); + + // Mark all Ports are disable and then gone + for (uint8_t i = 0; i < ext_hub_dev->constant.maxchild; i++) { + if (p_ext_hub_driver->constant.port_driver) { + p_ext_hub_driver->constant.port_driver->gone(ext_hub_dev->constant.ports[i]); + } + } + + // Release IN EP + ESP_ERROR_CHECK(usbh_ep_command(ext_hub_dev->constant.ep_in_hdl, USBH_EP_CMD_HALT)); + + // Close the device + ESP_ERROR_CHECK(usbh_dev_close(ext_hub_dev->constant.dev_hdl)); + + EXT_HUB_ENTER_CRITICAL(); + call_proc_req_cb = _device_set_actions(ext_hub_dev, DEV_ACTION_FREE); + EXT_HUB_EXIT_CRITICAL(); + + if (call_proc_req_cb) { + p_ext_hub_driver->constant.proc_req_cb(false, p_ext_hub_driver->constant.proc_req_cb_arg); + } +} + +static esp_err_t device_alloc_desc(ext_hub_dev_t *ext_hub_hdl, const usb_hub_descriptor_t *hub_desc) +{ + // Allocate memory to store the configuration descriptor + usb_hub_descriptor_t *desc = heap_caps_malloc(hub_desc->bDescLength, MALLOC_CAP_DEFAULT); // Buffer to copy over full configuration descriptor (wTotalLength) + if (desc == NULL) { + return ESP_ERR_NO_MEM; + } + // Copy the hub descriptor + memcpy(desc, hub_desc, hub_desc->bDescLength); + // Assign the hub descriptor to the device object + assert(ext_hub_hdl->constant.hub_desc == NULL); + ext_hub_hdl->constant.hub_desc = desc; + return ESP_OK; +} + +static esp_err_t device_alloc(device_config_t *config, ext_hub_dev_t **ext_hub_dev) +{ + esp_err_t ret; + urb_t *ctrl_urb = NULL; + urb_t *in_urb = NULL; + +#if !ENABLE_MULTIPLE_HUBS + usb_device_info_t dev_info; + ESP_ERROR_CHECK(usbh_dev_get_info(config->dev_hdl, &dev_info)); + if (dev_info.parent.dev_hdl) { + ESP_LOGW(EXT_HUB_TAG, "Multiple Hubs not supported, use menuconfig to enable feature"); + ret = ESP_ERR_NOT_SUPPORTED; + goto fail; + } +#endif // ENABLE_MULTIPLE_HUBS + + ext_hub_dev_t *hub_dev = heap_caps_calloc(1, sizeof(ext_hub_dev_t), MALLOC_CAP_DEFAULT); + + if (hub_dev == NULL) { + ESP_LOGE(EXT_HUB_TAG, "Unable to allocate device"); + ret = ESP_ERR_NO_MEM; + goto fail; + } + + // Allocate Control transfer URB + ctrl_urb = urb_alloc(sizeof(usb_setup_packet_t) + EXT_HUB_CTRL_TRANSFER_MAX_DATA_LEN, 0); + if (ctrl_urb == NULL) { + ESP_LOGE(EXT_HUB_TAG, "Unable to allocate Control URB"); + ret = ESP_ERR_NO_MEM; + goto ctrl_urb_fail; + } + + in_urb = urb_alloc(config->ep_in_desc->wMaxPacketSize, 0); + // Allocate Interrupt transfer URB + if (in_urb == NULL) { + ESP_LOGE(EXT_HUB_TAG, "Unable to allocate Interrupt URB"); + ret = ESP_ERR_NO_MEM; + goto in_urb_fail; + } + + usbh_ep_handle_t ep_hdl; + usbh_ep_config_t ep_config = { + .bInterfaceNumber = config->iface_desc->bInterfaceNumber, + .bAlternateSetting = config->iface_desc->bAlternateSetting, + .bEndpointAddress = config->ep_in_desc->bEndpointAddress, + .ep_cb = interrupt_pipe_cb, + .ep_cb_arg = (void *)hub_dev, + .context = (void *)hub_dev, + }; + + ret = usbh_ep_alloc(config->dev_hdl, &ep_config, &ep_hdl); + if (ret != ESP_OK) { + ESP_LOGE(EXT_HUB_TAG, "Endpoint allocation failure (%#x)", ret); + goto ep_fail; + } + // Configure Control transfer URB + ctrl_urb->usb_host_client = (void *) p_ext_hub_driver; + ctrl_urb->transfer.callback = control_transfer_complete_cb; + ctrl_urb->transfer.context = (void *) hub_dev; + + // Client is a memory address of the p_ext_hub_driver driver object + in_urb->usb_host_client = (void *) p_ext_hub_driver; + in_urb->transfer.callback = interrupt_transfer_complete_cb; + in_urb->transfer.context = (void *) hub_dev; + in_urb->transfer.num_bytes = config->ep_in_desc->wMaxPacketSize; + + // Save constant parameters + hub_dev->constant.ep_in_hdl = ep_hdl; + hub_dev->constant.ctrl_urb = ctrl_urb; + hub_dev->constant.in_urb = in_urb; + hub_dev->constant.dev_hdl = config->dev_hdl; + hub_dev->constant.dev_addr = config->dev_addr; + hub_dev->constant.iface_num = config->iface_desc->bInterfaceNumber; + // We will update number of ports during Hub Descriptor handling stage + hub_dev->constant.maxchild = 0; + + hub_dev->dynamic.flags.val = 0; + hub_dev->dynamic.state = EXT_HUB_STATE_ATTACHED; + hub_dev->dynamic.stage = EXT_HUB_STAGE_IDLE; + + EXT_HUB_ENTER_CRITICAL(); + TAILQ_INSERT_TAIL(&p_ext_hub_driver->dynamic.ext_hubs_tailq, hub_dev, dynamic.tailq_entry); + EXT_HUB_EXIT_CRITICAL(); + + ESP_LOGD(EXT_HUB_TAG, "[%d] New device (iface %d)", config->dev_addr, hub_dev->constant.iface_num); + + *ext_hub_dev = hub_dev; + return ret; + +ep_fail: + urb_free(in_urb); +in_urb_fail: + urb_free(ctrl_urb); +ctrl_urb_fail: + heap_caps_free(hub_dev); +fail: + return ret; +} + +static esp_err_t device_configure(ext_hub_dev_t *ext_hub_dev) +{ + EXT_HUB_CHECK(ext_hub_dev->constant.hub_desc != NULL, ESP_ERR_INVALID_STATE); + usb_hub_descriptor_t *hub_desc = ext_hub_dev->constant.hub_desc; + + ESP_LOGD(EXT_HUB_TAG, "[%d] Device configure (iface %d)", + ext_hub_dev->constant.dev_addr, + ext_hub_dev->constant.iface_num); + + if (hub_desc->wHubCharacteristics.compound) { + ESP_LOGD(EXT_HUB_TAG, "\tCompound device"); + } else { + ESP_LOGD(EXT_HUB_TAG, "\tStandalone HUB"); + } + + ESP_LOGD(EXT_HUB_TAG, "\t%d external port%s", + ext_hub_dev->constant.hub_desc->bNbrPorts, + (ext_hub_dev->constant.hub_desc->bNbrPorts == 1) ? "" : "s"); + + switch (hub_desc->wHubCharacteristics.power_switching) { + case USB_W_HUB_CHARS_PORT_PWR_CTRL_NO: + ESP_LOGD(EXT_HUB_TAG, "\tNo power switching (usb 1.0)"); + break; + case USB_W_HUB_CHARS_PORT_PWR_CTRL_INDV: + ESP_LOGD(EXT_HUB_TAG, "\tIndividual port power switching"); + break; + default: + // USB_W_HUB_CHARS_PORT_PWR_CTRL_ALL + ESP_LOGD(EXT_HUB_TAG, "\tAll ports power at once"); + break; + } + + switch (hub_desc->wHubCharacteristics.ovr_current_protect) { + case USB_W_HUB_CHARS_PORT_OVER_CURR_NO: + ESP_LOGD(EXT_HUB_TAG, "\tNo over-current protection"); + break; + case USB_W_HUB_CHARS_PORT_OVER_CURR_INDV: + ESP_LOGD(EXT_HUB_TAG, "\tIndividual port over-current protection"); + break; + default: + // USB_W_HUB_CHARS_PORT_OVER_CURR_ALL + ESP_LOGD(EXT_HUB_TAG, "\tGlobal over-current protection"); + break; + } + + if (hub_desc->wHubCharacteristics.indicator_support) { + ESP_LOGD(EXT_HUB_TAG, "\tPort indicators are supported"); + } + + ESP_LOGD(EXT_HUB_TAG, "\tPower on to power good time: %dms", hub_desc->bPwrOn2PwrGood * 2); + ESP_LOGD(EXT_HUB_TAG, "\tMaximum current: %d mA", hub_desc->bHubContrCurrent); + + // Create External Port flexible array + ext_hub_dev->constant.ports = heap_caps_calloc(ext_hub_dev->constant.hub_desc->bNbrPorts, sizeof(ext_port_hdl_t), MALLOC_CAP_DEFAULT); + if (ext_hub_dev->constant.ports == NULL) { + ESP_LOGE(EXT_HUB_TAG, "Ports allocation err"); + return ESP_ERR_NO_MEM; + } + + // Update device port amount + ext_hub_dev->constant.maxchild = ext_hub_dev->constant.hub_desc->bNbrPorts; + + // Create port and add it to pending list + for (uint8_t i = 0; i < ext_hub_dev->constant.maxchild; i++) { + if (p_ext_hub_driver->constant.port_driver) { + p_ext_hub_driver->constant.port_driver->new (NULL, (void**) &ext_hub_dev->constant.ports[i]); + } + } + + EXT_HUB_ENTER_CRITICAL(); + ext_hub_dev->dynamic.state = EXT_HUB_STATE_CONFIGURED; + EXT_HUB_EXIT_CRITICAL(); + + return ESP_OK; +} + +static void device_free(ext_hub_dev_t *ext_hub_dev) +{ + ESP_LOGD(EXT_HUB_TAG, "[%d] Freeing device", ext_hub_dev->constant.dev_addr); + + EXT_HUB_ENTER_CRITICAL(); + ext_hub_dev->dynamic.flags.waiting_free = 0; + TAILQ_REMOVE(&p_ext_hub_driver->dynamic.ext_hubs_tailq, ext_hub_dev, dynamic.tailq_entry); + EXT_HUB_EXIT_CRITICAL(); + + // Free ports + for (uint8_t i = 0; i < ext_hub_dev->constant.maxchild; i++) { + if (p_ext_hub_driver->constant.port_driver) { + p_ext_hub_driver->constant.port_driver->free(ext_hub_dev->constant.ports[i]); + } + } + + if (ext_hub_dev->constant.hub_desc) { + heap_caps_free(ext_hub_dev->constant.hub_desc); + } + if (ext_hub_dev->constant.ports) { + heap_caps_free(ext_hub_dev->constant.ports); + } + + ESP_ERROR_CHECK(usbh_ep_free(ext_hub_dev->constant.ep_in_hdl)); + urb_free(ext_hub_dev->constant.ctrl_urb); + urb_free(ext_hub_dev->constant.in_urb); + + heap_caps_free(ext_hub_dev); +} + +static esp_err_t get_dev_by_hdl(usb_device_handle_t dev_hdl, ext_hub_dev_t **ext_hub_hdl) +{ + esp_err_t ret = ESP_OK; + // Go through the Hubs lists to find the hub with the specified device address + ext_hub_dev_t *found_hub = NULL; + ext_hub_dev_t *hub = NULL; + + EXT_HUB_ENTER_CRITICAL(); + TAILQ_FOREACH(hub, &p_ext_hub_driver->dynamic.ext_hubs_pending_tailq, dynamic.tailq_entry) { + if (hub->constant.dev_hdl == dev_hdl) { + found_hub = hub; + goto exit; + } + } + + TAILQ_FOREACH(hub, &p_ext_hub_driver->dynamic.ext_hubs_tailq, dynamic.tailq_entry) { + if (hub->constant.dev_hdl == dev_hdl) { + found_hub = hub; + goto exit; + } + } + +exit: + if (found_hub == NULL) { + ret = ESP_ERR_NOT_FOUND; + } + EXT_HUB_EXIT_CRITICAL(); + + *ext_hub_hdl = found_hub; + return ret; +} + +static esp_err_t get_dev_by_addr(uint8_t dev_addr, ext_hub_dev_t **ext_hub_hdl) +{ + esp_err_t ret = ESP_OK; + // Go through the Hubs lists to find the Hub with the specified device address + ext_hub_dev_t *found_hub = NULL; + ext_hub_dev_t *hub = NULL; + + EXT_HUB_ENTER_CRITICAL(); + TAILQ_FOREACH(hub, &p_ext_hub_driver->dynamic.ext_hubs_pending_tailq, dynamic.tailq_entry) { + if (hub->constant.dev_addr == dev_addr) { + found_hub = hub; + goto exit; + } + } + + TAILQ_FOREACH(hub, &p_ext_hub_driver->dynamic.ext_hubs_tailq, dynamic.tailq_entry) { + if (hub->constant.dev_addr == dev_addr) { + found_hub = hub; + goto exit; + } + } + +exit: + if (found_hub == NULL) { + ret = ESP_ERR_NOT_FOUND; + } + EXT_HUB_EXIT_CRITICAL(); + + *ext_hub_hdl = found_hub; + return ret; +} + +// ----------------------------------------------------------------------------- +// -------------------------- Device handling --------------------------------- +// ----------------------------------------------------------------------------- + +static bool handle_hub_descriptor(ext_hub_dev_t *ext_hub_dev) +{ + esp_err_t ret; + bool pass; + usb_transfer_t *ctrl_xfer = &ext_hub_dev->constant.ctrl_urb->transfer; + const usb_hub_descriptor_t *hub_desc = (const usb_hub_descriptor_t *)(ctrl_xfer->data_buffer + sizeof(usb_setup_packet_t)); + + if (ctrl_xfer->status != USB_TRANSFER_STATUS_COMPLETED) { + ESP_LOGE(EXT_HUB_TAG, "Bad transfer status %d: stage=%d", ctrl_xfer->status, ext_hub_dev->dynamic.stage); + return false; + } + + ESP_LOG_BUFFER_HEXDUMP(EXT_HUB_TAG, ctrl_xfer->data_buffer, ctrl_xfer->actual_num_bytes, ESP_LOG_VERBOSE); + + ret = device_alloc_desc(ext_hub_dev, hub_desc); + if (ret != ESP_OK) { + pass = false; + goto exit; + } + + ret = device_configure(ext_hub_dev); + if (ret != ESP_OK) { + pass = false; + goto exit; + } + + pass = true; +exit: + return pass; +} + +static bool handle_device_status(ext_hub_dev_t *ext_hub_dev) +{ + usb_transfer_t *ctrl_xfer = &ext_hub_dev->constant.ctrl_urb->transfer; + const usb_device_status_t *dev_status = (const usb_device_status_t *)(ctrl_xfer->data_buffer + sizeof(usb_setup_packet_t)); + + ESP_LOGD(EXT_HUB_TAG, "[%d] Device status: ", ext_hub_dev->constant.dev_addr); + ESP_LOGD(EXT_HUB_TAG, "\tPower: %s", dev_status->self_powered ? "self-powered" : "bus-powered"); + ESP_LOGD(EXT_HUB_TAG, "\tRemoteWakeup: %s", dev_status->remote_wakeup ? "yes" : "no"); + + if (dev_status->remote_wakeup) { + // Device in remote_wakeup, we need send command Clear Device Feature: USB_W_VALUE_FEATURE_DEVICE_REMOTE_WAKEUP + // HEX codes of command: 00 01 01 00 00 00 00 00 + // TODO: IDF-10055 Hub Support remote_wakeup feature + ESP_LOGW(EXT_HUB_TAG, "Remote Wakeup feature has not been implemented yet"); + } + return true; +} + +static bool handle_hub_status(ext_hub_dev_t *ext_hub_dev) +{ + usb_transfer_t *ctrl_xfer = &ext_hub_dev->constant.ctrl_urb->transfer; + const usb_hub_status_t *hub_status = (const usb_hub_status_t *)(ctrl_xfer->data_buffer + sizeof(usb_setup_packet_t)); + + ESP_LOGD(EXT_HUB_TAG, "[%d] Hub status: ", ext_hub_dev->constant.dev_addr); + ESP_LOGD(EXT_HUB_TAG, "\tExternal power supply: %s", hub_status->wHubStatus.HUB_LOCAL_POWER ? "yes" : "no"); + ESP_LOGD(EXT_HUB_TAG, "\tOvercurrent: %s", hub_status->wHubStatus.HUB_OVER_CURRENT ? "yes" : "no"); + + if (hub_status->wHubStatus.HUB_OVER_CURRENT) { + ESP_LOGE(EXT_HUB_TAG, "Device has overcurrent!"); + // Hub has an overcurrent, we need to disable all port and/or disable parent port + // TODO: IDF-10056 Hubs overcurrent handling + ESP_LOGW(EXT_HUB_TAG, "Feature has not been implemented yet"); + return false; + } + + return true; +} + +static bool device_control_request(ext_hub_dev_t *ext_hub_dev) +{ + esp_err_t ret; + usb_transfer_t *transfer = &ext_hub_dev->constant.ctrl_urb->transfer; + + switch (ext_hub_dev->dynamic.stage) { + case EXT_HUB_STAGE_GET_DEVICE_STATUS: + USB_SETUP_PACKET_INIT_GET_STATUS((usb_setup_packet_t *)transfer->data_buffer); + transfer->num_bytes = sizeof(usb_setup_packet_t) + sizeof(usb_device_status_t); + break; + case EXT_HUB_STAGE_GET_HUB_DESCRIPTOR: + USB_SETUP_PACKET_INIT_GET_HUB_DESCRIPTOR((usb_setup_packet_t *)transfer->data_buffer); + transfer->num_bytes = sizeof(usb_setup_packet_t) + sizeof(usb_hub_descriptor_t); + break; + case EXT_HUB_STAGE_GET_HUB_STATUS: + USB_SETUP_PACKET_INIT_GET_HUB_STATUS((usb_setup_packet_t *)transfer->data_buffer); + transfer->num_bytes = sizeof(usb_setup_packet_t) + sizeof(usb_hub_status_t); + break; + default: + // Should never occur + abort(); + break; + } + + ret = usbh_dev_submit_ctrl_urb(ext_hub_dev->constant.dev_hdl, ext_hub_dev->constant.ctrl_urb); + if (ret != ESP_OK) { + ESP_LOGE(EXT_HUB_TAG, "Failed to submit ctrl urb, error %#x", ret); + return false; + } + + return true; +} + +static bool device_control_response_handling(ext_hub_dev_t *ext_hub_dev) +{ + bool stage_pass = false; + + switch (ext_hub_dev->dynamic.stage) { + case EXT_HUB_STAGE_CHECK_DEVICE_STATUS: + stage_pass = handle_device_status(ext_hub_dev); + break; + case EXT_HUB_STAGE_CHECK_HUB_DESCRIPTOR: + stage_pass = handle_hub_descriptor(ext_hub_dev); + break; + case EXT_HUB_STAGE_CHECK_HUB_STATUS: + stage_pass = handle_hub_status(ext_hub_dev); + break; + default: + // Should never occur + abort(); + break; + } + + return stage_pass; +} + +static bool stage_need_process(ext_hub_stage_t stage) +{ + bool need_process_cb = false; + + switch (stage) { + // Stages, required control transfer + case EXT_HUB_STAGE_GET_DEVICE_STATUS: + case EXT_HUB_STAGE_GET_HUB_DESCRIPTOR: + case EXT_HUB_STAGE_GET_HUB_STATUS: + // Error stage + case EXT_HUB_STAGE_FAILURE: + need_process_cb = true; + break; + default: + break; + } + + return need_process_cb; +} + +// return +// true - next stage requires the processing +// false - terminal stage +static bool device_set_next_stage(ext_hub_dev_t *ext_hub_dev, bool last_stage_pass) +{ + bool need_process_cb; + ext_hub_stage_t last_stage = ext_hub_dev->dynamic.stage; + ext_hub_stage_t next_stage; + + if (last_stage_pass) { + ESP_LOGD(EXT_HUB_TAG, "Stage %s OK", ext_hub_stage_strings[last_stage]); + if (last_stage == EXT_HUB_STAGE_GET_DEVICE_STATUS || + last_stage == EXT_HUB_STAGE_GET_HUB_DESCRIPTOR || + last_stage == EXT_HUB_STAGE_GET_HUB_STATUS) { + // Simply increment to get the next stage + next_stage = last_stage + 1; + } else { + // Terminal stages, move to IDLE + next_stage = EXT_HUB_STAGE_IDLE; + } + } else { + ESP_LOGE(EXT_HUB_TAG, "Stage %s FAILED", ext_hub_stage_strings[last_stage]); + // These stages cannot fail + assert(last_stage != EXT_HUB_STAGE_PORT_FEATURE || + last_stage != EXT_HUB_STAGE_PORT_STATUS_REQUEST); + + next_stage = EXT_HUB_STAGE_FAILURE; + } + + EXT_HUB_ENTER_CRITICAL(); + ext_hub_dev->dynamic.stage = next_stage; + need_process_cb = stage_need_process(next_stage); + EXT_HUB_EXIT_CRITICAL(); + + return need_process_cb; +} + +static void handle_port_feature(ext_hub_dev_t *ext_hub_dev) +{ + usb_transfer_t *ctrl_xfer = &ext_hub_dev->constant.ctrl_urb->transfer; + uint8_t port_num = USB_SETUP_PACKET_GET_PORT((usb_setup_packet_t *)ctrl_xfer->data_buffer); + uint8_t port_idx = port_num - 1; + + assert(port_idx < ext_hub_dev->constant.maxchild); + if (p_ext_hub_driver->constant.port_driver) { + p_ext_hub_driver->constant.port_driver->get_status(ext_hub_dev->constant.ports[port_idx]); + } +} + +static void handle_port_status(ext_hub_dev_t *ext_hub_dev) +{ + usb_transfer_t *ctrl_xfer = &ext_hub_dev->constant.ctrl_urb->transfer; + uint8_t port_num = USB_SETUP_PACKET_GET_PORT((usb_setup_packet_t *)ctrl_xfer->data_buffer); + uint8_t port_idx = port_num - 1; + const usb_port_status_t *new_status = (const usb_port_status_t *)(ctrl_xfer->data_buffer + sizeof(usb_setup_packet_t)); + + assert(port_idx < ext_hub_dev->constant.maxchild); + if (p_ext_hub_driver->constant.port_driver) { + p_ext_hub_driver->constant.port_driver->set_status(ext_hub_dev->constant.ports[port_idx], new_status); + } +} + +static void handle_device(ext_hub_dev_t *ext_hub_dev) +{ + bool call_proc_req_cb; + bool stage_pass = false; + // FSM for external Hub + switch (ext_hub_dev->dynamic.stage) { + case EXT_HUB_STAGE_IDLE: + break; + case EXT_HUB_STAGE_GET_DEVICE_STATUS: + case EXT_HUB_STAGE_GET_HUB_DESCRIPTOR: + case EXT_HUB_STAGE_GET_HUB_STATUS: + stage_pass = device_control_request(ext_hub_dev); + break; + case EXT_HUB_STAGE_CHECK_HUB_DESCRIPTOR: + stage_pass = device_control_response_handling(ext_hub_dev); + break; + case EXT_HUB_STAGE_PORT_FEATURE: + handle_port_feature(ext_hub_dev); + stage_pass = true; + break; + case EXT_HUB_STAGE_PORT_STATUS_REQUEST: + handle_port_status(ext_hub_dev); + stage_pass = true; + break; + case EXT_HUB_STAGE_FAILURE: + ESP_LOGW(EXT_HUB_TAG, "External Hub device failure handling has not been implemented yet"); + // device_error(ext_hub_dev); + break; + default: + // Should never occur + abort(); + break; + } + + call_proc_req_cb = device_set_next_stage(ext_hub_dev, stage_pass); + + if (call_proc_req_cb) { + p_ext_hub_driver->constant.proc_req_cb(false, p_ext_hub_driver->constant.proc_req_cb_arg); + } +} + +static void handle_ep1_flush(ext_hub_dev_t *ext_hub_dev) +{ + ESP_ERROR_CHECK(usbh_ep_command(ext_hub_dev->constant.ep_in_hdl, USBH_EP_CMD_HALT)); + ESP_ERROR_CHECK(usbh_ep_command(ext_hub_dev->constant.ep_in_hdl, USBH_EP_CMD_FLUSH)); +} + +static void handle_ep1_dequeue(ext_hub_dev_t *ext_hub_dev) +{ + // Dequeue all URBs and run their transfer callback + ESP_LOGD(EXT_HUB_TAG, "[%d] Interrupt dequeue", ext_hub_dev->constant.dev_addr); + urb_t *urb; + usbh_ep_dequeue_urb(ext_hub_dev->constant.ep_in_hdl, &urb); + while (urb != NULL) { + // Clear the transfer's in-flight flag to indicate the transfer is no longer in-flight + urb->usb_host_inflight = false; + urb->transfer.callback(&urb->transfer); + usbh_ep_dequeue_urb(ext_hub_dev->constant.ep_in_hdl, &urb); + } +} + +static void handle_ep1_clear(ext_hub_dev_t *ext_hub_dev) +{ + // We allow the pipe command to fail just in case the pipe becomes invalid mid command + usbh_ep_command(ext_hub_dev->constant.ep_in_hdl, USBH_EP_CMD_CLEAR); +} + +static void handle_error(ext_hub_dev_t *ext_hub_dev) +{ + // TODO: IDF-10057 Hub handling error + ESP_LOGW(EXT_HUB_TAG, "%s has not been implemented yet", __FUNCTION__); + device_disable(ext_hub_dev); +} + +static void handle_gone(ext_hub_dev_t *ext_hub_dev) +{ + bool call_proc_req_cb = false; + + // Set the flags + EXT_HUB_ENTER_CRITICAL(); + ext_hub_dev->dynamic.flags.waiting_free = 1; + call_proc_req_cb = _device_set_actions(ext_hub_dev, DEV_ACTION_FREE); + EXT_HUB_EXIT_CRITICAL(); + + if (call_proc_req_cb) { + p_ext_hub_driver->constant.proc_req_cb(false, p_ext_hub_driver->constant.proc_req_cb_arg); + } +} + +// ----------------------------------------------------------------------------- +// ------------------------------ Driver --------------------------------------- +// ----------------------------------------------------------------------------- + +esp_err_t ext_hub_install(const ext_hub_config_t *config) +{ + esp_err_t ret; + ext_hub_driver_t *ext_hub_drv = heap_caps_calloc(1, sizeof(ext_hub_driver_t), MALLOC_CAP_DEFAULT); + EXT_HUB_CHECK(ext_hub_drv != NULL, ESP_ERR_NO_MEM); + + // Save callbacks + ext_hub_drv->constant.proc_req_cb = config->proc_req_cb; + ext_hub_drv->constant.proc_req_cb_arg = config->proc_req_cb_arg; + // Copy Port driver pointer + ext_hub_drv->constant.port_driver = config->port_driver; + + if (ext_hub_drv->constant.port_driver == NULL) { + ESP_LOGW(EXT_HUB_TAG, "Port Driver has not been installed"); + } + + TAILQ_INIT(&ext_hub_drv->dynamic.ext_hubs_tailq); + TAILQ_INIT(&ext_hub_drv->dynamic.ext_hubs_pending_tailq); + + EXT_HUB_ENTER_CRITICAL(); + if (p_ext_hub_driver != NULL) { + EXT_HUB_EXIT_CRITICAL(); + ret = ESP_ERR_INVALID_STATE; + goto fail; + } + p_ext_hub_driver = ext_hub_drv; + EXT_HUB_EXIT_CRITICAL(); + + ESP_LOGD(EXT_HUB_TAG, "Driver installed"); + return ESP_OK; + +fail: + heap_caps_free(ext_hub_drv); + return ret; +} + +esp_err_t ext_hub_uninstall(void) +{ + EXT_HUB_ENTER_CRITICAL(); + EXT_HUB_CHECK_FROM_CRIT(p_ext_hub_driver != NULL, ESP_ERR_INVALID_STATE); + EXT_HUB_CHECK_FROM_CRIT(TAILQ_EMPTY(&p_ext_hub_driver->dynamic.ext_hubs_tailq), ESP_ERR_INVALID_STATE); + EXT_HUB_CHECK_FROM_CRIT(TAILQ_EMPTY(&p_ext_hub_driver->dynamic.ext_hubs_pending_tailq), ESP_ERR_INVALID_STATE); + ext_hub_driver_t *ext_hub_drv = p_ext_hub_driver; + p_ext_hub_driver = NULL; + EXT_HUB_EXIT_CRITICAL(); + + heap_caps_free(ext_hub_drv); + ESP_LOGD(EXT_HUB_TAG, "Driver uninstalled"); + return ESP_OK; +} + +void *ext_hub_get_client(void) +{ + bool driver_installed = false; + EXT_HUB_ENTER_CRITICAL(); + driver_installed = (p_ext_hub_driver != NULL); + EXT_HUB_EXIT_CRITICAL(); + return (driver_installed) ? (void*) p_ext_hub_driver : NULL; +} + +// ----------------------------------------------------------------------------- +// -------------------------- External Hub API --------------------------------- +// ----------------------------------------------------------------------------- + +esp_err_t ext_hub_get_handle(usb_device_handle_t dev_hdl, ext_hub_handle_t *ext_hub_hdl) +{ + EXT_HUB_ENTER_CRITICAL(); + EXT_HUB_CHECK_FROM_CRIT(p_ext_hub_driver != NULL, ESP_ERR_INVALID_STATE); + EXT_HUB_EXIT_CRITICAL(); + return get_dev_by_hdl(dev_hdl, ext_hub_hdl); +} + +static esp_err_t find_first_intf_desc(const usb_config_desc_t *config_desc, device_config_t *hub_config) +{ + bool iface_found = false; + const usb_ep_desc_t *ep_in_desc = NULL; + + int offset = 0; + const usb_intf_desc_t *next_intf_desc = (const usb_intf_desc_t *)usb_parse_next_descriptor_of_type( + (const usb_standard_desc_t *)config_desc, + config_desc->wTotalLength, + USB_B_DESCRIPTOR_TYPE_INTERFACE, + &offset); + + while (next_intf_desc != NULL) { + if (iface_found) { + // TODO: IDF-10058 Hubs support interface selection (HS) + ESP_LOGW(EXT_HUB_TAG, "Device has several Interfaces, selection has not been implemented yet. Using first."); + break; + } + // Parse all interfaces + if (USB_CLASS_HUB == next_intf_desc->bInterfaceClass) { + // We have found the first interface descriptor with matching bInterfaceNumber +#if (OTG_HSPHY_INTERFACE != 0) + // TODO: IDF-10059 Hubs support multiple TT (HS) + if (next_intf_desc->bInterfaceProtocol != USB_B_DEV_PROTOCOL_HUB_HS_NO_TT) { + ESP_LOGD(EXT_HUB_TAG, "Transaction Translator:"); + ESP_LOGW(EXT_HUB_TAG, "Transaction Translator has not been implemented yet"); + } + + switch (next_intf_desc->bInterfaceProtocol) { + case USB_B_DEV_PROTOCOL_HUB_HS_NO_TT: + ESP_LOGD(EXT_HUB_TAG, "\tNo TT"); + break; + case USB_B_DEV_PROTOCOL_HUB_HS_SINGLE_TT: + ESP_LOGD(EXT_HUB_TAG, "\tSingle TT"); + break; + case USB_B_DEV_PROTOCOL_HUB_HS_MULTI_TT: + ESP_LOGD(EXT_HUB_TAG, "\tMulti TT"); + break; + default: + ESP_LOGE(EXT_HUB_TAG, "\tInterface Protocol (%#x) not supported", next_intf_desc->bInterfaceProtocol); + goto next_iface; + } +#else + if (next_intf_desc->bInterfaceProtocol != USB_B_DEV_PROTOCOL_HUB_FS) { + ESP_LOGE(EXT_HUB_TAG, "\tProtocol (%#x) not supported", next_intf_desc->bInterfaceProtocol); + goto next_iface; + } +#endif // OTG_HSPHY_INTERFACE != 0 + + // Hub Interface always should have only one Interrupt endpoint + if (next_intf_desc->bNumEndpoints != 1) { + ESP_LOGE(EXT_HUB_TAG, "Unexpected number of endpoints (%d)", next_intf_desc->bNumEndpoints); + goto next_iface; + } + // Get related IN EP + ep_in_desc = usb_parse_endpoint_descriptor_by_index(next_intf_desc, 0, config_desc->wTotalLength, &offset); + if (ep_in_desc == NULL) { + ESP_LOGE(EXT_HUB_TAG, "EP descriptor not found (iface=%d)", next_intf_desc->bInterfaceNumber); + goto next_iface; + } + + if (!USB_EP_DESC_GET_EP_DIR(ep_in_desc) || + (USB_EP_DESC_GET_XFERTYPE(ep_in_desc) != USB_TRANSFER_TYPE_INTR)) { + ESP_LOGE(EXT_HUB_TAG, "Interrupt EP not found (iface=%d)", next_intf_desc->bInterfaceNumber); + goto next_iface; + } + + // Interface found, fill the config + hub_config->iface_desc = next_intf_desc; + hub_config->ep_in_desc = ep_in_desc; + iface_found = true; + } + +next_iface: + next_intf_desc = (const usb_intf_desc_t *)usb_parse_next_descriptor_of_type( + (const usb_standard_desc_t *)next_intf_desc, + config_desc->wTotalLength, + USB_B_DESCRIPTOR_TYPE_INTERFACE, + &offset); + } + + return (iface_found) ? ESP_OK : ESP_ERR_NOT_FOUND; +} + +esp_err_t ext_hub_new_dev(uint8_t dev_addr) +{ + EXT_HUB_ENTER_CRITICAL(); + EXT_HUB_CHECK_FROM_CRIT(p_ext_hub_driver != NULL, ESP_ERR_INVALID_STATE); + EXT_HUB_EXIT_CRITICAL(); + esp_err_t ret; + ext_hub_dev_t *hub_dev = NULL; + usb_device_handle_t dev_hdl = NULL; + const usb_config_desc_t *config_desc = NULL; + bool call_proc_req_cb = false; + + // Open device + ret = usbh_devs_open(dev_addr, &dev_hdl); + if (ret != ESP_OK) { + return ret; + } + + // Get Configuration Descriptor + ret = usbh_dev_get_config_desc(dev_hdl, &config_desc); + if (ret != ESP_OK) { + goto exit; + } + + // Find related Hub Interface descriptor + device_config_t hub_config = { + .dev_hdl = dev_hdl, + .dev_addr = dev_addr, + .iface_desc = NULL, + .ep_in_desc = NULL, + }; + + ret = find_first_intf_desc(config_desc, &hub_config); + if (ret != ESP_OK) { + goto exit; + } + + // Create External Hub device + ret = device_alloc(&hub_config, &hub_dev); + if (ret != ESP_OK) { + goto exit; + } + + EXT_HUB_ENTER_CRITICAL(); + hub_dev->dynamic.stage = EXT_HUB_STAGE_GET_HUB_DESCRIPTOR; + call_proc_req_cb = _device_set_actions(hub_dev, DEV_ACTION_REQ); + EXT_HUB_EXIT_CRITICAL(); + + if (call_proc_req_cb) { + p_ext_hub_driver->constant.proc_req_cb(false, p_ext_hub_driver->constant.proc_req_cb_arg); + } + + return ret; + +exit: + ESP_ERROR_CHECK(usbh_dev_close(dev_hdl)); + return ret; +} + +esp_err_t ext_hub_dev_gone(uint8_t dev_addr) +{ + EXT_HUB_ENTER_CRITICAL(); + EXT_HUB_CHECK_FROM_CRIT(p_ext_hub_driver != NULL, ESP_ERR_INVALID_STATE); + EXT_HUB_EXIT_CRITICAL(); + esp_err_t ret; + + ext_hub_dev_t *ext_hub_dev = NULL; + bool call_proc_req_cb = false; + + EXT_HUB_CHECK(dev_addr != 0, ESP_ERR_INVALID_ARG); + // Find device with dev_addr in the devices TAILQ + // TODO: IDF-10058 + // Release all devices by dev_addr + ret = get_dev_by_addr(dev_addr, &ext_hub_dev); + if (ret != ESP_OK) { + ESP_LOGD(EXT_HUB_TAG, "No device with address %d was found", dev_addr); + return ret; + } + + ESP_LOGE(EXT_HUB_TAG, "[%d] Device gone", ext_hub_dev->constant.dev_addr); + + for (uint8_t i = 0; i < ext_hub_dev->constant.maxchild; i++) { + if (p_ext_hub_driver->constant.port_driver) { + p_ext_hub_driver->constant.port_driver->gone(ext_hub_dev->constant.ports[i]); + } + } + + // Close the device + ESP_ERROR_CHECK(usbh_dev_close(ext_hub_dev->constant.dev_hdl)); + + EXT_HUB_ENTER_CRITICAL(); + ext_hub_dev->dynamic.flags.is_gone = 1; + call_proc_req_cb = _device_set_actions(ext_hub_dev, DEV_ACTION_GONE); + EXT_HUB_EXIT_CRITICAL(); + + if (call_proc_req_cb) { + p_ext_hub_driver->constant.proc_req_cb(false, p_ext_hub_driver->constant.proc_req_cb_arg); + } + return ret; +} + +esp_err_t ext_hub_all_free(void) +{ + ext_hub_dev_t *hub = NULL; + bool call_proc_req_cb = false; + + EXT_HUB_ENTER_CRITICAL(); + EXT_HUB_CHECK_FROM_CRIT(p_ext_hub_driver != NULL, ESP_ERR_INVALID_STATE); + TAILQ_FOREACH(hub, &p_ext_hub_driver->dynamic.ext_hubs_tailq, dynamic.tailq_entry) { + hub->dynamic.flags.waiting_free = 1; + _device_set_actions(hub, DEV_ACTION_RELEASE); + hub->dynamic.state = EXT_HUB_STATE_RELEASED; + call_proc_req_cb = true; + } + TAILQ_FOREACH(hub, &p_ext_hub_driver->dynamic.ext_hubs_pending_tailq, dynamic.tailq_entry) { + hub->dynamic.flags.waiting_free = 1; + hub->dynamic.state = EXT_HUB_STATE_RELEASED; + _device_set_actions(hub, DEV_ACTION_RELEASE); + call_proc_req_cb = true; + } + EXT_HUB_EXIT_CRITICAL(); + + if (call_proc_req_cb) { + p_ext_hub_driver->constant.proc_req_cb(false, p_ext_hub_driver->constant.proc_req_cb_arg); + } + + return ESP_OK; +} + +esp_err_t ext_hub_status_handle_complete(ext_hub_handle_t ext_hub_hdl) +{ + EXT_HUB_CHECK(ext_hub_hdl != NULL, ESP_ERR_INVALID_ARG); + ext_hub_dev_t *ext_hub_dev = (ext_hub_dev_t *)ext_hub_hdl; + + EXT_HUB_CHECK(ext_hub_dev->dynamic.state == EXT_HUB_STATE_CONFIGURED, ESP_ERR_INVALID_STATE); + + ESP_LOGD(EXT_HUB_TAG, "[%d] Status handle complete, wait status change ...", ext_hub_hdl->constant.dev_addr); + + return device_enable_int_ep(ext_hub_dev); +} + +esp_err_t ext_hub_process(void) +{ + EXT_HUB_ENTER_CRITICAL(); + EXT_HUB_CHECK_FROM_CRIT(p_ext_hub_driver != NULL, ESP_ERR_INVALID_STATE); + // Keep processing until all device's with pending events have been handled + while (!TAILQ_EMPTY(&p_ext_hub_driver->dynamic.ext_hubs_pending_tailq)) { + // Move the device back into the idle device list, + ext_hub_dev_t *ext_hub_dev = TAILQ_FIRST(&p_ext_hub_driver->dynamic.ext_hubs_pending_tailq); + TAILQ_REMOVE(&p_ext_hub_driver->dynamic.ext_hubs_pending_tailq, ext_hub_dev, dynamic.tailq_entry); + TAILQ_INSERT_TAIL(&p_ext_hub_driver->dynamic.ext_hubs_tailq, ext_hub_dev, dynamic.tailq_entry); + // Clear the device's flags + uint32_t action_flags = ext_hub_dev->dynamic.action_flags; + ext_hub_dev->dynamic.action_flags = 0; + ext_hub_dev->dynamic.flags.in_pending_list = 0; + + /* --------------------------------------------------------------------- + Exit critical section to handle device action flags in their listed order + --------------------------------------------------------------------- */ + EXT_HUB_EXIT_CRITICAL(); + ESP_LOGD(EXT_HUB_TAG, "[%d] Processing actions 0x%"PRIx32"", ext_hub_dev->constant.dev_addr, action_flags); + + if (action_flags & DEV_ACTION_REQ || + action_flags & DEV_ACTION_EP0_COMPLETE) { + handle_device(ext_hub_dev); + } + if (action_flags & DEV_ACTION_EP1_FLUSH) { + handle_ep1_flush(ext_hub_dev); + } + if (action_flags & DEV_ACTION_EP1_DEQUEUE) { + handle_ep1_dequeue(ext_hub_dev); + } + if (action_flags & DEV_ACTION_EP1_CLEAR) { + handle_ep1_clear(ext_hub_dev); + } + if (action_flags & DEV_ACTION_ERROR) { + handle_error(ext_hub_dev); + } + if (action_flags & DEV_ACTION_GONE) { + handle_gone(ext_hub_dev); + } + if (action_flags & DEV_ACTION_RELEASE) { + device_release(ext_hub_dev); + } + if (action_flags & DEV_ACTION_FREE) { + device_free(ext_hub_dev); + } + EXT_HUB_ENTER_CRITICAL(); + /* --------------------------------------------------------------------- + Re-enter critical sections. All device action flags should have been handled. + --------------------------------------------------------------------- */ + + } + EXT_HUB_EXIT_CRITICAL(); + + return ESP_OK; +} + +// ----------------------------------------------------------------------------- +// --------------------- External Hub - Device related ------------------------- +// ----------------------------------------------------------------------------- + +esp_err_t ext_hub_get_hub_status(ext_hub_handle_t ext_hub_hdl) +{ + EXT_HUB_ENTER_CRITICAL(); + EXT_HUB_CHECK_FROM_CRIT(p_ext_hub_driver != NULL, ESP_ERR_INVALID_STATE); + EXT_HUB_EXIT_CRITICAL(); + EXT_HUB_CHECK(ext_hub_hdl != NULL, ESP_ERR_INVALID_ARG); + ext_hub_dev_t *ext_hub_dev = (ext_hub_dev_t *)ext_hub_hdl; + + EXT_HUB_ENTER_CRITICAL(); + ext_hub_dev->dynamic.stage = EXT_HUB_STAGE_GET_HUB_STATUS; + bool call_proc_req_cb = _device_set_actions(ext_hub_dev, DEV_ACTION_REQ); + EXT_HUB_EXIT_CRITICAL(); + + if (call_proc_req_cb) { + p_ext_hub_driver->constant.proc_req_cb(false, p_ext_hub_driver->constant.proc_req_cb_arg); + } + + return ESP_OK; +} + +esp_err_t ext_hub_get_status(ext_hub_handle_t ext_hub_hdl) +{ + EXT_HUB_ENTER_CRITICAL(); + EXT_HUB_CHECK_FROM_CRIT(p_ext_hub_driver != NULL, ESP_ERR_INVALID_STATE); + EXT_HUB_EXIT_CRITICAL(); + + EXT_HUB_CHECK(ext_hub_hdl != NULL, ESP_ERR_INVALID_ARG); + ext_hub_dev_t *ext_hub_dev = (ext_hub_dev_t *)ext_hub_hdl; + + EXT_HUB_ENTER_CRITICAL(); + ext_hub_dev->dynamic.stage = EXT_HUB_STAGE_GET_DEVICE_STATUS; + bool call_proc_req_cb = _device_set_actions(ext_hub_dev, DEV_ACTION_REQ); + EXT_HUB_EXIT_CRITICAL(); + + if (call_proc_req_cb) { + p_ext_hub_driver->constant.proc_req_cb(false, p_ext_hub_driver->constant.proc_req_cb_arg); + } + + return ESP_OK; +} + +// ----------------------------------------------------------------------------- +// --------------------- External Hub - Port related --------------------------- +// ----------------------------------------------------------------------------- + +esp_err_t ext_hub_port_recycle(ext_hub_handle_t ext_hub_hdl, uint8_t port_num) +{ + EXT_HUB_ENTER_CRITICAL(); + EXT_HUB_CHECK_FROM_CRIT(p_ext_hub_driver != NULL, ESP_ERR_INVALID_STATE); + EXT_HUB_EXIT_CRITICAL(); + + esp_err_t ret; + EXT_HUB_CHECK(ext_hub_hdl != NULL, ESP_ERR_INVALID_ARG); + ext_hub_dev_t *ext_hub_dev = (ext_hub_dev_t *)ext_hub_hdl; + uint8_t port_idx = port_num - 1; + EXT_HUB_CHECK(port_idx < ext_hub_dev->constant.maxchild, ESP_ERR_INVALID_SIZE); + if (p_ext_hub_driver->constant.port_driver) { + ret = p_ext_hub_driver->constant.port_driver->recycle(ext_hub_dev->constant.ports[port_idx]); + } else { + ret = ESP_ERR_NOT_SUPPORTED; + } + return ret; +} + +esp_err_t ext_hub_port_reset(ext_hub_handle_t ext_hub_hdl, uint8_t port_num) +{ + EXT_HUB_ENTER_CRITICAL(); + EXT_HUB_CHECK_FROM_CRIT(p_ext_hub_driver != NULL, ESP_ERR_INVALID_STATE); + EXT_HUB_EXIT_CRITICAL(); + + esp_err_t ret; + EXT_HUB_CHECK(ext_hub_hdl != NULL, ESP_ERR_INVALID_ARG); + ext_hub_dev_t *ext_hub_dev = (ext_hub_dev_t *)ext_hub_hdl; + uint8_t port_idx = port_num - 1; + EXT_HUB_CHECK(port_idx < ext_hub_dev->constant.maxchild, ESP_ERR_INVALID_SIZE); + if (p_ext_hub_driver->constant.port_driver) { + ret = p_ext_hub_driver->constant.port_driver->reset(ext_hub_dev->constant.ports[port_idx]); + } else { + ret = ESP_ERR_NOT_SUPPORTED; + } + return ret; +} + +esp_err_t ext_hub_port_active(ext_hub_handle_t ext_hub_hdl, uint8_t port_num) +{ + EXT_HUB_ENTER_CRITICAL(); + EXT_HUB_CHECK_FROM_CRIT(p_ext_hub_driver != NULL, ESP_ERR_INVALID_STATE); + EXT_HUB_EXIT_CRITICAL(); + + esp_err_t ret; + EXT_HUB_CHECK(ext_hub_hdl != NULL, ESP_ERR_INVALID_ARG); + ext_hub_dev_t *ext_hub_dev = (ext_hub_dev_t *)ext_hub_hdl; + uint8_t port_idx = port_num - 1; + EXT_HUB_CHECK(port_idx < ext_hub_dev->constant.maxchild, ESP_ERR_INVALID_SIZE); + if (p_ext_hub_driver->constant.port_driver) { + ret = p_ext_hub_driver->constant.port_driver->active(ext_hub_dev->constant.ports[port_idx]); + } else { + ret = ESP_ERR_NOT_SUPPORTED; + } + return ret; +} + +esp_err_t ext_hub_port_disable(ext_hub_handle_t ext_hub_hdl, uint8_t port_num) +{ + EXT_HUB_ENTER_CRITICAL(); + EXT_HUB_CHECK_FROM_CRIT(p_ext_hub_driver != NULL, ESP_ERR_INVALID_STATE); + EXT_HUB_EXIT_CRITICAL(); + + esp_err_t ret; + EXT_HUB_CHECK(ext_hub_hdl != NULL, ESP_ERR_INVALID_ARG); + ext_hub_dev_t *ext_hub_dev = (ext_hub_dev_t *)ext_hub_hdl; + uint8_t port_idx = port_num - 1; + EXT_HUB_CHECK(port_idx < ext_hub_dev->constant.maxchild, ESP_ERR_INVALID_SIZE); + if (p_ext_hub_driver->constant.port_driver) { + ret = p_ext_hub_driver->constant.port_driver->disable(ext_hub_dev->constant.ports[port_idx]); + } else { + ret = ESP_ERR_NOT_SUPPORTED; + } + return ret; +} + +esp_err_t ext_hub_port_get_speed(ext_hub_handle_t ext_hub_hdl, uint8_t port_num, usb_speed_t *speed) +{ + EXT_HUB_ENTER_CRITICAL(); + EXT_HUB_CHECK_FROM_CRIT(p_ext_hub_driver != NULL, ESP_ERR_INVALID_STATE); + EXT_HUB_EXIT_CRITICAL(); + + esp_err_t ret; + EXT_HUB_CHECK(ext_hub_hdl != NULL, ESP_ERR_INVALID_ARG); + ext_hub_dev_t *ext_hub_dev = (ext_hub_dev_t *)ext_hub_hdl; + uint8_t port_idx = port_num - 1; + EXT_HUB_CHECK(port_idx < ext_hub_dev->constant.maxchild, ESP_ERR_INVALID_SIZE); + if (p_ext_hub_driver->constant.port_driver) { + ret = p_ext_hub_driver->constant.port_driver->get_speed(ext_hub_dev->constant.ports[port_idx], speed); + } else { + ret = ESP_ERR_NOT_SUPPORTED; + } + return ret; +} + +// ----------------------------------------------------------------------------- +// --------------------------- USB Chapter 11 ---------------------------------- +// ----------------------------------------------------------------------------- + +esp_err_t ext_hub_set_port_feature(ext_hub_handle_t ext_hub_hdl, uint8_t port_num, uint8_t feature) +{ + EXT_HUB_ENTER_CRITICAL(); + EXT_HUB_CHECK_FROM_CRIT(p_ext_hub_driver != NULL, ESP_ERR_INVALID_STATE); + EXT_HUB_EXIT_CRITICAL(); + + esp_err_t ret; + EXT_HUB_CHECK(ext_hub_hdl != NULL, ESP_ERR_INVALID_ARG); + ext_hub_dev_t *ext_hub_dev = (ext_hub_dev_t *)ext_hub_hdl; + usb_transfer_t *transfer = &ext_hub_dev->constant.ctrl_urb->transfer; + + EXT_HUB_CHECK(port_num != 0 && port_num <= ext_hub_dev->constant.maxchild, ESP_ERR_INVALID_SIZE); + + USB_SETUP_PACKET_INIT_SET_PORT_FEATURE((usb_setup_packet_t *)transfer->data_buffer, port_num, feature); + transfer->num_bytes = sizeof(usb_setup_packet_t); + + EXT_HUB_ENTER_CRITICAL(); + ext_hub_dev->dynamic.stage = EXT_HUB_STAGE_PORT_FEATURE; + EXT_HUB_EXIT_CRITICAL(); + + ret = usbh_dev_submit_ctrl_urb(ext_hub_dev->constant.dev_hdl, ext_hub_dev->constant.ctrl_urb); + if (ret != ESP_OK) { + ESP_LOGE(EXT_HUB_TAG, "Failed to submit ctrl urb, error %#x", ret); + } + return ret; +} + +esp_err_t ext_hub_clear_port_feature(ext_hub_handle_t ext_hub_hdl, uint8_t port_num, uint8_t feature) +{ + EXT_HUB_ENTER_CRITICAL(); + EXT_HUB_CHECK_FROM_CRIT(p_ext_hub_driver != NULL, ESP_ERR_INVALID_STATE); + EXT_HUB_EXIT_CRITICAL(); + + esp_err_t ret; + EXT_HUB_CHECK(ext_hub_hdl != NULL, ESP_ERR_INVALID_ARG); + ext_hub_dev_t *ext_hub_dev = (ext_hub_dev_t *)ext_hub_hdl; + usb_transfer_t *transfer = &ext_hub_dev->constant.ctrl_urb->transfer; + + EXT_HUB_CHECK(port_num != 0 && port_num <= ext_hub_dev->constant.maxchild, ESP_ERR_INVALID_SIZE); + + USB_SETUP_PACKET_INIT_CLEAR_PORT_FEATURE((usb_setup_packet_t *)transfer->data_buffer, port_num, feature); + transfer->num_bytes = sizeof(usb_setup_packet_t); + + EXT_HUB_ENTER_CRITICAL(); + ext_hub_dev->dynamic.stage = EXT_HUB_STAGE_PORT_FEATURE; + EXT_HUB_EXIT_CRITICAL(); + + ret = usbh_dev_submit_ctrl_urb(ext_hub_dev->constant.dev_hdl, ext_hub_dev->constant.ctrl_urb); + if (ret != ESP_OK) { + ESP_LOGE(EXT_HUB_TAG, "Failed to submit ctrl urb, error %#x", ret); + } + return ret; +} + +esp_err_t ext_hub_get_port_status(ext_hub_handle_t ext_hub_hdl, uint8_t port_num) +{ + EXT_HUB_ENTER_CRITICAL(); + EXT_HUB_CHECK_FROM_CRIT(p_ext_hub_driver != NULL, ESP_ERR_INVALID_STATE); + EXT_HUB_EXIT_CRITICAL(); + + esp_err_t ret; + EXT_HUB_CHECK(ext_hub_hdl != NULL, ESP_ERR_INVALID_ARG); + ext_hub_dev_t *ext_hub_dev = (ext_hub_dev_t *)ext_hub_hdl; + usb_transfer_t *transfer = &ext_hub_dev->constant.ctrl_urb->transfer; + + EXT_HUB_CHECK(port_num != 0 && port_num <= ext_hub_dev->constant.maxchild, ESP_ERR_INVALID_SIZE); + + USB_SETUP_PACKET_INIT_GET_PORT_STATUS((usb_setup_packet_t *)transfer->data_buffer, port_num); + transfer->num_bytes = sizeof(usb_setup_packet_t) + sizeof(usb_port_status_t); + + EXT_HUB_ENTER_CRITICAL(); + ext_hub_dev->dynamic.stage = EXT_HUB_STAGE_PORT_STATUS_REQUEST; + EXT_HUB_EXIT_CRITICAL(); + + ret = usbh_dev_submit_ctrl_urb(ext_hub_dev->constant.dev_hdl, ext_hub_dev->constant.ctrl_urb); + if (ret != ESP_OK) { + ESP_LOGE(EXT_HUB_TAG, "Failed to submit ctrl urb, error %#x", ret); + } + return ret; +} diff --git a/components/usb/hub.c b/components/usb/hub.c index 4ee318290eaf..a11947952f47 100644 --- a/components/usb/hub.c +++ b/components/usb/hub.c @@ -19,6 +19,10 @@ #include "hub.h" #include "usb/usb_helpers.h" +#if ENABLE_USB_HUBS +#include "ext_hub.h" +#endif // ENABLE_USB_HUBS + /* Implementation of the HUB driver that only supports the Root Hub with a single port. Therefore, we currently don't implement the bare minimum to control the root HCD port. @@ -35,13 +39,21 @@ implement the bare minimum to control the root HCD port. #define HUB_ROOT_HCD_PORT_FIFO_BIAS HCD_PORT_FIFO_BIAS_BALANCED #endif -// Hub driver action flags. LISTED IN THE ORDER THEY SHOULD BE HANDLED IN within hub_process(). Some actions are mutually exclusive -#define HUB_DRIVER_FLAG_ACTION_ROOT_EVENT 0x01 -#define HUB_DRIVER_FLAG_ACTION_PORT_REQ 0x02 - #define PORT_REQ_DISABLE 0x01 #define PORT_REQ_RECOVER 0x02 +/** + * @brief Hub driver action flags + */ +typedef enum { + HUB_DRIVER_ACTION_ROOT_EVENT = (1 << 0), + HUB_DRIVER_ACTION_ROOT_REQ = (1 << 1), +#if ENABLE_USB_HUBS + HUB_DRIVER_ACTION_EXT_HUB = (1 << 6), + HUB_DRIVER_ACTION_EXT_PORT = (1 << 7) +#endif // ENABLE_USB_HUBS +} hub_flag_action_t; + /** * @brief Root port states */ @@ -57,7 +69,6 @@ typedef enum { * @brief Hub device tree node * * Object type of a node in the USB device tree that is maintained by the Hub driver - * */ struct dev_tree_node_s { TAILQ_ENTRY(dev_tree_node_s) tailq_entry; /**< Entry for the device tree node object tailq */ @@ -72,11 +83,11 @@ typedef struct { struct { union { struct { - uint32_t actions: 8; - uint32_t reserved24: 24; + hub_flag_action_t actions: 8; /**< Hub actions */ + uint32_t reserved24: 24; /**< Reserved */ }; - uint32_t val; /**< Root port flag value */ - } flags; /**< Root port flags */ + uint32_t val; /**< Hub flag action value */ + } flags; /**< Hub flags */ root_port_state_t root_port_state; /**< Root port state */ unsigned int port_reqs; /**< Root port request flag */ } dynamic; /**< Dynamic members. Require a critical section */ @@ -145,7 +156,7 @@ static bool root_port_callback(hcd_port_handle_t port_hdl, hcd_port_event_t port */ static esp_err_t new_dev_tree_node(usb_device_handle_t parent_dev_hdl, uint8_t parent_port_num, usb_speed_t speed) { - esp_err_t ret = ESP_FAIL; + esp_err_t ret; unsigned int node_uid = p_hub_driver_obj->single_thread.next_uid; dev_tree_node_t *dev_tree_node = heap_caps_calloc(1, sizeof(dev_tree_node_t), MALLOC_CAP_DEFAULT); @@ -165,6 +176,8 @@ static esp_err_t new_dev_tree_node(usb_device_handle_t parent_dev_hdl, uint8_t p ret = usbh_devs_add(¶ms); if (ret != ESP_OK) { + // USBH devs add could failed due to lack of free hcd channels + // TODO: IDF-10044 Hub should recover after running out of hcd channels goto fail; } @@ -293,12 +306,22 @@ static esp_err_t dev_tree_node_remove_by_parent(usb_device_handle_t parent_dev_h static bool root_port_callback(hcd_port_handle_t port_hdl, hcd_port_event_t port_event, void *user_arg, bool in_isr) { HUB_DRIVER_ENTER_CRITICAL_SAFE(); - p_hub_driver_obj->dynamic.flags.actions |= HUB_DRIVER_FLAG_ACTION_ROOT_EVENT; + p_hub_driver_obj->dynamic.flags.actions |= HUB_DRIVER_ACTION_ROOT_EVENT; HUB_DRIVER_EXIT_CRITICAL_SAFE(); assert(in_isr); // Currently, this callback should only ever be called from an ISR context return p_hub_driver_obj->constant.proc_req_cb(USB_PROC_REQ_SOURCE_HUB, in_isr, p_hub_driver_obj->constant.proc_req_cb_arg); } +#ifdef ENABLE_USB_HUBS +static bool ext_hub_callback(bool in_isr, void *user_arg) +{ + HUB_DRIVER_ENTER_CRITICAL_SAFE(); + p_hub_driver_obj->dynamic.flags.actions |= HUB_DRIVER_ACTION_EXT_HUB; + HUB_DRIVER_EXIT_CRITICAL_SAFE(); + return p_hub_driver_obj->constant.proc_req_cb(USB_PROC_REQ_SOURCE_HUB, in_isr, p_hub_driver_obj->constant.proc_req_cb_arg); +} +#endif // ENABLE_USB_HUBS + // ---------------------- Handlers ------------------------- static void root_port_handle_events(hcd_port_handle_t root_port_hdl) { @@ -344,7 +367,7 @@ static void root_port_handle_events(hcd_port_handle_t root_port_hdl) case ROOT_PORT_STATE_DISABLED: // This occurred after the device has already been disabled // Therefore, there's no device object to clean up, and we can go straight to port recovery p_hub_driver_obj->dynamic.port_reqs |= PORT_REQ_RECOVER; - p_hub_driver_obj->dynamic.flags.actions |= HUB_DRIVER_FLAG_ACTION_PORT_REQ; + p_hub_driver_obj->dynamic.flags.actions |= HUB_DRIVER_ACTION_ROOT_REQ; break; case ROOT_PORT_STATE_ENABLED: // There is an enabled (active) device. We need to indicate to USBH that the device is gone @@ -409,7 +432,7 @@ static esp_err_t root_port_recycle(void) abort(); // Should never occur break; } - p_hub_driver_obj->dynamic.flags.actions |= HUB_DRIVER_FLAG_ACTION_PORT_REQ; + p_hub_driver_obj->dynamic.flags.actions |= HUB_DRIVER_ACTION_ROOT_REQ; HUB_DRIVER_EXIT_CRITICAL(); ESP_ERROR_CHECK(dev_tree_node_remove_by_parent(NULL, 0)); @@ -434,7 +457,20 @@ esp_err_t hub_install(hub_config_t *hub_config, void **client_ret) return ESP_ERR_NO_MEM; } +#if ENABLE_USB_HUBS + // Install External HUB driver + ext_hub_config_t ext_hub_config = { + .proc_req_cb = ext_hub_callback, + .port_driver = NULL, + }; + ret = ext_hub_install(&ext_hub_config); + if (ret != ESP_OK) { + goto err_ext_hub; + } + *client_ret = ext_hub_get_client(); +#else *client_ret = NULL; +#endif // ENABLE_USB_HUBS // Install HCD port hcd_port_config_t port_config = { @@ -474,6 +510,10 @@ esp_err_t hub_install(hub_config_t *hub_config, void **client_ret) assign_err: ESP_ERROR_CHECK(hcd_port_deinit(root_port_hdl)); err: +#if ENABLE_USB_HUBS + ext_hub_uninstall(); +err_ext_hub: +#endif // ENABLE_USB_HUBS heap_caps_free(hub_driver_obj); return ret; } @@ -487,6 +527,10 @@ esp_err_t hub_uninstall(void) p_hub_driver_obj = NULL; HUB_DRIVER_EXIT_CRITICAL(); +#if ENABLE_USB_HUBS + ESP_ERROR_CHECK(ext_hub_uninstall()); +#endif // ENABLE_USB_HUBS + ESP_ERROR_CHECK(hcd_port_deinit(hub_driver_obj->constant.root_port_hdl)); // Free Hub driver resources heap_caps_free(hub_driver_obj); @@ -531,14 +575,19 @@ esp_err_t hub_port_recycle(usb_device_handle_t parent_dev_hdl, uint8_t parent_po HUB_DRIVER_ENTER_CRITICAL(); HUB_DRIVER_CHECK_FROM_CRIT(p_hub_driver_obj != NULL, ESP_ERR_INVALID_STATE); HUB_DRIVER_EXIT_CRITICAL(); - - esp_err_t ret = ESP_FAIL; + esp_err_t ret; if (parent_port_num == 0) { ret = root_port_recycle(); } else { - ESP_LOGW(HUB_DRIVER_TAG, "Recycling External Port has not been implemented yet"); - return ESP_ERR_NOT_SUPPORTED; +#if ENABLE_USB_HUBS + ext_hub_handle_t ext_hub_hdl = NULL; + ext_hub_get_handle(parent_dev_hdl, &ext_hub_hdl); + ret = ext_hub_port_recycle(ext_hub_hdl, parent_port_num); +#else + ESP_LOGW(HUB_DRIVER_TAG, "Recycling External Port is not available (External Hub support disabled)"); + ret = ESP_ERR_NOT_SUPPORTED; +#endif // ENABLE_USB_HUBS } return ret; @@ -549,8 +598,7 @@ esp_err_t hub_port_reset(usb_device_handle_t parent_dev_hdl, uint8_t parent_port HUB_DRIVER_ENTER_CRITICAL(); HUB_DRIVER_CHECK_FROM_CRIT(p_hub_driver_obj != NULL, ESP_ERR_INVALID_STATE); HUB_DRIVER_EXIT_CRITICAL(); - - esp_err_t ret = ESP_FAIL; + esp_err_t ret; if (parent_port_num == 0) { ret = hcd_port_command(p_hub_driver_obj->constant.root_port_hdl, HCD_PORT_CMD_RESET); @@ -559,13 +607,68 @@ esp_err_t hub_port_reset(usb_device_handle_t parent_dev_hdl, uint8_t parent_port } ret = dev_tree_node_reset_completed(NULL, 0); } else { - ESP_LOGW(HUB_DRIVER_TAG, "Reset External Port has not been implemented yet"); - return ESP_ERR_NOT_SUPPORTED; +#if ENABLE_USB_HUBS + ext_hub_handle_t ext_hub_hdl = NULL; + ext_hub_get_handle(parent_dev_hdl, &ext_hub_hdl); + ret = ext_hub_port_reset(ext_hub_hdl, parent_port_num); +#else + ESP_LOGW(HUB_DRIVER_TAG, "Resetting External Port is not available (External Hub support disabled)"); + ret = ESP_ERR_NOT_SUPPORTED; +#endif // ENABLE_USB_HUBS } + return ret; +} + +esp_err_t hub_port_active(usb_device_handle_t parent_dev_hdl, uint8_t parent_port_num) +{ + esp_err_t ret; + if (parent_port_num == 0) { + // Root port no need to be activated + ret = ESP_OK; + } else { +#if ENABLE_USB_HUBS + // External Hub port + ext_hub_handle_t ext_hub_hdl = NULL; + ext_hub_get_handle(parent_dev_hdl, &ext_hub_hdl); + ret = ext_hub_port_active(ext_hub_hdl, parent_port_num); +#else + ESP_LOGW(HUB_DRIVER_TAG, "Activating External Port is not available (External Hub support disabled)"); + ret = ESP_ERR_NOT_SUPPORTED; +#endif // ENABLE_USB_HUBS + } return ret; } +#if ENABLE_USB_HUBS +esp_err_t hub_notify_new_dev(uint8_t dev_addr) +{ + HUB_DRIVER_ENTER_CRITICAL(); + HUB_DRIVER_CHECK_FROM_CRIT(p_hub_driver_obj != NULL, ESP_ERR_INVALID_STATE); + HUB_DRIVER_EXIT_CRITICAL(); + + return ext_hub_new_dev(dev_addr); +} + +esp_err_t hub_notify_dev_gone(uint8_t dev_addr) +{ + HUB_DRIVER_ENTER_CRITICAL(); + HUB_DRIVER_CHECK_FROM_CRIT(p_hub_driver_obj != NULL, ESP_ERR_INVALID_STATE); + HUB_DRIVER_EXIT_CRITICAL(); + + return ext_hub_dev_gone(dev_addr); +} + +esp_err_t hub_notify_all_free(void) +{ + HUB_DRIVER_ENTER_CRITICAL(); + HUB_DRIVER_CHECK_FROM_CRIT(p_hub_driver_obj != NULL, ESP_ERR_INVALID_STATE); + HUB_DRIVER_EXIT_CRITICAL(); + + return ext_hub_all_free(); +} +#endif // ENABLE_USB_HUBS + esp_err_t hub_process(void) { HUB_DRIVER_ENTER_CRITICAL(); @@ -574,10 +677,21 @@ esp_err_t hub_process(void) HUB_DRIVER_EXIT_CRITICAL(); while (action_flags) { - if (action_flags & HUB_DRIVER_FLAG_ACTION_ROOT_EVENT) { +#if ENABLE_USB_HUBS + if (action_flags & HUB_DRIVER_ACTION_EXT_PORT) { + ESP_LOGW(HUB_DRIVER_TAG, "ext_port_process() has not been implemented yet"); + /* + ESP_ERROR_CHECK(ext_port_process()); + */ + } + if (action_flags & HUB_DRIVER_ACTION_EXT_HUB) { + ESP_ERROR_CHECK(ext_hub_process()); + } +#endif // ENABLE_USB_HUBS + if (action_flags & HUB_DRIVER_ACTION_ROOT_EVENT) { root_port_handle_events(p_hub_driver_obj->constant.root_port_hdl); } - if (action_flags & HUB_DRIVER_FLAG_ACTION_PORT_REQ) { + if (action_flags & HUB_DRIVER_ACTION_ROOT_REQ) { root_port_req(p_hub_driver_obj->constant.root_port_hdl); } @@ -586,5 +700,6 @@ esp_err_t hub_process(void) p_hub_driver_obj->dynamic.flags.actions = 0; HUB_DRIVER_EXIT_CRITICAL(); } + return ESP_OK; } diff --git a/components/usb/include/usb/usb_types_ch11.h b/components/usb/include/usb/usb_types_ch11.h index 6d13998cc565..a30e9d3919be 100644 --- a/components/usb/include/usb/usb_types_ch11.h +++ b/components/usb/include/usb/usb_types_ch11.h @@ -66,7 +66,34 @@ typedef enum { } usb_hub_port_feature_t; /** - * @brief Size of a USB Hub Port Status and Hub Change results + * @brief USB Hub characteristics + * + * See USB 2.0 spec Table 11-13, offset 3 + */ +#define USB_W_HUB_CHARS_PORT_PWR_CTRL_ALL (0) /**< All ports power control at once */ +#define USB_W_HUB_CHARS_PORT_PWR_CTRL_INDV (1) /**< Individual port power control */ +#define USB_W_HUB_CHARS_PORT_PWR_CTRL_NO (2) /**< No power switching */ + +#define USB_W_HUB_CHARS_PORT_OVER_CURR_ALL (0) /**< All ports Over-Current reporting */ +#define USB_W_HUB_CHARS_PORT_OVER_CURR_INDV (1) /**< Individual port Over-current reporting */ +#define USB_W_HUB_CHARS_PORT_OVER_CURR_NO (2) /**< No Over-current Protection support */ + +#define USB_W_HUB_CHARS_TTTT_8_BITS (0) /**< TT requires at most 8 FS bit times of inter transaction gap on a full-/low-speed downstream bus */ +#define USB_W_HUB_CHARS_TTTT_16_BITS (1) /**< TT requires at most 16 FS bit times */ +#define USB_W_HUB_CHARS_TTTT_24_BITS (2) /**< TT requires at most 24 FS bit times */ +#define USB_W_HUB_CHARS_TTTT_32_BITS (3) /**< TT requires at most 32 FS bit times */ + +/** + * @brief USB Hub bDeviceProtocol + */ +#define USB_B_DEV_PROTOCOL_HUB_FS (0) /**< Full speed hub */ +#define USB_B_DEV_PROTOCOL_HUB_HS_NO_TT (0) /**< Hi-speed hub without TT */ +#define USB_B_DEV_PROTOCOL_HUB_HS_SINGLE_TT (1) /**< Hi-speed hub with single TT */ +#define USB_B_DEV_PROTOCOL_HUB_HS_MULTI_TT (2) /**< Hi-speed hub with multiple TT */ +#define USB_B_DEV_PROTOCOL_HUB_SS (3) /**< Super speed hub */ + +/** + * @brief USB Hub Port Status and Hub Change results size */ #define USB_PORT_STATUS_SIZE 4 @@ -148,7 +175,17 @@ typedef struct { uint8_t bDescLength; /**< Number of bytes in this descriptor, including this byte */ uint8_t bDescriptorType; /**< Descriptor Type, value: 29H for Hub descriptor */ uint8_t bNbrPorts; /**< Number of downstream facing ports that this Hub supports */ - uint16_t wHubCharacteristics; /**< Logical Power Switching Mode, Compound Device, Over-current Protection Mode, TT Think Time, Port Indicators Supported */ + union { + struct { + uint16_t power_switching: 2; + uint16_t compound: 1; + uint16_t ovr_current_protect: 2; + uint16_t tt_think_time: 2; + uint16_t indicator_support: 1; + uint16_t reserved: 8; + }; + uint16_t val; /**< Hub Characteristics value */ + } wHubCharacteristics; /**< Hub Characteristics */ uint8_t bPwrOn2PwrGood; /**< Time (in 2 ms intervals) from the time the power-on sequence begins on a port until power is good on that port */ uint8_t bHubContrCurrent; /**< Maximum current requirements of the Hub Controller electronics in mA. */ } __attribute__((packed)) usb_hub_descriptor_t; diff --git a/components/usb/include/usb/usb_types_ch9.h b/components/usb/include/usb/usb_types_ch9.h index c09440eb0051..500a5dc51c08 100644 --- a/components/usb/include/usb/usb_types_ch9.h +++ b/components/usb/include/usb/usb_types_ch9.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -101,6 +101,21 @@ typedef union { } usb_setup_packet_t; ESP_STATIC_ASSERT(sizeof(usb_setup_packet_t) == USB_SETUP_PACKET_SIZE, "Size of usb_setup_packet_t incorrect"); +/** + * @brief Structure representing a USB device status + * + * See Figures 9-4 Information Returned by a GetStatus() Request to a Device of USB2.0 specification for more details + */ +typedef union { + struct { + uint16_t self_powered: 1; /**< 1 - Device is currently self-powered, 0 - bus powered */ + uint16_t remote_wakeup: 1; /**< 1 - the ability of the device to signal remote wakeup is enabled, 0 - the ability of the device to signal remote wakeup is disabled. */ + uint16_t reserved: 14; /**< reserved */ + } USB_DESC_ATTR; /**< Packed */ + uint16_t val; /**< Device status value */ +} usb_device_status_t; +ESP_STATIC_ASSERT(sizeof(usb_device_status_t) == sizeof(uint16_t), "Size of usb_device_status_t incorrect"); + /** * @brief Bit masks belonging to the bmRequestType field of a setup packet */ @@ -144,6 +159,19 @@ ESP_STATIC_ASSERT(sizeof(usb_setup_packet_t) == USB_SETUP_PACKET_SIZE, "Size of #define USB_W_VALUE_DT_OTHER_SPEED_CONFIG 0x07 #define USB_W_VALUE_DT_INTERFACE_POWER 0x08 +/** + * @brief Initializer for a GET_STATUS request + * + * Sets the address of a connected device + */ +#define USB_SETUP_PACKET_INIT_GET_STATUS(setup_pkt_ptr) ({ \ + (setup_pkt_ptr)->bmRequestType = USB_BM_REQUEST_TYPE_DIR_IN | USB_BM_REQUEST_TYPE_TYPE_STANDARD | USB_BM_REQUEST_TYPE_RECIP_DEVICE; \ + (setup_pkt_ptr)->bRequest = USB_B_REQUEST_GET_STATUS; \ + (setup_pkt_ptr)->wValue = 0; \ + (setup_pkt_ptr)->wIndex = 0; \ + (setup_pkt_ptr)->wLength = 2; \ +}) + /** * @brief Initializer for a SET_ADDRESS request * diff --git a/components/usb/private_include/ext_hub.h b/components/usb/private_include/ext_hub.h new file mode 100644 index 000000000000..9fde880fe7e2 --- /dev/null +++ b/components/usb/private_include/ext_hub.h @@ -0,0 +1,248 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include +#include "sdkconfig.h" +#include "esp_err.h" +#include "hcd.h" +#include "usbh.h" +#include "usb/usb_types_stack.h" +#include "usb/usb_types_ch9.h" +#include "usb/usb_types_ch11.h" + +#if CONFIG_USB_HOST_HUB_MULTI_LEVEL +#define ENABLE_MULTIPLE_HUBS 1 +#endif // CONFIG_USB_HOST_HUB_MULTI_LEVEL + +#ifdef __cplusplus +extern "C" { +#endif + +// ----------------------------- Handles --------------------------------------- + +typedef struct ext_hub_s *ext_hub_handle_t; + +// ---------------------------- Callbacks -------------------------------------- + +/** + * @brief Callback used to indicate that the External Hub Driver requires process callback + * For Hub Driver only + */ +typedef bool (*ext_hub_cb_t)(bool in_isr, void *user_arg); + +// ------------------------ External Port API typedefs ------------------------- + +/** + * @brief External Hub Port driver + */ +typedef struct { + esp_err_t (*new)(void *port_cfg, void **port_hdl); + esp_err_t (*reset)(void *port_hdl); + esp_err_t (*recycle)(void *port_hdl); + esp_err_t (*active)(void *port_hdl); + esp_err_t (*disable)(void *port_hdl); + esp_err_t (*gone)(void *port_hdl); + esp_err_t (*free)(void *port_hdl); + esp_err_t (*get_speed)(void *por_hdl, usb_speed_t *speed); + esp_err_t (*get_status)(void *port_hdl); + esp_err_t (*set_status)(void *port_hdl, const usb_port_status_t *status); +} ext_hub_port_driver_t; + +/** + * @brief External Hub Driver configuration + */ +typedef struct { + ext_hub_cb_t proc_req_cb; /**< External Hub process callback */ + void *proc_req_cb_arg; /**< External Hub process callback argument */ + const ext_hub_port_driver_t* port_driver; /**< External Port Driver */ +} ext_hub_config_t; + +// ------------------------------ Driver --------------------------------------- + +/** + * @brief Install External Hub Driver + * + * Entry: + * - should be called within Hub Driver + * + * @param[in] config External Hub driver configuration + * @return esp_err_t + */ +esp_err_t ext_hub_install(const ext_hub_config_t* config); + +/** + * @brief Uninstall External Hub Driver + * + * Entry: + * - should be called within Hub Driver + * + * @return esp_err_t + */ +esp_err_t ext_hub_uninstall(void); + +/** + * @brief External Hub Driver get client pointer + * + * Entry: + * - should be called within Hub Driver + * + * @param[in] config External Hub driver configuration + * @return Unique pointer to identify the External Hub as a USB Host client + */ +void *ext_hub_get_client(void); + +// -------------------------- External Hub API --------------------------------- + +/** + * @brief Get External Hub device handle by USBH device handle + * + * @param[in] dev_hdl USBH device handle + * @param[out] ext_hub_hdl External Hub device handle + * @return esp_err_t + */ +esp_err_t ext_hub_get_handle(usb_device_handle_t dev_hdl, ext_hub_handle_t *ext_hub_hdl); + +/** + * @brief Add new device + * + * After attaching new device: + * - configure it's parameters (requesting hub descriptor) + * + * @param[in] dev_addr Device bus address + * @return esp_err_t + */ +esp_err_t ext_hub_new_dev(uint8_t dev_addr); + +/** + * @brief Device gone + * + * After device were detached: + * - prepare the device to be freed + * + * @param[in] dev_addr Device bus address + * @return esp_err_t + */ +esp_err_t ext_hub_dev_gone(uint8_t dev_addr); + +/** + * @brief Marks all devices to be freed + * + * Entry: + * - should be called within Hub Driver when USB Host library need to be uninstalled + * + * @param[in] dev_addr Device bus address + * @return esp_err_t + */ +esp_err_t ext_hub_all_free(void); + +/** + * @brief The External Hub or Ports statuses change completed + * + * Enables Interrupt IN endpoint to get information about Hub or Ports statuses change + * + * @param[in] ext_hub_hdl External Hub device handle + * @return esp_err_t + */ +esp_err_t ext_hub_status_handle_complete(ext_hub_handle_t ext_hub_hdl); + +/** + * @brief External Hub driver's process function + * + * External Hub driver process function that must be called repeatedly to process the driver's actions and events. + * If blocking, the caller can block on the notification callback of source USB_PROC_REQ_SOURCE_HUB + * to run this function. + */ +esp_err_t ext_hub_process(void); + +// -------------------- External Hub - Port related ---------------------------- + +/** + * @brief Indicate to the External Hub driver that a device's port can be recycled + * + * The device connected to the port has been freed. The Hub driver can now + * recycle the port. + * + * @param[in] ext_hub_hdl External Hub handle + * @param[in] port_num Port number + * @retval ESP_OK: Success + */ +esp_err_t ext_hub_port_recycle(ext_hub_handle_t ext_hub_hdl, uint8_t port_num); + +/** + * @brief Indicate to the External Hub driver that a device's port need a reset + * + * @param[in] ext_hub_hdl External Hub handle + * @param[in] port_num Port number + * @retval ESP_OK: Success + */ +esp_err_t ext_hub_port_reset(ext_hub_handle_t ext_hub_hdl, uint8_t port_num); + +/** + * @brief Indicate to the External Hub driver that a device's port has a device and device has been enumerated + * + * @param[in] ext_hub_hdl External Hub handle + * @param[in] port_num Port number + * @retval ESP_OK: Success + */ +esp_err_t ext_hub_port_active(ext_hub_handle_t ext_hub_hdl, uint8_t port_num); + +/** + * @brief Indicate to the External Hub driver that a device's port should be disabled + * + * @param[in] ext_hub_hdl External Hub handle + * @param[in] port_num Port number + * @retval ESP_OK: Success + */ +esp_err_t ext_hub_port_disable(ext_hub_handle_t ext_hub_hdl, uint8_t port_num); + +/** + * @brief Returns device speed of the device, attached to the port + * + * @param[in] ext_hub_hdl External Hub handle + * @param[in] port_num Port number + * @param[out] speed Devices' speed + * @retval ESP_OK: Success + */ +esp_err_t ext_hub_port_get_speed(ext_hub_handle_t ext_hub_hdl, uint8_t port_num, usb_speed_t *speed); + +// --------------------------- USB Chapter 11 ---------------------------------- + +/** + * @brief Set Port Feature request + * + * @param[in] ext_hub_hdl External Hub device handle + * @param[in] port_num Port number + * @param[in] feature Port Feature to set + * @return esp_err_t + */ +esp_err_t ext_hub_set_port_feature(ext_hub_handle_t ext_hub_hdl, uint8_t port_num, uint8_t feature); + +/** + * @brief Clear Port Feature request + * + * @param[in] ext_hub_hdl External Hub device handle + * @param[in] port_num Port number + * @param[in] feature Port Feature to clear + * @return esp_err_t + */ +esp_err_t ext_hub_clear_port_feature(ext_hub_handle_t ext_hub_hdl, uint8_t port_num, uint8_t feature); + +/** + * @brief Get Port Status request + * + * Sends the request to retrieve port status data. + * Actual port status data could be requested by calling ext_hub_get_port_status() after request completion. + * + * @param[in] ext_hub_hdl External Hub device handle + * @param[in] port_num Port number + * @return esp_err_t + */ +esp_err_t ext_hub_get_port_status(ext_hub_handle_t ext_hub_hdl, uint8_t port_num); + +#ifdef __cplusplus +} +#endif diff --git a/components/usb/private_include/hub.h b/components/usb/private_include/hub.h index 5c8361bfb287..067eef790b05 100644 --- a/components/usb/private_include/hub.h +++ b/components/usb/private_include/hub.h @@ -8,10 +8,15 @@ #include #include +#include "sdkconfig.h" #include "esp_err.h" #include "usb_private.h" #include "usbh.h" +#if CONFIG_USB_HOST_HUBS_SUPPORTED +#define ENABLE_USB_HUBS 1 +#endif // CONFIG_USB_HOST_HUBS_SUPPORTED + #ifdef __cplusplus extern "C" { #endif @@ -138,6 +143,50 @@ esp_err_t hub_port_recycle(usb_device_handle_t parent_dev_hdl, uint8_t parent_po */ esp_err_t hub_port_reset(usb_device_handle_t parent_dev_hdl, uint8_t parent_port_num); +/** + * @brief Activate the port + * + * @note This function should only be called from the Host Library task + * + * @param[in] parent_dev_hdl Parent device handle (is used to get the External Hub handle) + * @param[in] parent_port_num Parent number (is used to specify the External Port) + * @return + * - ESP_OK: Success + */ +esp_err_t hub_port_active(usb_device_handle_t parent_dev_hdl, uint8_t parent_port_num); + +#if ENABLE_USB_HUBS +/** + * @brief Notify Hub driver that new device has been attached + * + * If device is has a HUB class, then it will be added as External Hub to Hub Driver. + * + * @param[in] dev_addr Device bus address + * @return + * - ESP_OK: Success + */ +esp_err_t hub_notify_new_dev(uint8_t dev_addr); + +/** + * @brief Notify Hub driver that device has been removed + * + * If the device was an External Hub, then it will be removed from the Hub Driver. + * + * @param[in] dev_addr Device bus address + * @return + * - ESP_OK: Success + */ +esp_err_t hub_notify_dev_gone(uint8_t dev_addr); + +/** + * @brief Notify Hub driver that all devices should be freed + * + * @return + * - ESP_OK: Success + */ +esp_err_t hub_notify_all_free(void); +#endif // ENABLE_USB_HUBS + /** * @brief Hub driver's processing function * diff --git a/components/usb/usb_host.c b/components/usb/usb_host.c index 1e1ca4c16f2d..9bd773007b17 100644 --- a/components/usb/usb_host.c +++ b/components/usb/usb_host.c @@ -227,6 +227,11 @@ static inline bool _is_internal_client(void *client) if (p_host_lib_obj->constant.enum_client && (client == p_host_lib_obj->constant.enum_client)) { return true; } +#if ENABLE_USB_HUBS + if (p_host_lib_obj->constant.hub_client && (client == p_host_lib_obj->constant.hub_client)) { + return true; + } +#endif // ENABLE_USB_HUBS return false; } @@ -311,9 +316,15 @@ static void usbh_event_callback(usbh_event_data_t *event_data, void *arg) .new_dev.address = event_data->new_dev_data.dev_addr, }; send_event_msg_to_clients(&event_msg, true, 0); +#if ENABLE_USB_HUBS + hub_notify_new_dev(event_data->new_dev_data.dev_addr); +#endif // ENABLE_USB_HUBS break; } case USBH_EVENT_DEV_GONE: { +#if ENABLE_USB_HUBS + hub_notify_dev_gone(event_data->new_dev_data.dev_addr); +#endif // ENABLE_USB_HUBS // Prepare event msg, send only to clients that have opened the device usb_host_client_event_msg_t event_msg = { .event = USB_HOST_CLIENT_EVENT_DEV_GONE, @@ -324,9 +335,10 @@ static void usbh_event_callback(usbh_event_data_t *event_data, void *arg) } case USBH_EVENT_DEV_FREE: { // Let the Hub driver know that the device is free and its port can be recycled - ESP_ERROR_CHECK(hub_port_recycle(event_data->dev_free_data.parent_dev_hdl, - event_data->dev_free_data.port_num, - event_data->dev_free_data.dev_uid)); + // Port could be absent, no need to verify + hub_port_recycle(event_data->dev_free_data.parent_dev_hdl, + event_data->dev_free_data.port_num, + event_data->dev_free_data.dev_uid); break; } case USBH_EVENT_ALL_FREE: { @@ -378,6 +390,8 @@ static void enum_event_callback(enum_event_data_t *event_data, void *arg) hub_port_reset(event_data->reset_req.parent_dev_hdl, event_data->reset_req.parent_port_num); break; case ENUM_EVENT_COMPLETED: + // Notify port that device completed enumeration + hub_port_active(event_data->complete.parent_dev_hdl, event_data->complete.parent_port_num); // Propagate a new device event ESP_ERROR_CHECK(usbh_devs_new_dev_event(event_data->complete.dev_hdl)); break; @@ -995,6 +1009,9 @@ esp_err_t usb_host_device_free_all(void) HOST_CHECK_FROM_CRIT(p_host_lib_obj->dynamic.flags.num_clients == 0, ESP_ERR_INVALID_STATE); // All clients must have been deregistered HOST_EXIT_CRITICAL(); esp_err_t ret; +#if ENABLE_USB_HUBS + hub_notify_all_free(); +#endif // ENABLE_USB_HUBS ret = usbh_devs_mark_all_free(); // If ESP_ERR_NOT_FINISHED is returned, caller must wait for USB_HOST_LIB_EVENT_FLAGS_ALL_FREE to confirm all devices are free return ret; From 5527ee588ed5df90c43967631e674464230573f4 Mon Sep 17 00:00:00 2001 From: Roman Leonov Date: Thu, 23 May 2024 13:13:13 +0200 Subject: [PATCH 17/73] docs(ext_hub): Added description for External Hub Driver --- docs/conf_common.py | 3 +- docs/docs_not_updated/esp32c5.txt | 1 + docs/docs_not_updated/esp32p4.txt | 1 + .../usb_host/usb_host_notes_ext_hub.rst | 65 +++++++++++++++++++ .../usb_host/usb_host_notes_index.rst | 6 +- .../usb_host/usb_host_notes_ext_hub.rst | 1 + .../usb_host/usb_host_notes_index.rst | 57 +--------------- 7 files changed, 76 insertions(+), 58 deletions(-) create mode 100644 docs/en/api-reference/peripherals/usb_host/usb_host_notes_ext_hub.rst create mode 100644 docs/zh_CN/api-reference/peripherals/usb_host/usb_host_notes_ext_hub.rst diff --git a/docs/conf_common.py b/docs/conf_common.py index 053c47d3b743..fc29c4502891 100644 --- a/docs/conf_common.py +++ b/docs/conf_common.py @@ -117,7 +117,8 @@ 'api-reference/peripherals/usb_host/usb_host_notes_dwc_otg.rst', 'api-reference/peripherals/usb_host/usb_host_notes_index.rst', 'api-reference/peripherals/usb_host/usb_host_notes_usbh.rst', - 'api-reference/peripherals/usb_host/usb_host_notes_enum.rst'] + 'api-reference/peripherals/usb_host/usb_host_notes_enum.rst', + 'api-reference/peripherals/usb_host/usb_host_notes_ext_hub.rst'] I80_LCD_DOCS = ['api-reference/peripherals/lcd/i80_lcd.rst'] RGB_LCD_DOCS = ['api-reference/peripherals/lcd/rgb_lcd.rst'] diff --git a/docs/docs_not_updated/esp32c5.txt b/docs/docs_not_updated/esp32c5.txt index dc5ef2a728ae..bd92346df943 100644 --- a/docs/docs_not_updated/esp32c5.txt +++ b/docs/docs_not_updated/esp32c5.txt @@ -86,6 +86,7 @@ api-reference/peripherals/usb_host/usb_host_notes_dwc_otg.rst api-reference/peripherals/usb_host/usb_host_notes_design.rst api-reference/peripherals/usb_host/usb_host_notes_usbh.rst api-reference/peripherals/usb_host/usb_host_notes_enum.rst +api-reference/peripherals/usb_host/usb_host_notes_ext_hub.rst api-reference/peripherals/usb_device.rst api-reference/peripherals/sdspi_host.rst api-reference/peripherals/spi_slave.rst diff --git a/docs/docs_not_updated/esp32p4.txt b/docs/docs_not_updated/esp32p4.txt index 828989eb3914..06a53790b76e 100644 --- a/docs/docs_not_updated/esp32p4.txt +++ b/docs/docs_not_updated/esp32p4.txt @@ -18,6 +18,7 @@ api-reference/peripherals/usb_host/usb_host_notes_dwc_otg.rst api-reference/peripherals/usb_host/usb_host_notes_design.rst api-reference/peripherals/usb_host/usb_host_notes_usbh.rst api-reference/peripherals/usb_host/usb_host_notes_enum.rst +api-reference/peripherals/usb_host/usb_host_notes_ext_hub.rst api-reference/peripherals/usb_device.rst api-reference/peripherals/touch_element.rst api-reference/peripherals/spi_flash/xip_from_psram.inc diff --git a/docs/en/api-reference/peripherals/usb_host/usb_host_notes_ext_hub.rst b/docs/en/api-reference/peripherals/usb_host/usb_host_notes_ext_hub.rst new file mode 100644 index 000000000000..3b2876a7a4bc --- /dev/null +++ b/docs/en/api-reference/peripherals/usb_host/usb_host_notes_ext_hub.rst @@ -0,0 +1,65 @@ +USB Host External Hub Driver (Ext Hub) +====================================== + +Introduction +------------ + +The External Hub Driver (henceforth referred to as Ext Hub Driver) + +Requirements +------------ + +USB Specification Requirements +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Chapter 11 of the USB 2.0 specification outlines some aspects, when a USB Hub device is attached to a powered port. + +The design of the Ext Driver takes into consideration the following: + +- **Connectivity behavior** +- **Power management** +- **Device connect/disconnect detection** +- **Bus fault detection and recovery** +- **High-, full-, and low-speed device support** + +.. note:: + + For more detailed information, please refer to `USB 2.0 Specification `_ > Chapter 11.1 **Overview**. + +Host Stack Requirements +^^^^^^^^^^^^^^^^^^^^^^^ + +In addition to the USB 2.0 specification requirements, the Ext Hub Driver also takes into consideration the requirements set for the overall Host Stack (see :doc:`./usb_host_notes_design`): + +- Ext Hub Driver must not instantiate any tasks/threads +- Ext Hub Driver must be event driven, providing event callbacks and an event processing function +- Ext Hub Driver must use only API from underlying layer (USBH) + +Implementation & Usage +---------------------- + +Host Stack Interaction +^^^^^^^^^^^^^^^^^^^^^^ + +The Ext Hub Driver takes place between USB Host layer and USBH layer, next to the Hub Driver. The Hub Driver and the Ext Hub Driver were split into two Drivers to achieve the goal of logic distinguishing between root Hub and external Hub. + +Device handling +^^^^^^^^^^^^^^^ + +The Ext Hub Driver can be installed via ``ext_hub_install()`` call and uninstalled via ``ext_hub_uninstall()`` call. After installation the Ext Hub provides the following APIs for external Hub addition and removal: + +- ``ext_hub_new_dev()`` which will verify the device class (`HUB_CLASSCODE (09H)`) and, if the device has the Hub class, the Ext Hub Driver: + + - allocates a new device object + - adds it to the external device pool + - starts the process of Hub configuration (retrieving Hub Descriptor, Device status and Hub status) + +- ``ext_hub_dev_gone()`` which will verify the device in the Ext Hub Driver list and start the process of external Hub device removing. + +Events & Processing +^^^^^^^^^^^^^^^^^^^ + +The Ext Hub Driver is completely event driven and all event handling is done via the ``ext_hub_process()`` function. The ``ext_hub_config_t.proc_req_cb`` callback provided on the Ext Hub Driver installation will be called when processing is required. Typically, ``ext_hub_process()`` will be called from the Hub Driver ``hub_process()`` processing function. + +The Ext Hub Driver does not expose any event callback. + diff --git a/docs/en/api-reference/peripherals/usb_host/usb_host_notes_index.rst b/docs/en/api-reference/peripherals/usb_host/usb_host_notes_index.rst index 6b1c6fa9ac09..738ac7a27019 100644 --- a/docs/en/api-reference/peripherals/usb_host/usb_host_notes_index.rst +++ b/docs/en/api-reference/peripherals/usb_host/usb_host_notes_index.rst @@ -23,6 +23,7 @@ This document is split into the following sections: usb_host_notes_dwc_otg usb_host_notes_usbh usb_host_notes_enum + usb_host_notes_ext_hub Todo: @@ -45,6 +46,10 @@ Features & Limitations **The Host Stack currently supports the following notable features:** +.. only:: esp32p4 + + - Supports HS (High Speed) + - Supports FS (Full Speed) and LS (Low Speed) devices - Supports all transfer types (Control, Bulk, Isochronous, and Interrupt) - Automatically enumerates connected devices @@ -52,5 +57,4 @@ Features & Limitations **The Host Stack currently has the following notable limitations:** -- No HS (High Speed) support - No Hub support (currently only supports a single device) diff --git a/docs/zh_CN/api-reference/peripherals/usb_host/usb_host_notes_ext_hub.rst b/docs/zh_CN/api-reference/peripherals/usb_host/usb_host_notes_ext_hub.rst new file mode 100644 index 000000000000..e8bab47973b4 --- /dev/null +++ b/docs/zh_CN/api-reference/peripherals/usb_host/usb_host_notes_ext_hub.rst @@ -0,0 +1 @@ +.. include:: ../../../../en/api-reference/peripherals/usb_host/usb_host_notes_ext_hub.rst diff --git a/docs/zh_CN/api-reference/peripherals/usb_host/usb_host_notes_index.rst b/docs/zh_CN/api-reference/peripherals/usb_host/usb_host_notes_index.rst index c6318a690a1a..09d410debfb6 100644 --- a/docs/zh_CN/api-reference/peripherals/usb_host/usb_host_notes_index.rst +++ b/docs/zh_CN/api-reference/peripherals/usb_host/usb_host_notes_index.rst @@ -1,56 +1 @@ -USB 主机维护者注意事项(简介) -============================== - -:link_to_translation:`en:[English]` - -本文档包含有关 USB 主机协议栈实现细节的信息,面向 USB 主机协议栈的维护者和第三方贡献者。USB 主机协议栈的用户请参考 :doc:`../usb_host`。 - -.. warning:: - - USB 主机协议栈的实现细节属于私有 API,因此,除 USB 主机库外的所有层均不遵循 :ref:`ESP-IDF 版本简介 `,即允许进行重大更改。 - -.. figure:: ../../../../_static/usb_host/stack-overview.png - :align: center - :alt: 主机协议栈层次结构图 - -本文档分为以下几个部分: - -.. toctree:: - :maxdepth: 1 - - usb_host_notes_design - usb_host_notes_arch - usb_host_notes_dwc_otg - usb_host_notes_usbh - usb_host_notes_enum - -待写章节: - -- USB 主机维护者注意事项(HAL 和 LL) -- USB 主机维护者注意事项(HCD) -- USB 主机维护者注意事项(Hub) -- USB 主机维护者注意事项(USB Host Library) - -.. -------------------------------------------------- Introduction ----------------------------------------------------- - -简介 ----- - -ESP-IDF USB 主机协议栈允许 {IDF_TARGET_NAME} 作为 USB 主机运行,此时,{IDF_TARGET_NAME} 能够与各种 USB 设备通信。然而,大多数 USB 主机协议栈实现都不运行在嵌入式硬件上(即在电脑和手机端运行),因此,相对来说具有更多的资源(即,具有更高内存和 CPU 速度)。 - -ESP-IDF USB 主机协议栈(以下简称为主机协议栈)的实现考虑到了 {IDF_TARGET_NAME} 的嵌入式特性,这体现在主机协议栈设计的各个方面。 - -特性和局限性 -^^^^^^^^^^^^ - -**主机协议栈目前支持以下显著特性:** - -- 支持 FS(全速)和 LS(低速)设备 -- 支持所有传输类型(控制传输、批量传输、同步传输和中断传输) -- 自动枚举已连接设备 -- 允许多个类驱动程序(即 USB 主机库的客户端)同时运行并共享同一设备(即组合设备) - -**主机协议栈目前存在以下显著局限:** - -- 不支持 HS(高速)设备 -- 不支持集线器(当前仅支持单个设备) +.. include:: ../../../../en/api-reference/peripherals/usb_host/usb_host_notes_index.rst From e845c15b474963b4b0daa57669df757422e3d5ed Mon Sep 17 00:00:00 2001 From: laokaiyao Date: Tue, 25 Jun 2024 17:51:24 +0800 Subject: [PATCH 18/73] fix(rom): update rom layout for c5 --- .../esp_rom/include/esp32c5/rom/rom_layout.h | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/components/esp_rom/include/esp32c5/rom/rom_layout.h b/components/esp_rom/include/esp32c5/rom/rom_layout.h index e3796e50ca19..c6d9fa048103 100644 --- a/components/esp_rom/include/esp32c5/rom/rom_layout.h +++ b/components/esp_rom/include/esp32c5/rom/rom_layout.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -12,6 +12,7 @@ extern "C" { #endif +#define CORE_NUM 1 #define SUPPORT_BTDM 0 #define SUPPORT_BTBB 0 #define SUPPORT_WIFI 1 @@ -28,6 +29,10 @@ typedef struct { void *dram0_rtos_reserved_start; void *stack_sentry; void *stack; +#if (CORE_NUM == 2) + void *stack_sentry_app; + void *stack_app; +#endif #if SUPPORT_BTDM void *data_start_btdm; @@ -58,6 +63,7 @@ typedef struct { void *data_end_interface_net80211; void *bss_start_interface_net80211; void *bss_end_interface_net80211; + void *dram_start_pp; void *dram_end_pp; void *data_start_interface_pp; @@ -83,16 +89,15 @@ typedef struct { #if SUPPORT_USB_DWCOTG void *dram_start_usb_dwcotg_rom; void *dram_end_usb_dwcotg_rom; -#else - //Two reserved members are defined here, so the structure will not be broken, - //please keep in mind that there is no memory can be released between - //dram_start_usb_reserved_rom ~ dram_end_usb_reserved_rom. - void *dram_start_usb_reserved_rom; - void *dram_end_usb_reserved_rom; #endif void *dram_start_uart_rom; void *dram_end_uart_rom; + + void *eh_frame_vaddr_rom; + void *eh_frame_hdr_vaddr_rom; + + void *drom_start; } ets_rom_layout_t; extern const ets_rom_layout_t *const ets_rom_layout_p; From 0a57b255d221e65dcff5378a852d5a95be32db5e Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Tue, 25 Jun 2024 19:26:50 +0800 Subject: [PATCH 19/73] ci(qemu): increase timeout for esp_intr_dump test --- .../system/esp_intr_dump/pytest_esp_intr_dump.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/test_apps/system/esp_intr_dump/pytest_esp_intr_dump.py b/tools/test_apps/system/esp_intr_dump/pytest_esp_intr_dump.py index b4cfd0acf441..9beab7898441 100644 --- a/tools/test_apps/system/esp_intr_dump/pytest_esp_intr_dump.py +++ b/tools/test_apps/system/esp_intr_dump/pytest_esp_intr_dump.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 import os @@ -12,7 +12,7 @@ @pytest.mark.qemu @pytest.mark.host_test def test_esp_intr_dump_nonshared(dut: Dut) -> None: - dut.expect_exact(PROMPT, timeout=10) + dut.expect_exact(PROMPT, timeout=30) dut.write('intr_alloc GPIO LEVEL3\n') dut.expect_exact('Allocated GPIO LEVEL3') @@ -26,7 +26,7 @@ def test_esp_intr_dump_nonshared(dut: Dut) -> None: @pytest.mark.qemu @pytest.mark.host_test def test_esp_intr_dump_shared(dut: Dut) -> None: - dut.expect_exact(PROMPT, timeout=10) + dut.expect_exact(PROMPT, timeout=30) dut.write('intr_alloc GPIO SHARED\n') dut.expect_exact('Allocated GPIO SHARED') @@ -50,7 +50,7 @@ def test_esp_intr_dump_shared(dut: Dut) -> None: @pytest.mark.supported_targets @pytest.mark.generic def test_esp_intr_dump_expected_output(dut: Dut) -> None: - dut.expect_exact(PROMPT, timeout=10) + dut.expect_exact(PROMPT, timeout=30) dut.write('intr_dump\n') exp_out_file = os.path.join(os.path.dirname(__file__), 'expected_output', f'{dut.target}.txt') for line in open(exp_out_file, 'r').readlines(): From b19f9242d78502859c93d8d50967a9e10c2ec7be Mon Sep 17 00:00:00 2001 From: Cao Sen Miao Date: Mon, 5 Feb 2024 20:03:40 +0800 Subject: [PATCH 20/73] fix(usb_otg): Fix bug that usb_otg console cannot work on esp32s3 --- components/esp_system/port/cpu_start.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/esp_system/port/cpu_start.c b/components/esp_system/port/cpu_start.c index 798cd5e97df2..ca0c15209c7b 100644 --- a/components/esp_system/port/cpu_start.c +++ b/components/esp_system/port/cpu_start.c @@ -224,7 +224,7 @@ void IRAM_ATTR call_start_cpu1(void) #if CONFIG_ESP_CONSOLE_NONE esp_rom_install_channel_putc(1, NULL); esp_rom_install_channel_putc(2, NULL); -#else // CONFIG_ESP_CONSOLE_NONE +#elif !CONFIG_ESP_CONSOLE_USB_CDC esp_rom_install_uart_printf(); esp_rom_output_set_as_console(CONFIG_ESP_CONSOLE_ROM_SERIAL_PORT_NUM); #endif From afbd7e2a13da1ac276dbdd7b2f94131909d69f80 Mon Sep 17 00:00:00 2001 From: Lou Tianhao Date: Mon, 24 Jun 2024 20:46:33 +0800 Subject: [PATCH 21/73] docs(pm): add description for gpio_wakeup --- docs/en/api-reference/system/sleep_modes.rst | 20 +++++++++++++++++-- .../api-reference/system/sleep_modes.rst | 20 +++++++++++++++++-- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/docs/en/api-reference/system/sleep_modes.rst b/docs/en/api-reference/system/sleep_modes.rst index 2fb87648fbd4..faf68f80d74e 100644 --- a/docs/en/api-reference/system/sleep_modes.rst +++ b/docs/en/api-reference/system/sleep_modes.rst @@ -304,6 +304,20 @@ RTC peripherals or RTC memories do not need to be powered on during sleep in thi esp_sleep_pd_config(ESP_PD_DOMAIN_VDDSDIO, ESP_PD_OPTION_ON); + .. only:: SOC_PM_SUPPORT_TOP_PD + + .. note:: + + .. only:: SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP + + In Light-sleep mode, if you set Kconfig option :ref:`CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP`, to continue using :cpp:func:`gpio_wakeup_enable` for GPIO wakeup, you need to first call :cpp:func:`rtc_gpio_init` and :cpp:func:`rtc_gpio_set_direction`, setting the RTCIO to input mode. + + Alternatively,you can use :cpp:func:`esp_deep_sleep_enable_gpio_wakeup` directly in that condition for GPIO wakeup, because the digital IO power domain is being powered off, where the situation is the same as entering Deep-sleep. + + .. only:: not SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP + + In Light-sleep mode, if you set Kconfig option :ref:`CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP`, to continue using :cpp:func:`gpio_wakeup_enable` for GPIO wakeup, you need to first call :cpp:func:`rtc_gpio_init` and :cpp:func:`rtc_gpio_set_direction`, setting the RTCIO to input mode. + .. only:: not SOC_RTCIO_WAKE_SUPPORTED GPIO Wakeup @@ -313,11 +327,13 @@ RTC peripherals or RTC memories do not need to be powered on during sleep in thi Additionally, IOs that are powered by the VDD3P3_RTC power domain can be used to wake up the chip from Deep-sleep. The wakeup pin and wakeup trigger level can be configured by calling :cpp:func:`esp_deep_sleep_enable_gpio_wakeup`. The function will enable the Deep-sleep wakeup for the selected pin. - .. only:: esp32c6 or esp32h2 + .. only:: SOC_PM_SUPPORT_TOP_PD .. note:: - In Light-sleep mode, setting Kconfig option :ref:`CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP` will invalidate GPIO wakeup. + .. only:: SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP + + In Light-sleep mode, if you set Kconfig option :ref:`CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP`, you can use :cpp:func:`esp_deep_sleep_enable_gpio_wakeup` directly for GPIO wakeup, because the digital IO power domain is being powered off, where the situation is the same as entering Deep-sleep. UART Wakeup (Light-sleep Only) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/docs/zh_CN/api-reference/system/sleep_modes.rst b/docs/zh_CN/api-reference/system/sleep_modes.rst index 10a67020d527..76567ecffea3 100644 --- a/docs/zh_CN/api-reference/system/sleep_modes.rst +++ b/docs/zh_CN/api-reference/system/sleep_modes.rst @@ -304,6 +304,20 @@ RTC 控制器中内嵌定时器,可用于在预定义的时间到达后唤醒 esp_sleep_pd_config(ESP_PD_DOMAIN_VDDSDIO, ESP_PD_OPTION_ON); + .. only:: SOC_PM_SUPPORT_TOP_PD + + .. note:: + + .. only:: SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP + + 在 Light-sleep 模式下,如果设置 Kconfig 选项 :ref:`CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP`,为了继续使用 :cpp:func:`gpio_wakeup_enable` 用于 GPIO 唤醒, 需要先调用 :cpp:func:`rtc_gpio_init` 和 :cpp:func:`rtc_gpio_set_direction`,用于设置 RTC IO 为输入模式。 + + 或者, 可以使用直接调用 :cpp:func:`esp_deep_sleep_enable_gpio_wakeup` 用于 GPIO 唤醒,因为此时 digital IO 的电源域已经被关闭,这个情况类似于进入 Deep-sleep。 + + .. only:: not SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP + + 在 Light-sleep 模式下,如果设置 Kconfig 选项 :ref:`CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP`,为了继续使用 :cpp:func:`gpio_wakeup_enable` 用于 GPIO 唤醒, 需要先调用 :cpp:func:`rtc_gpio_init` 和 :cpp:func:`rtc_gpio_set_direction`,用于设置 RTC IO 为输入模式。 + .. only:: not SOC_RTCIO_WAKE_SUPPORTED GPIO 唤醒 @@ -313,11 +327,13 @@ RTC 控制器中内嵌定时器,可用于在预定义的时间到达后唤醒 此外,可将由 VDD3P3_RTC 电源域供电的 IO 用于芯片的 Deep-sleep 唤醒。调用 :cpp:func:`esp_deep_sleep_enable_gpio_wakeup` 函数可以配置相应的唤醒管脚和唤醒触发电平,该函数用于启用相应管脚的 Deep-sleep 唤醒功能。 - .. only:: esp32c6 or esp32h2 + .. only:: SOC_PM_SUPPORT_TOP_PD .. note:: - 在 Light-sleep 模式下,设置 Kconfig 选项 :ref:`CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP` 将使 GPIO 唤醒失效。 + .. only:: SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP + + 在 Light-sleep 模式下,如果设置 Kconfig 选项 :ref:`CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP`,可以使用直接调用 :cpp:func:`esp_deep_sleep_enable_gpio_wakeup` 用于 GPIO 唤醒,因为此时 digital IO 的电源域已经被关闭,这个情况类似于进入 Deep-sleep。 UART 唤醒(仅适用于 Light-sleep 模式) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From 87b1e455648e4d6cfc7c636296109319fd229f91 Mon Sep 17 00:00:00 2001 From: Guillaume Souchere Date: Mon, 17 Jun 2024 10:46:34 +0200 Subject: [PATCH 22/73] fix(console): USB Serial JTAG freezes when input received before init When data was sent through USB Serial JTAG before the driver was installed, the bus was malfunctioning. This was because the interrupt bit for data reception was cleared regardless of whether data was received or not. Consequently, usb_serial_jtag_isr_handler_default was not triggered and the data was never read causing the bus to malfunction. This commit is modifying usb_serial_jtag_driver_install to prevent clearing USB_SERIAL_JTAG_INTR_SERIAL_OUT_RECV_PKT and USB_SERIAL_JTAG_INTR_SERIAL_IN_EMPTY thus allowing the callback usb_serial_jtag_isr_handler_default to trigger for possible data exchanged prior to the call to usb_serial_jtag_driver_install. This commit also modified the while logic in linenoiseProbe to discard any data that doesn't match the expected chaaracter sequences to prevent random input from interfering with evaluating whether the terminal supports escape sequences or not. See https://github.com/espressif/esp-idf/issues/13940 --- components/console/linenoise/linenoise.c | 6 +++--- .../esp_driver_usb_serial_jtag/src/usb_serial_jtag.c | 12 ++++++++---- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/components/console/linenoise/linenoise.c b/components/console/linenoise/linenoise.c index b4e8409af90a..e585ab7e89c6 100644 --- a/components/console/linenoise/linenoise.c +++ b/components/console/linenoise/linenoise.c @@ -1091,9 +1091,9 @@ int linenoiseProbe(void) { if (cb < 0) { continue; } - if (read_bytes == 0 && c != '\x1b') { - /* invalid response */ - break; + if (read_bytes == 0 && c != ESC) { + /* invalid response, try again until the timeout triggers */ + continue; } read_bytes += cb; } diff --git a/components/esp_driver_usb_serial_jtag/src/usb_serial_jtag.c b/components/esp_driver_usb_serial_jtag/src/usb_serial_jtag.c index e03b4efc764f..790aed174cfa 100644 --- a/components/esp_driver_usb_serial_jtag/src/usb_serial_jtag.c +++ b/components/esp_driver_usb_serial_jtag/src/usb_serial_jtag.c @@ -193,10 +193,14 @@ esp_err_t usb_serial_jtag_driver_install(usb_serial_jtag_driver_config_t *usb_se usb_serial_jtag_ll_phy_set_defaults(); // External PHY not supported. Set default values. #endif // USB_WRAP_LL_EXT_PHY_SUPPORTED - usb_serial_jtag_ll_clr_intsts_mask(USB_SERIAL_JTAG_INTR_SERIAL_IN_EMPTY | - USB_SERIAL_JTAG_INTR_SERIAL_OUT_RECV_PKT); - usb_serial_jtag_ll_ena_intr_mask(USB_SERIAL_JTAG_INTR_SERIAL_IN_EMPTY | - USB_SERIAL_JTAG_INTR_SERIAL_OUT_RECV_PKT); + // Note: DO NOT clear the interrupt status bits here. The output routine needs + // USB_SERIAL_JTAG_INTR_SERIAL_IN_EMPTY set because it needs the ISR to trigger + // as soon as data is sent; the input routine needs the status to retrieve any + // data that is still in the FIFOs. + + // We only enable the RX interrupt; we'll enable the TX one when we actually + // have anything to send. + usb_serial_jtag_ll_ena_intr_mask(USB_SERIAL_JTAG_INTR_SERIAL_OUT_RECV_PKT); err = esp_intr_alloc(ETS_USB_SERIAL_JTAG_INTR_SOURCE, 0, usb_serial_jtag_isr_handler_default, NULL, &p_usb_serial_jtag_obj->intr_handle); if (err != ESP_OK) { From 40f3bc2e57616da672a0031cda17cd5bb36d88ef Mon Sep 17 00:00:00 2001 From: Song Ruo Jing Date: Fri, 14 Jun 2024 16:46:48 +0800 Subject: [PATCH 23/73] feat(clk): Add basic clock support for esp32c5 mp - Support SOC ROOT clock source switch - Support CPU frequency change - Support RTC SLOW clock source switch - Support RTC SLOW clock + RC FAST calibration - Remove FPGA build --- Kconfig | 1 - .../src/bootloader_flash_config_esp32c5.c | 6 - .../src/bootloader_clock_init.c | 6 - .../src/esp32c5/bootloader_esp32c5.c | 4 - components/esp_hw_support/CMakeLists.txt | 1 - components/esp_hw_support/Kconfig | 5 +- components/esp_hw_support/esp_clk.c | 2 +- components/esp_hw_support/linker.lf | 2 +- .../port/esp32c5/CMakeLists.txt | 3 +- .../port/esp32c5/esp_clk_tree.c | 19 +- .../port/esp32c5/include/soc/rtc.h | 24 +- .../esp_hw_support/port/esp32c5/pmu_init.c | 36 +- .../esp_hw_support/port/esp32c5/pmu_param.c | 56 ++- .../esp_hw_support/port/esp32c5/pmu_sleep.c | 4 +- .../port/esp32c5/private_include/ocode_init.h | 21 -- .../port/esp32c5/private_include/pmu_param.h | 12 +- .../esp_hw_support/port/esp32c5/rtc_clk.c | 145 +++++--- .../port/esp32c5/rtc_clk_init.c | 10 +- .../esp_hw_support/port/esp32c5/rtc_time.c | 147 +++----- .../port/esp32c6/rtc_clk_init.c | 2 - .../esp_hw_support/port/esp32c6/rtc_time.c | 10 +- .../port/esp32h2/rtc_clk_init.c | 2 - .../esp_hw_support/port/esp32h2/rtc_time.c | 10 +- .../esp_hw_support/port/esp_clk_tree_common.c | 7 + .../patches/esp_rom_hp_regi2c_esp32c5.c | 3 - components/esp_system/port/soc/esp32c5/clk.c | 14 +- components/esptool_py/Kconfig.projbuild | 5 +- components/hal/CMakeLists.txt | 2 +- components/hal/esp32c5/clk_tree_hal.c | 12 +- .../hal/esp32c5/include/hal/clk_tree_ll.h | 346 ++++-------------- .../hal/esp32c6/include/hal/clk_tree_ll.h | 5 +- .../hal/esp32c61/include/hal/clk_tree_ll.h | 2 +- .../hal/esp32h2/include/hal/clk_tree_ll.h | 5 +- .../esp32c5/include/soc/Kconfig.soc_caps.in | 24 ++ .../soc/esp32c5/include/soc/clk_tree_defs.h | 22 +- components/soc/esp32c5/include/soc/pcr_reg.h | 15 - .../soc/esp32c5/include/soc/pcr_struct.h | 34 +- components/soc/esp32c5/include/soc/soc_caps.h | 11 +- docs/docs_not_updated/esp32c5.txt | 1 - .../en/api-reference/peripherals/clk_tree.rst | 2 +- docs/en/api-reference/peripherals/ledc.rst | 2 +- .../api-reference/peripherals/clk_tree.rst | 2 +- docs/zh_CN/api-reference/peripherals/ledc.rst | 2 +- 43 files changed, 449 insertions(+), 595 deletions(-) delete mode 100644 components/esp_hw_support/port/esp32c5/private_include/ocode_init.h diff --git a/Kconfig b/Kconfig index d7240e63290f..b5c529cbebb3 100644 --- a/Kconfig +++ b/Kconfig @@ -122,7 +122,6 @@ mainmenu "Espressif IoT Development Framework Configuration" default "y" if IDF_TARGET="esp32c5" select FREERTOS_UNICORE select IDF_TARGET_ARCH_RISCV - select IDF_ENV_FPGA config IDF_TARGET_ESP32P4 bool diff --git a/components/bootloader_support/bootloader_flash/src/bootloader_flash_config_esp32c5.c b/components/bootloader_support/bootloader_flash/src/bootloader_flash_config_esp32c5.c index d1cf55eddf8c..3f04c45b7c78 100644 --- a/components/bootloader_support/bootloader_flash/src/bootloader_flash_config_esp32c5.c +++ b/components/bootloader_support/bootloader_flash/src/bootloader_flash_config_esp32c5.c @@ -28,7 +28,6 @@ #include "hal/mmu_ll.h" #include "hal/cache_hal.h" #include "hal/cache_ll.h" -#include "hal/clk_tree_ll.h" void bootloader_flash_update_id() { @@ -204,11 +203,6 @@ static void bootloader_spi_flash_resume(void) esp_err_t bootloader_init_spi_flash(void) { - // On ESP32C5, MSPI source clock's default HS divider leads to 120MHz, which is unusable before calibration - // Therefore, before switching SOC_ROOT_CLK to HS, we need to set MSPI source clock HS divider to make it run at - // 80MHz after the switch. PLL = 480MHz, so divider is 6. - clk_ll_mspi_fast_set_hs_divider(6); - bootloader_init_flash_configure(); bootloader_spi_flash_resume(); bootloader_flash_unlock(); diff --git a/components/bootloader_support/src/bootloader_clock_init.c b/components/bootloader_support/src/bootloader_clock_init.c index a3654ec3dd31..8099aa495533 100644 --- a/components/bootloader_support/src/bootloader_clock_init.c +++ b/components/bootloader_support/src/bootloader_clock_init.c @@ -53,18 +53,12 @@ __attribute__((weak)) void bootloader_clock_configure(void) clk_cfg.cpu_freq_mhz = cpu_freq_mhz; -#if CONFIG_IDF_TARGET_ESP32C5 - // TODO: [ESP32C5] IDF-9009 Check whether SOC_RTC_SLOW_CLK_SRC_RC_SLOW can be used on C5 MP - // RC150K can't do calibrate on ESP32C5MPW so not use it - clk_cfg.slow_clk_src = SOC_RTC_SLOW_CLK_SRC_RC32K; -#else // Use RTC_SLOW clock source sel register field's default value, RC_SLOW, for 2nd stage bootloader // RTC_SLOW clock source will be switched according to Kconfig selection at application startup clk_cfg.slow_clk_src = rtc_clk_slow_src_get(); if (clk_cfg.slow_clk_src == SOC_RTC_SLOW_CLK_SRC_INVALID) { clk_cfg.slow_clk_src = SOC_RTC_SLOW_CLK_SRC_RC_SLOW; } -#endif // Use RTC_FAST clock source sel register field's default value, XTAL_DIV, for 2nd stage bootloader // RTC_FAST clock source will be switched to RC_FAST at application startup diff --git a/components/bootloader_support/src/esp32c5/bootloader_esp32c5.c b/components/bootloader_support/src/esp32c5/bootloader_esp32c5.c index 3a11e2c29e3e..7009b9afae0f 100644 --- a/components/bootloader_support/src/esp32c5/bootloader_esp32c5.c +++ b/components/bootloader_support/src/esp32c5/bootloader_esp32c5.c @@ -89,11 +89,7 @@ static inline void bootloader_hardware_init(void) /* Enable analog i2c master clock */ SET_PERI_REG_MASK(MODEM_LPCON_CLK_CONF_REG, MODEM_LPCON_CLK_I2C_MST_EN); SET_PERI_REG_MASK(MODEM_LPCON_CLK_CONF_FORCE_ON_REG, MODEM_LPCON_CLK_I2C_MST_FO); // TODO: IDF-8667 Remove this? -#if CONFIG_IDF_TARGET_ESP32C5_BETA3_VERSION - SET_PERI_REG_MASK(MODEM_LPCON_I2C_MST_CLK_CONF_REG, MODEM_LPCON_CLK_I2C_MST_SEL_160M); -#else // CONFIG_IDF_TARGET_ESP32C5_MP_VERSION SET_PERI_REG_MASK(MODEM_SYSCON_CLK_CONF_REG, MODEM_SYSCON_CLK_I2C_MST_SEL_160M); -#endif } static inline void bootloader_ana_reset_config(void) diff --git a/components/esp_hw_support/CMakeLists.txt b/components/esp_hw_support/CMakeLists.txt index 45eb3932693c..0807483723a1 100644 --- a/components/esp_hw_support/CMakeLists.txt +++ b/components/esp_hw_support/CMakeLists.txt @@ -159,7 +159,6 @@ if(NOT BOOTLOADER_BUILD) "sleep_modem.c" # TODO: [ESP32C5] IDF-8638 "sleep_wake_stub.c" # TODO: [ESP32C5] IDF-8638 "sleep_gpio.c" # TODO: [ESP32C5] IDF-8638 - "port/esp_clk_tree_common.c" # TODO: [ESP32C5] IDF-8638 ) endif() diff --git a/components/esp_hw_support/Kconfig b/components/esp_hw_support/Kconfig index 8561d769b03f..6f61db540254 100644 --- a/components/esp_hw_support/Kconfig +++ b/components/esp_hw_support/Kconfig @@ -288,10 +288,7 @@ menu "Hardware Settings" # Invisible bringup bypass options for esp_hw_support component config ESP_BRINGUP_BYPASS_CPU_CLK_SETTING bool - # TODO: [ESP32C5] IDF-8642 IDF_TARGET_ESP32C5 is added because clock - # is required when bringup on C5 beta3, remove it when clock tree is - # supported - default y if !SOC_CLK_TREE_SUPPORTED && !IDF_TARGET_ESP32C5 + default y if !SOC_CLK_TREE_SUPPORTED default n help This option is only used for new chip bringup, when diff --git a/components/esp_hw_support/esp_clk.c b/components/esp_hw_support/esp_clk.c index d777543eacab..c4a2c0c207ff 100644 --- a/components/esp_hw_support/esp_clk.c +++ b/components/esp_hw_support/esp_clk.c @@ -96,7 +96,7 @@ int IRAM_ATTR esp_clk_cpu_freq(void) int IRAM_ATTR esp_clk_apb_freq(void) { // TODO: IDF-5173 Require cleanup, implementation should be unified -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C61 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 || CONFIG_IDF_TARGET_ESP32C61 return rtc_clk_apb_freq_get(); #else return MIN(s_get_cpu_freq_mhz() * MHZ, APB_CLK_FREQ); diff --git a/components/esp_hw_support/linker.lf b/components/esp_hw_support/linker.lf index 0ad8003c5644..b4b1518e6f44 100644 --- a/components/esp_hw_support/linker.lf +++ b/components/esp_hw_support/linker.lf @@ -19,7 +19,7 @@ entries: if IDF_TARGET_ESP32 = y || IDF_TARGET_ESP32S2 = y || IDF_TARGET_ESP32S3 = y || IDF_TARGET_ESP32C2 = y || IDF_TARGET_ESP32C3 = y: rtc_sleep (noflash_text) rtc_time (noflash_text) - if SOC_PMU_SUPPORTED = y: + if SOC_PMU_SUPPORTED = y && SOC_LIGHT_SLEEP_SUPPORTED = y: pmu_sleep (noflash) if SOC_USB_SERIAL_JTAG_SUPPORTED = y: sleep_console (noflash) diff --git a/components/esp_hw_support/port/esp32c5/CMakeLists.txt b/components/esp_hw_support/port/esp32c5/CMakeLists.txt index b7e789dd2600..6a32d8aec10b 100644 --- a/components/esp_hw_support/port/esp32c5/CMakeLists.txt +++ b/components/esp_hw_support/port/esp32c5/CMakeLists.txt @@ -1,10 +1,11 @@ set(srcs "rtc_clk_init.c" "rtc_time.c" "rtc_clk.c" + "pmu_init.c" + "pmu_param.c" "chip_info.c" ) - if(NOT BOOTLOADER_BUILD) list(APPEND srcs "sar_periph_ctrl.c" "esp_crypto_lock.c") diff --git a/components/esp_hw_support/port/esp32c5/esp_clk_tree.c b/components/esp_hw_support/port/esp32c5/esp_clk_tree.c index 77a61ea8f20a..62dfe1edddae 100644 --- a/components/esp_hw_support/port/esp32c5/esp_clk_tree.c +++ b/components/esp_hw_support/port/esp32c5/esp_clk_tree.c @@ -11,21 +11,22 @@ #include "soc/rtc.h" #include "hal/clk_tree_hal.h" #include "hal/clk_tree_ll.h" -// #include "esp_private/esp_clk_tree_common.h" -#include "sdkconfig.h" +#include "esp_private/esp_clk_tree_common.h" static const char *TAG = "esp_clk_tree"; esp_err_t esp_clk_tree_src_get_freq_hz(soc_module_clk_t clk_src, esp_clk_tree_src_freq_precision_t precision, uint32_t *freq_value) { - // TODO: [ESP32C5] IDF-8642 check again for MP version ESP_RETURN_ON_FALSE(clk_src > 0 && clk_src < SOC_MOD_CLK_INVALID, ESP_ERR_INVALID_ARG, TAG, "unknown clk src"); ESP_RETURN_ON_FALSE(precision < ESP_CLK_TREE_SRC_FREQ_PRECISION_INVALID, ESP_ERR_INVALID_ARG, TAG, "unknown precision"); ESP_RETURN_ON_FALSE(freq_value, ESP_ERR_INVALID_ARG, TAG, "null pointer"); uint32_t clk_src_freq = 0; switch (clk_src) { + case SOC_MOD_CLK_CPU: + clk_src_freq = clk_hal_cpu_get_freq_hz(); + break; case SOC_MOD_CLK_XTAL: clk_src_freq = clk_hal_xtal_get_freq_mhz() * MHZ; break; @@ -41,9 +42,17 @@ uint32_t *freq_value) case SOC_MOD_CLK_SPLL: clk_src_freq = CLK_LL_PLL_480M_FREQ_MHZ * MHZ; break; + case SOC_MOD_CLK_RTC_SLOW: + clk_src_freq = esp_clk_tree_lp_slow_get_freq_hz(precision); + break; + case SOC_MOD_CLK_RTC_FAST: + clk_src_freq = esp_clk_tree_lp_fast_get_freq_hz(precision); + break; case SOC_MOD_CLK_RC_FAST: - // C5-beta3 unable to calibrate to get exact RC_FAST frequency - clk_src_freq = SOC_CLK_RC_FAST_FREQ_APPROX; + clk_src_freq = esp_clk_tree_rc_fast_get_freq_hz(precision); + break; + case SOC_MOD_CLK_XTAL32K: + clk_src_freq = esp_clk_tree_xtal32k_get_freq_hz(precision); break; case SOC_MOD_CLK_XTAL_D2: clk_src_freq = (clk_hal_xtal_get_freq_mhz() * MHZ) >> 1; diff --git a/components/esp_hw_support/port/esp32c5/include/soc/rtc.h b/components/esp_hw_support/port/esp32c5/include/soc/rtc.h index 8aeb0611736b..b449d3741419 100644 --- a/components/esp_hw_support/port/esp32c5/include/soc/rtc.h +++ b/components/esp_hw_support/port/esp32c5/include/soc/rtc.h @@ -50,10 +50,6 @@ extern "C" { #define MHZ (1000000) -#define RTC_SLOW_CLK_150K_CAL_TIMEOUT_THRES(cycles) (cycles << 10) -#define RTC_SLOW_CLK_32K_CAL_TIMEOUT_THRES(cycles) (cycles << 12) -#define RTC_FAST_CLK_20M_CAL_TIMEOUT_THRES(cycles) (TIMG_RTC_CALI_TIMEOUT_THRES_V) // Just use the max timeout thres value - #define OTHER_BLOCKS_POWERUP 1 #define OTHER_BLOCKS_WAIT 1 @@ -121,21 +117,19 @@ typedef struct rtc_cpu_freq_config_s { #define RTC_VDDSDIO_TIEH_1_8V 0 //!< TIEH field value for 1.8V VDDSDIO #define RTC_VDDSDIO_TIEH_3_3V 1 //!< TIEH field value for 3.3V VDDSDIO - /** * @brief Clock source to be calibrated using rtc_clk_cal function * - * @note On previous targets, the enum values somehow reflects the register field values of TIMG_RTC_CALI_CLK_SEL - * However, this is not true on ESP32C5. The conversion to register field values is explicitly done in - * rtc_clk_cal_internal + * @note On ESP32C5, the enum values somehow reflects the register field values of PCR_32K_SEL. */ typedef enum { - RTC_CAL_RTC_MUX = -1, //!< Currently selected RTC_SLOW_CLK - // RTC_CAL_RC_SLOW = SOC_RTC_SLOW_CLK_SRC_RC_SLOW, //!< Internal 150kHz RC oscillator - RTC_CAL_RC32K = SOC_RTC_SLOW_CLK_SRC_RC32K, //!< Internal 32kHz RC oscillator, as one type of 32k clock - RTC_CAL_32K_XTAL = SOC_RTC_SLOW_CLK_SRC_XTAL32K, //!< External 32kHz XTAL, as one type of 32k clock - RTC_CAL_32K_OSC_SLOW = SOC_RTC_SLOW_CLK_SRC_OSC_SLOW, //!< External slow clock signal input by lp_pad_gpio0, as one type of 32k clock - RTC_CAL_RC_FAST //!< Internal 20MHz RC oscillator + RTC_CAL_RTC_MUX = -1, //!< Currently selected RTC_SLOW_CLK + RTC_CAL_RC32K = 0, //!< Internal 32kHz RC oscillator, as one type of 32k clock + RTC_CAL_32K_XTAL = 1, //!< External 32kHz XTAL, as one type of 32k clock + RTC_CAL_32K_OSC_SLOW = 2, //!< External slow clock signal input by lp_pad_gpio0, as one type of 32k clock + RTC_CAL_RC_SLOW = 3, //!< Internal 150kHz RC oscillator + RTC_CAL_RC_FAST = 4, //!< Internal 20MHz RC oscillator + RTC_CAL_INVALID_CLK, //!< Clock not available to calibrate } rtc_cal_sel_t; /** @@ -160,7 +154,7 @@ typedef struct { .xtal_freq = CONFIG_XTAL_FREQ, \ .cpu_freq_mhz = 80, \ .fast_clk_src = SOC_RTC_FAST_CLK_SRC_RC_FAST, \ - .slow_clk_src = SOC_RTC_SLOW_CLK_SRC_RC32K, \ + .slow_clk_src = SOC_RTC_SLOW_CLK_SRC_RC_SLOW, \ .clk_rtc_clk_div = 0, \ .clk_8m_clk_div = 0, \ .slow_clk_dcap = RTC_CNTL_SCK_DCAP_DEFAULT, \ diff --git a/components/esp_hw_support/port/esp32c5/pmu_init.c b/components/esp_hw_support/port/esp32c5/pmu_init.c index 345efa32ca3e..e280fc36dc79 100644 --- a/components/esp_hw_support/port/esp32c5/pmu_init.c +++ b/components/esp_hw_support/port/esp32c5/pmu_init.c @@ -23,13 +23,13 @@ typedef struct { const pmu_hp_system_power_param_t *power; const pmu_hp_system_clock_param_t *clock; const pmu_hp_system_digital_param_t *digital; - const pmu_hp_system_analog_param_t *analog; + pmu_hp_system_analog_param_t *analog; //param determined at runtime const pmu_hp_system_retention_param_t *retent; } pmu_hp_system_param_t; typedef struct { const pmu_lp_system_power_param_t *power; - const pmu_lp_system_analog_param_t *analog; + pmu_lp_system_analog_param_t *analog; //param determined at runtime } pmu_lp_system_param_t; pmu_context_t * __attribute__((weak)) IRAM_ATTR PMU_instance(void) @@ -42,7 +42,7 @@ pmu_context_t * __attribute__((weak)) IRAM_ATTR PMU_instance(void) return &pmu_context; } -void pmu_hp_system_init(pmu_context_t *ctx, pmu_hp_mode_t mode, pmu_hp_system_param_t *param) +void pmu_hp_system_init(pmu_context_t *ctx, pmu_hp_mode_t mode, const pmu_hp_system_param_t *param) { const pmu_hp_system_power_param_t *power = param->power; const pmu_hp_system_clock_param_t *clock = param->clock; @@ -101,7 +101,7 @@ void pmu_hp_system_init(pmu_context_t *ctx, pmu_hp_mode_t mode, pmu_hp_system_pa pmu_ll_hp_set_sleep_protect_mode(ctx->hal->dev, PMU_SLEEP_PROTECT_HP_LP_SLEEP); } -void pmu_lp_system_init(pmu_context_t *ctx, pmu_lp_mode_t mode, pmu_lp_system_param_t *param) +void pmu_lp_system_init(pmu_context_t *ctx, pmu_lp_mode_t mode, const pmu_lp_system_param_t *param) { const pmu_lp_system_power_param_t *power = param->power; const pmu_lp_system_analog_param_t *anlg = param->analog; @@ -157,18 +157,26 @@ static inline void pmu_power_domain_force_default(pmu_context_t *ctx) static inline void pmu_hp_system_param_default(pmu_hp_mode_t mode, pmu_hp_system_param_t *param) { + assert (param->analog); + param->power = pmu_hp_system_power_param_default(mode); param->clock = pmu_hp_system_clock_param_default(mode); param->digital = pmu_hp_system_digital_param_default(mode); - param->analog = pmu_hp_system_analog_param_default(mode); + *param->analog = *pmu_hp_system_analog_param_default(mode); //copy default value param->retent = pmu_hp_system_retention_param_default(mode); + + if (mode == PMU_MODE_HP_ACTIVE || mode == PMU_MODE_HP_MODEM) { + param->analog->regulator0.dbias = get_act_hp_dbias(); + } } static void pmu_hp_system_init_default(pmu_context_t *ctx) { assert(ctx); - pmu_hp_system_param_t param = { 0 }; for (pmu_hp_mode_t mode = PMU_MODE_HP_ACTIVE; mode < PMU_MODE_HP_MAX; mode++) { + pmu_hp_system_analog_param_t analog = {}; + pmu_hp_system_param_t param = {.analog = &analog}; + pmu_hp_system_param_default(mode, ¶m); pmu_hp_system_init(ctx, mode, ¶m); } @@ -176,15 +184,23 @@ static void pmu_hp_system_init_default(pmu_context_t *ctx) static inline void pmu_lp_system_param_default(pmu_lp_mode_t mode, pmu_lp_system_param_t *param) { + assert (param->analog); + param->power = pmu_lp_system_power_param_default(mode); - param->analog = pmu_lp_system_analog_param_default(mode); + *param->analog = *pmu_lp_system_analog_param_default(mode); //copy default value + + if (mode == PMU_MODE_LP_ACTIVE) { + param->analog->regulator0.dbias = get_act_lp_dbias(); + } } static void pmu_lp_system_init_default(pmu_context_t *ctx) { assert(ctx); - pmu_lp_system_param_t param; for (pmu_lp_mode_t mode = PMU_MODE_LP_ACTIVE; mode < PMU_MODE_LP_MAX; mode++) { + pmu_lp_system_analog_param_t analog = {}; + pmu_lp_system_param_t param = {.analog = &analog}; + pmu_lp_system_param_default(mode, ¶m); pmu_lp_system_init(ctx, mode, ¶m); } @@ -195,10 +211,6 @@ void pmu_init(void) /* Peripheral reg i2c power up */ SET_PERI_REG_MASK(PMU_RF_PWC_REG, PMU_PERIF_I2C_RSTB); SET_PERI_REG_MASK(PMU_RF_PWC_REG, PMU_XPD_PERIF_I2C); - REGI2C_WRITE_MASK(I2C_DIG_REG, I2C_DIG_REG_ENIF_RTC_DREG, 1); - REGI2C_WRITE_MASK(I2C_DIG_REG, I2C_DIG_REG_ENIF_DIG_DREG, 1); - REGI2C_WRITE_MASK(I2C_DIG_REG, I2C_DIG_REG_XPD_RTC_REG, 0); - REGI2C_WRITE_MASK(I2C_DIG_REG, I2C_DIG_REG_XPD_DIG_REG, 0); pmu_hp_system_init_default(PMU_instance()); pmu_lp_system_init_default(PMU_instance()); diff --git a/components/esp_hw_support/port/esp32c5/pmu_param.c b/components/esp_hw_support/port/esp32c5/pmu_param.c index 262bfe9fcf9b..cdcc639ad506 100644 --- a/components/esp_hw_support/port/esp32c5/pmu_param.c +++ b/components/esp_hw_support/port/esp32c5/pmu_param.c @@ -211,7 +211,7 @@ const pmu_hp_system_digital_param_t * pmu_hp_system_digital_param_default(pmu_hp .xpd = 1, \ .slp_mem_dbias = 0, \ .slp_logic_dbias = 0, \ - .dbias = HP_CALI_DBIAS \ + .dbias = HP_CALI_DBIAS_DEFAULT \ }, \ .regulator1 = { \ .drv_b = 0x0 \ @@ -231,7 +231,7 @@ const pmu_hp_system_digital_param_t * pmu_hp_system_digital_param_default(pmu_hp .xpd = 1, \ .slp_mem_dbias = 0, \ .slp_logic_dbias = 0, \ - .dbias = HP_CALI_DBIAS \ + .dbias = HP_CALI_DBIAS_DEFAULT \ }, \ .regulator1 = { \ .drv_b = 0x0 \ @@ -413,7 +413,7 @@ const pmu_lp_system_power_param_t * pmu_lp_system_power_param_default(pmu_lp_mod .slp_xpd = 0, \ .xpd = 1, \ .slp_dbias = 0, \ - .dbias = LP_CALI_DBIAS \ + .dbias = LP_CALI_DBIAS_DEFAULT \ }, \ .regulator1 = { \ .drv_b = 0x0 \ @@ -447,3 +447,53 @@ const pmu_lp_system_analog_param_t * pmu_lp_system_analog_param_default(pmu_lp_m assert(mode < ARRAY_SIZE(lp_analog)); return &lp_analog[mode]; } + +uint32_t get_act_hp_dbias(void) +{ + /* hp_cali_dbias is read from efuse to ensure that the hp_active_voltage is close to 1.15V + */ + uint32_t hp_cali_dbias = HP_CALI_DBIAS_DEFAULT; + // uint32_t blk_version = efuse_hal_blk_version(); + // if (blk_version >= 3) { + // hp_cali_dbias = efuse_ll_get_active_hp_dbias(); + // if (hp_cali_dbias != 0) { + // //efuse dbias need to add 2 to meet the CPU frequency switching + // if (hp_cali_dbias + 2 > 31) { + // hp_cali_dbias = 31; + // } else { + // hp_cali_dbias += 2; + // } + // } else { + // hp_cali_dbias = HP_CALI_DBIAS_DEFAULT; + // ESP_HW_LOGD(TAG, "hp_cali_dbias not burnt in efuse or wrong value was burnt in blk version: %" PRIu32 "\n", blk_version); + // } + // } + + return hp_cali_dbias; +} + +uint32_t get_act_lp_dbias(void) +{ + /* lp_cali_dbias is read from efuse to ensure that the lp_active_voltage is close to 1.15V + */ + uint32_t lp_cali_dbias = LP_CALI_DBIAS_DEFAULT; + // uint32_t blk_version = efuse_hal_blk_version(); + // if (blk_version >= 3) { + // lp_cali_dbias = efuse_ll_get_active_lp_dbias(); + // if (lp_cali_dbias != 0) { + // //efuse dbias need to add 2 to meet the CPU frequency switching + // if (lp_cali_dbias + 2 > 31) { + // lp_cali_dbias = 31; + // } else { + // lp_cali_dbias += 2; + // } + // } else { + // lp_cali_dbias = LP_CALI_DBIAS_DEFAULT; + // ESP_HW_LOGD(TAG, "lp_cali_dbias not burnt in efuse or wrong value was burnt in blk version: %" PRIu32 "\n", blk_version); + // } + // } else { + // ESP_HW_LOGD(TAG, "blk_version is less than 3, act dbias not burnt in efuse\n"); + // } + + return lp_cali_dbias; +} diff --git a/components/esp_hw_support/port/esp32c5/pmu_sleep.c b/components/esp_hw_support/port/esp32c5/pmu_sleep.c index 262ce0086e6e..f7f8185c13fc 100644 --- a/components/esp_hw_support/port/esp32c5/pmu_sleep.c +++ b/components/esp_hw_support/port/esp32c5/pmu_sleep.c @@ -168,11 +168,11 @@ const pmu_sleep_config_t* pmu_sleep_config_default( if (!(pd_flags & PMU_SLEEP_PD_XTAL)){ analog_default.hp_sys.analog.pd_cur = PMU_PD_CUR_SLEEP_ON; analog_default.hp_sys.analog.bias_sleep = PMU_BIASSLP_SLEEP_ON; - analog_default.hp_sys.analog.dbias = HP_CALI_DBIAS; + analog_default.hp_sys.analog.dbias = HP_CALI_DBIAS_DEFAULT; analog_default.lp_sys[LP(SLEEP)].analog.pd_cur = PMU_PD_CUR_SLEEP_ON; analog_default.lp_sys[LP(SLEEP)].analog.bias_sleep = PMU_BIASSLP_SLEEP_ON; - analog_default.lp_sys[LP(SLEEP)].analog.dbias = LP_CALI_DBIAS; + analog_default.lp_sys[LP(SLEEP)].analog.dbias = LP_CALI_DBIAS_DEFAULT; } config->analog = analog_default; diff --git a/components/esp_hw_support/port/esp32c5/private_include/ocode_init.h b/components/esp_hw_support/port/esp32c5/private_include/ocode_init.h deleted file mode 100644 index 524f286194c1..000000000000 --- a/components/esp_hw_support/port/esp32c5/private_include/ocode_init.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief Initialize OCode - * - */ -void esp_ocode_calib_init(void); - -#ifdef __cplusplus -} -#endif diff --git a/components/esp_hw_support/port/esp32c5/private_include/pmu_param.h b/components/esp_hw_support/port/esp32c5/private_include/pmu_param.h index 909a58321518..7153ef4846dd 100644 --- a/components/esp_hw_support/port/esp32c5/private_include/pmu_param.h +++ b/components/esp_hw_support/port/esp32c5/private_include/pmu_param.h @@ -19,9 +19,8 @@ extern "C" { #endif - -#define HP_CALI_DBIAS 25 -#define LP_CALI_DBIAS 26 +#define HP_CALI_DBIAS_DEFAULT 28 +#define LP_CALI_DBIAS_DEFAULT 28 // FOR XTAL FORCE PU IN SLEEP #define PMU_PD_CUR_SLEEP_ON 0 @@ -51,6 +50,9 @@ extern "C" { #define PMU_DBG_ATTEN_DEEPSLEEP_DEFAULT 12 #define PMU_LP_DBIAS_DEEPSLEEP_0V7 23 +uint32_t get_act_hp_dbias(void); +uint32_t get_act_lp_dbias(void); + typedef struct { pmu_hp_dig_power_reg_t dig_power; pmu_hp_clk_power_reg_t clk_power; @@ -412,7 +414,7 @@ typedef struct { typedef struct pmu_sleep_machine_constant { struct { - uint16_t min_slp_time_us; /* Mininum sleep protection time (unit: microsecond) */ + uint16_t min_slp_time_us; /* Minimum sleep protection time (unit: microsecond) */ uint8_t wakeup_wait_cycle; /* Modem wakeup signal (WiFi MAC and BEACON wakeup) waits for the slow & fast clock domain synchronization and the wakeup signal triggers the PMU FSM switching wait cycle (unit: slow clock cycle) */ uint8_t reserved0; uint16_t reserved1; @@ -424,7 +426,7 @@ typedef struct pmu_sleep_machine_constant { uint16_t power_up_wait_time_us; /* (unit: microsecond) */ } lp; struct { - uint16_t min_slp_time_us; /* Mininum sleep protection time (unit: microsecond) */ + uint16_t min_slp_time_us; /* Minimum sleep protection time (unit: microsecond) */ uint16_t clock_domain_sync_time_us; /* The Slow OSC clock domain synchronizes time with the Fast OSC domain, at least 4 slow clock cycles (unit: microsecond) */ uint16_t system_dfs_up_work_time_us; /* System DFS up scaling work time (unit: microsecond) */ uint16_t analog_wait_time_us; /* HP LDO power up wait time (unit: microsecond) */ diff --git a/components/esp_hw_support/port/esp32c5/rtc_clk.c b/components/esp_hw_support/port/esp32c5/rtc_clk.c index e244ebe18d62..c550c44d0c1f 100644 --- a/components/esp_hw_support/port/esp32c5/rtc_clk.c +++ b/components/esp_hw_support/port/esp32c5/rtc_clk.c @@ -172,6 +172,7 @@ static void rtc_clk_bbpll_configure(soc_xtal_freq_t xtal_freq, int pll_freq) clk_ll_bbpll_set_config(pll_freq, xtal_freq); /* WAIT CALIBRATION DONE */ while(!regi2c_ctrl_ll_bbpll_calibration_is_done()); + esp_rom_delay_us(10); // wait for true stop /* BBPLL CALIBRATION STOP */ regi2c_ctrl_ll_bbpll_calibration_stop(); rtc_clk_enable_i2c_ana_master_clock(false); @@ -185,29 +186,60 @@ static void rtc_clk_bbpll_configure(soc_xtal_freq_t xtal_freq, int pll_freq) */ static void rtc_clk_cpu_freq_to_xtal(int cpu_freq, int div) { - clk_ll_ahb_set_ls_divider(div); - clk_ll_cpu_set_ls_divider(div); + // let f_cpu = f_ahb + clk_ll_cpu_set_divider(div); + clk_ll_ahb_set_divider(div); clk_ll_cpu_set_src(SOC_CPU_CLK_SRC_XTAL); + clk_ll_bus_update(); esp_rom_set_cpu_ticks_per_us(cpu_freq); } static void rtc_clk_cpu_freq_to_8m(void) { - clk_ll_ahb_set_ls_divider(1); - clk_ll_cpu_set_ls_divider(1); + clk_ll_cpu_set_divider(1); + clk_ll_ahb_set_divider(1); clk_ll_cpu_set_src(SOC_CPU_CLK_SRC_RC_FAST); + clk_ll_bus_update(); esp_rom_set_cpu_ticks_per_us(20); } /** - * Switch to one of PLL-based frequencies. Current frequency can be XTAL or PLL. + * Switch to PLL_F240M as cpu clock source. * PLL must already be enabled. * @param cpu_freq new CPU frequency */ -static void rtc_clk_cpu_freq_to_pll_mhz(int cpu_freq_mhz) -{ - clk_ll_cpu_set_hs_divider(CLK_LL_PLL_480M_FREQ_MHZ / cpu_freq_mhz); - clk_ll_cpu_set_src(SOC_CPU_CLK_SRC_PLL); +static void rtc_clk_cpu_freq_to_pll_240_mhz(int cpu_freq_mhz) +{ + // f_hp_root = 240MHz + uint32_t cpu_divider = CLK_LL_PLL_240M_FREQ_MHZ / cpu_freq_mhz; + clk_ll_cpu_set_divider(cpu_divider); + // Constraint: f_ahb <= 48MHz; f_cpu = N * f_ahb (N = 1, 2, 3...) + // let f_ahb = 40MHz + const uint32_t ahb_divider = 6; + assert((cpu_divider <= ahb_divider) && (ahb_divider % cpu_divider == 0)); + clk_ll_ahb_set_divider(ahb_divider); + clk_ll_cpu_set_src(SOC_CPU_CLK_SRC_PLL_F240M); + clk_ll_bus_update(); + esp_rom_set_cpu_ticks_per_us(cpu_freq_mhz); +} + +/** + * Switch to PLL_F160M as cpu clock source. + * PLL must already be enabled. + * @param cpu_freq new CPU frequency + */ +static void rtc_clk_cpu_freq_to_pll_160_mhz(int cpu_freq_mhz) +{ + // f_hp_root = 160MHz + uint32_t cpu_divider = CLK_LL_PLL_160M_FREQ_MHZ / cpu_freq_mhz; + clk_ll_cpu_set_divider(cpu_divider); + // Constraint: f_ahb <= 48MHz; f_cpu = N * f_ahb (N = 1, 2, 3...) + // let f_ahb = 40MHz + const uint32_t ahb_divider = 4; + assert((cpu_divider <= ahb_divider) && (ahb_divider % cpu_divider == 0)); + clk_ll_ahb_set_divider(ahb_divider); + clk_ll_cpu_set_src(SOC_CPU_CLK_SRC_PLL_F160M); + clk_ll_bus_update(); esp_rom_set_cpu_ticks_per_us(cpu_freq_mhz); } @@ -219,7 +251,14 @@ bool rtc_clk_cpu_freq_mhz_to_config(uint32_t freq_mhz, rtc_cpu_freq_config_t *ou uint32_t real_freq_mhz; uint32_t xtal_freq = (uint32_t)rtc_clk_xtal_freq_get(); - if (freq_mhz <= xtal_freq && freq_mhz != 0) { + // To maintain APB_MAX (40MHz) while lowering CPU frequency when using a 48MHz XTAL, have to let CPU frequnecy be + // 40MHz with PLL_F160M or PLL_F240M clock source. This is a special case, has to handle separately. + if (xtal_freq == SOC_XTAL_FREQ_48M && freq_mhz == 40) { + real_freq_mhz = freq_mhz; + source = SOC_CPU_CLK_SRC_PLL_F160M; + source_freq_mhz = CLK_LL_PLL_160M_FREQ_MHZ; + divider = 4; + } else if (freq_mhz <= xtal_freq && freq_mhz != 0) { divider = xtal_freq / freq_mhz; real_freq_mhz = (xtal_freq + divider / 2) / divider; /* round */ if (real_freq_mhz != freq_mhz) { @@ -229,21 +268,21 @@ bool rtc_clk_cpu_freq_mhz_to_config(uint32_t freq_mhz, rtc_cpu_freq_config_t *ou source_freq_mhz = xtal_freq; source = SOC_CPU_CLK_SRC_XTAL; - } else if (freq_mhz == 80) { - real_freq_mhz = freq_mhz; - source = SOC_CPU_CLK_SRC_PLL; - source_freq_mhz = CLK_LL_PLL_480M_FREQ_MHZ; - divider = 6; - } else if (freq_mhz == 120) { + } else if (freq_mhz == 240) { real_freq_mhz = freq_mhz; - source = SOC_CPU_CLK_SRC_PLL; - source_freq_mhz = CLK_LL_PLL_480M_FREQ_MHZ; - divider = 4; + source = SOC_CPU_CLK_SRC_PLL_F240M; + source_freq_mhz = CLK_LL_PLL_240M_FREQ_MHZ; + divider = 1; } else if (freq_mhz == 160) { real_freq_mhz = freq_mhz; - source = SOC_CPU_CLK_SRC_PLL; - source_freq_mhz = CLK_LL_PLL_480M_FREQ_MHZ; - divider = 3; + source = SOC_CPU_CLK_SRC_PLL_F160M; + source_freq_mhz = CLK_LL_PLL_160M_FREQ_MHZ; + divider = 1; + } else if (freq_mhz == 80) { + real_freq_mhz = freq_mhz; + source = SOC_CPU_CLK_SRC_PLL_F160M; + source_freq_mhz = CLK_LL_PLL_160M_FREQ_MHZ; + divider = 2; } else { // unsupported frequency return false; @@ -266,21 +305,29 @@ void rtc_clk_cpu_freq_set_config(const rtc_cpu_freq_config_t *config) soc_cpu_clk_src_t old_cpu_clk_src = clk_ll_cpu_get_src(); if (config->source == SOC_CPU_CLK_SRC_XTAL) { rtc_clk_cpu_freq_to_xtal(config->freq_mhz, config->div); - if ((old_cpu_clk_src == SOC_CPU_CLK_SRC_PLL) && !s_bbpll_digi_consumers_ref_count) { + if (((old_cpu_clk_src == SOC_CPU_CLK_SRC_PLL_F160M) || (old_cpu_clk_src == SOC_CPU_CLK_SRC_PLL_F240M)) && !s_bbpll_digi_consumers_ref_count) { // We don't turn off the bbpll if some consumers depend on bbpll rtc_clk_bbpll_disable(); } - } else if (config->source == SOC_CPU_CLK_SRC_PLL) { - if (old_cpu_clk_src != SOC_CPU_CLK_SRC_PLL) { + } else if (config->source == SOC_CPU_CLK_SRC_PLL_F240M) { + if (old_cpu_clk_src != SOC_CPU_CLK_SRC_PLL_F240M && old_cpu_clk_src != SOC_CPU_CLK_SRC_PLL_F160M) { rtc_clk_set_cpu_switch_to_pll(SLEEP_EVENT_HW_PLL_EN_START); rtc_clk_bbpll_enable(); - rtc_clk_bbpll_configure(rtc_clk_xtal_freq_get(), config->source_freq_mhz); + rtc_clk_bbpll_configure(rtc_clk_xtal_freq_get(), CLK_LL_PLL_480M_FREQ_MHZ); } - rtc_clk_cpu_freq_to_pll_mhz(config->freq_mhz); + rtc_clk_cpu_freq_to_pll_240_mhz(config->freq_mhz); + rtc_clk_set_cpu_switch_to_pll(SLEEP_EVENT_HW_PLL_EN_STOP); + } else if (config->source == SOC_CPU_CLK_SRC_PLL_F160M) { + if (old_cpu_clk_src != SOC_CPU_CLK_SRC_PLL_F240M && old_cpu_clk_src != SOC_CPU_CLK_SRC_PLL_F160M) { + rtc_clk_set_cpu_switch_to_pll(SLEEP_EVENT_HW_PLL_EN_START); + rtc_clk_bbpll_enable(); + rtc_clk_bbpll_configure(rtc_clk_xtal_freq_get(), CLK_LL_PLL_480M_FREQ_MHZ); + } + rtc_clk_cpu_freq_to_pll_160_mhz(config->freq_mhz); rtc_clk_set_cpu_switch_to_pll(SLEEP_EVENT_HW_PLL_EN_STOP); } else if (config->source == SOC_CPU_CLK_SRC_RC_FAST) { rtc_clk_cpu_freq_to_8m(); - if ((old_cpu_clk_src == SOC_CPU_CLK_SRC_PLL) && !s_bbpll_digi_consumers_ref_count) { + if (((old_cpu_clk_src == SOC_CPU_CLK_SRC_PLL_F160M) || (old_cpu_clk_src == SOC_CPU_CLK_SRC_PLL_F240M)) && !s_bbpll_digi_consumers_ref_count) { // We don't turn off the bbpll if some consumers depend on bbpll rtc_clk_bbpll_disable(); } @@ -292,17 +339,21 @@ void rtc_clk_cpu_freq_get_config(rtc_cpu_freq_config_t *out_config) soc_cpu_clk_src_t source = clk_ll_cpu_get_src(); uint32_t source_freq_mhz; uint32_t freq_mhz; - uint32_t div = clk_ll_cpu_get_ls_divider(); // div = freq of SOC_ROOT_CLK / freq of CPU_CLK - uint32_t hs_div = clk_ll_cpu_get_hs_divider(); + uint32_t div = clk_ll_cpu_get_divider(); // div = freq of SOC_ROOT_CLK / freq of CPU_CLK switch (source) { case SOC_CPU_CLK_SRC_XTAL: { source_freq_mhz = (uint32_t)rtc_clk_xtal_freq_get(); freq_mhz = source_freq_mhz / div; break; } - case SOC_CPU_CLK_SRC_PLL: { - source_freq_mhz = clk_ll_bbpll_get_freq_mhz(); - freq_mhz = source_freq_mhz / hs_div; + case SOC_CPU_CLK_SRC_PLL_F160M: { + source_freq_mhz = CLK_LL_PLL_160M_FREQ_MHZ; + freq_mhz = source_freq_mhz / div; + break; + } + case SOC_CPU_CLK_SRC_PLL_F240M: { + source_freq_mhz = CLK_LL_PLL_240M_FREQ_MHZ; + freq_mhz = source_freq_mhz / div; break; } case SOC_CPU_CLK_SRC_RC_FAST: @@ -325,11 +376,12 @@ void rtc_clk_cpu_freq_set_config_fast(const rtc_cpu_freq_config_t *config) { if (config->source == SOC_CPU_CLK_SRC_XTAL) { rtc_clk_cpu_freq_to_xtal(config->freq_mhz, config->div); - } else if ( - config->source == SOC_CPU_CLK_SRC_PLL && - s_cur_pll_freq == config->source_freq_mhz - ) { - rtc_clk_cpu_freq_to_pll_mhz(config->freq_mhz); + } else if (config->source == SOC_CPU_CLK_SRC_PLL_F160M && + s_cur_pll_freq == CLK_LL_PLL_480M_FREQ_MHZ) { + rtc_clk_cpu_freq_to_pll_160_mhz(config->freq_mhz); + } else if (config->source == SOC_CPU_CLK_SRC_PLL_F240M && + s_cur_pll_freq == CLK_LL_PLL_480M_FREQ_MHZ) { + rtc_clk_cpu_freq_to_pll_240_mhz(config->freq_mhz); } else if (config->source == SOC_CPU_CLK_SRC_RC_FAST) { rtc_clk_cpu_freq_to_8m(); } else { @@ -356,7 +408,8 @@ void rtc_clk_cpu_set_to_default_config(void) void rtc_clk_cpu_freq_to_pll_and_pll_lock_release(int cpu_freq_mhz) { - rtc_clk_cpu_freq_to_pll_mhz(cpu_freq_mhz); + // TODO: IDF-8641 CPU_MAX_FREQ don't know what to do... pll_240 or pll_160... + rtc_clk_cpu_freq_to_pll_240_mhz(cpu_freq_mhz); clk_ll_cpu_clk_src_lock_release(); } @@ -375,15 +428,19 @@ static uint32_t rtc_clk_ahb_freq_get(void) switch (source) { case SOC_CPU_CLK_SRC_XTAL: soc_root_freq_mhz = rtc_clk_xtal_freq_get(); - divider = clk_ll_ahb_get_ls_divider(); + divider = clk_ll_ahb_get_divider(); + break; + case SOC_CPU_CLK_SRC_PLL_F160M: + soc_root_freq_mhz = CLK_LL_PLL_160M_FREQ_MHZ; + divider = clk_ll_ahb_get_divider(); break; - case SOC_CPU_CLK_SRC_PLL: - soc_root_freq_mhz = clk_ll_bbpll_get_freq_mhz(); - divider = clk_ll_ahb_get_hs_divider(); + case SOC_CPU_CLK_SRC_PLL_F240M: + soc_root_freq_mhz = CLK_LL_PLL_240M_FREQ_MHZ; + divider = clk_ll_ahb_get_divider(); break; case SOC_CPU_CLK_SRC_RC_FAST: soc_root_freq_mhz = 20; - divider = clk_ll_ahb_get_ls_divider(); + divider = clk_ll_ahb_get_divider(); break; default: // Unknown SOC_ROOT clock source diff --git a/components/esp_hw_support/port/esp32c5/rtc_clk_init.c b/components/esp_hw_support/port/esp32c5/rtc_clk_init.c index f8c61cda81aa..81e452e71a87 100644 --- a/components/esp_hw_support/port/esp32c5/rtc_clk_init.c +++ b/components/esp_hw_support/port/esp32c5/rtc_clk_init.c @@ -79,10 +79,14 @@ void rtc_clk_init(rtc_clk_config_t cfg) REG_SET_FIELD(LP_CLKRST_RC32K_CNTL_REG, LP_CLKRST_RC32K_DFREQ, cfg.rc32k_dfreq); REGI2C_WRITE_MASK(I2C_DIG_REG, I2C_DIG_REG_ENIF_RTC_DREG, 1); REGI2C_WRITE_MASK(I2C_DIG_REG, I2C_DIG_REG_ENIF_DIG_DREG, 1); - REG_SET_FIELD(PMU_HP_ACTIVE_HP_REGULATOR0_REG, PMU_HP_ACTIVE_HP_REGULATOR_DBIAS, HP_CALI_DBIAS); - REG_SET_FIELD(PMU_HP_SLEEP_LP_REGULATOR0_REG, PMU_HP_SLEEP_LP_REGULATOR_DBIAS, LP_CALI_DBIAS); + REGI2C_WRITE_MASK(I2C_DIG_REG, I2C_DIG_REG_XPD_RTC_REG, 0); + REGI2C_WRITE_MASK(I2C_DIG_REG, I2C_DIG_REG_XPD_DIG_REG, 0); + uint32_t hp_cali_dbias = get_act_hp_dbias(); + uint32_t lp_cali_dbias = get_act_lp_dbias(); - clk_ll_rc_fast_tick_conf(); // TODO: IDF-8642 Unnecessary or not? + SET_PERI_REG_BITS(PMU_HP_ACTIVE_HP_REGULATOR0_REG, PMU_HP_ACTIVE_HP_REGULATOR_DBIAS, hp_cali_dbias, PMU_HP_ACTIVE_HP_REGULATOR_DBIAS_S); + SET_PERI_REG_BITS(PMU_HP_MODEM_HP_REGULATOR0_REG, PMU_HP_MODEM_HP_REGULATOR_DBIAS, hp_cali_dbias, PMU_HP_MODEM_HP_REGULATOR_DBIAS_S); + SET_PERI_REG_BITS(PMU_HP_SLEEP_LP_REGULATOR0_REG, PMU_HP_SLEEP_LP_REGULATOR_DBIAS, lp_cali_dbias, PMU_HP_SLEEP_LP_REGULATOR_DBIAS_S); // XTAL freq determined by efuse, and can be directly informed from register field PCR_CLK_XTAL_FREQ diff --git a/components/esp_hw_support/port/esp32c5/rtc_time.c b/components/esp_hw_support/port/esp32c5/rtc_time.c index ec157f07d185..76e77e06f50e 100644 --- a/components/esp_hw_support/port/esp32c5/rtc_time.c +++ b/components/esp_hw_support/port/esp32c5/rtc_time.c @@ -12,6 +12,7 @@ #include "hal/clk_tree_ll.h" #include "hal/timer_ll.h" #include "soc/timer_group_reg.h" +#include "soc/pcr_reg.h" #include "esp_rom_sys.h" #include "assert.h" #include "hal/efuse_hal.h" @@ -23,64 +24,31 @@ __attribute__((unused)) static const char *TAG = "rtc_time"; /* Calibration of RTC_SLOW_CLK is performed using a special feature of TIMG0. * This feature counts the number of XTAL clock cycles within a given number of * RTC_SLOW_CLK cycles. - * - * Slow clock calibration feature has two modes of operation: one-off and cycling. - * In cycling mode (which is enabled by default on SoC reset), counting of XTAL - * cycles within RTC_SLOW_CLK cycle is done continuously. Cycling mode is enabled - * using TIMG_RTC_CALI_START_CYCLING bit. In one-off mode counting is performed - * once, and TIMG_RTC_CALI_RDY bit is set when counting is done. One-off mode is - * enabled using TIMG_RTC_CALI_START bit. */ -/* On ESP32C5, TIMG_RTC_CALI_CLK_SEL can config to 0, 1, 2, 3 - * 0 or 3: calibrate RC_SLOW clock - * 1: calibrate RC_FAST clock - * 2: calibrate 32K clock, which 32k depends on reg_32k_sel: 0: Internal 32 kHz RC oscillator, 1: External 32 kHz XTAL, 2: External 32kHz clock input by lp_pad_gpio0 - */ -#define TIMG_RTC_CALI_CLK_SEL_RC_SLOW 0 -#define TIMG_RTC_CALI_CLK_SEL_RC_FAST 1 -#define TIMG_RTC_CALI_CLK_SEL_32K 2 +#define CLK_CAL_TIMEOUT_THRES(cal_clk, cycles) ((cal_clk == RTC_CAL_RC32K || cal_clk == RTC_CAL_32K_XTAL || cal_clk == RTC_CAL_32K_OSC_SLOW) ? (cycles << 12) : (cycles << 10)) -/** - * @brief Clock calibration function used by rtc_clk_cal - * - * Calibration of RTC_SLOW_CLK is performed using a special feature of TIMG0. - * This feature counts the number of XTAL clock cycles within a given number of - * RTC_SLOW_CLK cycles. - * - * Slow clock calibration feature has two modes of operation: one-off and cycling. - * In cycling mode (which is enabled by default on SoC reset), counting of XTAL - * cycles within RTC_SLOW_CLK cycle is done continuously. Cycling mode is enabled - * using TIMG_RTC_CALI_START_CYCLING bit. In one-off mode counting is performed - * once, and TIMG_RTC_CALI_RDY bit is set when counting is done. One-off mode is - * enabled using TIMG_RTC_CALI_START bit. - * - * @param cal_clk which clock to calibrate - * @param slowclk_cycles number of slow clock cycles to count - * @return number of XTAL clock cycles within the given number of slow clock cycles - */ static uint32_t rtc_clk_cal_internal(rtc_cal_sel_t cal_clk, uint32_t slowclk_cycles) { assert(slowclk_cycles < TIMG_RTC_CALI_MAX_V); - uint32_t cali_clk_sel = 0; - soc_rtc_slow_clk_src_t slow_clk_src = rtc_clk_slow_src_get(); - soc_rtc_slow_clk_src_t old_32k_cal_clk_sel = clk_ll_32k_calibration_get_target(); if (cal_clk == RTC_CAL_RTC_MUX) { - cal_clk = (rtc_cal_sel_t)slow_clk_src; + soc_rtc_slow_clk_src_t slow_clk_src = rtc_clk_slow_src_get(); + if (slow_clk_src == SOC_RTC_SLOW_CLK_SRC_RC_SLOW) { + cal_clk = RTC_CAL_RC_SLOW; + } else if (slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K) { + cal_clk = RTC_CAL_32K_XTAL; + } else if (slow_clk_src == SOC_RTC_SLOW_CLK_SRC_RC32K) { + cal_clk = RTC_CAL_RC32K; + } else if (slow_clk_src == SOC_RTC_SLOW_CLK_SRC_OSC_SLOW) { + cal_clk = RTC_CAL_32K_OSC_SLOW; + } } - // TODO: [ESP32C5] IDF-8642 Seems RC_SLOW, RC_FAST can't be calibrated on beta3 - // if (cal_clk == RTC_CAL_RC_FAST) { - // cali_clk_sel = TIMG_RTC_CALI_CLK_SEL_RC_FAST; - // } else if (cal_clk == RTC_CAL_RC_SLOW) { - // cali_clk_sel = TIMG_RTC_CALI_CLK_SEL_RC_SLOW; - // } else - { - cali_clk_sel = TIMG_RTC_CALI_CLK_SEL_32K; - clk_ll_32k_calibration_set_target((soc_rtc_slow_clk_src_t)cal_clk); + if (cal_clk < 0 || cal_clk >= RTC_CAL_INVALID_CLK) { + ESP_EARLY_LOGE(TAG, "clock not supported to be calibrated"); + return 0; } - /* Enable requested clock (150k clock is always on) */ // All clocks on/off takes time to be stable, so we shouldn't frequently enable/disable the clock // Only enable if originally was disabled, and set back to the disable state after calibration is done @@ -90,16 +58,16 @@ static uint32_t rtc_clk_cal_internal(rtc_cal_sel_t cal_clk, uint32_t slowclk_cyc clk_ll_xtal32k_digi_enable(); } - // bool rc_fast_enabled = clk_ll_rc_fast_is_enabled(); - // bool dig_rc_fast_enabled = clk_ll_rc_fast_digi_is_enabled(); - // if (cal_clk == RTC_CAL_RC_FAST) { - // if (!rc_fast_enabled) { - // rtc_clk_8m_enable(true); - // } - // if (!dig_rc_fast_enabled) { - // rtc_dig_clk8m_enable(); - // } - // } + bool rc_fast_enabled = clk_ll_rc_fast_is_enabled(); + bool dig_rc_fast_enabled = clk_ll_rc_fast_digi_is_enabled(); + if (cal_clk == RTC_CAL_RC_FAST) { + if (!rc_fast_enabled) { + rtc_clk_8m_enable(true); + } + if (!dig_rc_fast_enabled) { + rtc_dig_clk8m_enable(); + } + } bool rc32k_enabled = clk_ll_rc32k_is_enabled(); bool dig_rc32k_enabled = clk_ll_rc32k_digi_is_enabled(); @@ -126,22 +94,22 @@ static uint32_t rtc_clk_cal_internal(rtc_cal_sel_t cal_clk, uint32_t slowclk_cyc } /* Prepare calibration */ - // calibration clock source is set by PCR register: PCR_32K_SEL - // REG_SET_FIELD(TIMG_RTCCALICFG_REG(0), TIMG_RTC_CALI_CLK_SEL, cali_clk_sel); + REG_SET_FIELD(PCR_CTRL_32K_CONF_REG, PCR_32K_SEL, cal_clk); + if (cal_clk == RTC_CAL_RC_FAST) { + clk_ll_rc_fast_tick_conf(); + } CLEAR_PERI_REG_MASK(TIMG_RTCCALICFG_REG(0), TIMG_RTC_CALI_START_CYCLING); REG_SET_FIELD(TIMG_RTCCALICFG_REG(0), TIMG_RTC_CALI_MAX, slowclk_cycles); /* Figure out how long to wait for calibration to finish */ /* Set timeout reg and expect time delay*/ + REG_SET_FIELD(TIMG_RTCCALICFG2_REG(0), TIMG_RTC_CALI_TIMEOUT_THRES, CLK_CAL_TIMEOUT_THRES(cal_clk, slowclk_cycles)); uint32_t expected_freq; - if (cali_clk_sel == TIMG_RTC_CALI_CLK_SEL_32K) { - REG_SET_FIELD(TIMG_RTCCALICFG2_REG(0), TIMG_RTC_CALI_TIMEOUT_THRES, RTC_SLOW_CLK_32K_CAL_TIMEOUT_THRES(slowclk_cycles)); + if (cal_clk == RTC_CAL_RC32K || cal_clk == RTC_CAL_32K_XTAL || cal_clk == RTC_CAL_32K_OSC_SLOW) { expected_freq = SOC_CLK_XTAL32K_FREQ_APPROX; - } else if (cali_clk_sel == TIMG_RTC_CALI_CLK_SEL_RC_FAST) { - REG_SET_FIELD(TIMG_RTCCALICFG2_REG(0), TIMG_RTC_CALI_TIMEOUT_THRES, RTC_FAST_CLK_20M_CAL_TIMEOUT_THRES(slowclk_cycles)); - expected_freq = SOC_CLK_RC_FAST_FREQ_APPROX; + } else if (cal_clk == RTC_CAL_RC_FAST) { + expected_freq = SOC_CLK_RC_FAST_FREQ_APPROX >> CLK_LL_RC_FAST_TICK_DIV_BITS; } else { - REG_SET_FIELD(TIMG_RTCCALICFG2_REG(0), TIMG_RTC_CALI_TIMEOUT_THRES, RTC_SLOW_CLK_150K_CAL_TIMEOUT_THRES(slowclk_cycles)); expected_freq = SOC_CLK_RC_SLOW_FREQ_APPROX; } uint32_t us_time_estimate = (uint32_t) (((uint64_t) slowclk_cycles) * MHZ / expected_freq); @@ -156,12 +124,11 @@ static uint32_t rtc_clk_cal_internal(rtc_cal_sel_t cal_clk, uint32_t slowclk_cyc if (GET_PERI_REG_MASK(TIMG_RTCCALICFG_REG(0), TIMG_RTC_CALI_RDY)) { cal_val = REG_GET_FIELD(TIMG_RTCCALICFG1_REG(0), TIMG_RTC_CALI_VALUE); - // TODO: IDF-8642 Check whether this workaround still need for C5 - // /*The Fosc CLK of calibration circuit is divided by 32. - // So we need to multiply the frequency of the FOSC by 32 times.*/ - // if (cal_clk == RTC_CAL_RC_FAST) { - // cal_val = cal_val >> 5; - // } + /*The Fosc CLK of calibration circuit is divided by a factor, k. + So we need to multiply the frequency of the FOSC by k times.*/ + if (cal_clk == RTC_CAL_RC_FAST) { + cal_val = cal_val >> CLK_LL_RC_FAST_TICK_DIV_BITS; + } break; } if (GET_PERI_REG_MASK(TIMG_RTCCALICFG2_REG(0), TIMG_RTC_CALI_TIMEOUT)) { @@ -176,14 +143,14 @@ static uint32_t rtc_clk_cal_internal(rtc_cal_sel_t cal_clk, uint32_t slowclk_cyc clk_ll_xtal32k_digi_disable(); } - // if (cal_clk == RTC_CAL_RC_FAST) { - // if (!dig_rc_fast_enabled) { - // rtc_dig_clk8m_disable(); - // } - // if (!rc_fast_enabled) { - // rtc_clk_8m_enable(false); - // } - // } + if (cal_clk == RTC_CAL_RC_FAST) { + if (!dig_rc_fast_enabled) { + rtc_dig_clk8m_disable(); + } + if (!rc_fast_enabled) { + rtc_clk_8m_enable(false); + } + } if (cal_clk == RTC_CAL_RC32K) { if (!dig_rc32k_enabled) { @@ -194,11 +161,6 @@ static uint32_t rtc_clk_cal_internal(rtc_cal_sel_t cal_clk, uint32_t slowclk_cyc } } - // Always set back the calibration 32kHz clock selection - if (old_32k_cal_clk_sel != SOC_RTC_SLOW_CLK_SRC_INVALID) { - clk_ll_32k_calibration_set_target(old_32k_cal_clk_sel); - } - return cal_val; } @@ -212,13 +174,13 @@ static bool rtc_clk_cal_32k_valid(uint32_t xtal_freq, uint32_t slowclk_cycles, u uint32_t rtc_clk_cal(rtc_cal_sel_t cal_clk, uint32_t slowclk_cycles) { soc_xtal_freq_t xtal_freq = rtc_clk_xtal_freq_get(); - // TODO: IDF-8642 Check whether this workaround still need for C5 - // /*The Fosc CLK of calibration circuit is divided by 32. - // So we need to divide the calibrate cycles of the FOSC by 32 to - // avoid excessive calibration time.*/ - // if (cal_clk == RTC_CAL_RC_FAST) { - // slowclk_cycles = slowclk_cycles >> 5; - // } + + /*The Fosc CLK of calibration circuit is divided by a factor, k. + So we need to divide the calibrate cycles of the FOSC by k to + avoid excessive calibration time.*/ + if (cal_clk == RTC_CAL_RC_FAST) { + slowclk_cycles = slowclk_cycles >> CLK_LL_RC_FAST_TICK_DIV_BITS; + } uint64_t xtal_cycles = rtc_clk_cal_internal(cal_clk, slowclk_cycles); if (cal_clk == RTC_CAL_32K_XTAL && !rtc_clk_cal_32k_valid((uint32_t)xtal_freq, slowclk_cycles, xtal_cycles)) { @@ -246,8 +208,7 @@ uint64_t rtc_time_slowclk_to_us(uint64_t rtc_cycles, uint32_t period) uint64_t rtc_time_get(void) { - ESP_EARLY_LOGW(TAG, "rtc_timer has not been implemented yet"); - return 0; + return lp_timer_hal_get_cycle_count(); } uint32_t rtc_clk_freq_cal(uint32_t cal_val) diff --git a/components/esp_hw_support/port/esp32c6/rtc_clk_init.c b/components/esp_hw_support/port/esp32c6/rtc_clk_init.c index 70c275a1f967..9ab938f02aeb 100644 --- a/components/esp_hw_support/port/esp32c6/rtc_clk_init.c +++ b/components/esp_hw_support/port/esp32c6/rtc_clk_init.c @@ -84,8 +84,6 @@ void rtc_clk_init(rtc_clk_config_t cfg) SET_PERI_REG_BITS(PMU_HP_MODEM_HP_REGULATOR0_REG, PMU_HP_MODEM_HP_REGULATOR_DBIAS, hp_cali_dbias, PMU_HP_MODEM_HP_REGULATOR_DBIAS_S); SET_PERI_REG_BITS(PMU_HP_SLEEP_LP_REGULATOR0_REG, PMU_HP_SLEEP_LP_REGULATOR_DBIAS, lp_cali_dbias, PMU_HP_SLEEP_LP_REGULATOR_DBIAS_S); - clk_ll_rc_fast_tick_conf(); - soc_xtal_freq_t xtal_freq = cfg.xtal_freq; esp_rom_output_tx_wait_idle(0); rtc_clk_xtal_freq_update(xtal_freq); diff --git a/components/esp_hw_support/port/esp32c6/rtc_time.c b/components/esp_hw_support/port/esp32c6/rtc_time.c index 40b535eefd6a..8e31485e1dff 100644 --- a/components/esp_hw_support/port/esp32c6/rtc_time.c +++ b/components/esp_hw_support/port/esp32c6/rtc_time.c @@ -125,6 +125,9 @@ static uint32_t rtc_clk_cal_internal(rtc_cal_sel_t cal_clk, uint32_t slowclk_cyc /* Prepare calibration */ REG_SET_FIELD(TIMG_RTCCALICFG_REG(0), TIMG_RTC_CALI_CLK_SEL, cali_clk_sel); + if (cali_clk_sel == TIMG_RTC_CALI_CLK_SEL_RC_FAST) { + clk_ll_rc_fast_tick_conf(); + } CLEAR_PERI_REG_MASK(TIMG_RTCCALICFG_REG(0), TIMG_RTC_CALI_START_CYCLING); REG_SET_FIELD(TIMG_RTCCALICFG_REG(0), TIMG_RTC_CALI_MAX, slowclk_cycles); /* Figure out how long to wait for calibration to finish */ @@ -137,6 +140,9 @@ static uint32_t rtc_clk_cal_internal(rtc_cal_sel_t cal_clk, uint32_t slowclk_cyc } else if (cali_clk_sel == TIMG_RTC_CALI_CLK_SEL_RC_FAST) { REG_SET_FIELD(TIMG_RTCCALICFG2_REG(0), TIMG_RTC_CALI_TIMEOUT_THRES, RTC_FAST_CLK_20M_CAL_TIMEOUT_THRES(slowclk_cycles)); expected_freq = SOC_CLK_RC_FAST_FREQ_APPROX; + if (ESP_CHIP_REV_ABOVE(efuse_hal_chip_revision(), 1)) { + expected_freq = expected_freq >> CLK_LL_RC_FAST_TICK_DIV_BITS; + } } else { REG_SET_FIELD(TIMG_RTCCALICFG2_REG(0), TIMG_RTC_CALI_TIMEOUT_THRES, RTC_SLOW_CLK_150K_CAL_TIMEOUT_THRES(slowclk_cycles)); expected_freq = SOC_CLK_RC_SLOW_FREQ_APPROX; @@ -160,7 +166,7 @@ static uint32_t rtc_clk_cal_internal(rtc_cal_sel_t cal_clk, uint32_t slowclk_cyc calibration. */ if (ESP_CHIP_REV_ABOVE(efuse_hal_chip_revision(), 1)) { if (cal_clk == RTC_CAL_RC_FAST) { - cal_val = cal_val >> 5; + cal_val = cal_val >> CLK_LL_RC_FAST_TICK_DIV_BITS; CLEAR_PERI_REG_MASK(PCR_CTRL_TICK_CONF_REG, PCR_TICK_ENABLE); } } @@ -221,7 +227,7 @@ uint32_t rtc_clk_cal(rtc_cal_sel_t cal_clk, uint32_t slowclk_cycles) avoid excessive calibration time.*/ if (ESP_CHIP_REV_ABOVE(efuse_hal_chip_revision(), 1)) { if (cal_clk == RTC_CAL_RC_FAST) { - slowclk_cycles = slowclk_cycles >> 5; + slowclk_cycles = slowclk_cycles >> CLK_LL_RC_FAST_TICK_DIV_BITS; SET_PERI_REG_MASK(PCR_CTRL_TICK_CONF_REG, PCR_TICK_ENABLE); } } diff --git a/components/esp_hw_support/port/esp32h2/rtc_clk_init.c b/components/esp_hw_support/port/esp32h2/rtc_clk_init.c index d456aee76410..fcac148c6a97 100644 --- a/components/esp_hw_support/port/esp32h2/rtc_clk_init.c +++ b/components/esp_hw_support/port/esp32h2/rtc_clk_init.c @@ -52,8 +52,6 @@ void rtc_clk_init(rtc_clk_config_t cfg) SET_PERI_REG_BITS(PMU_HP_ACTIVE_HP_REGULATOR0_REG, PMU_HP_ACTIVE_HP_REGULATOR_DBIAS, hp_cali_dbias, PMU_HP_ACTIVE_HP_REGULATOR_DBIAS_S); SET_PERI_REG_BITS(PMU_HP_SLEEP_LP_REGULATOR0_REG, PMU_HP_SLEEP_LP_REGULATOR_DBIAS, lp_cali_dbias, PMU_HP_SLEEP_LP_REGULATOR_DBIAS_S); - clk_ll_rc_fast_tick_conf(); - soc_xtal_freq_t xtal_freq = cfg.xtal_freq; esp_rom_output_tx_wait_idle(0); rtc_clk_xtal_freq_update(xtal_freq); diff --git a/components/esp_hw_support/port/esp32h2/rtc_time.c b/components/esp_hw_support/port/esp32h2/rtc_time.c index 395be4dc4ab0..7db712d7a618 100644 --- a/components/esp_hw_support/port/esp32h2/rtc_time.c +++ b/components/esp_hw_support/port/esp32h2/rtc_time.c @@ -125,6 +125,9 @@ static uint32_t rtc_clk_cal_internal(rtc_cal_sel_t cal_clk, uint32_t slowclk_cyc /* Prepare calibration */ REG_SET_FIELD(TIMG_RTCCALICFG_REG(0), TIMG_RTC_CALI_CLK_SEL, cali_clk_sel); + if (cali_clk_sel == TIMG_RTC_CALI_CLK_SEL_RC_FAST) { + clk_ll_rc_fast_tick_conf(); + } CLEAR_PERI_REG_MASK(TIMG_RTCCALICFG_REG(0), TIMG_RTC_CALI_START_CYCLING); REG_SET_FIELD(TIMG_RTCCALICFG_REG(0), TIMG_RTC_CALI_MAX, slowclk_cycles); /* Figure out how long to wait for calibration to finish */ @@ -137,6 +140,9 @@ static uint32_t rtc_clk_cal_internal(rtc_cal_sel_t cal_clk, uint32_t slowclk_cyc } else if (cali_clk_sel == TIMG_RTC_CALI_CLK_SEL_RC_FAST) { REG_SET_FIELD(TIMG_RTCCALICFG2_REG(0), TIMG_RTC_CALI_TIMEOUT_THRES, RTC_FAST_CLK_8M_CAL_TIMEOUT_THRES(slowclk_cycles)); expected_freq = SOC_CLK_RC_FAST_FREQ_APPROX; + if (ESP_CHIP_REV_ABOVE(efuse_hal_chip_revision(), 2)) { + expected_freq = expected_freq >> CLK_LL_RC_FAST_TICK_DIV_BITS; + } } else { REG_SET_FIELD(TIMG_RTCCALICFG2_REG(0), TIMG_RTC_CALI_TIMEOUT_THRES, RTC_SLOW_CLK_150K_CAL_TIMEOUT_THRES(slowclk_cycles)); expected_freq = SOC_CLK_RC_SLOW_FREQ_APPROX; @@ -160,7 +166,7 @@ static uint32_t rtc_clk_cal_internal(rtc_cal_sel_t cal_clk, uint32_t slowclk_cyc calibration. */ if (ESP_CHIP_REV_ABOVE(efuse_hal_chip_revision(), 2)) { if (cal_clk == RTC_CAL_RC_FAST) { - cal_val = cal_val >> 5; + cal_val = cal_val >> CLK_LL_RC_FAST_TICK_DIV_BITS; CLEAR_PERI_REG_MASK(PCR_CTRL_TICK_CONF_REG, PCR_TICK_ENABLE); } } @@ -221,7 +227,7 @@ uint32_t rtc_clk_cal(rtc_cal_sel_t cal_clk, uint32_t slowclk_cycles) avoid excessive calibration time.*/ if (ESP_CHIP_REV_ABOVE(efuse_hal_chip_revision(), 2)) { if (cal_clk == RTC_CAL_RC_FAST) { - slowclk_cycles = slowclk_cycles >> 5; + slowclk_cycles = slowclk_cycles >> CLK_LL_RC_FAST_TICK_DIV_BITS; SET_PERI_REG_MASK(PCR_CTRL_TICK_CONF_REG, PCR_TICK_ENABLE); } } diff --git a/components/esp_hw_support/port/esp_clk_tree_common.c b/components/esp_hw_support/port/esp_clk_tree_common.c index 0bc2bfe5319f..cf5a2eece1a3 100644 --- a/components/esp_hw_support/port/esp_clk_tree_common.c +++ b/components/esp_hw_support/port/esp_clk_tree_common.c @@ -41,6 +41,9 @@ static esp_clk_tree_calibrated_freq_t s_calibrated_freq = {}; #define DEFAULT_32K_CLK_CAL_CYCLES 100 /* Number of cycles for RC_FAST calibration */ #define DEFAULT_RC_FAST_CAL_CYCLES 10000 // RC_FAST has a higher frequency, therefore, requires more cycles to get an accurate value + // Usually we calibrate on the divider of the RC_FAST clock, the cal_cycles is divided by + // the divider factor internally in rtc_clk_cal, so the time to spend on calibrating RC_FAST + // is always (10000 / f_rc_fast) /** @@ -187,6 +190,10 @@ uint32_t esp_clk_tree_lp_fast_get_freq_hz(esp_clk_tree_src_freq_precision_t prec #if SOC_CLK_LP_FAST_SUPPORT_LP_PLL case SOC_RTC_FAST_CLK_SRC_LP_PLL: return clk_ll_lp_pll_get_freq_mhz() * MHZ; +#endif +#if SOC_CLK_LP_FAST_SUPPORT_XTAL + case SOC_RTC_FAST_CLK_SRC_XTAL: + return clk_hal_xtal_get_freq_mhz() * MHZ; #endif default: // Invalid clock source diff --git a/components/esp_rom/patches/esp_rom_hp_regi2c_esp32c5.c b/components/esp_rom/patches/esp_rom_hp_regi2c_esp32c5.c index f1de56912786..dedebaee4709 100644 --- a/components/esp_rom/patches/esp_rom_hp_regi2c_esp32c5.c +++ b/components/esp_rom/patches/esp_rom_hp_regi2c_esp32c5.c @@ -7,7 +7,6 @@ #include "esp_attr.h" #include "soc/i2c_ana_mst_reg.h" #include "modem/modem_lpcon_reg.h" -#include "soc/pmu_reg.h" #define REGI2C_BIAS_MST_SEL (BIT(8)) #define REGI2C_BBPLL_MST_SEL (BIT(9)) @@ -77,8 +76,6 @@ static IRAM_ATTR uint8_t regi2c_enable_block(uint8_t block) uint32_t i2c_sel = 0; REG_SET_BIT(MODEM_LPCON_CLK_CONF_REG, MODEM_LPCON_CLK_I2C_MST_EN); - REG_SET_BIT(PMU_RF_PWC_REG, PMU_PERIF_I2C_RSTB); // TODO: IDF-8642 Move to pmu_init() - REG_SET_BIT(PMU_RF_PWC_REG, PMU_XPD_PERIF_I2C); // TODO: IDF-8642 Move to pmu_init() /* Before config I2C register, enable corresponding slave. */ switch (block) { diff --git a/components/esp_system/port/soc/esp32c5/clk.c b/components/esp_system/port/soc/esp32c5/clk.c index 7242255e4d4e..674b92920e5a 100644 --- a/components/esp_system/port/soc/esp32c5/clk.c +++ b/components/esp_system/port/soc/esp32c5/clk.c @@ -30,7 +30,6 @@ #include "esp_private/esp_pmu.h" #include "esp_rom_uart.h" #include "esp_rom_sys.h" -#include "ocode_init.h" /* Number of cycles to wait from the 32k XTAL oscillator to consider it running. * Larger values increase startup delay. Smaller values may cause false positive @@ -44,20 +43,13 @@ static void select_rtc_slow_clk(soc_rtc_slow_clk_src_t rtc_slow_clk_src); static const char *TAG = "clk"; -// TODO: [ESP32C5] IDF-8642 void esp_rtc_init(void) { #if !CONFIG_IDF_ENV_FPGA -#if SOC_PMU_SUPPORTED pmu_init(); -#endif - if (esp_rom_get_reset_reason(0) == RESET_REASON_CHIP_POWER_ON) { - esp_ocode_calib_init(); - } #endif } -// TODO: [ESP32C5] IDF-8642 __attribute__((weak)) void esp_clk_init(void) { #if !CONFIG_IDF_ENV_FPGA @@ -122,7 +114,7 @@ __attribute__((weak)) void esp_clk_init(void) // Re calculate the ccount to make time calculation correct. esp_cpu_set_cycle_count((uint64_t)esp_cpu_get_cycle_count() * new_freq_mhz / old_freq_mhz); - // Set crypto clock (`clk_sec`) to use 160M SPLL clock + // Set crypto clock (`clk_sec`) to use 480M SPLL clock REG_SET_FIELD(PCR_SEC_CONF_REG, PCR_SEC_CLK_SEL, 0x2); } @@ -195,7 +187,8 @@ void rtc_clk_select_rtc_slow_clk(void) */ __attribute__((weak)) void esp_perip_clk_init(void) { - // TODO: [ESP32C5] IDF-8844 +// TODO: [ESP32C5] IDF-8844 +#if SOC_MODEM_CLOCK_SUPPORTED // modem_clock_domain_pmu_state_icg_map_init(); /* During system initialization, the low-power clock source of the modem * (WiFi, BLE or Coexist) follows the configuration of the slow clock source @@ -211,6 +204,7 @@ __attribute__((weak)) void esp_perip_clk_init(void) : (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_OSC_SLOW) ? MODEM_CLOCK_LPCLK_SRC_EXT32K : MODEM_CLOCK_LPCLK_SRC_RC32K); modem_clock_select_lp_clock_source(PERIPH_WIFI_MODULE, modem_lpclk_src, 0); +#endif ESP_EARLY_LOGW(TAG, "esp_perip_clk_init() has not been implemented yet"); #if 0 // TODO: [ESP32C5] IDF-8844 diff --git a/components/esptool_py/Kconfig.projbuild b/components/esptool_py/Kconfig.projbuild index 0351cc16fb3d..49661e1b795a 100644 --- a/components/esptool_py/Kconfig.projbuild +++ b/components/esptool_py/Kconfig.projbuild @@ -3,8 +3,9 @@ menu "Serial flasher config" config ESPTOOLPY_NO_STUB bool "Disable download stub" - default "y" if IDF_ENV_FPGA || IDF_ENV_BRINGUP - default "n" + default y if IDF_ENV_FPGA || IDF_ENV_BRINGUP + default y if IDF_TARGET_ESP32C5 # TODO: IDF-8631 to be removed + default n help The flasher tool sends a precompiled download stub first by default. That stub allows things diff --git a/components/hal/CMakeLists.txt b/components/hal/CMakeLists.txt index 6cc4319dc2ce..0e9e12a6fcf7 100644 --- a/components/hal/CMakeLists.txt +++ b/components/hal/CMakeLists.txt @@ -56,7 +56,7 @@ if(NOT BOOTLOADER_BUILD) endif() endif() - if(CONFIG_SOC_CLK_TREE_SUPPORTED OR CONFIG_IDF_TARGET_ESP32C5) # TODO: IDF-8642 + if(CONFIG_SOC_CLK_TREE_SUPPORTED) list(APPEND srcs "${target}/clk_tree_hal.c") endif() diff --git a/components/hal/esp32c5/clk_tree_hal.c b/components/hal/esp32c5/clk_tree_hal.c index de3b62e9fc90..b7ac7939f237 100644 --- a/components/hal/esp32c5/clk_tree_hal.c +++ b/components/hal/esp32c5/clk_tree_hal.c @@ -17,8 +17,10 @@ uint32_t clk_hal_soc_root_get_freq_mhz(soc_cpu_clk_src_t cpu_clk_src) switch (cpu_clk_src) { case SOC_CPU_CLK_SRC_XTAL: return clk_hal_xtal_get_freq_mhz(); - case SOC_CPU_CLK_SRC_PLL: - return clk_ll_bbpll_get_freq_mhz(); + case SOC_CPU_CLK_SRC_PLL_F160M: + return CLK_LL_PLL_160M_FREQ_MHZ; + case SOC_CPU_CLK_SRC_PLL_F240M: + return CLK_LL_PLL_240M_FREQ_MHZ; case SOC_CPU_CLK_SRC_RC_FAST: return SOC_CLK_RC_FAST_FREQ_APPROX / MHZ; default: @@ -31,16 +33,14 @@ uint32_t clk_hal_soc_root_get_freq_mhz(soc_cpu_clk_src_t cpu_clk_src) uint32_t clk_hal_cpu_get_freq_hz(void) { soc_cpu_clk_src_t source = clk_ll_cpu_get_src(); - uint32_t divider = (source == SOC_CPU_CLK_SRC_PLL) ? clk_ll_cpu_get_hs_divider() : clk_ll_cpu_get_ls_divider(); - + uint32_t divider = clk_ll_cpu_get_divider(); return clk_hal_soc_root_get_freq_mhz(source) * MHZ / divider; } uint32_t clk_hal_ahb_get_freq_hz(void) { soc_cpu_clk_src_t source = clk_ll_cpu_get_src(); - uint32_t divider = (source == SOC_CPU_CLK_SRC_PLL) ? clk_ll_ahb_get_hs_divider() : clk_ll_ahb_get_ls_divider(); - + uint32_t divider = clk_ll_ahb_get_divider(); return clk_hal_soc_root_get_freq_mhz(source) * MHZ / divider; } diff --git a/components/hal/esp32c5/include/hal/clk_tree_ll.h b/components/hal/esp32c5/include/hal/clk_tree_ll.h index f1a9793efeff..08eaa2747e54 100644 --- a/components/hal/esp32c5/include/hal/clk_tree_ll.h +++ b/components/hal/esp32c5/include/hal/clk_tree_ll.h @@ -40,12 +40,8 @@ extern "C" { .dbuf = 1, \ } -/* -Set the frequency division factor of ref_tick -The FOSC of rtc calibration uses the 32 frequency division clock, -So the frequency division factor of ref_tick must be greater than or equal to 32 -*/ -#define REG_FOSC_TICK_NUM 255 // TODO: IDF-8642 No need? Can calibrate on RC_FAST directly? +// Fix default division factor for the RC_FAST clock for calibration to be 32 +#define CLK_LL_RC_FAST_TICK_DIV_BITS 5 /** * @brief XTAL32K_CLK enable modes @@ -289,7 +285,7 @@ static inline __attribute__((always_inline)) uint32_t clk_ll_bbpll_get_freq_mhz( } /** - * @brief Set BBPLL frequency from XTAL source (Digital part) + * @brief Set SPLL frequency from XTAL source (Digital part) * * @param pll_freq_mhz PLL frequency, in MHz */ @@ -301,7 +297,7 @@ static inline __attribute__((always_inline)) void clk_ll_bbpll_set_freq_mhz(uint } /** - * @brief Set BBPLL frequency from XTAL source (Analog part) + * @brief Set SPLL frequency from XTAL source (Analog part) * * @param pll_freq_mhz PLL frequency, in MHz * @param xtal_freq_mhz XTAL frequency, in MHz @@ -313,36 +309,52 @@ static inline __attribute__((always_inline)) void clk_ll_bbpll_set_config(uint32 uint8_t div7_0; uint8_t dr1; uint8_t dr3; - uint8_t dchgp; - uint8_t dbias; - uint8_t dcur; + uint8_t dchgp = 5; + uint8_t dbias = 3; + uint8_t href = 3; + uint8_t lref = 1; /* Configure 480M PLL */ switch (xtal_freq_mhz) { + case SOC_XTAL_FREQ_48M: + div_ref = 1; + div7_0 = 10; + dr1 = 1; + dr3 = 1; + break; case SOC_XTAL_FREQ_40M: + div_ref = 1; + div7_0 = 12; + dr1 = 0; + dr3 = 0; + break; default: - div_ref = 0; - div7_0 = 8; + div_ref = 1; + div7_0 = 12; dr1 = 0; dr3 = 0; - dchgp = 5; - dcur = 3; - dbias = 2; break; } - uint8_t i2c_bbpll_lref = (dchgp << I2C_BBPLL_OC_DCHGP_LSB) | (div_ref); uint8_t i2c_bbpll_div_7_0 = div7_0; - uint8_t i2c_bbpll_dcur = (1 << I2C_BBPLL_OC_DLREF_SEL_LSB ) | (3 << I2C_BBPLL_OC_DHREF_SEL_LSB) | dcur; - REGI2C_WRITE(I2C_BBPLL, I2C_BBPLL_OC_REF_DIV, i2c_bbpll_lref); REGI2C_WRITE(I2C_BBPLL, I2C_BBPLL_OC_DIV_7_0, i2c_bbpll_div_7_0); REGI2C_WRITE_MASK(I2C_BBPLL, I2C_BBPLL_OC_DR1, dr1); REGI2C_WRITE_MASK(I2C_BBPLL, I2C_BBPLL_OC_DR3, dr3); - REGI2C_WRITE(I2C_BBPLL, I2C_BBPLL_OC_DCUR, i2c_bbpll_dcur); + REGI2C_WRITE_MASK(I2C_BBPLL, I2C_BBPLL_OC_DLREF_SEL, lref); + REGI2C_WRITE_MASK(I2C_BBPLL, I2C_BBPLL_OC_DHREF_SEL, href); REGI2C_WRITE_MASK(I2C_BBPLL, I2C_BBPLL_OC_VCO_DBIAS, dbias); } +/** + * @brief To enable the change of soc_clk_sel, cpu_div_num, and ahb_div_num + */ +static inline __attribute__((always_inline)) void clk_ll_bus_update(void) +{ + PCR.bus_clk_update.bus_clock_update = 1; + while (PCR.bus_clk_update.bus_clock_update); +} + /** * @brief Select the clock source for CPU_CLK (SOC Clock Root) * @@ -354,12 +366,15 @@ static inline __attribute__((always_inline)) void clk_ll_cpu_set_src(soc_cpu_clk case SOC_CPU_CLK_SRC_XTAL: PCR.sysclk_conf.soc_clk_sel = 0; break; - case SOC_CPU_CLK_SRC_PLL: + case SOC_CPU_CLK_SRC_RC_FAST: PCR.sysclk_conf.soc_clk_sel = 1; break; - case SOC_CPU_CLK_SRC_RC_FAST: + case SOC_CPU_CLK_SRC_PLL_F160M: PCR.sysclk_conf.soc_clk_sel = 2; break; + case SOC_CPU_CLK_SRC_PLL_F240M: + PCR.sysclk_conf.soc_clk_sel = 3; + break; default: // Unsupported SOC_CLK mux input sel abort(); @@ -378,9 +393,11 @@ static inline __attribute__((always_inline)) soc_cpu_clk_src_t clk_ll_cpu_get_sr case 0: return SOC_CPU_CLK_SRC_XTAL; case 1: - return SOC_CPU_CLK_SRC_PLL; - case 2: return SOC_CPU_CLK_SRC_RC_FAST; + case 2: + return SOC_CPU_CLK_SRC_PLL_F160M; + case 3: + return SOC_CPU_CLK_SRC_PLL_F240M; default: // Invalid SOC_CLK_SEL value return SOC_CPU_CLK_SRC_INVALID; @@ -388,129 +405,47 @@ static inline __attribute__((always_inline)) soc_cpu_clk_src_t clk_ll_cpu_get_sr } /** - * @brief Set CPU_CLK's high-speed divider (valid when SOC_ROOT clock source is PLL) + * @brief Set CPU_CLK's divider * - * @param divider Divider. (PCR_HS_DIV_NUM + 1) * (PCR_CPU_HS_DIV_NUM + 1) = divider. + * @param divider Divider. (PCR_CPU_DIV_NUM + 1) = divider. */ -static inline __attribute__((always_inline)) void clk_ll_cpu_set_hs_divider(uint32_t divider) +static inline __attribute__((always_inline)) void clk_ll_cpu_set_divider(uint32_t divider) { - // SOC_ROOT_CLK ---(1)---> HP_ROOT_CLK ---(2)---> CPU_CLK - // (1) not configurable for the target (HRO register field: PCR_HS_DIV_NUM) - // Fixed at 3 for HS clock source - // Corresponding register field value is PCR_HS_DIV_NUM=2 - // (2) configurable - // HS divider option: 1, 2, 4 (PCR_CPU_HS_DIV_NUM=0, 1, 3) - - HAL_ASSERT(divider == 3 || divider == 4 || divider == 6 || divider == 12); - HAL_FORCE_MODIFY_U32_REG_FIELD(PCR.cpu_freq_conf, cpu_div_num, (divider / 3) - 1); - - // 120MHz CPU freq cannot be achieved through divider, need to set force_120m - // This field is only valid if PCR_CPU_HS_DIV_NUM=0 and PCR_SOC_CLK_SEL=SOC_CPU_CLK_SRC_PLL - // bool force_120m = (divider == 4) ? 1 : 0; - // PCR.cpu_freq_conf.cpu_hs_120m_force = force_120m; + HAL_ASSERT(divider >= 1); + HAL_FORCE_MODIFY_U32_REG_FIELD(PCR.cpu_freq_conf, cpu_div_num, (divider) - 1); } /** - * @brief Set CPU_CLK's low-speed divider (valid when SOC_ROOT clock source is XTAL/RC_FAST) + * @brief Get CPU_CLK's divider * - * @param divider Divider. (PCR_LS_DIV_NUM + 1) * (PCR_CPU_LS_DIV_NUM + 1) = divider. + * @return Divider. Divider = (PCR_CPU_DIV_NUM + 1). */ -static inline __attribute__((always_inline)) void clk_ll_cpu_set_ls_divider(uint32_t divider) +static inline __attribute__((always_inline)) uint32_t clk_ll_cpu_get_divider(void) { - // SOC_ROOT_CLK ---(1)---> HP_ROOT_CLK ---(2)---> CPU_CLK - // (1) not configurable for the target (HRO register field: PCR_LS_DIV_NUM) - // Fixed at 1 for LS clock source - // Corresponding register field value is PCR_LS_DIV_NUM=0 - // (2) configurable - // LS divider option: 1, 2, 4, 8, 16, 32 (PCR_CPU_LS_DIV_NUM=0, 1, 3, 7, 15, 31) - HAL_ASSERT((divider > 0) && ((divider & (divider - 1)) == 0)); - HAL_FORCE_MODIFY_U32_REG_FIELD(PCR.cpu_freq_conf, cpu_div_num, divider - 1); + return HAL_FORCE_READ_U32_REG_FIELD(PCR.cpu_freq_conf, cpu_div_num) + 1; } /** - * @brief Get CPU_CLK's high-speed divider + * @brief Set AHB_CLK's divider * - * @return Divider. Divider = (PCR_HS_DIV_NUM + 1) * (PCR_CPU_HS_DIV_NUM + 1). - */ -static inline __attribute__((always_inline)) uint32_t clk_ll_cpu_get_hs_divider(void) -{ - // uint32_t force_120m = PCR.cpu_freq_conf.cpu_hs_120m_force; - uint32_t cpu_hs_div = HAL_FORCE_READ_U32_REG_FIELD(PCR.cpu_freq_conf, cpu_div_num); - if (cpu_hs_div == 0) { - return 4; - } - uint32_t hp_root_hs_div = HAL_FORCE_READ_U32_REG_FIELD(PCR.sysclk_conf, hs_div_num); - return (hp_root_hs_div + 1) * (cpu_hs_div + 1); -} - -/** - * @brief Get CPU_CLK's low-speed divider + * Constraint: f_ahb <= 48 MHz, f_cpu = n * f_ahb * - * @return Divider. Divider = (PCR_LS_DIV_NUM + 1) * (PCR_CPU_LS_DIV_NUM + 1). + * @param divider Divider. (PCR_AHB_DIV_NUM + 1) = divider. */ -static inline __attribute__((always_inline)) uint32_t clk_ll_cpu_get_ls_divider(void) +static inline __attribute__((always_inline)) void clk_ll_ahb_set_divider(uint32_t divider) { - uint32_t cpu_ls_div = HAL_FORCE_READ_U32_REG_FIELD(PCR.cpu_freq_conf, cpu_div_num); - uint32_t hp_root_ls_div = HAL_FORCE_READ_U32_REG_FIELD(PCR.sysclk_conf, ls_div_num); - return (hp_root_ls_div + 1) * (cpu_ls_div + 1); -} - -/** - * @brief Set AHB_CLK's high-speed divider (valid when SOC_ROOT clock source is PLL) - * - * @param divider Divider. (PCR_HS_DIV_NUM + 1) * (PCR_AHB_HS_DIV_NUM + 1) = divider. - */ -static inline __attribute__((always_inline)) void clk_ll_ahb_set_hs_divider(uint32_t divider) -{ - // SOC_ROOT_CLK ---(1)---> HP_ROOT_CLK ---(2)---> AHB_CLK - // (1) not configurable for the target (HRO register field: PCR_HS_DIV_NUM) - // Fixed at 3 for HS clock source - // Corresponding register field value is PCR_HS_DIV_NUM=2 - // (2) configurable - // HS divider option: 4, 8, 16 (PCR_AHB_HS_DIV_NUM=3, 7, 15) - HAL_ASSERT(divider == 12 || divider == 24 || divider == 48); - HAL_FORCE_MODIFY_U32_REG_FIELD(PCR.ahb_freq_conf, ahb_div_num, (divider / 3) - 1); -} - -/** - * @brief Set AHB_CLK's low-speed divider (valid when SOC_ROOT clock source is XTAL/RC_FAST) - * - * @param divider Divider. (PCR_LS_DIV_NUM + 1) * (PCR_AHB_LS_DIV_NUM + 1) = divider. - */ -static inline __attribute__((always_inline)) void clk_ll_ahb_set_ls_divider(uint32_t divider) -{ - // SOC_ROOT_CLK ---(1)---> HP_ROOT_CLK ---(2)---> AHB_CLK - // (1) not configurable for the target (HRO register field: PCR_LS_DIV_NUM) - // Fixed at 1 for LS clock source - // Corresponding register field value is PCR_LS_DIV_NUM=0 - // (2) configurable - // LS divider option: 1, 2, 4, 8, 16, 32 (PCR_CPU_LS_DIV_NUM=0, 1, 3, 7, 15, 31) - HAL_ASSERT((divider > 0) && ((divider & (divider - 1)) == 0)); + HAL_ASSERT(divider >= 1); HAL_FORCE_MODIFY_U32_REG_FIELD(PCR.ahb_freq_conf, ahb_div_num, divider - 1); } /** - * @brief Get AHB_CLK's high-speed divider + * @brief Get AHB_CLK's divider * - * @return Divider. Divider = (PCR_HS_DIV_NUM + 1) * (PCR_AHB_HS_DIV_NUM + 1). + * @return Divider. Divider = (PCR_AHB_DIV_NUM + 1). */ -static inline __attribute__((always_inline)) uint32_t clk_ll_ahb_get_hs_divider(void) +static inline __attribute__((always_inline)) uint32_t clk_ll_ahb_get_divider(void) { - uint32_t ahb_hs_div = HAL_FORCE_READ_U32_REG_FIELD(PCR.ahb_freq_conf, ahb_div_num); - uint32_t hp_root_hs_div = HAL_FORCE_READ_U32_REG_FIELD(PCR.sysclk_conf, hs_div_num); - return (hp_root_hs_div + 1) * (ahb_hs_div + 1); -} - -/** - * @brief Get AHB_CLK's low-speed divider - * - * @return Divider. Divider = (PCR_LS_DIV_NUM + 1) * (PCR_AHB_LS_DIV_NUM + 1). - */ -static inline __attribute__((always_inline)) uint32_t clk_ll_ahb_get_ls_divider(void) -{ - uint32_t ahb_ls_div = HAL_FORCE_READ_U32_REG_FIELD(PCR.ahb_freq_conf, ahb_div_num); - uint32_t hp_root_ls_div = HAL_FORCE_READ_U32_REG_FIELD(PCR.sysclk_conf, ls_div_num); - return (hp_root_ls_div + 1) * (ahb_ls_div + 1); + return HAL_FORCE_READ_U32_REG_FIELD(PCR.ahb_freq_conf, ahb_div_num) + 1; } /** @@ -536,103 +471,6 @@ static inline __attribute__((always_inline)) uint32_t clk_ll_apb_get_divider(voi return HAL_FORCE_READ_U32_REG_FIELD(PCR.apb_freq_conf, apb_div_num) + 1; } -/** - * @brief Set MSPI_FAST_CLK's high-speed divider (valid when SOC_ROOT clock source is PLL) - * - * @param divider Divider. - */ -static inline __attribute__((always_inline)) void clk_ll_mspi_fast_set_hs_divider(uint32_t divider) -{ - // SOC_ROOT_CLK ------> MSPI_FAST_CLK - // HS divider option: 4, 5, 6 (PCR_MSPI_FAST_HS_DIV_NUM=3, 4, 5) - uint32_t div_num = 0; - switch (divider) { - case 4: - div_num = 3; - break; - case 5: - div_num = 4; - break; - case 6: - div_num = 5; - break; - default: - // Unsupported HS MSPI_FAST divider - abort(); - } - HAL_FORCE_MODIFY_U32_REG_FIELD(PCR.mspi_clk_conf, mspi_fast_div_num, div_num); -} - -/** - * @brief Set MSPI_FAST_CLK's low-speed divider (valid when SOC_ROOT clock source is XTAL/RC_FAST) - * - * @param divider Divider. - */ -static inline __attribute__((always_inline)) void clk_ll_mspi_fast_set_ls_divider(uint32_t divider) -{ - // SOC_ROOT_CLK ------> MSPI_FAST_CLK - // LS divider option: 1, 2, 4 (PCR_MSPI_FAST_LS_DIV_NUM=0, 1, 2) - uint32_t div_num = 0; - switch (divider) { - case 1: - div_num = 0; - break; - case 2: - div_num = 1; - break; - case 4: - div_num = 2; - break; - default: - // Unsupported LS MSPI_FAST divider - abort(); - } - HAL_FORCE_MODIFY_U32_REG_FIELD(PCR.mspi_clk_conf, mspi_fast_div_num, div_num); -} - -/** - * @brief Select the calibration 32kHz clock source for timergroup0 - * - * @param in_sel One of the 32kHz clock sources (RC32K_CLK, XTAL32K_CLK, OSC_SLOW_CLK) - */ -static inline __attribute__((always_inline)) void clk_ll_32k_calibration_set_target(soc_rtc_slow_clk_src_t in_sel) -{ - switch (in_sel) { - case SOC_RTC_SLOW_CLK_SRC_RC32K: - PCR.ctrl_32k_conf.clk_32k_sel = 0; - break; - case SOC_RTC_SLOW_CLK_SRC_XTAL32K: - PCR.ctrl_32k_conf.clk_32k_sel = 1; - break; - case SOC_RTC_SLOW_CLK_SRC_OSC_SLOW: - PCR.ctrl_32k_conf.clk_32k_sel = 2; - break; - default: - // Unsupported 32K_SEL mux input - abort(); - } -} - -/** - * @brief Get the calibration 32kHz clock source for timergroup0 - * - * @return soc_rtc_slow_clk_src_t Currently selected calibration 32kHz clock (one of the 32kHz clocks) - */ -static inline __attribute__((always_inline)) soc_rtc_slow_clk_src_t clk_ll_32k_calibration_get_target(void) -{ - uint32_t clk_sel = PCR.ctrl_32k_conf.clk_32k_sel; - switch (clk_sel) { - case 0: - return SOC_RTC_SLOW_CLK_SRC_RC32K; - case 1: - return SOC_RTC_SLOW_CLK_SRC_XTAL32K; - case 2: - return SOC_RTC_SLOW_CLK_SRC_OSC_SLOW; - default: - return SOC_RTC_SLOW_CLK_SRC_INVALID; - } -} - /** * @brief Select the clock source for RTC_SLOW_CLK * @@ -695,6 +533,9 @@ static inline __attribute__((always_inline)) void clk_ll_rtc_fast_set_src(soc_rt case SOC_RTC_FAST_CLK_SRC_XTAL_D2: LP_CLKRST.lp_clk_conf.fast_clk_sel = 1; break; + case SOC_RTC_FAST_CLK_SRC_XTAL: + LP_CLKRST.lp_clk_conf.fast_clk_sel = 2; + break; default: // Unsupported RTC_FAST_CLK mux input sel abort(); @@ -714,6 +555,8 @@ static inline __attribute__((always_inline)) soc_rtc_fast_clk_src_t clk_ll_rtc_f return SOC_RTC_FAST_CLK_SRC_RC_FAST; case 1: return SOC_RTC_FAST_CLK_SRC_XTAL_D2; + case 2: + return SOC_RTC_FAST_CLK_SRC_XTAL; default: return SOC_RTC_FAST_CLK_SRC_INVALID; } @@ -741,6 +584,14 @@ static inline __attribute__((always_inline)) uint32_t clk_ll_rc_fast_get_divider return 1; } +/** + * @brief Set the frequency division factor of RC_FAST clock + */ +static inline void clk_ll_rc_fast_tick_conf(void) +{ + HAL_FORCE_MODIFY_U32_REG_FIELD(PCR.ctrl_32k_conf, fosc_tick_num, (1 << CLK_LL_RC_FAST_TICK_DIV_BITS) - 1); // divider = 1 << CLK_LL_RC_FAST_TICK_DIV_BITS +} + /** * @brief Set RC_SLOW_CLK divider * @@ -753,49 +604,6 @@ static inline __attribute__((always_inline)) void clk_ll_rc_slow_set_divider(uin } /************************** LP STORAGE REGISTER STORE/LOAD **************************/ -#if CONFIG_IDF_TARGET_ESP32C5_BETA3_VERSION -/** - * @brief Store XTAL_CLK frequency in RTC storage register - * - * Value of RTC_XTAL_FREQ_REG is stored as two copies in lower and upper 16-bit - * halves. These are the routines to work with that representation. - * - * @param xtal_freq_mhz XTAL frequency, in MHz. The frequency must necessarily be even, - * otherwise there will be a conflict with the low bit, which is used to disable logs - * in the ROM code. - */ -static inline __attribute__((always_inline)) void clk_ll_xtal_store_freq_mhz(uint32_t xtal_freq_mhz) -{ - // Read the status of whether disabling logging from ROM code - uint32_t reg = READ_PERI_REG(RTC_XTAL_FREQ_REG) & RTC_DISABLE_ROM_LOG; - // If so, need to write back this setting - if (reg == RTC_DISABLE_ROM_LOG) { - xtal_freq_mhz |= 1; - } - WRITE_PERI_REG(RTC_XTAL_FREQ_REG, (xtal_freq_mhz & UINT16_MAX) | ((xtal_freq_mhz & UINT16_MAX) << 16)); -} - -/** - * @brief Load XTAL_CLK frequency from RTC storage register - * - * Value of RTC_XTAL_FREQ_REG is stored as two copies in lower and upper 16-bit - * halves. These are the routines to work with that representation. - * - * @return XTAL frequency, in MHz. Returns 0 if value in reg is invalid. - */ -static inline __attribute__((always_inline)) uint32_t clk_ll_xtal_load_freq_mhz(void) -{ - // Read from RTC storage register - uint32_t xtal_freq_reg = READ_PERI_REG(RTC_XTAL_FREQ_REG); - if ((xtal_freq_reg & 0xFFFF) == ((xtal_freq_reg >> 16) & 0xFFFF) && - xtal_freq_reg != 0 && xtal_freq_reg != UINT32_MAX) { - return xtal_freq_reg & ~RTC_DISABLE_ROM_LOG & UINT16_MAX; - } - // If the format in reg is invalid - return 0; -} -#endif - /** * @brief Store RTC_SLOW_CLK calibration value in RTC storage register * @@ -821,16 +629,6 @@ static inline __attribute__((always_inline)) uint32_t clk_ll_rtc_slow_load_cal(v return REG_READ(RTC_SLOW_CLK_CAL_REG); } - -/* -Set the frequency division factor of ref_tick -*/ -static inline void clk_ll_rc_fast_tick_conf(void) -{ - PCR.ctrl_32k_conf.fosc_tick_num = REG_FOSC_TICK_NUM; -} - - #ifdef __cplusplus } #endif diff --git a/components/hal/esp32c6/include/hal/clk_tree_ll.h b/components/hal/esp32c6/include/hal/clk_tree_ll.h index 9fe36292ac0f..30aa05e1ada1 100644 --- a/components/hal/esp32c6/include/hal/clk_tree_ll.h +++ b/components/hal/esp32c6/include/hal/clk_tree_ll.h @@ -44,7 +44,8 @@ Set the frequency division factor of ref_tick The FOSC of rtc calibration uses the 32 frequency division clock for ECO1, So the frequency division factor of ref_tick must be greater than or equal to 32 */ -#define REG_FOSC_TICK_NUM 255 +#define CLK_LL_RC_FAST_TICK_DIV_BITS 5 +#define REG_FOSC_TICK_NUM 255 /** * @brief XTAL32K_CLK enable modes @@ -810,7 +811,7 @@ Set the frequency division factor of ref_tick */ static inline void clk_ll_rc_fast_tick_conf(void) { - PCR.ctrl_tick_conf.fosc_tick_num = REG_FOSC_TICK_NUM; + HAL_FORCE_MODIFY_U32_REG_FIELD(PCR.ctrl_tick_conf, fosc_tick_num, REG_FOSC_TICK_NUM); // enable a division of 32 to the fosc clock } diff --git a/components/hal/esp32c61/include/hal/clk_tree_ll.h b/components/hal/esp32c61/include/hal/clk_tree_ll.h index 4ad88dccbbf6..8ed04659a10c 100644 --- a/components/hal/esp32c61/include/hal/clk_tree_ll.h +++ b/components/hal/esp32c61/include/hal/clk_tree_ll.h @@ -808,7 +808,7 @@ Set the frequency division factor of ref_tick */ static inline void clk_ll_rc_fast_tick_conf(void) { - PCR.ctrl_32k_conf.fosc_tick_num = REG_FOSC_TICK_NUM; + HAL_FORCE_MODIFY_U32_REG_FIELD(PCR.ctrl_32k_conf, fosc_tick_num, REG_FOSC_TICK_NUM); // divider = (REG_FOSC_TICK_NUM + 1) = 256 } diff --git a/components/hal/esp32h2/include/hal/clk_tree_ll.h b/components/hal/esp32h2/include/hal/clk_tree_ll.h index f862b5a1286c..f59460772834 100644 --- a/components/hal/esp32h2/include/hal/clk_tree_ll.h +++ b/components/hal/esp32h2/include/hal/clk_tree_ll.h @@ -43,7 +43,8 @@ Set the frequency division factor of ref_tick The FOSC of rtc calibration uses the 32 frequency division clock for ECO2, So the frequency division factor of ref_tick must be greater than or equal to 32 */ -#define REG_FOSC_TICK_NUM 255 +#define CLK_LL_RC_FAST_TICK_DIV_BITS 5 +#define REG_FOSC_TICK_NUM 255 /** * @brief XTAL32K_CLK enable modes @@ -746,7 +747,7 @@ Set the frequency division factor of ref_tick */ static inline void clk_ll_rc_fast_tick_conf(void) { - PCR.ctrl_tick_conf.fosc_tick_num = REG_FOSC_TICK_NUM; + HAL_FORCE_MODIFY_U32_REG_FIELD(PCR.ctrl_tick_conf, fosc_tick_num, REG_FOSC_TICK_NUM); // enable a division of 32 to the fosc clock } /* diff --git a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in index a9d6abc8e664..100ca95028e6 100644 --- a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in @@ -131,6 +131,10 @@ config SOC_SECURE_BOOT_SUPPORTED bool default y +config SOC_PMU_SUPPORTED + bool + default y + config SOC_LP_TIMER_SUPPORTED bool default y @@ -139,6 +143,10 @@ config SOC_LP_PERIPHERALS_SUPPORTED bool default y +config SOC_CLK_TREE_SUPPORTED + bool + default y + config SOC_SPI_FLASH_SUPPORTED bool default y @@ -847,6 +855,14 @@ config SOC_UART_BITRATE_MAX int default 5000000 +config SOC_UART_SUPPORT_PLL_F80M_CLK + bool + default y + +config SOC_UART_SUPPORT_RTC_CLK + bool + default y + config SOC_UART_SUPPORT_XTAL_CLK bool default y @@ -895,6 +911,10 @@ config SOC_PM_SUPPORT_RTC_PERIPH_PD bool default y +config SOC_CLK_RC_FAST_SUPPORT_CALIBRATION + bool + default y + config SOC_MODEM_CLOCK_IS_INDEPENDENT bool default y @@ -911,6 +931,10 @@ config SOC_CLK_RC32K_SUPPORTED bool default y +config SOC_CLK_LP_FAST_SUPPORT_XTAL + bool + default y + config SOC_RCC_IS_INDEPENDENT bool default y diff --git a/components/soc/esp32c5/include/soc/clk_tree_defs.h b/components/soc/esp32c5/include/soc/clk_tree_defs.h index ee7437c0e57b..05cb03e456fc 100644 --- a/components/soc/esp32c5/include/soc/clk_tree_defs.h +++ b/components/soc/esp32c5/include/soc/clk_tree_defs.h @@ -19,7 +19,7 @@ extern "C" { * * The exact frequency of RC_FAST_CLK can be computed in runtime through calibration. * - * 2) External 40/48MHz Crystal Clock: XTAL + * 2) External 48MHz Crystal Clock: XTAL * * 3) Internal 136kHz RC Oscillator: RC_SLOW (may also referred as SOSC in TRM or reg. description) * @@ -45,7 +45,6 @@ extern "C" { * OSC_SLOW_CLK can also be calibrated to get its exact frequency. */ -// TODO: [ESP32C5] IDF-8642 (inherit from C6) /* With the default value of FOSC_DFREQ = 100, RC_FAST clock frequency is 17.5 MHz +/- 7% */ #define SOC_CLK_RC_FAST_FREQ_APPROX 17500000 /*!< Approximate RC_FAST_CLK frequency in Hz */ #define SOC_CLK_RC_SLOW_FREQ_APPROX 136000 /*!< Approximate RC_SLOW_CLK frequency in Hz */ @@ -60,10 +59,10 @@ extern "C" { /** * @brief Root clock */ -typedef enum { // TODO: [ESP32C5] IDF-8642 (inherit from C6) +typedef enum { SOC_ROOT_CLK_INT_RC_FAST, /*!< Internal 17.5MHz RC oscillator */ SOC_ROOT_CLK_INT_RC_SLOW, /*!< Internal 136kHz RC oscillator */ - SOC_ROOT_CLK_EXT_XTAL, /*!< External 40MHz crystal */ + SOC_ROOT_CLK_EXT_XTAL, /*!< External 48MHz crystal */ SOC_ROOT_CLK_EXT_XTAL32K, /*!< External 32kHz crystal */ SOC_ROOT_CLK_INT_RC32K, /*!< Internal 32kHz RC oscillator */ SOC_ROOT_CLK_EXT_OSC_SLOW, /*!< External slow clock signal at pin0 */ @@ -73,12 +72,11 @@ typedef enum { // TODO: [ESP32C5] IDF-8642 (inherit from C6) * @brief CPU_CLK mux inputs, which are the supported clock sources for the CPU_CLK * @note Enum values are matched with the register field values on purpose */ -typedef enum { // TODO: [ESP32C5] IDF-8642 (inherit from C6) +typedef enum { SOC_CPU_CLK_SRC_XTAL = 0, /*!< Select XTAL_CLK as CPU_CLK source */ SOC_CPU_CLK_SRC_RC_FAST = 1, /*!< Select RC_FAST_CLK as CPU_CLK source */ SOC_CPU_CLK_SRC_PLL_F160M = 2, /*!< Select PLL_F160M_CLK as CPU_CLK source (PLL_F160M_CLK is derived from SPLL (480MHz), which is the output of the main crystal oscillator frequency multiplier) */ SOC_CPU_CLK_SRC_PLL_F240M = 3, /*!< Select PLL_F240M_CLK as CPU_CLK source (PLL_F240M_CLK is derived from SPLL (480MHz), which is the output of the main crystal oscillator frequency multiplier) */ - SOC_CPU_CLK_SRC_PLL = SOC_CPU_CLK_SRC_PLL_F240M, // TODO: [IDF-8642] remove this alias SOC_CPU_CLK_SRC_INVALID, /*!< Invalid CPU_CLK source */ } soc_cpu_clk_src_t; @@ -86,7 +84,7 @@ typedef enum { // TODO: [ESP32C5] IDF-8642 (inherit from C6) * @brief RTC_SLOW_CLK mux inputs, which are the supported clock sources for the RTC_SLOW_CLK * @note Enum values are matched with the register field values on purpose */ -typedef enum { // TODO: [ESP32C5] IDF-8642 (inherit from C6) +typedef enum { SOC_RTC_SLOW_CLK_SRC_RC_SLOW = 0, /*!< Select RC_SLOW_CLK as RTC_SLOW_CLK source */ SOC_RTC_SLOW_CLK_SRC_XTAL32K = 1, /*!< Select XTAL32K_CLK as RTC_SLOW_CLK source */ SOC_RTC_SLOW_CLK_SRC_RC32K = 2, /*!< Select RC32K_CLK as RTC_SLOW_CLK source */ @@ -98,7 +96,7 @@ typedef enum { // TODO: [ESP32C5] IDF-8642 (inherit from C6) * @brief RTC_FAST_CLK mux inputs, which are the supported clock sources for the RTC_FAST_CLK * @note Enum values are matched with the register field values on purpose */ -typedef enum { // TODO: [ESP32C5] IDF-8642 (inherit from C6) +typedef enum { SOC_RTC_FAST_CLK_SRC_RC_FAST = 0, /*!< Select RC_FAST_CLK as RTC_FAST_CLK source */ SOC_RTC_FAST_CLK_SRC_XTAL_D2 = 1, /*!< Select XTAL_D2_CLK as RTC_FAST_CLK source */ SOC_RTC_FAST_CLK_SRC_XTAL_DIV = SOC_RTC_FAST_CLK_SRC_XTAL_D2, /*!< Alias name for `SOC_RTC_FAST_CLK_SRC_XTAL_D2` */ @@ -125,7 +123,7 @@ typedef enum { * * @note enum starts from 1, to save 0 for special purpose */ -typedef enum { // TODO: [ESP32C5] IDF-8642 (inherit from C6) +typedef enum { // For CPU domain SOC_MOD_CLK_CPU = 1, /*!< CPU_CLK can be sourced from XTAL, PLL, or RC_FAST by configuring soc_cpu_clk_src_t */ // For RTC domain @@ -138,9 +136,9 @@ typedef enum { // TODO: [ESP32C5] IDF-8642 (inherit from C6) SOC_MOD_CLK_SPLL, /*!< SPLL is from the main XTAL oscillator frequency multipliers, it has a "fixed" frequency of 480MHz */ SOC_MOD_CLK_XTAL32K, /*!< XTAL32K_CLK comes from the external 32kHz crystal, passing a clock gating to the peripherals */ SOC_MOD_CLK_RC_FAST, /*!< RC_FAST_CLK comes from the internal 20MHz rc oscillator, passing a clock gating to the peripherals */ - SOC_MOD_CLK_XTAL, /*!< XTAL_CLK comes from the external 40MHz crystal */ + SOC_MOD_CLK_XTAL, /*!< XTAL_CLK comes from the external 48MHz crystal */ // For LP peripherals - SOC_MOD_CLK_XTAL_D2, /*!< XTAL_D2_CLK comes from the external 40MHz crystal, passing a div of 2 to the LP peripherals */ + SOC_MOD_CLK_XTAL_D2, /*!< XTAL_D2_CLK comes from the external 48MHz crystal, passing a div of 2 to the LP peripherals */ SOC_MOD_CLK_INVALID, /*!< Indication of the end of the available module clock sources */ } soc_module_clk_t; @@ -548,7 +546,7 @@ typedef enum { // TODO: [ESP32C5] IDF-8649 } soc_periph_mspi_clk_src_t; //////////////////////////////////////////////CLOCK OUTPUT/////////////////////////////////////////////////////////// -typedef enum { // TODO: [ESP32C5] IDF-8642 (inherit from C6) +typedef enum { // TODO CLKOUT_SIG_PLL = 1, /*!< PLL_CLK is the output of crystal oscillator frequency multiplier */ CLKOUT_SIG_XTAL = 5, /*!< Main crystal oscillator clock */ CLKOUT_SIG_PLL_F80M = 13, /*!< From PLL, usually be 80MHz */ diff --git a/components/soc/esp32c5/include/soc/pcr_reg.h b/components/soc/esp32c5/include/soc/pcr_reg.h index b8e084f1a742..e9e7316b2a6f 100644 --- a/components/soc/esp32c5/include/soc/pcr_reg.h +++ b/components/soc/esp32c5/include/soc/pcr_reg.h @@ -1902,21 +1902,6 @@ extern "C" { * SYSCLK configuration register */ #define PCR_SYSCLK_CONF_REG (DR_REG_PCR_BASE + 0x110) -/** PCR_LS_DIV_NUM : HRO; bitpos: [7:0]; default: 0; - * clk_hproot is div1 of low-speed clock-source if clck-source is a low-speed - * clock-source such as XTAL/FOSC. - */ -#define PCR_LS_DIV_NUM 0x000000FFU -#define PCR_LS_DIV_NUM_M (PCR_LS_DIV_NUM_V << PCR_LS_DIV_NUM_S) -#define PCR_LS_DIV_NUM_V 0x000000FFU -#define PCR_LS_DIV_NUM_S 0 -/** PCR_HS_DIV_NUM : HRO; bitpos: [15:8]; default: 2; - * clk_hproot is div3 of SPLL if the clock-source is high-speed clock SPLL. - */ -#define PCR_HS_DIV_NUM 0x000000FFU -#define PCR_HS_DIV_NUM_M (PCR_HS_DIV_NUM_V << PCR_HS_DIV_NUM_S) -#define PCR_HS_DIV_NUM_V 0x000000FFU -#define PCR_HS_DIV_NUM_S 8 /** PCR_SOC_CLK_SEL : R/W; bitpos: [17:16]; default: 0; * Configures to select the clock source of HP_ROOT_CLK.\\ * 0 (default): XTAL_CLK\\ diff --git a/components/soc/esp32c5/include/soc/pcr_struct.h b/components/soc/esp32c5/include/soc/pcr_struct.h index db621a0671ed..15acd48aad6e 100644 --- a/components/soc/esp32c5/include/soc/pcr_struct.h +++ b/components/soc/esp32c5/include/soc/pcr_struct.h @@ -1642,15 +1642,7 @@ typedef union { */ typedef union { struct { - /** ls_div_num : HRO; bitpos: [7:0]; default: 0; - * clk_hproot is div1 of low-speed clock-source if clck-source is a low-speed - * clock-source such as XTAL/FOSC. - */ - uint32_t ls_div_num:8; - /** hs_div_num : HRO; bitpos: [15:8]; default: 2; - * clk_hproot is div3 of SPLL if the clock-source is high-speed clock SPLL. - */ - uint32_t hs_div_num:8; + uint32_t reserved_0:16; /** soc_clk_sel : R/W; bitpos: [17:16]; default: 0; * Configures to select the clock source of HP_ROOT_CLK.\\ * 0 (default): XTAL_CLK\\ @@ -1706,7 +1698,7 @@ typedef union { typedef union { struct { /** cpu_div_num : R/W; bitpos: [7:0]; default: 0; - * Set this field to generate clk_cpu driven by clk_hproot. The clk_cpu is + * Set this field to generate clk_cpu derived by clk_hproot. The clk_cpu is * div1(default)/div2/div4 of clk_hproot. This field is only available for low-speed * clock-source such as XTAL/FOSC, and should be used together with PCR_AHB_DIV_NUM. */ @@ -1722,7 +1714,7 @@ typedef union { typedef union { struct { /** ahb_div_num : R/W; bitpos: [7:0]; default: 0; - * Set this field to generate clk_ahb driven by clk_hproot. The clk_ahb is + * Set this field to generate clk_ahb derived by clk_hproot. The clk_ahb is * div1(default)/div2/div4/div8 of clk_hproot. This field is only available for * low-speed clock-source such as XTAL/FOSC, and should be used together with * PCR_CPU_DIV_NUM. @@ -1749,7 +1741,7 @@ typedef union { */ uint32_t apb_decrease_div_num:8; /** apb_div_num : R/W; bitpos: [15:8]; default: 0; - * Set as one within (0,1,3) to generate clk_apb driven by clk_ahb. The clk_apb is + * Set as one within (0,1,3) to generate clk_apb derived by clk_ahb. The clk_apb is * div1(default)/div2/div4 of clk_ahb. */ uint32_t apb_div_num:8; @@ -1764,47 +1756,47 @@ typedef union { typedef union { struct { /** pll_240m_clk_en : R/W; bitpos: [0]; default: 1; - * This field is used to open 240 MHz clock (div2 of SPLL) driven from SPLL. 0: close, + * This field is used to open 240 MHz clock (div2 of SPLL) derived from SPLL. 0: close, * 1: open(default). Only available when high-speed clock-source SPLL is active. */ uint32_t pll_240m_clk_en:1; /** pll_160m_clk_en : R/W; bitpos: [1]; default: 1; - * This field is used to open 160 MHz clock (div3 of SPLL) driven from SPLL. 0: close, + * This field is used to open 160 MHz clock (div3 of SPLL) derived from SPLL. 0: close, * 1: open(default). Only available when high-speed clock-source SPLL is active. */ uint32_t pll_160m_clk_en:1; /** pll_120m_clk_en : R/W; bitpos: [2]; default: 1; - * This field is used to open 120 MHz clock (div4 of SPLL) driven from SPLL. 0: close, + * This field is used to open 120 MHz clock (div4 of SPLL) derived from SPLL. 0: close, * 1: open(default). Only available when high-speed clock-source SPLL is active. */ uint32_t pll_120m_clk_en:1; /** pll_80m_clk_en : R/W; bitpos: [3]; default: 1; - * This field is used to open 80 MHz clock (div6 of SPLL) driven from SPLL. 0: close, + * This field is used to open 80 MHz clock (div6 of SPLL) derived from SPLL. 0: close, * 1: open(default). Only available when high-speed clock-source SPLL is active. */ uint32_t pll_80m_clk_en:1; /** pll_60m_clk_en : R/W; bitpos: [4]; default: 1; - * This field is used to open 60 MHz clock (div8 of SPLL) driven from SPLL. 0: close, + * This field is used to open 60 MHz clock (div8 of SPLL) derived from SPLL. 0: close, * 1: open(default). Only available when high-speed clock-source SPLL is active. */ uint32_t pll_60m_clk_en:1; /** pll_48m_clk_en : R/W; bitpos: [5]; default: 1; - * This field is used to open 48 MHz clock (div10 of SPLL) driven from SPLL. 0: close, + * This field is used to open 48 MHz clock (div10 of SPLL) derived from SPLL. 0: close, * 1: open(default). Only available when high-speed clock-source SPLL is active. */ uint32_t pll_48m_clk_en:1; /** pll_40m_clk_en : R/W; bitpos: [6]; default: 1; - * This field is used to open 40 MHz clock (div12 of SPLL) driven from SPLL. 0: close, + * This field is used to open 40 MHz clock (div12 of SPLL) derived from SPLL. 0: close, * 1: open(default). Only available when high-speed clock-source SPLL is active. */ uint32_t pll_40m_clk_en:1; /** pll_20m_clk_en : R/W; bitpos: [7]; default: 1; - * This field is used to open 20 MHz clock (div24 of SPLL) driven from SPLL. 0: close, + * This field is used to open 20 MHz clock (div24 of SPLL) derived from SPLL. 0: close, * 1: open(default). Only available when high-speed clock-source SPLL is active. */ uint32_t pll_20m_clk_en:1; /** pll_12m_clk_en : R/W; bitpos: [8]; default: 1; - * This field is used to open 12 MHz clock (div40 of SPLL) driven from SPLL. 0: close, + * This field is used to open 12 MHz clock (div40 of SPLL) derived from SPLL. 0: close, * 1: open(default). Only available when high-speed clock-source SPLL is active. */ uint32_t pll_12m_clk_en:1; diff --git a/components/soc/esp32c5/include/soc/soc_caps.h b/components/soc/esp32c5/include/soc/soc_caps.h index 155000b197b9..9870aaeeb765 100644 --- a/components/soc/esp32c5/include/soc/soc_caps.h +++ b/components/soc/esp32c5/include/soc/soc_caps.h @@ -58,14 +58,14 @@ #define SOC_SECURE_BOOT_SUPPORTED 1 // #define SOC_BOD_SUPPORTED 1 // TODO: [ESP32C5] IDF-8647 // #define SOC_APM_SUPPORTED 1 // TODO: [ESP32C5] IDF-8614, IDF-8615 -// #define SOC_PMU_SUPPORTED 1 // TODO: [ESP32C5] IDF-8667 +#define SOC_PMU_SUPPORTED 1 // TODO: [ESP32C5] IDF-8667 // #define SOC_PAU_SUPPORTED 1 // TODO: [ESP32C5] IDF-8638 #define SOC_LP_TIMER_SUPPORTED 1 // #define SOC_LP_AON_SUPPORTED 1 // TODO: [ESP32C5] IDF-8638 #define SOC_LP_PERIPHERALS_SUPPORTED 1 // #define SOC_LP_I2C_SUPPORTED 1 // TODO: [ESP32C5] IDF-8634 // #define SOC_ULP_LP_UART_SUPPORTED 1 // TODO: [ESP32C5] IDF-8633 -// #define SOC_CLK_TREE_SUPPORTED 1 // TODO: [ESP32C5] IDF-8642 +#define SOC_CLK_TREE_SUPPORTED 1 // #define SOC_ASSIST_DEBUG_SUPPORTED 1 // TODO: [ESP32C5] IDF-8663 // #define SOC_WDT_SUPPORTED 1 // TODO: [ESP32C5] IDF-8650 #define SOC_SPI_FLASH_SUPPORTED 1 // TODO: [ESP32C5] IDF-8715 @@ -493,8 +493,8 @@ #define SOC_UART_FIFO_LEN (128) /*!< The UART hardware FIFO length */ #define SOC_LP_UART_FIFO_LEN (16) /*!< The LP UART hardware FIFO length */ #define SOC_UART_BITRATE_MAX (5000000) /*!< Max bit rate supported by UART */ -// #define SOC_UART_SUPPORT_PLL_F80M_CLK (1) /*!< Support PLL_F80M as the clock source */ -// #define SOC_UART_SUPPORT_RTC_CLK (1) /*!< Support RTC clock as the clock source */ // TODO: [ESP32C5] IDF-8642 +#define SOC_UART_SUPPORT_PLL_F80M_CLK (1) /*!< Support PLL_F80M as the clock source */ +#define SOC_UART_SUPPORT_RTC_CLK (1) /*!< Support RTC clock as the clock source */ #define SOC_UART_SUPPORT_XTAL_CLK (1) /*!< Support XTAL clock as the clock source */ #define SOC_UART_SUPPORT_WAKEUP_INT (1) /*!< Support UART wakeup interrupt */ #define SOC_UART_HAS_LP_UART (1) /*!< Support LP UART */ @@ -545,12 +545,13 @@ // #define SOC_PM_PAU_LINK_NUM (4) /*-------------------------- CLOCK SUBSYSTEM CAPS ----------------------------------------*/ -// #define SOC_CLK_RC_FAST_SUPPORT_CALIBRATION (1) // TODO: IDF-8642 +#define SOC_CLK_RC_FAST_SUPPORT_CALIBRATION (1) #define SOC_MODEM_CLOCK_IS_INDEPENDENT (1) #define SOC_CLK_XTAL32K_SUPPORTED (1) /*!< Support to connect an external low frequency crystal */ #define SOC_CLK_OSC_SLOW_SUPPORTED (1) /*!< Support to connect an external oscillator, not a crystal */ #define SOC_CLK_RC32K_SUPPORTED (1) /*!< Support an internal 32kHz RC oscillator */ +#define SOC_CLK_LP_FAST_SUPPORT_XTAL (1) /*!< Support XTAL clock as the LP_FAST clock source */ #define SOC_RCC_IS_INDEPENDENT 1 /*!< Reset and Clock Control is independent, thanks to the PCR registers */ diff --git a/docs/docs_not_updated/esp32c5.txt b/docs/docs_not_updated/esp32c5.txt index bd92346df943..10d49479d1f9 100644 --- a/docs/docs_not_updated/esp32c5.txt +++ b/docs/docs_not_updated/esp32c5.txt @@ -97,7 +97,6 @@ api-reference/peripherals/lcd.rst api-reference/peripherals/ana_cmpr.rst api-reference/peripherals/temp_sensor.rst api-reference/peripherals/spi_features.rst -api-reference/peripherals/clk_tree.rst api-reference/peripherals/spi_flash/spi_flash_concurrency.rst api-reference/peripherals/spi_flash/spi_flash_override_driver.rst api-reference/peripherals/spi_flash/spi_flash_optional_feature.rst diff --git a/docs/en/api-reference/peripherals/clk_tree.rst b/docs/en/api-reference/peripherals/clk_tree.rst index 1b43c0e7c4b6..d54b6bbbcc00 100644 --- a/docs/en/api-reference/peripherals/clk_tree.rst +++ b/docs/en/api-reference/peripherals/clk_tree.rst @@ -7,7 +7,7 @@ Clock Tree {IDF_TARGET_RC_FAST_ADJUSTED_FREQ: default="17.5", esp32="8.5", esp32s2="8.5", esp32h2="8.5"} -{IDF_TARGET_XTAL_FREQ: default="40", esp32="2 ~ 40", esp32c2="40/26", esp32h2="32"} +{IDF_TARGET_XTAL_FREQ: default="40", esp32="2 ~ 40", esp32c2="40/26", esp32h2="32", esp32c5="48"} {IDF_TARGET_RC_SLOW_VAGUE_FREQ: default="136", esp32="150", esp32s2="90"} diff --git a/docs/en/api-reference/peripherals/ledc.rst b/docs/en/api-reference/peripherals/ledc.rst index cce6b155cd53..6595a5aa9c1f 100644 --- a/docs/en/api-reference/peripherals/ledc.rst +++ b/docs/en/api-reference/peripherals/ledc.rst @@ -166,7 +166,7 @@ The source clock can also limit the PWM frequency. The higher the source clock f - ~ 17.5 MHz - Dynamic Frequency Scaling compatible, Light sleep compatible * - XTAL_CLK - - 48/40 MHz + - 48 MHz - Dynamic Frequency Scaling compatible .. only:: esp32c6 diff --git a/docs/zh_CN/api-reference/peripherals/clk_tree.rst b/docs/zh_CN/api-reference/peripherals/clk_tree.rst index 46ab9c20c813..18705f495d46 100644 --- a/docs/zh_CN/api-reference/peripherals/clk_tree.rst +++ b/docs/zh_CN/api-reference/peripherals/clk_tree.rst @@ -7,7 +7,7 @@ {IDF_TARGET_RC_FAST_ADJUSTED_FREQ: default="17.5", esp32="8.5", esp32s2="8.5", esp32h2="8.5"} -{IDF_TARGET_XTAL_FREQ: default="40", esp32="2 ~ 40", esp32c2="40/26", esp32h2="32"} +{IDF_TARGET_XTAL_FREQ: default="40", esp32="2 ~ 40", esp32c2="40/26", esp32h2="32", esp32c5="48"} {IDF_TARGET_RC_SLOW_VAGUE_FREQ: default="136", esp32="150", esp32s2="90"} diff --git a/docs/zh_CN/api-reference/peripherals/ledc.rst b/docs/zh_CN/api-reference/peripherals/ledc.rst index 71dbdd9d365d..5baae074a73e 100644 --- a/docs/zh_CN/api-reference/peripherals/ledc.rst +++ b/docs/zh_CN/api-reference/peripherals/ledc.rst @@ -166,7 +166,7 @@ LED PWM 控制器可在无需 CPU 干预的情况下自动改变占空比,实 - ~ 17.5 MHz - 支持动态调频 (DFS) 功能,支持 Light-sleep 模式 * - XTAL_CLK - - 48/40 MHz + - 48 MHz - 支持动态调频 (DFS) 功能 .. only:: esp32c6 From 7982ece4af9e6ed35be45efb63946b7ede7b8745 Mon Sep 17 00:00:00 2001 From: Jeroen Domburg Date: Thu, 13 Jun 2024 11:34:13 +0800 Subject: [PATCH 24/73] refactor(usb-serial-jtag): usb-serial-jtag driver simplification to fix rom print coexistence --- .../src/usb_serial_jtag.c | 167 ++++++++---------- .../src/usb_serial_jtag_vfs.c | 9 +- 2 files changed, 76 insertions(+), 100 deletions(-) diff --git a/components/esp_driver_usb_serial_jtag/src/usb_serial_jtag.c b/components/esp_driver_usb_serial_jtag/src/usb_serial_jtag.c index f7623139ddc1..b69b82b3afab 100644 --- a/components/esp_driver_usb_serial_jtag/src/usb_serial_jtag.c +++ b/components/esp_driver_usb_serial_jtag/src/usb_serial_jtag.c @@ -19,35 +19,31 @@ #include "esp_check.h" #include "esp_private/periph_ctrl.h" +/* + Note: Before you add a workaround for an issue in this driver, please please try + to figure out the actual root cause first. The USB-serial-JTAG is a simple device, + it shouldn't need anything more than a simple, straightforward driver. +*/ + #if !SOC_RCC_IS_INDEPENDENT #define USJ_RCC_ATOMIC() PERIPH_RCC_ATOMIC() #else #define USJ_RCC_ATOMIC() #endif -typedef enum { - FIFO_IDLE = 0, /*!< Indicates the fifo is in idle state */ - FIFO_BUSY = 1, /*!< Indicates the fifo is in busy state */ -} fifo_status_t; - -// The hardware buffer max size is 64 +// The hardware buffer max size is 64, both for RX and TX. #define USB_SER_JTAG_ENDP_SIZE (64) -#define USB_SER_JTAG_RX_MAX_SIZE (64) +#define USB_SER_JTAG_RX_MAX_SIZE (USB_SER_JTAG_ENDP_SIZE) typedef struct { intr_handle_t intr_handle; /*!< USB-SERIAL-JTAG interrupt handler */ - portMUX_TYPE spinlock; /*!< Spinlock for usb_serial_jtag */ - _Atomic fifo_status_t fifo_status; /*!< Record the status of fifo */ // RX parameters RingbufHandle_t rx_ring_buf; /*!< RX ring buffer handler */ - uint32_t rx_buf_size; /*!< TX buffer size */ - uint8_t rx_data_buf[USB_SER_JTAG_ENDP_SIZE]; /*!< Data buffer to stash FIFO data */ // TX parameters - uint32_t tx_buf_size; /*!< TX buffer size */ RingbufHandle_t tx_ring_buf; /*!< TX ring buffer handler */ - uint8_t tx_data_buf[USB_SER_JTAG_ENDP_SIZE]; /*!< Data buffer to stash TX FIFO data */ + uint8_t tx_stash_buf[USB_SER_JTAG_ENDP_SIZE]; /*!< Data buffer to stash TX FIFO data */ size_t tx_stash_cnt; /*!< Number of stashed TX FIFO bytes */ } usb_serial_jtag_obj_t; @@ -55,13 +51,6 @@ static usb_serial_jtag_obj_t *p_usb_serial_jtag_obj = NULL; static const char* USB_SERIAL_JTAG_TAG = "usb_serial_jtag"; -static size_t usb_serial_jtag_write_and_flush(const uint8_t *buf, uint32_t wr_len) -{ - size_t size = usb_serial_jtag_ll_write_txfifo(buf, wr_len); - usb_serial_jtag_ll_txfifo_flush(); - return size; -} - static void usb_serial_jtag_isr_handler_default(void *arg) { BaseType_t xTaskWoken = 0; @@ -69,77 +58,70 @@ static void usb_serial_jtag_isr_handler_default(void *arg) usbjtag_intr_status = usb_serial_jtag_ll_get_intsts_mask(); if (usbjtag_intr_status & USB_SERIAL_JTAG_INTR_SERIAL_IN_EMPTY) { + //Clear interrupt so we won't be called until the next transfer finishes. + usb_serial_jtag_ll_clr_intsts_mask(USB_SERIAL_JTAG_INTR_SERIAL_IN_EMPTY); + // Interrupt tells us the host picked up the data we sent. // If we have more data, we can put it in the buffer and the host will pick that up next. - // Send data in isr. - // If the hardware fifo is available, write in it. Otherwise, do nothing. + // We expect the TX FIFO to be writable for this. If it's not, somehow someone else + // (ROM print routines?) have snuck in a full buffer before we got here. In that case, + // we simply ignore the interrupt, a new one will come if the buffer is empty again. if (usb_serial_jtag_ll_txfifo_writable() == 1) { - // We disable the interrupt here so that the interrupt won't be triggered if there is no data to send. - + // Retrieve data from either the stash buffer or, if that's empty, from the ring buffer. size_t queued_size; - uint8_t *queued_buff = NULL; - bool is_stashed_data = false; + uint8_t *queued_buf = NULL; if (p_usb_serial_jtag_obj->tx_stash_cnt != 0) { // Send stashed tx bytes before reading bytes from ring buffer - queued_buff = p_usb_serial_jtag_obj->tx_data_buf; + queued_buf = p_usb_serial_jtag_obj->tx_stash_buf; queued_size = p_usb_serial_jtag_obj->tx_stash_cnt; - is_stashed_data = true; } else { // Max 64 data payload size in a single EndPoint - queued_buff = (uint8_t *)xRingbufferReceiveUpToFromISR(p_usb_serial_jtag_obj->tx_ring_buf, &queued_size, USB_SER_JTAG_ENDP_SIZE); + queued_buf = (uint8_t *)xRingbufferReceiveUpToFromISR(p_usb_serial_jtag_obj->tx_ring_buf, &queued_size, USB_SER_JTAG_ENDP_SIZE); } - usb_serial_jtag_ll_clr_intsts_mask(USB_SERIAL_JTAG_INTR_SERIAL_IN_EMPTY); - - if (queued_buff != NULL) { - - // Although tx_queued_bytes may be larger than 0, we may have - // interrupted before xRingbufferSend() was called. - // Copy the queued buffer into the TX FIFO - - // On ringbuffer wrap-around the size can be 0 even though the buffer returned is not NULL - if (queued_size > 0) { - portENTER_CRITICAL_ISR(&p_usb_serial_jtag_obj->spinlock); - atomic_store(&p_usb_serial_jtag_obj->fifo_status, FIFO_BUSY); - uint32_t sent_size = usb_serial_jtag_write_and_flush(queued_buff, queued_size); - portEXIT_CRITICAL_ISR(&p_usb_serial_jtag_obj->spinlock); - - if (sent_size < queued_size) { - // Not all bytes could be sent at once; stash the unwritten bytes in a tx buffer - // stash_size will not larger than USB_SER_JTAG_ENDP_SIZE because queued_size is got from xRingbufferReceiveUpToFromISR - size_t stash_size = queued_size - sent_size; - memcpy(p_usb_serial_jtag_obj->tx_data_buf, &queued_buff[sent_size], stash_size); - p_usb_serial_jtag_obj->tx_stash_cnt = stash_size; - } else { - p_usb_serial_jtag_obj->tx_stash_cnt = 0; - // assert if sent_size is larger than queued_size. - assert(sent_size <= queued_size); - } + if (queued_buf != NULL && queued_size > 0) { + // We have some data to send. Send it. + uint32_t sent_size = usb_serial_jtag_ll_write_txfifo(queued_buf, queued_size); + usb_serial_jtag_ll_txfifo_flush(); + + // Check if we were able to send everything. + if (sent_size < queued_size) { + // Not all bytes could be sent at once; stash the unwritten bytes in a buffer + // This will happen if e.g. the rom output functions manage to sneak a few bytes into the + // TX FIFO before this interrupt triggers. Note stash_size will not larger than + // USB_SER_JTAG_ENDP_SIZE because queued_size is obtained from xRingbufferReceiveUpToFromISR. + size_t stash_size = queued_size - sent_size; + memcpy(p_usb_serial_jtag_obj->tx_stash_buf, &queued_buf[sent_size], stash_size); + p_usb_serial_jtag_obj->tx_stash_cnt = stash_size; + } else { + p_usb_serial_jtag_obj->tx_stash_cnt = 0; } - if (is_stashed_data == false) { - vRingbufferReturnItemFromISR(p_usb_serial_jtag_obj->tx_ring_buf, queued_buff, &xTaskWoken); + // Return the buffer if we got it from the ring buffer. + if (queued_buf != p_usb_serial_jtag_obj->tx_stash_buf) { + vRingbufferReturnItemFromISR(p_usb_serial_jtag_obj->tx_ring_buf, queued_buf, &xTaskWoken); } } else { + // No data to send. // The last transmit may have sent a full EP worth of data. The host will interpret // this as a transaction that hasn't finished yet and keep the data in its internal // buffers rather than releasing it to the program listening on the CDC serial port. // We need to flush again in order to send a 0-byte packet that ends the transaction. usb_serial_jtag_ll_txfifo_flush(); - // Note that since this doesn't re-enable USB_SERIAL_JTAG_INTR_SERIAL_IN_EMPTY, the - // flush will not by itself cause this ISR to be called again. + + // We will also disable the interrupt as for now there's no need to handle the + // TX interrupt again. We'll re-enable this externally if we need data sent. + usb_serial_jtag_ll_disable_intr_mask(USB_SERIAL_JTAG_INTR_SERIAL_IN_EMPTY); } - } else { - atomic_store(&p_usb_serial_jtag_obj->fifo_status, FIFO_IDLE); - usb_serial_jtag_ll_clr_intsts_mask(USB_SERIAL_JTAG_INTR_SERIAL_IN_EMPTY); } } if (usbjtag_intr_status & USB_SERIAL_JTAG_INTR_SERIAL_OUT_RECV_PKT) { - // read rx buffer(max length is 64), and send available data to ringbuffer. - // Ensure the rx buffer size is larger than RX_MAX_SIZE. + // Acknowledge interrupt usb_serial_jtag_ll_clr_intsts_mask(USB_SERIAL_JTAG_INTR_SERIAL_OUT_RECV_PKT); - uint32_t rx_fifo_len = usb_serial_jtag_ll_read_rxfifo(p_usb_serial_jtag_obj->rx_data_buf, USB_SER_JTAG_RX_MAX_SIZE); - xRingbufferSendFromISR(p_usb_serial_jtag_obj->rx_ring_buf, p_usb_serial_jtag_obj->rx_data_buf, rx_fifo_len, &xTaskWoken); + // Read RX FIFO and send available data to ringbuffer. + uint8_t buf[USB_SER_JTAG_RX_MAX_SIZE]; + uint32_t rx_fifo_len = usb_serial_jtag_ll_read_rxfifo(buf, USB_SER_JTAG_RX_MAX_SIZE); + xRingbufferSendFromISR(p_usb_serial_jtag_obj->rx_ring_buf, buf, rx_fifo_len, &xTaskWoken); } if (xTaskWoken == pdTRUE) { @@ -157,15 +139,13 @@ esp_err_t usb_serial_jtag_driver_install(usb_serial_jtag_driver_config_t *usb_se p_usb_serial_jtag_obj = (usb_serial_jtag_obj_t*) heap_caps_calloc(1, sizeof(usb_serial_jtag_obj_t), MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT); if (p_usb_serial_jtag_obj == NULL) { ESP_LOGE(USB_SERIAL_JTAG_TAG, "memory allocate error"); - err = ESP_ERR_NO_MEM; - goto _exit; + // no `goto _exit` here as there's nothing to clean up and that would make the uninstall + // routine unhappy. + return ESP_ERR_NO_MEM; } - p_usb_serial_jtag_obj->rx_buf_size = usb_serial_jtag_config->rx_buffer_size; - p_usb_serial_jtag_obj->tx_buf_size = usb_serial_jtag_config->tx_buffer_size; p_usb_serial_jtag_obj->tx_stash_cnt = 0; - p_usb_serial_jtag_obj->spinlock = (portMUX_TYPE)portMUX_INITIALIZER_UNLOCKED; - p_usb_serial_jtag_obj->rx_ring_buf = xRingbufferCreate(p_usb_serial_jtag_obj->rx_buf_size, RINGBUF_TYPE_BYTEBUF); + p_usb_serial_jtag_obj->rx_ring_buf = xRingbufferCreate(usb_serial_jtag_config->rx_buffer_size, RINGBUF_TYPE_BYTEBUF); if (p_usb_serial_jtag_obj->rx_ring_buf == NULL) { ESP_LOGE(USB_SERIAL_JTAG_TAG, "ringbuffer create error"); err = ESP_ERR_NO_MEM; @@ -183,7 +163,6 @@ esp_err_t usb_serial_jtag_driver_install(usb_serial_jtag_driver_config_t *usb_se USJ_RCC_ATOMIC() { usb_serial_jtag_ll_enable_bus_clock(true); } - atomic_store(&p_usb_serial_jtag_obj->fifo_status, FIFO_IDLE); // Configure PHY #if USB_SERIAL_JTAG_LL_EXT_PHY_SUPPORTED @@ -193,10 +172,14 @@ esp_err_t usb_serial_jtag_driver_install(usb_serial_jtag_driver_config_t *usb_se usb_serial_jtag_ll_phy_set_defaults(); // External PHY not supported. Set default values. #endif // USB_WRAP_LL_EXT_PHY_SUPPORTED - usb_serial_jtag_ll_clr_intsts_mask(USB_SERIAL_JTAG_INTR_SERIAL_IN_EMPTY | - USB_SERIAL_JTAG_INTR_SERIAL_OUT_RECV_PKT); - usb_serial_jtag_ll_ena_intr_mask(USB_SERIAL_JTAG_INTR_SERIAL_IN_EMPTY | - USB_SERIAL_JTAG_INTR_SERIAL_OUT_RECV_PKT); + // Note: DO NOT clear the interrupt status bits here. The output routine needs + // USB_SERIAL_JTAG_INTR_SERIAL_IN_EMPTY set because it needs the ISR to trigger + // as soon as data is sent; the input routine needs the status to retrieve any + // data that is still in the FIFOs. + + // We only enable the RX interrupt; we'll enable the TX one when we actually + // have anything to send. + usb_serial_jtag_ll_ena_intr_mask(USB_SERIAL_JTAG_INTR_SERIAL_OUT_RECV_PKT); err = esp_intr_alloc(ETS_USB_SERIAL_JTAG_INTR_SOURCE, 0, usb_serial_jtag_isr_handler_default, NULL, &p_usb_serial_jtag_obj->intr_handle); if (err != ESP_OK) { @@ -238,37 +221,29 @@ int usb_serial_jtag_write_bytes(const void* src, size_t size, TickType_t ticks_t ESP_RETURN_ON_FALSE(src != NULL, ESP_ERR_INVALID_ARG, USB_SERIAL_JTAG_TAG, "Invalid buffer pointer."); ESP_RETURN_ON_FALSE(p_usb_serial_jtag_obj != NULL, ESP_ERR_INVALID_ARG, USB_SERIAL_JTAG_TAG, "The driver hasn't been initialized"); - size_t sent_data = 0; BaseType_t result = pdTRUE; - const uint8_t *buff = (const uint8_t *)src; - if (p_usb_serial_jtag_obj->fifo_status == FIFO_IDLE) { - portENTER_CRITICAL(&p_usb_serial_jtag_obj->spinlock); - atomic_store(&p_usb_serial_jtag_obj->fifo_status, FIFO_BUSY); - sent_data = usb_serial_jtag_write_and_flush(src, size); - portEXIT_CRITICAL(&p_usb_serial_jtag_obj->spinlock); - } - - // Blocking method, Sending data to ringbuffer, and handle the data in ISR. - if (size - sent_data > 0) { - result = xRingbufferSend(p_usb_serial_jtag_obj->tx_ring_buf, (void*)(buff + sent_data), size - sent_data, ticks_to_wait); - } else { - atomic_store(&p_usb_serial_jtag_obj->fifo_status, FIFO_IDLE); - } + result = xRingbufferSend(p_usb_serial_jtag_obj->tx_ring_buf, (void*)src, size, ticks_to_wait); + // Re-enable the TX interrupt. If this was disabled, this will immediately trigger the ISR + // and send the things we just put in the ringbuffer. usb_serial_jtag_ll_ena_intr_mask(USB_SERIAL_JTAG_INTR_SERIAL_IN_EMPTY); return (result == pdFALSE) ? 0 : size; } +//Note that this is also called when usb_serial_jtag_driver_install errors out and as such should +//work on a half-initialized driver as well. esp_err_t usb_serial_jtag_driver_uninstall(void) { if (p_usb_serial_jtag_obj == NULL) { - ESP_LOGI(USB_SERIAL_JTAG_TAG, "ALREADY NULL"); + ESP_LOGE(USB_SERIAL_JTAG_TAG, "uninstall without install called"); return ESP_OK; } - /* Not disable the module clock and usb_pad_enable here since the USJ stdout might still depends on it. */ - //Disable tx/rx interrupt. + /* Don't disable the module clock and usb_pad_enable here since the USJ stdout might still depends on it. */ + usb_serial_jtag_ll_disable_intr_mask(USB_SERIAL_JTAG_INTR_SERIAL_IN_EMPTY | USB_SERIAL_JTAG_INTR_SERIAL_OUT_RECV_PKT); - esp_intr_free(p_usb_serial_jtag_obj->intr_handle); + if (p_usb_serial_jtag_obj->intr_handle) { + esp_intr_free(p_usb_serial_jtag_obj->intr_handle); + } if (p_usb_serial_jtag_obj->rx_ring_buf) { vRingbufferDelete(p_usb_serial_jtag_obj->rx_ring_buf); diff --git a/components/esp_driver_usb_serial_jtag/src/usb_serial_jtag_vfs.c b/components/esp_driver_usb_serial_jtag/src/usb_serial_jtag_vfs.c index 9446a6d24ed3..ea400bbb65d7 100644 --- a/components/esp_driver_usb_serial_jtag/src/usb_serial_jtag_vfs.c +++ b/components/esp_driver_usb_serial_jtag/src/usb_serial_jtag_vfs.c @@ -121,6 +121,11 @@ static void usb_serial_jtag_tx_char(int fd, int c) do { if (usb_serial_jtag_ll_txfifo_writable()) { usb_serial_jtag_ll_write_txfifo(&cc, 1); + if (c == '\n') { + //Make sure line doesn't linger in fifo + usb_serial_jtag_ll_txfifo_flush(); + } + //update time of last successful tx to now. s_ctx.last_tx_ts = esp_timer_get_time(); break; } @@ -155,10 +160,6 @@ static ssize_t usb_serial_jtag_write(int fd, const void * data, size_t size) } } s_ctx.tx_func(fd, c); - if (c == '\n') { - //Make sure line doesn't linger in fifo - usb_serial_jtag_ll_txfifo_flush(); - } } _lock_release_recursive(&s_ctx.write_lock); return size; From 2bd3eaf288ce6d2880af1dc430dc84edded64378 Mon Sep 17 00:00:00 2001 From: zwl Date: Wed, 26 Jun 2024 17:19:00 +0800 Subject: [PATCH 25/73] feat(bluetooth/controller): Fixed the issue of unresponsiveness when using hci uart mode on ESP32-C6 and ESP32-H2 --- components/bt/controller/lib_esp32c6/esp32c6-bt-lib | 2 +- components/bt/controller/lib_esp32h2/esp32h2-bt-lib | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/components/bt/controller/lib_esp32c6/esp32c6-bt-lib b/components/bt/controller/lib_esp32c6/esp32c6-bt-lib index c2b9d7c8c2ab..ed6c0b4e0ab3 160000 --- a/components/bt/controller/lib_esp32c6/esp32c6-bt-lib +++ b/components/bt/controller/lib_esp32c6/esp32c6-bt-lib @@ -1 +1 @@ -Subproject commit c2b9d7c8c2ab4872ffe4f0501c4753fcbc96ba48 +Subproject commit ed6c0b4e0ab3b8ddce5d8bc65e417b1adcbca5b4 diff --git a/components/bt/controller/lib_esp32h2/esp32h2-bt-lib b/components/bt/controller/lib_esp32h2/esp32h2-bt-lib index c2c9f4161f2e..2d69367e13a9 160000 --- a/components/bt/controller/lib_esp32h2/esp32h2-bt-lib +++ b/components/bt/controller/lib_esp32h2/esp32h2-bt-lib @@ -1 +1 @@ -Subproject commit c2c9f4161f2ed200dbbcec71fbfd26da0241f376 +Subproject commit 2d69367e13a928afb73d1a8c579c0dad98eb9393 From b7b32952ff9b4463cf2ecc7299116903b9610519 Mon Sep 17 00:00:00 2001 From: zwl Date: Wed, 26 Jun 2024 17:19:33 +0800 Subject: [PATCH 26/73] feat(bluetooth/controller): Fixed the issue of unresponsiveness when using hci uart mode on ESP32-C5 --- components/bt/controller/lib_esp32c5/esp32c5-bt-lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32c5/esp32c5-bt-lib b/components/bt/controller/lib_esp32c5/esp32c5-bt-lib index 3996803d35bc..5f428f914114 160000 --- a/components/bt/controller/lib_esp32c5/esp32c5-bt-lib +++ b/components/bt/controller/lib_esp32c5/esp32c5-bt-lib @@ -1 +1 @@ -Subproject commit 3996803d35bcb79283bb7dcff60a11092339a838 +Subproject commit 5f428f914114c88470bf0a785f08840c2b35abca From 5fe080ea5a04b8459c030ce7dab5c3cb4ca79150 Mon Sep 17 00:00:00 2001 From: Armando Date: Wed, 26 Jun 2024 16:05:44 +0800 Subject: [PATCH 27/73] fix(rtc): fixed non-iram rtc code in early stage on p4 leading xip_psram stuck --- components/esp_hw_support/linker.lf | 3 +++ components/esp_system/port/soc/esp32p4/clk.c | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/components/esp_hw_support/linker.lf b/components/esp_hw_support/linker.lf index 0ad8003c5644..00bcae6634ef 100644 --- a/components/esp_hw_support/linker.lf +++ b/components/esp_hw_support/linker.lf @@ -21,6 +21,9 @@ entries: rtc_time (noflash_text) if SOC_PMU_SUPPORTED = y: pmu_sleep (noflash) + if SPIRAM_FLASH_LOAD_TO_PSRAM = y: + pmu_init (noflash) + pmu_param (noflash) if SOC_USB_SERIAL_JTAG_SUPPORTED = y: sleep_console (noflash) if IDF_TARGET_ESP32 = y || IDF_TARGET_ESP32S2 = y: diff --git a/components/esp_system/port/soc/esp32p4/clk.c b/components/esp_system/port/soc/esp32p4/clk.c index 85332e67ae98..49f9737e8efb 100644 --- a/components/esp_system/port/soc/esp32p4/clk.c +++ b/components/esp_system/port/soc/esp32p4/clk.c @@ -41,7 +41,7 @@ static void select_rtc_slow_clk(soc_rtc_slow_clk_src_t rtc_slow_clk_src); static const char *TAG = "clk"; -void esp_rtc_init(void) +void IRAM_ATTR esp_rtc_init(void) { #if SOC_PMU_SUPPORTED pmu_init(); From d6e96182630dfc6eb21eadc118f976cdeaad31b1 Mon Sep 17 00:00:00 2001 From: Armando Date: Wed, 26 Jun 2024 17:00:19 +0800 Subject: [PATCH 28/73] change(mmu): remove SOC_MMU_PAGE_SIZE_CONFIGURABLE --- components/soc/esp32c5/include/soc/soc_caps.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/components/soc/esp32c5/include/soc/soc_caps.h b/components/soc/esp32c5/include/soc/soc_caps.h index 155000b197b9..c9edec6e4268 100644 --- a/components/soc/esp32c5/include/soc/soc_caps.h +++ b/components/soc/esp32c5/include/soc/soc_caps.h @@ -283,8 +283,6 @@ #define SOC_LEDC_FADE_PARAMS_BIT_WIDTH (10) /*-------------------------- MMU CAPS ----------------------------------------*/ -// TODO: [ESP32C5] IDF-8658 -// #define SOC_MMU_PAGE_SIZE_CONFIGURABLE (1) #define SOC_MMU_PERIPH_NUM (1U) #define SOC_MMU_LINEAR_ADDRESS_REGION_NUM (1U) #define SOC_MMU_DI_VADDR_SHARED (1) /*!< D/I vaddr are shared */ From 6e85d744a86f22e43921e2bafc91d1c341c0a4bc Mon Sep 17 00:00:00 2001 From: Sudeep Mohanty Date: Wed, 19 Jun 2024 10:09:40 +0200 Subject: [PATCH 29/73] feat(lp-spi): Added support for LP SPI driver to the LP Core on esp32p4 This commit adds LP SPI master and LP SPI slave support for the LP Core on the esp32p4. --- .../esp32p4/include/soc/Kconfig.soc_caps.in | 12 + .../soc/esp32p4/include/soc/lp_spi_struct.h | 265 +-------------- components/soc/esp32p4/include/soc/soc_caps.h | 5 + components/ulp/CMakeLists.txt | 4 + components/ulp/cmake/CMakeLists.txt | 3 +- components/ulp/lp_core/include/lp_core_spi.h | 109 +++++++ .../lp_core/lp_core/include/ulp_lp_core_spi.h | 65 ++++ components/ulp/lp_core/lp_core/lp_core_spi.c | 262 +++++++++++++++ components/ulp/lp_core/lp_core_spi.c | 306 ++++++++++++++++++ docs/component_info_ignore_file.txt | 1 + docs/doxygen/Doxyfile_esp32p4 | 2 + docs/en/api-reference/system/ulp-lp-core.rst | 9 + .../api-reference/system/ulp-lp-core.rst | 9 + 13 files changed, 799 insertions(+), 253 deletions(-) create mode 100644 components/ulp/lp_core/include/lp_core_spi.h create mode 100644 components/ulp/lp_core/lp_core/include/ulp_lp_core_spi.h create mode 100644 components/ulp/lp_core/lp_core/lp_core_spi.c create mode 100644 components/ulp/lp_core/lp_core_spi.c diff --git a/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in b/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in index 624c2d2c3cb8..162fe6d00776 100644 --- a/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in @@ -243,6 +243,10 @@ config SOC_LP_I2C_SUPPORTED bool default y +config SOC_LP_SPI_SUPPORTED + bool + default y + config SOC_SPIRAM_SUPPORTED bool default y @@ -1279,6 +1283,14 @@ config SOC_SPI_MAX_PRE_DIVIDER int default 16 +config SOC_LP_SPI_PERIPH_NUM + bool + default y + +config SOC_LP_SPI_MAXIMUM_BUFFER_SIZE + int + default 64 + config SOC_SPI_MEM_SUPPORT_AUTO_WAIT_IDLE bool default y diff --git a/components/soc/esp32p4/include/soc/lp_spi_struct.h b/components/soc/esp32p4/include/soc/lp_spi_struct.h index b30c8192e110..8d052bf29713 100644 --- a/components/soc/esp32p4/include/soc/lp_spi_struct.h +++ b/components/soc/esp32p4/include/soc/lp_spi_struct.h @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -116,7 +116,7 @@ typedef union { uint32_t reg_clkdiv_pre:4; uint32_t reserved_22:9; /** reg_clk_equ_sysclk : R/W; bitpos: [31]; default: 1; - * In the master mode 1: spi_clk is eqaul to system 0: spi_clk is divided from system + * In the master mode 1: spi_clk is equal to system 0: spi_clk is divided from system * clock. Can be configured in CONF state. */ uint32_t reg_clk_equ_sysclk:1; @@ -813,244 +813,19 @@ typedef union { } lp_spi_sleep_conf1_reg_t; -/** Group: LP SPI W0 REG */ -/** Type of spi_w0 register - * SPI CPU-controlled buffer0 +/** Group: LP SPI Wn REG */ +/** Type of spi_wn register + * SPI CPU-controlled buffer */ typedef union { struct { - /** reg_buf0 : R/W/SS; bitpos: [31:0]; default: 0; + /** reg_buf : R/W/SS; bitpos: [31:0]; default: 0; * data buffer */ - uint32_t reg_buf0:32; + uint32_t reg_buf:32; }; uint32_t val; -} lp_spi_w0_reg_t; - - -/** Group: LP SPI W1 REG */ -/** Type of spi_w1 register - * SPI CPU-controlled buffer1 - */ -typedef union { - struct { - /** reg_buf1 : R/W/SS; bitpos: [31:0]; default: 0; - * data buffer - */ - uint32_t reg_buf1:32; - }; - uint32_t val; -} lp_spi_w1_reg_t; - - -/** Group: LP SPI W2 REG */ -/** Type of spi_w2 register - * SPI CPU-controlled buffer2 - */ -typedef union { - struct { - /** reg_buf2 : R/W/SS; bitpos: [31:0]; default: 0; - * data buffer - */ - uint32_t reg_buf2:32; - }; - uint32_t val; -} lp_spi_w2_reg_t; - - -/** Group: LP SPI W3 REG */ -/** Type of spi_w3 register - * SPI CPU-controlled buffer3 - */ -typedef union { - struct { - /** reg_buf3 : R/W/SS; bitpos: [31:0]; default: 0; - * data buffer - */ - uint32_t reg_buf3:32; - }; - uint32_t val; -} lp_spi_w3_reg_t; - - -/** Group: LP SPI W4 REG */ -/** Type of spi_w4 register - * SPI CPU-controlled buffer4 - */ -typedef union { - struct { - /** reg_buf4 : R/W/SS; bitpos: [31:0]; default: 0; - * data buffer - */ - uint32_t reg_buf4:32; - }; - uint32_t val; -} lp_spi_w4_reg_t; - - -/** Group: LP SPI W5 REG */ -/** Type of spi_w5 register - * SPI CPU-controlled buffer5 - */ -typedef union { - struct { - /** reg_buf5 : R/W/SS; bitpos: [31:0]; default: 0; - * data buffer - */ - uint32_t reg_buf5:32; - }; - uint32_t val; -} lp_spi_w5_reg_t; - - -/** Group: LP SPI W6 REG */ -/** Type of spi_w6 register - * SPI CPU-controlled buffer6 - */ -typedef union { - struct { - /** reg_buf6 : R/W/SS; bitpos: [31:0]; default: 0; - * data buffer - */ - uint32_t reg_buf6:32; - }; - uint32_t val; -} lp_spi_w6_reg_t; - - -/** Group: LP SPI W7 REG */ -/** Type of spi_w7 register - * SPI CPU-controlled buffer7 - */ -typedef union { - struct { - /** reg_buf7 : R/W/SS; bitpos: [31:0]; default: 0; - * data buffer - */ - uint32_t reg_buf7:32; - }; - uint32_t val; -} lp_spi_w7_reg_t; - - -/** Group: LP SPI W8 REG */ -/** Type of spi_w8 register - * SPI CPU-controlled buffer8 - */ -typedef union { - struct { - /** reg_buf8 : R/W/SS; bitpos: [31:0]; default: 0; - * data buffer - */ - uint32_t reg_buf8:32; - }; - uint32_t val; -} lp_spi_w8_reg_t; - - -/** Group: LP SPI W9 REG */ -/** Type of spi_w9 register - * SPI CPU-controlled buffer9 - */ -typedef union { - struct { - /** reg_buf9 : R/W/SS; bitpos: [31:0]; default: 0; - * data buffer - */ - uint32_t reg_buf9:32; - }; - uint32_t val; -} lp_spi_w9_reg_t; - - -/** Group: LP SPI W10 REG */ -/** Type of spi_w10 register - * SPI CPU-controlled buffer10 - */ -typedef union { - struct { - /** reg_buf10 : R/W/SS; bitpos: [31:0]; default: 0; - * data buffer - */ - uint32_t reg_buf10:32; - }; - uint32_t val; -} lp_spi_w10_reg_t; - - -/** Group: LP SPI W11 REG */ -/** Type of spi_w11 register - * SPI CPU-controlled buffer11 - */ -typedef union { - struct { - /** reg_buf11 : R/W/SS; bitpos: [31:0]; default: 0; - * data buffer - */ - uint32_t reg_buf11:32; - }; - uint32_t val; -} lp_spi_w11_reg_t; - - -/** Group: LP SPI W12 REG */ -/** Type of spi_w12 register - * SPI CPU-controlled buffer12 - */ -typedef union { - struct { - /** reg_buf12 : R/W/SS; bitpos: [31:0]; default: 0; - * data buffer - */ - uint32_t reg_buf12:32; - }; - uint32_t val; -} lp_spi_w12_reg_t; - - -/** Group: LP SPI W13 REG */ -/** Type of spi_w13 register - * SPI CPU-controlled buffer13 - */ -typedef union { - struct { - /** reg_buf13 : R/W/SS; bitpos: [31:0]; default: 0; - * data buffer - */ - uint32_t reg_buf13:32; - }; - uint32_t val; -} lp_spi_w13_reg_t; - - -/** Group: LP SPI W14 REG */ -/** Type of spi_w14 register - * SPI CPU-controlled buffer14 - */ -typedef union { - struct { - /** reg_buf14 : R/W/SS; bitpos: [31:0]; default: 0; - * data buffer - */ - uint32_t reg_buf14:32; - }; - uint32_t val; -} lp_spi_w14_reg_t; - - -/** Group: LP SPI W15 REG */ -/** Type of spi_w15 register - * SPI CPU-controlled buffer15 - */ -typedef union { - struct { - /** reg_buf15 : R/W/SS; bitpos: [31:0]; default: 0; - * data buffer - */ - uint32_t reg_buf15:32; - }; - uint32_t val; -} lp_spi_w15_reg_t; +} lp_spi_wn_reg_t; /** Group: LP SPI SLAVE REG */ @@ -1062,7 +837,7 @@ typedef union { /** reg_clk_mode : R/W; bitpos: [1:0]; default: 0; * SPI clock mode bits. 0: SPI clock is off when CS inactive 1: SPI clock is delayed * one cycle after CS inactive 2: SPI clock is delayed two cycles after CS inactive 3: - * SPI clock is alwasy on. Can be configured in CONF state. + * SPI clock is always on. Can be configured in CONF state. */ uint32_t reg_clk_mode:2; /** reg_clk_mode_13 : R/W; bitpos: [2]; default: 0; @@ -1238,22 +1013,7 @@ typedef struct { volatile lp_spi_sleep_conf1_reg_t spi_sleep_conf1; volatile lp_spi_dma_int_set_reg_t spi_dma_int_set; uint32_t reserved_050[18]; - volatile lp_spi_w0_reg_t spi_w0; - volatile lp_spi_w1_reg_t spi_w1; - volatile lp_spi_w2_reg_t spi_w2; - volatile lp_spi_w3_reg_t spi_w3; - volatile lp_spi_w4_reg_t spi_w4; - volatile lp_spi_w5_reg_t spi_w5; - volatile lp_spi_w6_reg_t spi_w6; - volatile lp_spi_w7_reg_t spi_w7; - volatile lp_spi_w8_reg_t spi_w8; - volatile lp_spi_w9_reg_t spi_w9; - volatile lp_spi_w10_reg_t spi_w10; - volatile lp_spi_w11_reg_t spi_w11; - volatile lp_spi_w12_reg_t spi_w12; - volatile lp_spi_w13_reg_t spi_w13; - volatile lp_spi_w14_reg_t spi_w14; - volatile lp_spi_w15_reg_t spi_w15; + volatile lp_spi_wn_reg_t data_buf[16]; uint32_t reserved_0d8[2]; volatile lp_spi_slave_reg_t spi_slave; volatile lp_spi_slave1_reg_t spi_slave1; @@ -1263,11 +1023,12 @@ typedef struct { volatile lp_rnd_eco_cs_reg_t rnd_eco_cs; volatile lp_rnd_eco_low_reg_t rnd_eco_low; volatile lp_rnd_eco_high_reg_t rnd_eco_high; -} lp_dev_t; +} lp_spi_dev_t; +extern lp_spi_dev_t LP_SPI; #ifndef __cplusplus -_Static_assert(sizeof(lp_dev_t) == 0x100, "Invalid size of lp_dev_t structure"); +_Static_assert(sizeof(lp_spi_dev_t) == 0x100, "Invalid size of lp_dev_t structure"); #endif #ifdef __cplusplus diff --git a/components/soc/esp32p4/include/soc/soc_caps.h b/components/soc/esp32p4/include/soc/soc_caps.h index a9e10dca9b49..8f48eb6d6f1a 100644 --- a/components/soc/esp32p4/include/soc/soc_caps.h +++ b/components/soc/esp32p4/include/soc/soc_caps.h @@ -78,6 +78,7 @@ #define SOC_LP_GPIO_MATRIX_SUPPORTED 1 #define SOC_LP_PERIPHERALS_SUPPORTED 1 #define SOC_LP_I2C_SUPPORTED 1 +#define SOC_LP_SPI_SUPPORTED 1 #define SOC_SPIRAM_SUPPORTED 1 #define SOC_PSRAM_DMA_CAPABLE 1 // #define SOC_ULP_SUPPORTED 1 //TODO: IDF-7534 @@ -504,6 +505,10 @@ #define SOC_MEMSPI_IS_INDEPENDENT 1 #define SOC_SPI_MAX_PRE_DIVIDER 16 +/*-------------------------- LP SPI CAPS ----------------------------------------*/ +#define SOC_LP_SPI_PERIPH_NUM 1 +#define SOC_LP_SPI_MAXIMUM_BUFFER_SIZE 64 + /*-------------------------- SPI MEM CAPS ---------------------------------------*/ #define SOC_SPI_MEM_SUPPORT_AUTO_WAIT_IDLE (1) #define SOC_SPI_MEM_SUPPORT_AUTO_SUSPEND (1) diff --git a/components/ulp/CMakeLists.txt b/components/ulp/CMakeLists.txt index ec5571d9c657..dd159c8a60de 100644 --- a/components/ulp/CMakeLists.txt +++ b/components/ulp/CMakeLists.txt @@ -65,6 +65,10 @@ if(CONFIG_ULP_COPROC_TYPE_LP_CORE) if(CONFIG_SOC_LP_TIMER_SUPPORTED) list(APPEND srcs "lp_core/shared/ulp_lp_core_lp_timer_shared.c") endif() + + if(CONFIG_SOC_LP_SPI_SUPPORTED) + list(APPEND srcs "lp_core/lp_core_spi.c") + endif() endif() idf_component_register(SRCS ${srcs} diff --git a/components/ulp/cmake/CMakeLists.txt b/components/ulp/cmake/CMakeLists.txt index f08c3ab0a0e8..99f10c6bd1ab 100644 --- a/components/ulp/cmake/CMakeLists.txt +++ b/components/ulp/cmake/CMakeLists.txt @@ -114,7 +114,8 @@ elseif(ULP_COCPU_IS_LP_CORE) "${IDF_PATH}/components/ulp/lp_core/lp_core/lp_core_print.c" "${IDF_PATH}/components/ulp/lp_core/lp_core/lp_core_panic.c" "${IDF_PATH}/components/ulp/lp_core/lp_core/lp_core_interrupt.c" - "${IDF_PATH}/components/ulp/lp_core/lp_core/lp_core_i2c.c") + "${IDF_PATH}/components/ulp/lp_core/lp_core/lp_core_i2c.c" + "${IDF_PATH}/components/ulp/lp_core/lp_core/lp_core_spi.c") target_link_options(${ULP_APP_NAME} PRIVATE "-nostartfiles") target_link_options(${ULP_APP_NAME} PRIVATE "-Wl,--no-warn-rwx-segments") diff --git a/components/ulp/lp_core/include/lp_core_spi.h b/components/ulp/lp_core/include/lp_core_spi.h new file mode 100644 index 000000000000..f2f0ea9f0368 --- /dev/null +++ b/components/ulp/lp_core/include/lp_core_spi.h @@ -0,0 +1,109 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief LP SPI peripheral + * Since we have just one LP SPI peripheral, we can define it as a uint32_t type for now, instead of an enum. + */ +typedef uint32_t lp_spi_host_t; + +/** + * @brief LP SPI device configuration flags + */ +#define LP_SPI_DEVICE_TXBIT_LSBFIRST (1<<0) /*!< Transmit command/address/data LSB first instead of the default MSB first */ +#define LP_SPI_DEVICE_RXBIT_LSBFIRST (1<<1) /*!< Receive data LSB first instead of the default MSB first */ +#define LP_SPI_DEVICE_BIT_LSBFIRST (LP_SPI_DEVICE_TXBIT_LSBFIRST|LP_SPI_DEVICE_RXBIT_LSBFIRST) /*!< Transmit and receive LSB first */ +#define LP_SPI_DEVICE_3WIRE (1<<2) /*!< Use MOSI (=spid) for both sending and receiving data */ +#define LP_SPI_DEVICE_CS_ACTIVE_HIGH (1<<3) /*!< Make CS line active-high during a transanction instead of the default active-low state. Only available in SPI master mode. */ +#define LP_SPI_DEVICE_HALF_DUPLEX (1<<4) /*!< Transmit data before receiving it, instead of simultaneously. Only available in SPI master mode. */ + +/** + * @brief LP SPI bus configuration parameters + */ +typedef struct { + int mosi_io_num; /*!< GPIO pin for Master out, Slave In signal, a.k.a, SPI_D. */ + int miso_io_num; /*!< GPIO pin for Master in, Slave Out signal, a.k.a, SPI_Q. */ + int sclk_io_num; /*!< GPIO pin for LP SPI Clock signal. */ +} lp_spi_bus_config_t; + +/** + * @brief LP SPI device configuration parameters + */ +typedef struct { + int cs_io_num; /*!< GPIO pin for the device Chip Select (CS) signal. */ + int clock_speed_hz; /*!< SPI clock speed in Hz. */ + int spi_mode; /*!< SPI mode, representing a pair of Clock Polarity (CPOL) and Clock Phase (CPHA) configuration: + - SPI Mode 0: (0, 0) + - SPI Mode 1: (0, 1) + - SPI Mode 2: (1, 0) + - SPI Mode 3: (1, 1) + */ + int duty_cycle; /*!< Duty cycle of positive SPI clock, in 1/256th increments (128 = 50% duty cycle). Setting this to 0 (=not setting it) is equivalent to setting this to 128. */ + int flags; /*!< Bitwise OR of LP_SPI_DEVICE_* flags */ + int cs_ena_pretrans; /*!< Amount of SPI bit-cycles the CS should be active for, before the transmission (0-16). This only works on half-duplex transactions. */ + int cs_ena_posttrans; /*!< Amount of SPI bit-cycles the CS should stay active for, after the transmission (0-16). This only works on half-duplex transactions. */ +} lp_spi_device_config_t; + +/** + * @brief LP SPI slave configuration parameters + */ +typedef struct { + int cs_io_num; /*!< GPIO pin for the device Chip Select (CS) signal. */ + int spi_mode; /*!< SPI mode, representing a pair of Clock Polarity (CPOL) and Clock Phase (CPHA) configuration: + - SPI Mode 0: (0, 0) + - SPI Mode 1: (0, 1) + - SPI Mode 2: (1, 0) + - SPI Mode 3: (1, 1) + */ + int flags; /*!< Bitwise OR of LP_SPI_DEVICE_* flags */ +} lp_spi_slave_config_t; + +/** + * @brief Initialize the LP SPI bus for use by the LP core + * + * @param host_id LP SPI host number + * @param bus_config LP SPI bus configuration parameters + * + * @return esp_err_t ESP_OK when successful + * ESP_ERR_INVALID_ARG if the configuration is invalid + */ +esp_err_t lp_core_lp_spi_bus_initialize(lp_spi_host_t host_id, const lp_spi_bus_config_t *bus_config); + +/** + * @brief Initialize the LP SPI controller in master mode and add an SPI device to the LP SPI bus. + * + * @param host_id LP SPI host number + * @param dev_config LP SPI device configuration parameters + * + * @return esp_err_t ESP_OK when successful + * ESP_ERR_INVALID_ARG if the configuration is invalid + * ESP_FAIL if the device could not be added + */ +esp_err_t lp_core_lp_spi_bus_add_device(lp_spi_host_t host_id, const lp_spi_device_config_t *dev_config); + +/** + * @brief Initialize the LP SPI controller in slave mode + * + * @param host_id LP SPI host number + * @param slave_config LP SPI slave configuration parameters + * + * @return esp_err_t ESP_OK when successful + * ESP_FAIL if the SPI controller could not be initialized in slave mode + */ +esp_err_t lp_core_lp_spi_slave_initialize(lp_spi_host_t host_id, const lp_spi_slave_config_t *slave_config); + +#ifdef __cplusplus +} +#endif diff --git a/components/ulp/lp_core/lp_core/include/ulp_lp_core_spi.h b/components/ulp/lp_core/lp_core/include/ulp_lp_core_spi.h new file mode 100644 index 000000000000..95b97e132007 --- /dev/null +++ b/components/ulp/lp_core/lp_core/include/ulp_lp_core_spi.h @@ -0,0 +1,65 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "esp_err.h" + +/** + * The LP SPI bus identifier to initiate a transaction on. + */ +typedef uint32_t lp_spi_bus_t; + +/** + * This structure describes one SPI transaction. The descriptor should not be modified until the transaction finishes. + */ +typedef struct { + uint32_t tx_length; /*!< Total data length to transmit in bytes */ + uint32_t rx_length; /*!< Total data length to receive in bytes */ + const void *tx_buffer; /*!< Pointer to the transmit buffer. Must be set for master mode transactions. Can be NULL for slave mode transactions. */ + void *rx_buffer; /*!< Pointer to the receive buffer. Must be set for slave mode transactions. Can be NULL for master mode transactions. */ + lp_spi_bus_t bus; /*!< The LP SPI bus to transmit the data on */ + // The following are only used in master mode transactions + int command; /*!< Command data, of which the length is set in the ``command_bits`` field of this structure. */ + uint32_t address; /*!< Address data, of which the length is set in the ``address_bits`` field of this structure. */ + uint8_t command_bits; /*!< Default amount of bits in command phase */ + uint8_t address_bits; /*!< Default amount of bits in address phase */ + uint8_t dummy_bits; /*!< Amount of dummy bits to insert between address and data phase. */ +} lp_spi_transaction_t; + +/** + * @brief Initiate an LP SPI transaction in master mode to transmit device to an SPI device and optionally receive data + * from the device. + * + * @param trans_desc LP SPI transaction configuration descriptor + * @param ticks_to_wait Operation timeout in CPU cycles. Set to -1 to wait forever. + * + * @return esp_err_t ESP_OK when successful + * ESP_ERR_INVALID_ARG if the configuration is invalid + * ESP_ERR_TIMEOUT when the operation times out + */ +esp_err_t lp_core_lp_spi_master_transfer(lp_spi_transaction_t *trans_desc, int32_t ticks_to_wait); + +/** + * @brief Initiate an LP SPI transaction in slave mode to receive data from an SPI master and optionally transmit data + * back to the master. + * + * @param trans_desc LP SPI transaction configuration descriptor + * @param ticks_to_wait Operation timeout in CPU cycles. Set to -1 to wait forever. + * + * @return esp_err_t ESP_OK when successful + * ESP_ERR_INVALID_ARG if the configuration is invalid + * ESP_ERR_TIMEOUT when the operation times out + */ +esp_err_t lp_core_lp_spi_slave_transfer(lp_spi_transaction_t *trans_desc, int32_t ticks_to_wait); + +#ifdef __cplusplus +} +#endif diff --git a/components/ulp/lp_core/lp_core/lp_core_spi.c b/components/ulp/lp_core/lp_core/lp_core_spi.c new file mode 100644 index 000000000000..9ff1f8a2734b --- /dev/null +++ b/components/ulp/lp_core/lp_core/lp_core_spi.c @@ -0,0 +1,262 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "soc/soc_caps.h" + +#if SOC_LP_SPI_SUPPORTED + +#include +#include +#include "esp_err.h" +#include "ulp_lp_core_spi.h" +#include "soc/lp_spi_struct.h" + +/* Use the register structure to access LP_SPI module registers */ +lp_spi_dev_t *lp_spi_dev = &LP_SPI; + +static inline esp_err_t lp_core_spi_wait_for_interrupt(int32_t ticks_to_wait) +{ + uint32_t to = 0; + while (!lp_spi_dev->spi_dma_int_raw.reg_trans_done_int_raw) { + if (ticks_to_wait > -1) { + /* If the ticks_to_wait value is not -1, keep track of ticks and + * break from the loop once the timeout is reached. + */ + to++; + if (to >= ticks_to_wait) { + /* Clear interrupt bits */ + lp_spi_dev->spi_dma_int_clr.reg_trans_done_int_clr = 1; + return ESP_ERR_TIMEOUT; + } + } + } + + return ESP_OK; +} + +////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////// Public APIs /////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////// + +esp_err_t lp_core_lp_spi_master_transfer(lp_spi_transaction_t *trans_desc, int32_t ticks_to_wait) +{ + esp_err_t ret = ESP_OK; + + /* Argument sanity check + * Note: The Tx buffer is mandatory for this API. + */ + if (trans_desc == NULL || trans_desc->tx_buffer == NULL || trans_desc->tx_length == 0) { + return ESP_ERR_INVALID_ARG; + } + + /* Reset the Tx and Rx FIFOs */ + lp_spi_dev->spi_dma_conf.reg_rx_afifo_rst = 1; + lp_spi_dev->spi_dma_conf.reg_rx_afifo_rst = 0; + lp_spi_dev->spi_dma_conf.reg_buf_afifo_rst = 1; + lp_spi_dev->spi_dma_conf.reg_buf_afifo_rst = 0; + + /* Clear any previous interrupts. + * Note: LP SPI does not have any DMA access but the interrupt bit lives in the DMA interrupt register. + */ + lp_spi_dev->spi_dma_int_clr.reg_trans_done_int_clr = 1; + + /* Make sure that we do not have any ongoing transactions */ + if (lp_spi_dev->spi_cmd.reg_usr) { + return ESP_ERR_INVALID_STATE; + } + + /* Configure dummy bits */ + lp_spi_dev->spi_user.reg_usr_dummy = trans_desc->dummy_bits ? 1 : 0; + if (trans_desc->dummy_bits) { + lp_spi_dev->spi_user1.reg_usr_dummy_cyclelen = trans_desc->dummy_bits - 1; + } + + /* Configure the command and command bit length */ + lp_spi_dev->spi_user.reg_usr_command = trans_desc->command_bits ? 1 : 0; + if (trans_desc->command_bits) { + lp_spi_dev->spi_user2.reg_usr_command_bitlen = trans_desc->command_bits - 1; + lp_spi_dev->spi_user2.reg_usr_command_value = lp_spi_dev->spi_ctrl.reg_wr_bit_order ? trans_desc->command : __builtin_bswap32(trans_desc->command << (32 - trans_desc->command_bits)); + } + + /* Configure the address and address bit length */ + lp_spi_dev->spi_user.reg_usr_addr = trans_desc->address_bits ? 1 : 0; + if (trans_desc->address_bits) { + lp_spi_dev->spi_user1.reg_usr_addr_bitlen = trans_desc->address_bits - 1; + lp_spi_dev->spi_addr.reg_usr_addr_value = lp_spi_dev->spi_ctrl.reg_wr_bit_order ? __builtin_bswap32(trans_desc->address) : trans_desc->address << (32 - trans_desc->address_bits); + } + + /* Set data lines */ + lp_spi_dev->spi_user.reg_usr_mosi = 1; + lp_spi_dev->spi_user.reg_usr_miso = trans_desc->rx_buffer ? 1 : 0; + + /* Configure the transaction bit length */ + int tx_bitlen = trans_desc->tx_length * 8; + lp_spi_dev->spi_ms_dlen.reg_ms_data_bitlen = tx_bitlen - 1; + + /* Prepare the data to be transmitted */ + uint32_t tx_idx = 0; + uint32_t rx_idx = 0; + + /* The TRM suggests that the data is sent from and received in the LP_SPI_W0_REG ~ LP_SPI_W15_REG registers. + * The following rules apply: + * 1. The first 64 bytes are sent from/received in LP_SPI_W0_REG ~ LP_SPI_W15_REG + * 2. Bytes 64 - 255 are repeatedly sent from or received in LP_SPI_W15_REG[31:24] + * 3. Subsequent blocks of 256 bytes of data continue to follow the above rules + * + * This driver, however, avoids using the LP_SPI_W15_REG altogether. In other words, + * this driver sends or receives data in chunks of 60 bytes (LP_SPI_W0_REG ~ LP_SPI_W14_REG) + * and does not handle the repeated use of the high-byte of LP_SPI_W15_REG. This design approach + * has been chosen to simplify the data handling logic. + */ + uint8_t max_data_reg_num = (SOC_LP_SPI_MAXIMUM_BUFFER_SIZE / 4) - 1; // 15 + uint8_t max_data_chunk_size = max_data_reg_num * 4; // 60 + while (tx_idx < trans_desc->tx_length) { + /* Store 4 bytes of data in the data buffer registers serially. */ + lp_spi_dev->data_buf[(tx_idx / 4) & max_data_reg_num].reg_buf = *(uint32_t *)(trans_desc->tx_buffer + tx_idx); + tx_idx += 4; + + /* Begin transmission of the data if we have pushed all the data or if we have reached the maximum data chunk size */ + if ((tx_idx >= trans_desc->tx_length) || (tx_idx % max_data_chunk_size) == 0) { + /* Apply the configuration */ + lp_spi_dev->spi_cmd.reg_update = 1; + while (lp_spi_dev->spi_cmd.reg_update) { + ; + } + + /* Start the transaction */ + lp_spi_dev->spi_cmd.reg_usr = 1; + + /* Wait for the transaction to complete */ + ret = lp_core_spi_wait_for_interrupt(ticks_to_wait); + if (ret != ESP_OK) { + return ret; + } + + /* Clear the transaction done interrupt */ + lp_spi_dev->spi_dma_int_clr.reg_trans_done_int_clr = 1; + + /* Fetch the received data if an Rx buffer is provided */ + if (trans_desc->rx_buffer != NULL) { + while (rx_idx < tx_idx) { + *(uint32_t *)(trans_desc->rx_buffer + rx_idx) = lp_spi_dev->data_buf[(rx_idx / 4) & max_data_reg_num].reg_buf; + rx_idx += 4; + // This loop would exit even if we haven't received all the data. + } + } + } + } + + return ret; +} + +esp_err_t lp_core_lp_spi_slave_transfer(lp_spi_transaction_t *trans_desc, int32_t ticks_to_wait) +{ + esp_err_t ret = ESP_OK; + + /* Argument sanity check + * Note: The Rx buffer is mandatory for this API. + */ + if (trans_desc == NULL || trans_desc->rx_buffer == NULL || trans_desc->rx_length == 0) { + return ESP_ERR_INVALID_ARG; + } + + /* Reset the Tx and Rx FIFOs */ + lp_spi_dev->spi_dma_conf.reg_rx_afifo_rst = 1; + lp_spi_dev->spi_dma_conf.reg_rx_afifo_rst = 0; + lp_spi_dev->spi_dma_conf.reg_buf_afifo_rst = 1; + lp_spi_dev->spi_dma_conf.reg_buf_afifo_rst = 0; + + /* Clear any previous interrupts. + * Note: LP SPI does not have any DMA access but the interrupt bit lives in the DMA interrupt register. + */ + lp_spi_dev->spi_dma_int_clr.reg_trans_done_int_clr = 1; + + /* Set data lines */ + lp_spi_dev->spi_user.reg_usr_mosi = 1; + lp_spi_dev->spi_user.reg_usr_miso = 1; + + /* Configure the transaction bit length */ + int rx_bitlen = trans_desc->rx_length * 8; + lp_spi_dev->spi_ms_dlen.reg_ms_data_bitlen = rx_bitlen - 1; + + /* Prepare the data to be received */ + uint32_t rx_idx = 0; + uint32_t rcvd_bitlen = 0; + uint32_t rcvd_length_in_bytes = 0; + + /* The LP SPI slave receives data in the LP_SPI_W0_REG ~ LP_SPI_W15_REG registers. + * The following rules apply: + * 1. The first 64 bytes are received in LP_SPI_W0_REG ~ LP_SPI_W15_REG + * 2. The next 64 bytes are overwritten in LP_SPI_W0_REG ~ LP_SPI_W15_REG + * + * Since the peripheral has no protection against overwriting the data, we restrict the + * driver to receive up to 64 bytes of data at a time. + */ + uint32_t length_in_bytes = trans_desc->rx_length; + if (trans_desc->rx_length > SOC_LP_SPI_MAXIMUM_BUFFER_SIZE) { + /* Truncate the length to the maximum buffer size */ + length_in_bytes = SOC_LP_SPI_MAXIMUM_BUFFER_SIZE; + } + + while (rx_idx < length_in_bytes) { + /* Wait for the transmission to complete */ + ret = lp_core_spi_wait_for_interrupt(ticks_to_wait); + if (ret != ESP_OK) { + return ret; + } + + /* Fetch the received bit length */ + rcvd_bitlen = lp_spi_dev->spi_slave1.reg_slv_data_bitlen > (trans_desc->rx_length * 8) ? (trans_desc->rx_length * 8) : lp_spi_dev->spi_slave1.reg_slv_data_bitlen; + rcvd_length_in_bytes = (rcvd_bitlen + 7) / 8; + + /* Read the received data */ + while (rx_idx < rcvd_length_in_bytes) { + *(uint32_t *)(trans_desc->rx_buffer + rx_idx) = lp_spi_dev->data_buf[(rx_idx / 4)].reg_buf; + rx_idx += 4; + } + + /* Clear the transaction done interrupt */ + lp_spi_dev->spi_dma_int_clr.reg_trans_done_int_clr = 1; + } + + /* Prepare data for transmission if a Tx buffer is provided */ + if (trans_desc->tx_buffer != NULL) { + uint32_t tx_idx = 0; + uint32_t length_in_bytes = trans_desc->tx_length; + if (length_in_bytes > SOC_LP_SPI_MAXIMUM_BUFFER_SIZE) { + /* Truncate the length to the maximum buffer size */ + length_in_bytes = SOC_LP_SPI_MAXIMUM_BUFFER_SIZE; + } + + while (tx_idx < length_in_bytes) { + /* Store 4 bytes of data in the data buffer registers serially. */ + lp_spi_dev->data_buf[(tx_idx / 4)].reg_buf = *(uint32_t *)(trans_desc->tx_buffer + tx_idx); + tx_idx += 4; + } + + /* Apply the configuration */ + lp_spi_dev->spi_cmd.reg_update = 1; + while (lp_spi_dev->spi_cmd.reg_update) { + ; + } + + /* Start the transaction */ + lp_spi_dev->spi_cmd.reg_usr = 1; + + /* Wait for the transaction to complete */ + ret = lp_core_spi_wait_for_interrupt(ticks_to_wait); + if (ret != ESP_OK) { + return ret; + } + + /* Clear the transaction done interrupt */ + lp_spi_dev->spi_dma_int_clr.reg_trans_done_int_clr = 1; + } + + return ret; +} + +#endif /* SOC_LP_SPI_SUPPORTED */ diff --git a/components/ulp/lp_core/lp_core_spi.c b/components/ulp/lp_core/lp_core_spi.c new file mode 100644 index 000000000000..0def39cc0153 --- /dev/null +++ b/components/ulp/lp_core/lp_core_spi.c @@ -0,0 +1,306 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "esp_check.h" +#include "lp_core_spi.h" +#include "driver/rtc_io.h" +#include "driver/lp_io.h" +#include "hal/rtc_io_types.h" +#include "include/lp_core_spi.h" +#include "soc/lp_spi_struct.h" +#include "soc/lp_gpio_sig_map.h" +#include "soc/lpperi_struct.h" +#include "esp_private/periph_ctrl.h" +#include "esp_private/esp_clk_tree_common.h" +#include "hal/spi_ll.h" + +static const char *LP_SPI_TAG = "lp_spi"; + +/* Use the LP SPI register structure to access peripheral registers */ +lp_spi_dev_t *lp_spi_dev = &LP_SPI; + +static esp_err_t lp_spi_config_io(gpio_num_t pin, rtc_gpio_mode_t direction, uint32_t out_pad_idx, uint32_t in_pad_idx) +{ + esp_err_t ret = ESP_OK; + + /* If pin is -1, then it is not connected to any LP_IO */ + if (pin == -1) { + return ESP_OK; + } + + /* Initialize LP_IO */ + ESP_RETURN_ON_ERROR(rtc_gpio_init(pin), LP_SPI_TAG, "LP IO Init failed for GPIO %d", pin); + + /* Set LP_IO direction */ + ESP_RETURN_ON_ERROR(rtc_gpio_set_direction(pin, direction), LP_SPI_TAG, "LP IO Set direction failed for %d", pin); + + /* Connect the LP SPI signals to the LP_IO Matrix */ + ESP_RETURN_ON_ERROR(lp_gpio_connect_out_signal(pin, out_pad_idx, 0, 0), LP_SPI_TAG, "LP IO Matrix connect out signal failed for %d", pin); + ESP_RETURN_ON_ERROR(lp_gpio_connect_in_signal(pin, in_pad_idx, 0), LP_SPI_TAG, "LP IO Matrix connect in signal failed for %d", pin); + + return ret; +} + +static esp_err_t lp_spi_bus_init_io(const lp_spi_bus_config_t *bus_config) +{ + esp_err_t ret = ESP_OK; + + /* Argument sanity check */ +#if SOC_LP_GPIO_MATRIX_SUPPORTED + /* LP SPI signals can be routed to any LP_IO */ + ESP_RETURN_ON_FALSE((rtc_gpio_is_valid_gpio(bus_config->mosi_io_num)), ESP_FAIL, LP_SPI_TAG, "mosi_io_num error"); + ESP_RETURN_ON_FALSE((bus_config->miso_io_num == -1) || (rtc_gpio_is_valid_gpio(bus_config->miso_io_num)), ESP_FAIL, LP_SPI_TAG, "miso_io_num error"); + ESP_RETURN_ON_FALSE((rtc_gpio_is_valid_gpio(bus_config->sclk_io_num)), ESP_FAIL, LP_SPI_TAG, "sclk_io_num error"); + + /* Configure miso pin*/ + ret = lp_spi_config_io(bus_config->miso_io_num, RTC_GPIO_MODE_INPUT_OUTPUT, LP_SPI_Q_PAD_OUT_IDX, LP_SPI_Q_PAD_IN_IDX); + /* Configure mosi pin */ + ret = lp_spi_config_io(bus_config->mosi_io_num, RTC_GPIO_MODE_INPUT_OUTPUT, LP_SPI_D_PAD_OUT_IDX, LP_SPI_D_PAD_IN_IDX); + /* Configure sclk pin */ + ret = lp_spi_config_io(bus_config->sclk_io_num, RTC_GPIO_MODE_INPUT_OUTPUT, LP_SPI_CK_PAD_OUT_IDX, LP_SPI_CK_PAD_IN_IDX); +#else +#error "LP SPI bus initialization is not supported without LP GPIO Matrix." +#endif /* SOC_LP_GPIO_MATRIX_SUPPORTED */ + + return ret; +} + +static esp_err_t lp_spi_cs_pin_init(int cs_io_num) +{ + esp_err_t ret = ESP_OK; + +#if SOC_LP_GPIO_MATRIX_SUPPORTED + /* CS signal can be routed to any LP_IO */ + ESP_RETURN_ON_FALSE((rtc_gpio_is_valid_gpio(cs_io_num)), ESP_FAIL, LP_SPI_TAG, "cs_io_num error"); + + /* Configure CS pin */ + ret = lp_spi_config_io(cs_io_num, RTC_GPIO_MODE_INPUT_OUTPUT, LP_SPI_CS_PAD_OUT_IDX, LP_SPI_CS_PAD_IN_IDX); +#else +#error "LP SPI device Chip Select (CS) initialization is not supported without LP GPIO Matrix." +#endif /* SOC_LP_GPIO_MATRIX_SUPPORTED */ + + return ret; +} + +static void lp_spi_enable_clock_gate(void) +{ + lpperi_dev_t *lp_peri_dev = &LPPERI; + PERIPH_RCC_ATOMIC() { + (void)__DECLARE_RCC_ATOMIC_ENV; // Avoid warnings for unused variable __DECLARE_RCC_ATOMIC_ENV + lp_peri_dev->clk_en.ck_en_lp_spi = 1; + } +} + +static esp_err_t lp_spi_clock_init(const lp_spi_device_config_t *dev_config) +{ + esp_err_t ret = ESP_OK; + + /* Max requested clock frequency cannot be more than the LP_FAST_CLK frequency */ + uint32_t max_clock_source_hz = esp_clk_tree_lp_fast_get_freq_hz(ESP_CLK_TREE_SRC_FREQ_PRECISION_APPROX); + ESP_RETURN_ON_FALSE(dev_config->clock_speed_hz <= max_clock_source_hz, ESP_ERR_INVALID_ARG, LP_SPI_TAG, "Invalid clock speed for SPI device. Max allowed = %ld Hz", max_clock_source_hz); + + /* Set the duty cycle. If not specified, use 50% */ + int duty_cycle = dev_config->duty_cycle ? dev_config->duty_cycle : 128; + + /* Calculate the clock pre-div values. We use the HP SPI LL function here for the calculation. */ + spi_ll_clock_val_t spi_clock; + spi_ll_master_cal_clock(max_clock_source_hz, dev_config->clock_speed_hz, duty_cycle, &spi_clock); + lp_spi_dev->spi_clock.val = spi_clock; + + return ret; +} + +static void lp_spi_master_init(void) +{ + /* Initialize the LP SPI in master mode. + * (We do not have a HAL/LL layer for LP SPI, yet, so let's use the LP SPI registers directly). + */ + + /* Clear Slave mode to enable Master mode */ + lp_spi_dev->spi_slave.reg_slave_mode = 0; + lp_spi_dev->spi_slave.reg_clk_mode = 0; + + /* Reset CS timing */ + lp_spi_dev->spi_user1.reg_cs_setup_time = 0; + lp_spi_dev->spi_user1.reg_cs_hold_time = 0; + + /* Use all 64 bytes of the Tx/Rx buffers in CPU controlled transfer */ + lp_spi_dev->spi_user.reg_usr_mosi_highpart = 0; + lp_spi_dev->spi_user.reg_usr_miso_highpart = 0; +} + +static void lp_spi_slave_init(void) +{ + /* Set Slave mode */ + lp_spi_dev->spi_slave.reg_slave_mode = 1; + + /* Reset the SPI peripheral */ + lp_spi_dev->spi_slave.reg_soft_reset = 1; + lp_spi_dev->spi_slave.reg_soft_reset = 0; + + /* Configure slave */ + lp_spi_dev->spi_clock.val = 0; + lp_spi_dev->spi_user.val = 0; + lp_spi_dev->spi_ctrl.val = 0; + lp_spi_dev->spi_user.reg_doutdin = 1; //we only support full duplex + lp_spi_dev->spi_user.reg_sio = 0; + + /* Use all 64 bytes of the Tx/Rx buffers in CPU controlled transfer */ + lp_spi_dev->spi_user.reg_usr_miso_highpart = 0; + lp_spi_dev->spi_user.reg_usr_mosi_highpart = 0; +} + +static void lp_spi_master_setup_device(const lp_spi_device_config_t *dev_config) +{ + /* Configure transmission bit order */ + lp_spi_dev->spi_ctrl.reg_rd_bit_order = dev_config->flags & LP_SPI_DEVICE_RXBIT_LSBFIRST ? 1 : 0; + lp_spi_dev->spi_ctrl.reg_wr_bit_order = dev_config->flags & LP_SPI_DEVICE_TXBIT_LSBFIRST ? 1 : 0; + + /* Configure SPI mode in master mode */ + if (dev_config->spi_mode == 0) { + lp_spi_dev->spi_misc.reg_ck_idle_edge = 0; + lp_spi_dev->spi_user.reg_ck_out_edge = 0; + } else if (dev_config->spi_mode == 1) { + lp_spi_dev->spi_misc.reg_ck_idle_edge = 0; + lp_spi_dev->spi_user.reg_ck_out_edge = 1; + } else if (dev_config->spi_mode == 2) { + lp_spi_dev->spi_misc.reg_ck_idle_edge = 1; + lp_spi_dev->spi_user.reg_ck_out_edge = 1; + } else if (dev_config->spi_mode == 3) { + lp_spi_dev->spi_misc.reg_ck_idle_edge = 1; + lp_spi_dev->spi_user.reg_ck_out_edge = 0; + } + + /* Configure the polarity of the CS line */ + lp_spi_dev->spi_misc.reg_master_cs_pol = dev_config->flags & LP_SPI_DEVICE_CS_ACTIVE_HIGH ? 1 : 0; + + /* Configure half-duplex (0) or full-duplex (1) mode for LP SPI master */ + lp_spi_dev->spi_user.reg_doutdin = dev_config->flags & LP_SPI_DEVICE_HALF_DUPLEX ? 0 : 1; + + /* Configure 3-Wire half-duplex mode */ + lp_spi_dev->spi_user.reg_sio = dev_config->flags & LP_SPI_DEVICE_3WIRE ? 1 : 0; + + /* Configure CS setup and hold times */ + lp_spi_dev->spi_user1.reg_cs_setup_time = dev_config->cs_ena_pretrans == 0 ? 0 : dev_config->cs_ena_pretrans - 1; + lp_spi_dev->spi_user.reg_cs_setup = dev_config->cs_ena_pretrans ? 1 : 0; + lp_spi_dev->spi_user1.reg_cs_hold_time = dev_config->cs_ena_posttrans; + lp_spi_dev->spi_user.reg_cs_hold = dev_config->cs_ena_posttrans ? 1 : 0; + + /* Select the CS pin */ + lp_spi_dev->spi_misc.reg_cs0_dis = 0; +} + +static void lp_spi_slave_setup_device(const lp_spi_slave_config_t *slave_config) +{ + /* Configure transmission bit order */ + lp_spi_dev->spi_ctrl.reg_rd_bit_order = slave_config->flags & LP_SPI_DEVICE_RXBIT_LSBFIRST ? 1 : 0; + lp_spi_dev->spi_ctrl.reg_wr_bit_order = slave_config->flags & LP_SPI_DEVICE_TXBIT_LSBFIRST ? 1 : 0; + + /* Configure SPI mode in slave mode */ + if (slave_config->spi_mode == 0) { + lp_spi_dev->spi_misc.reg_ck_idle_edge = 0; + lp_spi_dev->spi_user.reg_rsck_i_edge = 0; + lp_spi_dev->spi_user.reg_tsck_i_edge = 0; + lp_spi_dev->spi_slave.reg_clk_mode_13 = 0; + } else if (slave_config->spi_mode == 1) { + lp_spi_dev->spi_misc.reg_ck_idle_edge = 0; + lp_spi_dev->spi_user.reg_rsck_i_edge = 1; + lp_spi_dev->spi_user.reg_tsck_i_edge = 1; + lp_spi_dev->spi_slave.reg_clk_mode_13 = 1; + } else if (slave_config->spi_mode == 2) { + lp_spi_dev->spi_misc.reg_ck_idle_edge = 1; + lp_spi_dev->spi_user.reg_rsck_i_edge = 1; + lp_spi_dev->spi_user.reg_tsck_i_edge = 1; + lp_spi_dev->spi_slave.reg_clk_mode_13 = 0; + } else if (slave_config->spi_mode == 3) { + lp_spi_dev->spi_misc.reg_ck_idle_edge = 1; + lp_spi_dev->spi_user.reg_rsck_i_edge = 0; + lp_spi_dev->spi_user.reg_tsck_i_edge = 0; + lp_spi_dev->spi_slave.reg_clk_mode_13 = 1; + } + + if (slave_config->flags & LP_SPI_DEVICE_CS_ACTIVE_HIGH) { + ESP_LOGW(LP_SPI_TAG, "Active high CS line is not supported in slave mode. Using active low CS line."); + } + lp_spi_dev->spi_misc.reg_slave_cs_pol = 0; + + if (slave_config->flags & LP_SPI_DEVICE_HALF_DUPLEX) { + ESP_LOGW(LP_SPI_TAG, "Half-duplex mode is not supported in slave mode. Using full-duplex mode."); + } + lp_spi_dev->spi_user.reg_doutdin = 1; + + /* Configure 3-Wire half-duplex mode */ + lp_spi_dev->spi_user.reg_sio = slave_config->flags & LP_SPI_DEVICE_3WIRE ? 1 : 0; + + /* Select the CS pin */ + lp_spi_dev->spi_misc.reg_cs0_dis = 0; +} + +////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////// Public APIs /////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////// + +esp_err_t lp_core_lp_spi_bus_initialize(lp_spi_host_t host_id, const lp_spi_bus_config_t *bus_config) +{ + (void)host_id; + + /* Sanity check arguments */ + if (bus_config == NULL) { + return ESP_ERR_INVALID_ARG; + } + + /* Connect the LP SPI peripheral to a "bus", i.e. a set of + * GPIO pins defined in the bus_config structure. + */ + esp_err_t ret = lp_spi_bus_init_io(bus_config); + + return ret; +} + +esp_err_t lp_core_lp_spi_bus_add_device(lp_spi_host_t host_id, const lp_spi_device_config_t *dev_config) +{ + (void)host_id; + + esp_err_t ret = ESP_OK; + + /* Configure the CS pin */ + ESP_RETURN_ON_ERROR(lp_spi_cs_pin_init(dev_config->cs_io_num), LP_SPI_TAG, "CS pin initialization failed"); + + /* Enable the LP SPI clock gate */ + lp_spi_enable_clock_gate(); + + /* Lazy initialize the LP SPI in master mode */ + lp_spi_master_init(); + + /* Configure clock */ + ESP_RETURN_ON_ERROR(lp_spi_clock_init(dev_config), LP_SPI_TAG, "Clock initialization failed"); + + /* Setup the SPI device */ + lp_spi_master_setup_device(dev_config); + + return ret; +} + +esp_err_t lp_core_lp_spi_slave_initialize(lp_spi_host_t host_id, const lp_spi_slave_config_t *slave_config) +{ + (void)host_id; + + esp_err_t ret = ESP_OK; + + /* Configure the CS pin */ + ESP_RETURN_ON_ERROR(lp_spi_cs_pin_init(slave_config->cs_io_num), LP_SPI_TAG, "CS pin initialization failed"); + + /* Enable the LP SPI clock gate */ + lp_spi_enable_clock_gate(); + + /* Initialize the LP SPI in slave mode */ + lp_spi_slave_init(); + + /* Setup the SPI device */ + lp_spi_slave_setup_device(slave_config); + + return ret; +} diff --git a/docs/component_info_ignore_file.txt b/docs/component_info_ignore_file.txt index 21b0fd9c0c6d..fd09655d2170 100644 --- a/docs/component_info_ignore_file.txt +++ b/docs/component_info_ignore_file.txt @@ -7,6 +7,7 @@ components/ulp/lp_core/lp_core/include/ulp_lp_core_print.h components/ulp/lp_core/lp_core/include/ulp_lp_core_uart.h components/ulp/lp_core/lp_core/include/ulp_lp_core_utils.h components/ulp/lp_core/lp_core/include/ulp_lp_core_interrupts.h +components/ulp/lp_core/lp_core/include/ulp_lp_core_spi.h # ESSL headers do not belong to any IDF component, in a user project it will come from a managed component components/driver/test_apps/components/esp_serial_slave_link/include/esp_serial_slave_link/essl_sdio.h components/driver/test_apps/components/esp_serial_slave_link/include/esp_serial_slave_link/essl_spi.h diff --git a/docs/doxygen/Doxyfile_esp32p4 b/docs/doxygen/Doxyfile_esp32p4 index 1c9f7aa9dbe4..58fd99650ef6 100644 --- a/docs/doxygen/Doxyfile_esp32p4 +++ b/docs/doxygen/Doxyfile_esp32p4 @@ -1,6 +1,7 @@ INPUT += \ $(PROJECT_PATH)/components/ulp/lp_core/include/lp_core_i2c.h \ $(PROJECT_PATH)/components/ulp/lp_core/include/lp_core_uart.h \ + $(PROJECT_PATH)/components/ulp/lp_core/include/lp_core_spi.h \ $(PROJECT_PATH)/components/ulp/lp_core/include/ulp_lp_core.h \ $(PROJECT_PATH)/components/ulp/lp_core/lp_core/include/ulp_lp_core_gpio.h \ $(PROJECT_PATH)/components/ulp/lp_core/lp_core/include/ulp_lp_core_i2c.h \ @@ -8,6 +9,7 @@ INPUT += \ $(PROJECT_PATH)/components/ulp/lp_core/lp_core/include/ulp_lp_core_uart.h \ $(PROJECT_PATH)/components/ulp/lp_core/lp_core/include/ulp_lp_core_utils.h \ $(PROJECT_PATH)/components/ulp/lp_core/lp_core/include/ulp_lp_core_interrupts.h \ + $(PROJECT_PATH)/components/ulp/lp_core/lp_core/include/ulp_lp_core_spi.h \ $(PROJECT_PATH)/components/ulp/ulp_common/include/ulp_common.h \ $(PROJECT_PATH)/components/usb/include/usb/usb_helpers.h \ $(PROJECT_PATH)/components/usb/include/usb/usb_host.h \ diff --git a/docs/en/api-reference/system/ulp-lp-core.rst b/docs/en/api-reference/system/ulp-lp-core.rst index 70e59eb4054f..dd3540e6da6a 100644 --- a/docs/en/api-reference/system/ulp-lp-core.rst +++ b/docs/en/api-reference/system/ulp-lp-core.rst @@ -168,6 +168,7 @@ To enhance the capabilities of the ULP LP-Core coprocessor, it has access to per * LP IO * LP I2C * LP UART + :SOC_LP_SPI_SUPPORTED: * LP SPI .. only:: CONFIG_ESP_ROM_HAS_LP_ROM @@ -240,6 +241,10 @@ Main CPU API Reference .. include-build-file:: inc/lp_core_i2c.inc .. include-build-file:: inc/lp_core_uart.inc +.. only:: CONFIG_SOC_LP_SPI_SUPPORTED + + .. include-build-file:: inc/lp_core_spi.inc + LP Core API Reference ~~~~~~~~~~~~~~~~~~~~~~ @@ -250,4 +255,8 @@ LP Core API Reference .. include-build-file:: inc/ulp_lp_core_print.inc .. include-build-file:: inc/ulp_lp_core_interrupts.inc +.. only:: CONFIG_SOC_LP_SPI_SUPPORTED + + .. include-build-file:: inc/ulp_lp_core_spi.inc + .. _esp-idf-monitor: https://github.com/espressif/esp-idf-monitor diff --git a/docs/zh_CN/api-reference/system/ulp-lp-core.rst b/docs/zh_CN/api-reference/system/ulp-lp-core.rst index b98d804857c5..b68341b2a2fd 100644 --- a/docs/zh_CN/api-reference/system/ulp-lp-core.rst +++ b/docs/zh_CN/api-reference/system/ulp-lp-core.rst @@ -164,6 +164,7 @@ ULP LP-Core 支持的外设 * LP IO * LP I2C * LP UART + :SOC_LP_SPI_SUPPORTED: * LP SPI .. only:: CONFIG_ESP_ROM_HAS_LP_ROM @@ -236,6 +237,10 @@ API 参考 .. include-build-file:: inc/lp_core_i2c.inc .. include-build-file:: inc/lp_core_uart.inc +.. only:: CONFIG_SOC_LP_SPI_SUPPORTED + + .. include-build-file:: inc/lp_core_spi.inc + LP 内核 API 参考 ~~~~~~~~~~~~~~~~~~~~~~ @@ -246,4 +251,8 @@ LP 内核 API 参考 .. include-build-file:: inc/ulp_lp_core_print.inc .. include-build-file:: inc/ulp_lp_core_interrupts.inc +.. only:: CONFIG_SOC_LP_SPI_SUPPORTED + + .. include-build-file:: inc/ulp_lp_core_spi.inc + .. _esp-idf-monitor: https://github.com/espressif/esp-idf-monitor From 70a0b4a1bf4cdc83b365fd82ed14c21faaa55c6b Mon Sep 17 00:00:00 2001 From: Sudeep Mohanty Date: Wed, 19 Jun 2024 10:18:19 +0200 Subject: [PATCH 30/73] test: Added LP core unit tests for LP SPI This commit adds tests for LP SPI master and LP SPI slave devices. --- .../ulp/test_apps/lp_core/main/CMakeLists.txt | 14 + .../main/lp_core/test_main_spi_master.c | 38 +++ .../main/lp_core/test_main_spi_slave.c | 32 +++ .../lp_core/main/lp_core/test_shared.h | 1 + .../test_apps/lp_core/main/test_lp_core_spi.c | 254 ++++++++++++++++++ 5 files changed, 339 insertions(+) create mode 100644 components/ulp/test_apps/lp_core/main/lp_core/test_main_spi_master.c create mode 100644 components/ulp/test_apps/lp_core/main/lp_core/test_main_spi_slave.c create mode 100644 components/ulp/test_apps/lp_core/main/test_lp_core_spi.c diff --git a/components/ulp/test_apps/lp_core/main/CMakeLists.txt b/components/ulp/test_apps/lp_core/main/CMakeLists.txt index 20b618d0596b..59bd723f445b 100644 --- a/components/ulp/test_apps/lp_core/main/CMakeLists.txt +++ b/components/ulp/test_apps/lp_core/main/CMakeLists.txt @@ -8,6 +8,10 @@ if(CONFIG_SOC_ULP_LP_UART_SUPPORTED) list(APPEND app_sources "test_lp_core_uart.c") endif() +if(CONFIG_SOC_LP_SPI_SUPPORTED) + list(APPEND app_sources "test_lp_core_spi.c") +endif() + set(lp_core_sources "lp_core/test_main.c") set(lp_core_sources_counter "lp_core/test_main_counter.c") @@ -25,6 +29,11 @@ if(CONFIG_SOC_ULP_LP_UART_SUPPORTED) set(lp_core_sources_uart "lp_core/test_main_uart.c") endif() +if(CONFIG_SOC_LP_SPI_SUPPORTED) + set(lp_core_sources_spi_master "lp_core/test_main_spi_master.c") + set(lp_core_sources_spi_slave "lp_core/test_main_spi_slave.c") +endif() + idf_component_register(SRCS ${app_sources} INCLUDE_DIRS "lp_core" REQUIRES ulp unity esp_timer test_utils @@ -49,3 +58,8 @@ endif() if(CONFIG_SOC_ULP_LP_UART_SUPPORTED) ulp_embed_binary(lp_core_test_app_uart "${lp_core_sources_uart}" "${lp_core_exp_dep_srcs}") endif() + +if(CONFIG_SOC_LP_SPI_SUPPORTED) + ulp_embed_binary(lp_core_test_app_spi_master "${lp_core_sources_spi_master}" "${lp_core_exp_dep_srcs}") + ulp_embed_binary(lp_core_test_app_spi_slave "${lp_core_sources_spi_slave}" "${lp_core_exp_dep_srcs}") +endif() diff --git a/components/ulp/test_apps/lp_core/main/lp_core/test_main_spi_master.c b/components/ulp/test_apps/lp_core/main/lp_core/test_main_spi_master.c new file mode 100644 index 000000000000..f7872dbcfc5b --- /dev/null +++ b/components/ulp/test_apps/lp_core/main/lp_core/test_main_spi_master.c @@ -0,0 +1,38 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include "ulp_lp_core_spi.h" +#include "test_shared.h" + +volatile lp_core_test_commands_t spi_test_cmd = LP_CORE_NO_COMMAND; + +volatile uint8_t spi_master_tx_buf[100] = {0}; +volatile uint8_t spi_master_rx_buf[100] = {0}; +volatile uint32_t spi_tx_len = 0; + +int main(void) +{ + /* Wait for the HP core to start the test */ + while (spi_test_cmd == LP_CORE_NO_COMMAND) { + + } + + /* Setup SPI transaction */ + lp_spi_transaction_t trans_desc = { + .tx_length = spi_tx_len, + .rx_length = spi_tx_len, + .tx_buffer = (uint8_t *)spi_master_tx_buf, + .rx_buffer = (uint8_t *)spi_master_rx_buf, + }; + + /* Transmit data */ + lp_core_lp_spi_master_transfer(&trans_desc, -1); + + /* Synchronize with the HP core running the test */ + spi_test_cmd = LP_CORE_NO_COMMAND; + + return 0; +} diff --git a/components/ulp/test_apps/lp_core/main/lp_core/test_main_spi_slave.c b/components/ulp/test_apps/lp_core/main/lp_core/test_main_spi_slave.c new file mode 100644 index 000000000000..81b208295e5e --- /dev/null +++ b/components/ulp/test_apps/lp_core/main/lp_core/test_main_spi_slave.c @@ -0,0 +1,32 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include "ulp_lp_core_spi.h" +#include "test_shared.h" + +volatile lp_core_test_command_reply_t spi_test_cmd_reply = LP_CORE_COMMAND_NOK; + +volatile uint8_t spi_slave_tx_buf[100] = {0}; +volatile uint8_t spi_slave_rx_buf[100] = {0}; +volatile uint32_t spi_rx_len = 0; + +int main(void) +{ + /* Setup SPI transaction */ + lp_spi_transaction_t trans_desc = { + .rx_length = spi_rx_len, + .rx_buffer = (uint8_t *)spi_slave_rx_buf, + .tx_buffer = NULL, + }; + + /* Receive data */ + lp_core_lp_spi_slave_transfer(&trans_desc, -1); + + /* Synchronize with the HP core running the test */ + spi_test_cmd_reply = LP_CORE_COMMAND_OK; + + return 0; +} diff --git a/components/ulp/test_apps/lp_core/main/lp_core/test_shared.h b/components/ulp/test_apps/lp_core/main/lp_core/test_shared.h index 8f27a65915d9..8fc1c4314004 100644 --- a/components/ulp/test_apps/lp_core/main/lp_core/test_shared.h +++ b/components/ulp/test_apps/lp_core/main/lp_core/test_shared.h @@ -24,6 +24,7 @@ typedef enum { LP_CORE_LP_UART_READ_TEST, LP_CORE_LP_UART_MULTI_BYTE_READ_TEST, LP_CORE_LP_UART_PRINT_TEST, + LP_CORE_LP_SPI_WRITE_READ_TEST, LP_CORE_NO_COMMAND, } lp_core_test_commands_t; diff --git a/components/ulp/test_apps/lp_core/main/test_lp_core_spi.c b/components/ulp/test_apps/lp_core/main/test_lp_core_spi.c new file mode 100644 index 000000000000..b23e99bd0997 --- /dev/null +++ b/components/ulp/test_apps/lp_core/main/test_lp_core_spi.c @@ -0,0 +1,254 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include "lp_core_test_app_spi_master.h" +#include "lp_core_test_app_spi_slave.h" +#include "ulp_lp_core.h" +#include "lp_core_spi.h" +#include "unity.h" +#include "test_utils.h" +#include "esp_log.h" +#include "test_shared.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" + +extern const uint8_t lp_core_main_spi_master_bin_start[] asm("_binary_lp_core_test_app_spi_master_bin_start"); +extern const uint8_t lp_core_main_spi_master_bin_end[] asm("_binary_lp_core_test_app_spi_master_bin_end"); +extern const uint8_t lp_core_main_spi_slave_bin_start[] asm("_binary_lp_core_test_app_spi_slave_bin_start"); +extern const uint8_t lp_core_main_spi_slave_bin_end[] asm("_binary_lp_core_test_app_spi_slave_bin_end"); + +static const char* TAG = "lp_core_spi_test"; + +#define TEST_GPIO_PIN_MISO 6 +#define TEST_GPIO_PIN_MOSI 7 +#define TEST_GPIO_PIN_CLK 8 +#define TEST_GPIO_PIN_CS 4 + +#define TEST_DATA_LEN_BYTES 42 +uint8_t expected_data[100] = {0}; + +static void load_and_start_lp_core_firmware(ulp_lp_core_cfg_t* cfg, const uint8_t* firmware_start, const uint8_t* firmware_end) +{ + TEST_ASSERT(ulp_lp_core_load_binary(firmware_start, (firmware_end - firmware_start)) == ESP_OK); + TEST_ASSERT(ulp_lp_core_run(cfg) == ESP_OK); +} + +static void setup_test_data(void) +{ + uint8_t *tx_data = (uint8_t *)&ulp_spi_master_tx_buf; + ulp_spi_tx_len = TEST_DATA_LEN_BYTES; + + /* Setup test data */ + for (int i = 0; i < ulp_spi_tx_len; i++) { + tx_data[i] = (i + 1) % 256; + expected_data[i] = tx_data[i]; + } +} + +static void setup_expected_data(void) +{ + ulp_spi_rx_len = TEST_DATA_LEN_BYTES; + + /* Setup expected data */ + for (int i = 0; i < TEST_DATA_LEN_BYTES; i++) { + expected_data[i] = (i + 1) % 256; + } +} + +/* Base LP SPI bus settings */ +lp_spi_host_t host_id = 0; +lp_spi_bus_config_t bus_config = { + .miso_io_num = TEST_GPIO_PIN_MISO, + .mosi_io_num = TEST_GPIO_PIN_MOSI, + .sclk_io_num = TEST_GPIO_PIN_CLK, +}; + +/* Base LP SPI device settings */ +lp_spi_device_config_t device = { + .cs_io_num = TEST_GPIO_PIN_CS, + .spi_mode = 0, + .clock_speed_hz = 10 * 1000, // 10 MHz + .duty_cycle = 128, // 50% duty cycle +}; + +/* Base LP SPI slave device settings */ +lp_spi_slave_config_t slv_device = { + .cs_io_num = TEST_GPIO_PIN_CS, + .spi_mode = 0, +}; + +static void lp_spi_master_init(int spi_flags, bool setup_master_loop_back) +{ + /* Initialize LP SPI bus */ + /* Setup loop back for tests which do not use an LP SPI slave for looping back the data. */ + bus_config.miso_io_num = setup_master_loop_back ? TEST_GPIO_PIN_MOSI : TEST_GPIO_PIN_MISO; + TEST_ASSERT(lp_core_lp_spi_bus_initialize(host_id, &bus_config) == ESP_OK); + + /* Add LP SPI device */ + device.flags = spi_flags; + TEST_ASSERT(lp_core_lp_spi_bus_add_device(host_id, &device) == ESP_OK); +} + +static void lp_spi_slave_init(int spi_flags) +{ + /* Initialize LP SPI bus */ + TEST_ASSERT(lp_core_lp_spi_bus_initialize(host_id, &bus_config) == ESP_OK); + + /* Add LP SPI slave device */ + if (spi_flags != 0) { + slv_device.flags = spi_flags; + } + TEST_ASSERT(lp_core_lp_spi_slave_initialize(host_id, &slv_device) == ESP_OK); +} + +static void lp_spi_master_execute_test(bool wait_for_slave_ready) +{ + /* Load and run the LP core firmware */ + ulp_lp_core_cfg_t lp_cfg = { + .wakeup_source = ULP_LP_CORE_WAKEUP_SOURCE_HP_CPU, + }; + load_and_start_lp_core_firmware(&lp_cfg, lp_core_main_spi_master_bin_start, lp_core_main_spi_master_bin_end); + + if (wait_for_slave_ready) { + /* Wait for the HP SPI device to be initialized */ + unity_wait_for_signal("LP SPI slave ready"); + } + + /* Setup test data */ + setup_test_data(); + + /* Start the test */ + ulp_spi_test_cmd = LP_CORE_LP_SPI_WRITE_READ_TEST; + + while (ulp_spi_test_cmd != LP_CORE_NO_COMMAND) { + /* Wait for the test to complete */ + vTaskDelay(1); + } + + /* Verify the received data if we expect the data to be looped back from the LP SPI slave */ + uint8_t *rx_data = (uint8_t *)&ulp_spi_master_rx_buf; + for (int i = 0; i < TEST_DATA_LEN_BYTES; i++) { + ESP_LOGI(TAG, "LP SPI master received data: 0x%02x", rx_data[i]); + } + + TEST_ASSERT_EQUAL_HEX8_ARRAY(expected_data, rx_data, ulp_spi_tx_len); +} + +static void lp_spi_slave_execute_test(void) +{ + /* Load and run the LP core firmware */ + ulp_lp_core_cfg_t lp_cfg = { + .wakeup_source = ULP_LP_CORE_WAKEUP_SOURCE_HP_CPU, + }; + load_and_start_lp_core_firmware(&lp_cfg, lp_core_main_spi_slave_bin_start, lp_core_main_spi_slave_bin_end); + + /* Setup expected test data */ + setup_expected_data(); + + /* Send signal to LP SPI master */ + unity_send_signal("LP SPI slave ready"); + + /* Wait for the test to complete */ + while (ulp_spi_test_cmd_reply != LP_CORE_COMMAND_OK) { + vTaskDelay(1); + } + + /* Verify the received data */ + uint8_t *rx_data = (uint8_t *)&ulp_spi_slave_rx_buf; + for (int i = 0; i < TEST_DATA_LEN_BYTES; i++) { + ESP_LOGI(TAG, "LP SPI slave received data: 0x%02x", rx_data[i]); + } + + TEST_ASSERT_EQUAL_HEX8_ARRAY(expected_data, rx_data, TEST_DATA_LEN_BYTES); +} + +void test_lp_spi_master(void) +{ + /* Initialize LP SPI in master mode */ + lp_spi_master_init(0, false); + + /* Start the LP SPI master test */ + lp_spi_master_execute_test(true); +} + +void test_lp_spi_slave(void) +{ + /* Initialize LP SPI in slave mode */ + lp_spi_slave_init(0); + + /* Start the LP SPI slave test */ + lp_spi_slave_execute_test(); +} +void test_lp_spi_master_3wire(void) +{ + /* Initialize LP SPI in master mode */ + int spi_flags = LP_SPI_DEVICE_3WIRE; + lp_spi_master_init(spi_flags, false); + + /* Start the LP SPI master test */ + lp_spi_master_execute_test(true); +} + +void test_lp_spi_slave_3wire(void) +{ + /* Initialize LP SPI in slave mode */ + int spi_flags = LP_SPI_DEVICE_3WIRE; + lp_spi_slave_init(spi_flags); + + /* Start the LP SPI slave test */ + lp_spi_slave_execute_test(); +} + +void test_lp_spi_master_lsbfirst(void) +{ + /* Initialize LP SPI in master mode */ + int spi_flags = LP_SPI_DEVICE_BIT_LSBFIRST; + lp_spi_master_init(spi_flags, false); + + /* Start the LP SPI master test */ + lp_spi_master_execute_test(true); +} + +void test_lp_spi_slave_lsbfirst(void) +{ + /* Initialize LP SPI in slave mode */ + int spi_flags = LP_SPI_DEVICE_BIT_LSBFIRST; + lp_spi_slave_init(spi_flags); + + /* Start the LP SPI slave test */ + lp_spi_slave_execute_test(); +} + +/* Test LP-SPI master loopback */ +TEST_CASE("LP-Core LP-SPI master loopback test", "[lp_core]") +{ + /* Initialize LP SPI in master mode */ + lp_spi_master_init(0, true); + + /* Start the LP SPI master test */ + lp_spi_master_execute_test(false); +} + +/* Test LP-SPI master loopback with active low CS line */ +TEST_CASE("LP-Core LP-SPI master loopback test with active high CS line", "[lp_core]") +{ + /* Initialize LP SPI in master mode */ + int spi_flags = LP_SPI_DEVICE_CS_ACTIVE_HIGH; + lp_spi_master_init(spi_flags, true); + + /* Start the LP SPI master test */ + lp_spi_master_execute_test(false); +} + +/* Test LP-SPI master and LP-SPI slave communication */ +TEST_CASE_MULTIPLE_DEVICES("LP-Core LP-SPI master and LP-SPI slave read write test", "[lp_core_spi][test_env=generic_multi_device][timeout=150]", test_lp_spi_master, test_lp_spi_slave); + +/* Test LP-SPI master in 3-Wire SPI mode */ +TEST_CASE_MULTIPLE_DEVICES("LP-Core LP-SPI master and LP-SPI slave in 3-Wire SPI mode", "[lp_core_spi][test_env=generic_multi_device][timeout=150]", test_lp_spi_master_3wire, test_lp_spi_slave_3wire); + +/* Test LP-SPI master and LP-SPI slave in LSB first mode */ +TEST_CASE_MULTIPLE_DEVICES("LP-Core LP-SPI master and LP-SPI in LSB first SPI mode", "[lp_core_spi][test_env=generic_multi_device][timeout=150]", test_lp_spi_master_lsbfirst, test_lp_spi_slave_lsbfirst); From c1e58e7d2dbf03496d27feae4ba31c2cc349be29 Mon Sep 17 00:00:00 2001 From: Myk Melez Date: Wed, 26 Jun 2024 15:34:23 -0700 Subject: [PATCH 31/73] fix(pthread): Remove TLS pointer/deletion callback from correct thread Originally, pthread_internal_local_storage_destructor_callback was only called from pthread_exit on the thread whose TLS is being destroyed. In b3755b751ed42d98c933a919c744dc6455f5ee68, pthread_internal_local_storage_destructor_callback started being called from pthread_join and pthread_detach on a different thread (whichever one called one of those functions). But pthread_internal_local_storage_destructor_callback is still calling vTaskSetThreadLocalStoragePointer and vTaskSetThreadLocalStoragePointerAndDelCallback with a NULL xTaskToSet argument, which causes those functions to set the TLS pointer and deletion callback for the current thread, not the thread whose TLS is being destroyed. This commit makes pthread_internal_local_storage_destructor_callback call vTaskSetThreadLocalStoragePointer and vTaskSetThreadLocalStoragePointerAndDelCallback with the handle of the thread whose TLS is being destroyed. --- components/pthread/pthread_local_storage.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/components/pthread/pthread_local_storage.c b/components/pthread/pthread_local_storage.c index 19cb73a98d88..80b562edb533 100644 --- a/components/pthread/pthread_local_storage.c +++ b/components/pthread/pthread_local_storage.c @@ -147,7 +147,9 @@ static void pthread_cleanup_thread_specific_data_callback(int index, void *v_tls free(tls); } -/* this function called from pthread_task_func for "early" cleanup of TLS in a pthread */ +/* this function called from pthread_task_func for "early" cleanup of TLS in a pthread + and from pthread_join/pthread_detach for cleanup of TLS after pthread exit +*/ void pthread_internal_local_storage_destructor_callback(TaskHandle_t handle) { void *tls = pvTaskGetThreadLocalStoragePointer(handle, PTHREAD_TLS_INDEX); @@ -157,9 +159,9 @@ void pthread_internal_local_storage_destructor_callback(TaskHandle_t handle) calling it again... */ #if !defined(CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS) - vTaskSetThreadLocalStoragePointer(NULL, PTHREAD_TLS_INDEX, NULL); + vTaskSetThreadLocalStoragePointer(handle, PTHREAD_TLS_INDEX, NULL); #else - vTaskSetThreadLocalStoragePointerAndDelCallback(NULL, + vTaskSetThreadLocalStoragePointerAndDelCallback(handle, PTHREAD_TLS_INDEX, NULL, NULL); From 2cb9419b14a19cdabea012e7a966ac861d40517c Mon Sep 17 00:00:00 2001 From: Xiaoyu Liu Date: Wed, 19 Jun 2024 12:09:05 +0800 Subject: [PATCH 32/73] change(esp_rom): optimize target-specific header files layout in components/esp_rom --- .../esp_coex/esp32h2/esp_coex_adapter.c | 2 +- components/esp_rom/CMakeLists.txt | 6 +-- .../{ => esp32}/include/esp32/rom/aes.h | 18 +++------ .../{ => esp32}/include/esp32/rom/bigint.h | 18 +++------ .../{ => esp32}/include/esp32/rom/cache.h | 0 .../{ => esp32}/include/esp32/rom/crc.h | 18 +++------ .../{ => esp32}/include/esp32/rom/efuse.h | 0 .../{ => esp32}/include/esp32/rom/ets_sys.h | 16 ++++---- .../{ => esp32}/include/esp32/rom/gpio.h | 4 +- .../include/esp32/rom/libc_stubs.h | 0 .../{ => esp32}/include/esp32/rom/lldesc.h | 0 .../{ => esp32}/include/esp32/rom/md5_hash.h | 0 .../{ => esp32}/include/esp32/rom/rsa_pss.h | 0 .../{ => esp32}/include/esp32/rom/rtc.h | 2 +- .../include/esp32/rom/secure_boot.h | 0 .../{ => esp32}/include/esp32/rom/sha.h | 18 +++------ .../{ => esp32}/include/esp32/rom/spi_flash.h | 0 .../esp32/include/esp32/rom/tbconsole.h | 19 +++++++++ .../{ => esp32}/include/esp32/rom/tjpgd.h | 6 +-- .../{ => esp32}/include/esp32/rom/uart.h | 0 .../include/esp32c2/rom/apb_backup_dma.h | 0 .../{ => esp32c2}/include/esp32c2/rom/cache.h | 2 +- .../{ => esp32c2}/include/esp32c2/rom/crc.h | 0 .../{ => esp32c2}/include/esp32c2/rom/ecdsa.h | 0 .../{ => esp32c2}/include/esp32c2/rom/efuse.h | 4 +- .../include/esp32c2/rom/esp_flash.h | 0 .../include/esp32c2/rom/ets_sys.h | 0 .../{ => esp32c2}/include/esp32c2/rom/gpio.h | 2 +- .../include/esp32c2/rom/libc_stubs.h | 0 .../include/esp32c2/rom/lldesc.h | 0 .../include/esp32c2/rom/rom_layout.h | 0 .../{ => esp32c2}/include/esp32c2/rom/rtc.h | 0 .../include/esp32c2/rom/secure_boot.h | 0 .../{ => esp32c2}/include/esp32c2/rom/sha.h | 0 .../include/esp32c2/rom/spi_flash.h | 2 +- .../{ => esp32c2}/include/esp32c2/rom/uart.h | 4 +- .../{ => esp32c3}/include/esp32c3/rom/aes.h | 0 .../include/esp32c3/rom/apb_backup_dma.h | 0 .../include/esp32c3/rom/bigint.h | 18 +++------ .../{ => esp32c3}/include/esp32c3/rom/cache.h | 2 +- .../{ => esp32c3}/include/esp32c3/rom/crc.h | 18 +++------ .../include/esp32c3/rom/digital_signature.h | 18 +++------ .../{ => esp32c3}/include/esp32c3/rom/efuse.h | 4 +- .../include/esp32c3/rom/esp_flash.h | 18 +++------ .../include/esp32c3/rom/ets_sys.h | 10 ++--- .../{ => esp32c3}/include/esp32c3/rom/gpio.h | 2 +- .../include/esp32c3}/rom/hmac.h | 18 +++------ .../include/esp32c3/rom/libc_stubs.h | 0 .../include/esp32c3/rom/lldesc.h | 0 .../include/esp32c3/rom/md5_hash.h | 0 .../include/esp32c3/rom/rom_layout.h | 0 .../include/esp32c3/rom/rsa_pss.h | 18 +++------ .../{ => esp32c3}/include/esp32c3/rom/rtc.h | 0 .../include/esp32c3/rom/secure_boot.h | 0 .../{ => esp32c3}/include/esp32c3/rom/sha.h | 18 +++------ .../include/esp32c3/rom/spi_flash.h | 2 +- .../{ => esp32c3}/include/esp32c3/rom/tjpgd.h | 6 +-- .../{ => esp32c3}/include/esp32c3/rom/uart.h | 4 +- .../{ => esp32c5}/include/esp32c5/rom/aes.h | 0 .../include/esp32c5/rom/bigint.h | 0 .../{ => esp32c5}/include/esp32c5/rom/cache.h | 0 .../{ => esp32c5}/include/esp32c5/rom/crc.h | 0 .../include/esp32c5/rom/digital_signature.h | 0 .../{ => esp32c5}/include/esp32c5/rom/ecdsa.h | 0 .../{ => esp32c5}/include/esp32c5/rom/efuse.h | 0 .../include/esp32c5/rom/esp_flash.h | 0 .../include/esp32c5/rom/ets_sys.h | 0 .../{ => esp32c5}/include/esp32c5/rom/gpio.h | 0 .../{ => esp32c5}/include/esp32c5/rom/hmac.h | 0 .../include/esp32c5/rom/libc_stubs.h | 0 .../include/esp32c5/rom/lldesc.h | 0 .../include/esp32c5/rom/md5_hash.h | 0 .../include/esp32c5/rom/opi_flash.h | 0 .../include/esp32c5/rom/rom_layout.h | 0 .../include/esp32c5/rom/rsa_pss.h | 0 .../{ => esp32c5}/include/esp32c5/rom/rtc.h | 0 .../include/esp32c5/rom/secure_boot.h | 0 .../{ => esp32c5}/include/esp32c5/rom/sha.h | 0 .../include/esp32c5/rom/spi_flash.h | 0 .../{ => esp32c5}/include/esp32c5/rom/tjpgd.h | 0 .../{ => esp32c5}/include/esp32c5/rom/uart.h | 0 .../{ => esp32c6}/include/esp32c6/rom/aes.h | 0 .../include/esp32c6/rom/bigint.h | 0 .../{ => esp32c6}/include/esp32c6/rom/cache.h | 2 +- .../{ => esp32c6}/include/esp32c6/rom/crc.h | 0 .../include/esp32c6/rom/digital_signature.h | 0 .../{ => esp32c6}/include/esp32c6/rom/ecdsa.h | 0 .../{ => esp32c6}/include/esp32c6/rom/efuse.h | 2 +- .../include/esp32c6/rom/esp_flash.h | 0 .../include/esp32c6/rom/ets_sys.h | 10 ++--- .../{ => esp32c6}/include/esp32c6/rom/gpio.h | 2 +- .../{ => esp32c6}/include/esp32c6/rom/hmac.h | 0 .../include/esp32c6/rom/libc_stubs.h | 0 .../include/esp32c6/rom/lldesc.h | 0 .../include/esp32c6/rom/md5_hash.h | 0 .../include/esp32c6/rom/rom_layout.h | 0 .../include/esp32c6/rom/rsa_pss.h | 0 .../{ => esp32c6}/include/esp32c6/rom/rtc.h | 0 .../include/esp32c6/rom/secure_boot.h | 0 .../{ => esp32c6}/include/esp32c6/rom/sha.h | 0 .../include/esp32c6}/rom/spi_flash.h | 2 +- .../{ => esp32c6}/include/esp32c6/rom/tjpgd.h | 6 +-- .../{ => esp32c6}/include/esp32c6/rom/uart.h | 6 +-- .../include/esp32c61/rom/bigint.h | 0 .../include/esp32c61/rom/cache.h | 0 .../{ => esp32c61}/include/esp32c61/rom/crc.h | 0 .../include/esp32c61/rom/ecdsa.h | 0 .../include/esp32c61/rom/efuse.h | 2 +- .../include/esp32c61/rom/esp_flash.h | 0 .../include/esp32c61/rom/ets_sys.h | 10 ++--- .../include/esp32c61/rom/gpio.h | 0 .../include/esp32c61/rom/libc_stubs.h | 0 .../include/esp32c61/rom/lldesc.h | 0 .../include/esp32c61/rom/md5_hash.h | 0 .../include/esp32c61/rom/opi_flash.h | 4 +- .../include/esp32c61/rom/rom_layout.h | 0 .../{ => esp32c61}/include/esp32c61/rom/rtc.h | 0 .../include/esp32c61/rom/secure_boot.h | 0 .../{ => esp32c61}/include/esp32c61/rom/sha.h | 0 .../include/esp32c61/rom/spi_flash.h | 2 +- .../include/esp32c61/rom/tjpgd.h | 6 +-- .../include/esp32c61/rom/uart.h | 6 +-- .../{ => esp32h2}/include/esp32h2/rom/aes.h | 0 .../include/esp32h2/rom/bigint.h | 0 .../{ => esp32h2}/include/esp32h2/rom/cache.h | 2 +- .../{ => esp32h2}/include/esp32h2/rom/crc.h | 0 .../include/esp32h2/rom/digital_signature.h | 0 .../{ => esp32h2}/include/esp32h2/rom/ecdsa.h | 0 .../{ => esp32h2}/include/esp32h2/rom/efuse.h | 2 +- .../include/esp32h2/rom/esp_flash.h | 0 .../include/esp32h2/rom/ets_sys.h | 10 ++--- .../{ => esp32h2}/include/esp32h2/rom/gpio.h | 2 +- .../{ => esp32h2}/include/esp32h2/rom/hmac.h | 0 .../include/esp32h2/rom/libc_stubs.h | 0 .../include/esp32h2/rom/lldesc.h | 0 .../include/esp32h2/rom/md5_hash.h | 0 .../include/esp32h2/rom/rom_layout.h | 0 .../include/esp32h2/rom/rsa_pss.h | 0 .../{ => esp32h2}/include/esp32h2/rom/rtc.h | 0 .../include/esp32h2/rom/secure_boot.h | 0 .../{ => esp32h2}/include/esp32h2/rom/sha.h | 0 .../include/esp32h2}/rom/spi_flash.h | 2 +- .../{ => esp32h2}/include/esp32h2/rom/uart.h | 6 +-- .../{ => esp32p4}/include/esp32p4/rom/aes.h | 0 .../include/esp32p4/rom/bigint.h | 0 .../{ => esp32p4}/include/esp32p4/rom/cache.h | 6 +-- .../{ => esp32p4}/include/esp32p4/rom/crc.h | 0 .../include/esp32p4/rom/digital_signature.h | 0 .../{ => esp32p4}/include/esp32p4/rom/ecdsa.h | 0 .../{ => esp32p4}/include/esp32p4/rom/efuse.h | 4 +- .../include/esp32p4/rom/esp_flash.h | 0 .../include/esp32p4/rom/ets_sys.h | 16 ++++---- .../{ => esp32p4}/include/esp32p4/rom/gpio.h | 4 +- .../{ => esp32p4}/include/esp32p4/rom/hmac.h | 0 .../include/esp32p4/rom/key_mgr.h | 0 .../{ => esp32p4}/include/esp32p4/rom/km.h | 0 .../include/esp32p4/rom/libc_stubs.h | 0 .../include/esp32p4/rom/lldesc.h | 0 .../include/esp32p4/rom/md5_hash.h | 0 .../include/esp32p4/rom/opi_flash.h | 4 +- .../include/esp32p4/rom/rom_layout.h | 0 .../include/esp32p4/rom/rsa_pss.h | 0 .../{ => esp32p4}/include/esp32p4/rom/rtc.h | 0 .../include/esp32p4/rom/secure_boot.h | 0 .../{ => esp32p4}/include/esp32p4/rom/sha.h | 0 .../include/esp32p4/rom/spi_flash.h | 2 +- .../{ => esp32p4}/include/esp32p4/rom/uart.h | 6 +-- .../{ => esp32s2}/include/esp32s2/rom/aes.h | 18 +++------ .../include/esp32s2/rom/bigint.h | 18 +++------ .../{ => esp32s2}/include/esp32s2/rom/cache.h | 4 +- .../{ => esp32s2}/include/esp32s2/rom/crc.h | 18 +++------ .../include/esp32s2/rom/digital_signature.h | 18 +++------ .../{ => esp32s2}/include/esp32s2/rom/efuse.h | 4 +- .../include/esp32s2/rom/ets_sys.h | 0 .../{ => esp32s2}/include/esp32s2/rom/gpio.h | 4 +- .../include/esp32s2}/rom/hmac.h | 18 +++------ .../include/esp32s2/rom/libc_stubs.h | 0 .../include/esp32s2/rom/lldesc.h | 0 .../include/esp32s2/rom/md5_hash.h | 0 .../include/esp32s2/rom/opi_flash.h | 4 +- .../include/esp32s2/rom/rsa_pss.h | 19 +++------ .../{ => esp32s2}/include/esp32s2/rom/rtc.h | 0 .../include/esp32s2/rom/secure_boot.h | 0 .../{ => esp32s2}/include/esp32s2/rom/sha.h | 18 +++------ .../include/esp32s2/rom/spi_flash.h | 2 +- .../{ => esp32s2}/include/esp32s2/rom/uart.h | 6 +-- .../include/esp32s2/rom/usb/cdc_acm.h | 0 .../esp32s2/rom/usb/chip_usb_dw_wrapper.h | 0 .../include/esp32s2/rom/usb/cpio.h | 0 .../include/esp32s2/rom/usb/usb_cdc.h | 0 .../include/esp32s2/rom/usb/usb_common.h | 0 .../include/esp32s2/rom/usb/usb_dc.h | 4 +- .../include/esp32s2/rom/usb/usb_descriptor.h | 0 .../include/esp32s2}/rom/usb/usb_device.h | 4 +- .../include/esp32s2/rom/usb/usb_dfu.h | 0 .../include/esp32s2/rom/usb/usb_os_glue.h | 0 .../include/esp32s2/rom/usb/usb_persist.h | 0 .../{ => esp32s3}/include/esp32s3/rom/aes.h | 0 .../include/esp32s3/rom/apb_backup_dma.h | 0 .../include/esp32s3/rom/bigint.h | 18 +++------ .../{ => esp32s3}/include/esp32s3/rom/cache.h | 4 +- .../{ => esp32s3}/include/esp32s3/rom/crc.h | 18 +++------ .../include/esp32s3/rom/digital_signature.h | 18 +++------ .../{ => esp32s3}/include/esp32s3/rom/efuse.h | 4 +- .../include/esp32s3/rom/ets_sys.h | 10 ++--- .../{ => esp32s3}/include/esp32s3/rom/gpio.h | 2 +- .../{ => esp32s3}/include/esp32s3/rom/hmac.h | 18 +++------ .../include/esp32s3/rom/libc_stubs.h | 0 .../include/esp32s3/rom/lldesc.h | 0 .../include/esp32s3/rom/md5_hash.h | 0 .../include/esp32s3/rom/opi_flash.h | 4 +- .../include/esp32s3/rom/rom_layout.h | 0 .../include/esp32s3/rom/rsa_pss.h | 18 +++------ .../{ => esp32s3}/include/esp32s3/rom/rtc.h | 0 .../include/esp32s3/rom/secure_boot.h | 0 .../{ => esp32s3}/include/esp32s3/rom/sha.h | 18 +++------ .../include/esp32s3/rom/spi_flash.h | 2 +- .../{ => esp32s3}/include/esp32s3/rom/tjpgd.h | 6 +-- .../{ => esp32s3}/include/esp32s3/rom/uart.h | 4 +- .../include/esp32s3/rom/usb/cdc_acm.h | 0 .../esp32s3/rom/usb/chip_usb_dw_wrapper.h | 0 .../include/esp32s3/rom/usb/cpio.h | 0 .../include/esp32s3/rom/usb/usb_cdc.h | 0 .../include/esp32s3/rom/usb/usb_common.h | 0 .../include/esp32s3/rom/usb/usb_dc.h | 4 +- .../include/esp32s3/rom/usb/usb_descriptor.h | 0 .../include/esp32s3}/rom/usb/usb_device.h | 4 +- .../include/esp32s3/rom/usb/usb_dfu.h | 0 .../include/esp32s3/rom/usb/usb_os_glue.h | 0 .../include/esp32s3/rom/usb/usb_persist.h | 0 components/esp_rom/include/esp32/rom/miniz.h | 8 ---- .../esp_rom/include/esp32/rom/tbconsole.h | 27 ------------- .../esp_rom/include/esp32c2/rom/miniz.h | 8 ---- .../esp_rom/include/esp32c3/rom/miniz.h | 8 ---- .../esp_rom/include/esp32c5/rom/miniz.h | 8 ---- .../esp_rom/include/esp32c6/rom/miniz.h | 8 ---- .../esp_rom/include/esp32c61/rom/miniz.h | 8 ---- .../esp_rom/include/esp32s2/rom/miniz.h | 8 ---- .../esp_rom/include/esp32s3/rom/miniz.h | 8 ---- .../esp_rom/include/linux/soc/reset_reasons.h | 31 --------------- .../{ => linux}/include/linux/rom/efuse.h | 0 .../{ => linux}/include/linux/rom/ets_sys.h | 0 .../linux/include/linux/soc/reset_reasons.h | 23 +++++++++++ components/nvs_flash/test_nvs_host/Makefile | 2 +- .../release-5.x/5.4/system.rst | 7 ++++ tools/ci/check_copyright_config.yaml | 4 +- tools/ci/check_copyright_ignore.txt | 36 +++-------------- tools/ci/check_public_headers_exceptions.txt | 39 +++++++++---------- 248 files changed, 337 insertions(+), 630 deletions(-) rename components/esp_rom/{ => esp32}/include/esp32/rom/aes.h (58%) rename components/esp_rom/{ => esp32}/include/esp32/rom/bigint.h (67%) rename components/esp_rom/{ => esp32}/include/esp32/rom/cache.h (100%) rename components/esp_rom/{ => esp32}/include/esp32/rom/crc.h (87%) rename components/esp_rom/{ => esp32}/include/esp32/rom/efuse.h (100%) rename components/esp_rom/{ => esp32}/include/esp32/rom/ets_sys.h (97%) rename components/esp_rom/{ => esp32}/include/esp32/rom/gpio.h (97%) rename components/esp_rom/{ => esp32}/include/esp32/rom/libc_stubs.h (100%) rename components/esp_rom/{ => esp32}/include/esp32/rom/lldesc.h (100%) rename components/esp_rom/{ => esp32}/include/esp32/rom/md5_hash.h (100%) rename components/esp_rom/{ => esp32}/include/esp32/rom/rsa_pss.h (100%) rename components/esp_rom/{ => esp32}/include/esp32/rom/rtc.h (99%) rename components/esp_rom/{ => esp32}/include/esp32/rom/secure_boot.h (100%) rename components/esp_rom/{ => esp32}/include/esp32/rom/sha.h (62%) rename components/esp_rom/{ => esp32}/include/esp32/rom/spi_flash.h (100%) create mode 100644 components/esp_rom/esp32/include/esp32/rom/tbconsole.h rename components/esp_rom/{ => esp32}/include/esp32/rom/tjpgd.h (94%) rename components/esp_rom/{ => esp32}/include/esp32/rom/uart.h (100%) rename components/esp_rom/{ => esp32c2}/include/esp32c2/rom/apb_backup_dma.h (100%) rename components/esp_rom/{ => esp32c2}/include/esp32c2/rom/cache.h (99%) rename components/esp_rom/{ => esp32c2}/include/esp32c2/rom/crc.h (100%) rename components/esp_rom/{ => esp32c2}/include/esp32c2/rom/ecdsa.h (100%) rename components/esp_rom/{ => esp32c2}/include/esp32c2/rom/efuse.h (98%) rename components/esp_rom/{ => esp32c2}/include/esp32c2/rom/esp_flash.h (100%) rename components/esp_rom/{ => esp32c2}/include/esp32c2/rom/ets_sys.h (100%) rename components/esp_rom/{ => esp32c2}/include/esp32c2/rom/gpio.h (98%) rename components/esp_rom/{ => esp32c2}/include/esp32c2/rom/libc_stubs.h (100%) rename components/esp_rom/{ => esp32c2}/include/esp32c2/rom/lldesc.h (100%) rename components/esp_rom/{ => esp32c2}/include/esp32c2/rom/rom_layout.h (100%) rename components/esp_rom/{ => esp32c2}/include/esp32c2/rom/rtc.h (100%) rename components/esp_rom/{ => esp32c2}/include/esp32c2/rom/secure_boot.h (100%) rename components/esp_rom/{ => esp32c2}/include/esp32c2/rom/sha.h (100%) rename components/esp_rom/{ => esp32c2}/include/esp32c2/rom/spi_flash.h (99%) rename components/esp_rom/{ => esp32c2}/include/esp32c2/rom/uart.h (98%) rename components/esp_rom/{ => esp32c3}/include/esp32c3/rom/aes.h (100%) rename components/esp_rom/{ => esp32c3}/include/esp32c3/rom/apb_backup_dma.h (100%) rename components/esp_rom/{ => esp32c3}/include/esp32c3/rom/bigint.h (54%) rename components/esp_rom/{ => esp32c3}/include/esp32c3/rom/cache.h (99%) rename components/esp_rom/{ => esp32c3}/include/esp32c3/rom/crc.h (81%) rename components/esp_rom/{ => esp32c3}/include/esp32c3/rom/digital_signature.h (89%) rename components/esp_rom/{ => esp32c3}/include/esp32c3/rom/efuse.h (99%) rename components/esp_rom/{ => esp32c3}/include/esp32c3/rom/esp_flash.h (64%) rename components/esp_rom/{ => esp32c3}/include/esp32c3/rom/ets_sys.h (97%) rename components/esp_rom/{ => esp32c3}/include/esp32c3/rom/gpio.h (98%) rename components/esp_rom/{include/esp32s2 => esp32c3/include/esp32c3}/rom/hmac.h (71%) rename components/esp_rom/{ => esp32c3}/include/esp32c3/rom/libc_stubs.h (100%) rename components/esp_rom/{ => esp32c3}/include/esp32c3/rom/lldesc.h (100%) rename components/esp_rom/{ => esp32c3}/include/esp32c3/rom/md5_hash.h (100%) rename components/esp_rom/{ => esp32c3}/include/esp32c3/rom/rom_layout.h (100%) rename components/esp_rom/{ => esp32c3}/include/esp32c3/rom/rsa_pss.h (54%) rename components/esp_rom/{ => esp32c3}/include/esp32c3/rom/rtc.h (100%) rename components/esp_rom/{ => esp32c3}/include/esp32c3/rom/secure_boot.h (100%) rename components/esp_rom/{ => esp32c3}/include/esp32c3/rom/sha.h (65%) rename components/esp_rom/{ => esp32c3}/include/esp32c3/rom/spi_flash.h (99%) rename components/esp_rom/{ => esp32c3}/include/esp32c3/rom/tjpgd.h (94%) rename components/esp_rom/{ => esp32c3}/include/esp32c3/rom/uart.h (98%) rename components/esp_rom/{ => esp32c5}/include/esp32c5/rom/aes.h (100%) rename components/esp_rom/{ => esp32c5}/include/esp32c5/rom/bigint.h (100%) rename components/esp_rom/{ => esp32c5}/include/esp32c5/rom/cache.h (100%) rename components/esp_rom/{ => esp32c5}/include/esp32c5/rom/crc.h (100%) rename components/esp_rom/{ => esp32c5}/include/esp32c5/rom/digital_signature.h (100%) rename components/esp_rom/{ => esp32c5}/include/esp32c5/rom/ecdsa.h (100%) rename components/esp_rom/{ => esp32c5}/include/esp32c5/rom/efuse.h (100%) rename components/esp_rom/{ => esp32c5}/include/esp32c5/rom/esp_flash.h (100%) rename components/esp_rom/{ => esp32c5}/include/esp32c5/rom/ets_sys.h (100%) rename components/esp_rom/{ => esp32c5}/include/esp32c5/rom/gpio.h (100%) rename components/esp_rom/{ => esp32c5}/include/esp32c5/rom/hmac.h (100%) rename components/esp_rom/{ => esp32c5}/include/esp32c5/rom/libc_stubs.h (100%) rename components/esp_rom/{ => esp32c5}/include/esp32c5/rom/lldesc.h (100%) rename components/esp_rom/{ => esp32c5}/include/esp32c5/rom/md5_hash.h (100%) rename components/esp_rom/{ => esp32c5}/include/esp32c5/rom/opi_flash.h (100%) rename components/esp_rom/{ => esp32c5}/include/esp32c5/rom/rom_layout.h (100%) rename components/esp_rom/{ => esp32c5}/include/esp32c5/rom/rsa_pss.h (100%) rename components/esp_rom/{ => esp32c5}/include/esp32c5/rom/rtc.h (100%) rename components/esp_rom/{ => esp32c5}/include/esp32c5/rom/secure_boot.h (100%) rename components/esp_rom/{ => esp32c5}/include/esp32c5/rom/sha.h (100%) rename components/esp_rom/{ => esp32c5}/include/esp32c5/rom/spi_flash.h (100%) rename components/esp_rom/{ => esp32c5}/include/esp32c5/rom/tjpgd.h (100%) rename components/esp_rom/{ => esp32c5}/include/esp32c5/rom/uart.h (100%) rename components/esp_rom/{ => esp32c6}/include/esp32c6/rom/aes.h (100%) rename components/esp_rom/{ => esp32c6}/include/esp32c6/rom/bigint.h (100%) rename components/esp_rom/{ => esp32c6}/include/esp32c6/rom/cache.h (99%) rename components/esp_rom/{ => esp32c6}/include/esp32c6/rom/crc.h (100%) rename components/esp_rom/{ => esp32c6}/include/esp32c6/rom/digital_signature.h (100%) rename components/esp_rom/{ => esp32c6}/include/esp32c6/rom/ecdsa.h (100%) rename components/esp_rom/{ => esp32c6}/include/esp32c6/rom/efuse.h (99%) rename components/esp_rom/{ => esp32c6}/include/esp32c6/rom/esp_flash.h (100%) rename components/esp_rom/{ => esp32c6}/include/esp32c6/rom/ets_sys.h (97%) rename components/esp_rom/{ => esp32c6}/include/esp32c6/rom/gpio.h (98%) rename components/esp_rom/{ => esp32c6}/include/esp32c6/rom/hmac.h (100%) rename components/esp_rom/{ => esp32c6}/include/esp32c6/rom/libc_stubs.h (100%) rename components/esp_rom/{ => esp32c6}/include/esp32c6/rom/lldesc.h (100%) rename components/esp_rom/{ => esp32c6}/include/esp32c6/rom/md5_hash.h (100%) rename components/esp_rom/{ => esp32c6}/include/esp32c6/rom/rom_layout.h (100%) rename components/esp_rom/{ => esp32c6}/include/esp32c6/rom/rsa_pss.h (100%) rename components/esp_rom/{ => esp32c6}/include/esp32c6/rom/rtc.h (100%) rename components/esp_rom/{ => esp32c6}/include/esp32c6/rom/secure_boot.h (100%) rename components/esp_rom/{ => esp32c6}/include/esp32c6/rom/sha.h (100%) rename components/esp_rom/{include/esp32h2 => esp32c6/include/esp32c6}/rom/spi_flash.h (99%) rename components/esp_rom/{ => esp32c6}/include/esp32c6/rom/tjpgd.h (94%) rename components/esp_rom/{ => esp32c6}/include/esp32c6/rom/uart.h (97%) rename components/esp_rom/{ => esp32c61}/include/esp32c61/rom/bigint.h (100%) rename components/esp_rom/{ => esp32c61}/include/esp32c61/rom/cache.h (100%) rename components/esp_rom/{ => esp32c61}/include/esp32c61/rom/crc.h (100%) rename components/esp_rom/{ => esp32c61}/include/esp32c61/rom/ecdsa.h (100%) rename components/esp_rom/{ => esp32c61}/include/esp32c61/rom/efuse.h (99%) rename components/esp_rom/{ => esp32c61}/include/esp32c61/rom/esp_flash.h (100%) rename components/esp_rom/{ => esp32c61}/include/esp32c61/rom/ets_sys.h (97%) rename components/esp_rom/{ => esp32c61}/include/esp32c61/rom/gpio.h (100%) rename components/esp_rom/{ => esp32c61}/include/esp32c61/rom/libc_stubs.h (100%) rename components/esp_rom/{ => esp32c61}/include/esp32c61/rom/lldesc.h (100%) rename components/esp_rom/{ => esp32c61}/include/esp32c61/rom/md5_hash.h (100%) rename components/esp_rom/{ => esp32c61}/include/esp32c61/rom/opi_flash.h (98%) rename components/esp_rom/{ => esp32c61}/include/esp32c61/rom/rom_layout.h (100%) rename components/esp_rom/{ => esp32c61}/include/esp32c61/rom/rtc.h (100%) rename components/esp_rom/{ => esp32c61}/include/esp32c61/rom/secure_boot.h (100%) rename components/esp_rom/{ => esp32c61}/include/esp32c61/rom/sha.h (100%) rename components/esp_rom/{ => esp32c61}/include/esp32c61/rom/spi_flash.h (99%) rename components/esp_rom/{ => esp32c61}/include/esp32c61/rom/tjpgd.h (94%) rename components/esp_rom/{ => esp32c61}/include/esp32c61/rom/uart.h (97%) rename components/esp_rom/{ => esp32h2}/include/esp32h2/rom/aes.h (100%) rename components/esp_rom/{ => esp32h2}/include/esp32h2/rom/bigint.h (100%) rename components/esp_rom/{ => esp32h2}/include/esp32h2/rom/cache.h (99%) rename components/esp_rom/{ => esp32h2}/include/esp32h2/rom/crc.h (100%) rename components/esp_rom/{ => esp32h2}/include/esp32h2/rom/digital_signature.h (100%) rename components/esp_rom/{ => esp32h2}/include/esp32h2/rom/ecdsa.h (100%) rename components/esp_rom/{ => esp32h2}/include/esp32h2/rom/efuse.h (99%) rename components/esp_rom/{ => esp32h2}/include/esp32h2/rom/esp_flash.h (100%) rename components/esp_rom/{ => esp32h2}/include/esp32h2/rom/ets_sys.h (97%) rename components/esp_rom/{ => esp32h2}/include/esp32h2/rom/gpio.h (98%) rename components/esp_rom/{ => esp32h2}/include/esp32h2/rom/hmac.h (100%) rename components/esp_rom/{ => esp32h2}/include/esp32h2/rom/libc_stubs.h (100%) rename components/esp_rom/{ => esp32h2}/include/esp32h2/rom/lldesc.h (100%) rename components/esp_rom/{ => esp32h2}/include/esp32h2/rom/md5_hash.h (100%) rename components/esp_rom/{ => esp32h2}/include/esp32h2/rom/rom_layout.h (100%) rename components/esp_rom/{ => esp32h2}/include/esp32h2/rom/rsa_pss.h (100%) rename components/esp_rom/{ => esp32h2}/include/esp32h2/rom/rtc.h (100%) rename components/esp_rom/{ => esp32h2}/include/esp32h2/rom/secure_boot.h (100%) rename components/esp_rom/{ => esp32h2}/include/esp32h2/rom/sha.h (100%) rename components/esp_rom/{include/esp32c6 => esp32h2/include/esp32h2}/rom/spi_flash.h (99%) rename components/esp_rom/{ => esp32h2}/include/esp32h2/rom/uart.h (97%) rename components/esp_rom/{ => esp32p4}/include/esp32p4/rom/aes.h (100%) rename components/esp_rom/{ => esp32p4}/include/esp32p4/rom/bigint.h (100%) rename components/esp_rom/{ => esp32p4}/include/esp32p4/rom/cache.h (99%) rename components/esp_rom/{ => esp32p4}/include/esp32p4/rom/crc.h (100%) rename components/esp_rom/{ => esp32p4}/include/esp32p4/rom/digital_signature.h (100%) rename components/esp_rom/{ => esp32p4}/include/esp32p4/rom/ecdsa.h (100%) rename components/esp_rom/{ => esp32p4}/include/esp32p4/rom/efuse.h (99%) rename components/esp_rom/{ => esp32p4}/include/esp32p4/rom/esp_flash.h (100%) rename components/esp_rom/{ => esp32p4}/include/esp32p4/rom/ets_sys.h (96%) rename components/esp_rom/{ => esp32p4}/include/esp32p4/rom/gpio.h (98%) rename components/esp_rom/{ => esp32p4}/include/esp32p4/rom/hmac.h (100%) rename components/esp_rom/{ => esp32p4}/include/esp32p4/rom/key_mgr.h (100%) rename components/esp_rom/{ => esp32p4}/include/esp32p4/rom/km.h (100%) rename components/esp_rom/{ => esp32p4}/include/esp32p4/rom/libc_stubs.h (100%) rename components/esp_rom/{ => esp32p4}/include/esp32p4/rom/lldesc.h (100%) rename components/esp_rom/{ => esp32p4}/include/esp32p4/rom/md5_hash.h (100%) rename components/esp_rom/{ => esp32p4}/include/esp32p4/rom/opi_flash.h (98%) rename components/esp_rom/{ => esp32p4}/include/esp32p4/rom/rom_layout.h (100%) rename components/esp_rom/{ => esp32p4}/include/esp32p4/rom/rsa_pss.h (100%) rename components/esp_rom/{ => esp32p4}/include/esp32p4/rom/rtc.h (100%) rename components/esp_rom/{ => esp32p4}/include/esp32p4/rom/secure_boot.h (100%) rename components/esp_rom/{ => esp32p4}/include/esp32p4/rom/sha.h (100%) rename components/esp_rom/{ => esp32p4}/include/esp32p4/rom/spi_flash.h (99%) rename components/esp_rom/{ => esp32p4}/include/esp32p4/rom/uart.h (98%) rename components/esp_rom/{ => esp32s2}/include/esp32s2/rom/aes.h (59%) rename components/esp_rom/{ => esp32s2}/include/esp32s2/rom/bigint.h (59%) rename components/esp_rom/{ => esp32s2}/include/esp32s2/rom/cache.h (99%) rename components/esp_rom/{ => esp32s2}/include/esp32s2/rom/crc.h (72%) rename components/esp_rom/{ => esp32s2}/include/esp32s2/rom/digital_signature.h (89%) rename components/esp_rom/{ => esp32s2}/include/esp32s2/rom/efuse.h (99%) rename components/esp_rom/{ => esp32s2}/include/esp32s2/rom/ets_sys.h (100%) rename components/esp_rom/{ => esp32s2}/include/esp32s2/rom/gpio.h (97%) rename components/esp_rom/{include/esp32c3 => esp32s2/include/esp32s2}/rom/hmac.h (71%) rename components/esp_rom/{ => esp32s2}/include/esp32s2/rom/libc_stubs.h (100%) rename components/esp_rom/{ => esp32s2}/include/esp32s2/rom/lldesc.h (100%) rename components/esp_rom/{ => esp32s2}/include/esp32s2/rom/md5_hash.h (100%) rename components/esp_rom/{ => esp32s2}/include/esp32s2/rom/opi_flash.h (98%) rename components/esp_rom/{ => esp32s2}/include/esp32s2/rom/rsa_pss.h (53%) rename components/esp_rom/{ => esp32s2}/include/esp32s2/rom/rtc.h (100%) rename components/esp_rom/{ => esp32s2}/include/esp32s2/rom/secure_boot.h (100%) rename components/esp_rom/{ => esp32s2}/include/esp32s2/rom/sha.h (70%) rename components/esp_rom/{ => esp32s2}/include/esp32s2/rom/spi_flash.h (99%) rename components/esp_rom/{ => esp32s2}/include/esp32s2/rom/uart.h (98%) rename components/esp_rom/{ => esp32s2}/include/esp32s2/rom/usb/cdc_acm.h (100%) rename components/esp_rom/{ => esp32s2}/include/esp32s2/rom/usb/chip_usb_dw_wrapper.h (100%) rename components/esp_rom/{ => esp32s2}/include/esp32s2/rom/usb/cpio.h (100%) rename components/esp_rom/{ => esp32s2}/include/esp32s2/rom/usb/usb_cdc.h (100%) rename components/esp_rom/{ => esp32s2}/include/esp32s2/rom/usb/usb_common.h (100%) rename components/esp_rom/{ => esp32s2}/include/esp32s2/rom/usb/usb_dc.h (99%) rename components/esp_rom/{ => esp32s2}/include/esp32s2/rom/usb/usb_descriptor.h (100%) rename components/esp_rom/{include/esp32s3 => esp32s2/include/esp32s2}/rom/usb/usb_device.h (99%) rename components/esp_rom/{ => esp32s2}/include/esp32s2/rom/usb/usb_dfu.h (100%) rename components/esp_rom/{ => esp32s2}/include/esp32s2/rom/usb/usb_os_glue.h (100%) rename components/esp_rom/{ => esp32s2}/include/esp32s2/rom/usb/usb_persist.h (100%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/aes.h (100%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/apb_backup_dma.h (100%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/bigint.h (51%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/cache.h (99%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/crc.h (81%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/digital_signature.h (88%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/efuse.h (99%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/ets_sys.h (98%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/gpio.h (98%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/hmac.h (70%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/libc_stubs.h (100%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/lldesc.h (100%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/md5_hash.h (100%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/opi_flash.h (98%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/rom_layout.h (100%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/rsa_pss.h (53%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/rtc.h (100%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/secure_boot.h (100%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/sha.h (65%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/spi_flash.h (99%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/tjpgd.h (94%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/uart.h (98%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/usb/cdc_acm.h (100%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/usb/chip_usb_dw_wrapper.h (100%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/usb/cpio.h (100%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/usb/usb_cdc.h (100%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/usb/usb_common.h (100%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/usb/usb_dc.h (99%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/usb/usb_descriptor.h (100%) rename components/esp_rom/{include/esp32s2 => esp32s3/include/esp32s3}/rom/usb/usb_device.h (99%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/usb/usb_dfu.h (100%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/usb/usb_os_glue.h (100%) rename components/esp_rom/{ => esp32s3}/include/esp32s3/rom/usb/usb_persist.h (100%) delete mode 100644 components/esp_rom/include/esp32/rom/miniz.h delete mode 100644 components/esp_rom/include/esp32/rom/tbconsole.h delete mode 100644 components/esp_rom/include/esp32c2/rom/miniz.h delete mode 100644 components/esp_rom/include/esp32c3/rom/miniz.h delete mode 100644 components/esp_rom/include/esp32c5/rom/miniz.h delete mode 100644 components/esp_rom/include/esp32c6/rom/miniz.h delete mode 100644 components/esp_rom/include/esp32c61/rom/miniz.h delete mode 100644 components/esp_rom/include/esp32s2/rom/miniz.h delete mode 100644 components/esp_rom/include/esp32s3/rom/miniz.h delete mode 100644 components/esp_rom/include/linux/soc/reset_reasons.h rename components/esp_rom/{ => linux}/include/linux/rom/efuse.h (100%) rename components/esp_rom/{ => linux}/include/linux/rom/ets_sys.h (100%) create mode 100644 components/esp_rom/linux/include/linux/soc/reset_reasons.h diff --git a/components/esp_coex/esp32h2/esp_coex_adapter.c b/components/esp_coex/esp32h2/esp_coex_adapter.c index 6cdfdd9bd99f..936f8f2ce84c 100644 --- a/components/esp_coex/esp32h2/esp_coex_adapter.c +++ b/components/esp_coex/esp32h2/esp_coex_adapter.c @@ -21,7 +21,7 @@ #include "soc/rtc.h" #include "esp_private/esp_clk.h" #include "private/esp_coexist_adapter.h" -#include "esp32c6/rom/ets_sys.h" +#include "esp32h2/rom/ets_sys.h" #define TAG "esp_coex_adapter" diff --git a/components/esp_rom/CMakeLists.txt b/components/esp_rom/CMakeLists.txt index 9a97104f9a44..44cb92c966fa 100644 --- a/components/esp_rom/CMakeLists.txt +++ b/components/esp_rom/CMakeLists.txt @@ -3,7 +3,8 @@ idf_build_get_property(target IDF_TARGET) set(target_folder "${target}") set(include_dirs "include" - "include/${target_folder}" + "${target_folder}/include" + "${target_folder}/include/${target_folder}" "${target_folder}") set(private_required_comp "") @@ -17,9 +18,6 @@ if(target STREQUAL "linux") "${target}/esp_rom_md5.c" "${target}/esp_rom_efuse.c") else() - if(CONFIG_IDF_TARGET_ESP32C5) - list(APPEND include_dirs "include/${target_folder}/..") - endif() list(APPEND sources "patches/esp_rom_crc.c" "patches/esp_rom_uart.c" "patches/esp_rom_spiflash.c" diff --git a/components/esp_rom/include/esp32/rom/aes.h b/components/esp_rom/esp32/include/esp32/rom/aes.h similarity index 58% rename from components/esp_rom/include/esp32/rom/aes.h rename to components/esp_rom/esp32/include/esp32/rom/aes.h index bbe13d22e47f..a517a350a81e 100644 --- a/components/esp_rom/include/esp32/rom/aes.h +++ b/components/esp_rom/esp32/include/esp32/rom/aes.h @@ -5,19 +5,11 @@ use the wrapper functions in esp32/aes.h instead. */ -// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef _ROM_AES_H_ #define _ROM_AES_H_ diff --git a/components/esp_rom/include/esp32/rom/bigint.h b/components/esp_rom/esp32/include/esp32/rom/bigint.h similarity index 67% rename from components/esp_rom/include/esp32/rom/bigint.h rename to components/esp_rom/esp32/include/esp32/rom/bigint.h index 97ad72202a33..16ed4dc1c2c4 100644 --- a/components/esp_rom/include/esp32/rom/bigint.h +++ b/components/esp_rom/esp32/include/esp32/rom/bigint.h @@ -5,19 +5,11 @@ use the wrapper functions in hwcrypto/mpi.h instead. */ -// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef _ROM_BIGINT_H_ #define _ROM_BIGINT_H_ diff --git a/components/esp_rom/include/esp32/rom/cache.h b/components/esp_rom/esp32/include/esp32/rom/cache.h similarity index 100% rename from components/esp_rom/include/esp32/rom/cache.h rename to components/esp_rom/esp32/include/esp32/rom/cache.h diff --git a/components/esp_rom/include/esp32/rom/crc.h b/components/esp_rom/esp32/include/esp32/rom/crc.h similarity index 87% rename from components/esp_rom/include/esp32/rom/crc.h rename to components/esp_rom/esp32/include/esp32/rom/crc.h index a570361176b9..16c0e0ed3e0d 100644 --- a/components/esp_rom/include/esp32/rom/crc.h +++ b/components/esp_rom/esp32/include/esp32/rom/crc.h @@ -1,16 +1,8 @@ -// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef ROM_CRC_H #define ROM_CRC_H diff --git a/components/esp_rom/include/esp32/rom/efuse.h b/components/esp_rom/esp32/include/esp32/rom/efuse.h similarity index 100% rename from components/esp_rom/include/esp32/rom/efuse.h rename to components/esp_rom/esp32/include/esp32/rom/efuse.h diff --git a/components/esp_rom/include/esp32/rom/ets_sys.h b/components/esp_rom/esp32/include/esp32/rom/ets_sys.h similarity index 97% rename from components/esp_rom/include/esp32/rom/ets_sys.h rename to components/esp_rom/esp32/include/esp32/rom/ets_sys.h index 549db8ffc638..eb73b8979559 100644 --- a/components/esp_rom/include/esp32/rom/ets_sys.h +++ b/components/esp_rom/esp32/include/esp32/rom/ets_sys.h @@ -64,11 +64,11 @@ struct ETSEventTag { ETSParam par; /**< Event parameter, sometimes without usage, then will be set as 0*/ }; -typedef void (*ETSTask)(ETSEvent *e); /**< Type of the Task processer*/ +typedef void (*ETSTask)(ETSEvent *e); /**< Type of the Task processor*/ typedef void (* ets_idle_cb_t)(void *arg); /**< Type of the system idle callback*/ /** - * @brief Start the Espressif Task Scheduler, which is an infinit loop. Please do not add code after it. + * @brief Start the Espressif Task Scheduler, which is an infinite loop. Please do not add code after it. * * @param none * @@ -88,9 +88,9 @@ void ets_run(void); void ets_set_idle_cb(ets_idle_cb_t func, void *arg); /** - * @brief Init a task with processer, priority, queue to receive Event, queue length. + * @brief Init a task with processor, priority, queue to receive Event, queue length. * - * @param ETSTask task : The task processer. + * @param ETSTask task : The task processor. * * @param uint8_t prio : Task priority, 0-31, bigger num with high priority, one priority with one task. * @@ -128,7 +128,7 @@ ETS_STATUS ets_post(uint8_t prio, ETSSignal sig, ETSParam par); * @{ */ -extern const char *const exc_cause_table[40]; ///**< excption cause that defined by the core.*/ +extern const char *const exc_cause_table[40]; ///**< exception cause that defined by the core.*/ /** * @brief Set Pro cpu Entry code, code can be called in PRO CPU when booting is not completed. @@ -230,7 +230,7 @@ int ets_printf(const char *fmt, ...); void ets_write_char_uart(char c); /** - * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need ouput. + * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need output. * To install putc1, which is defaulted installed as ets_write_char_uart in none silent boot mode, as NULL in silent mode. * * @param void (*)(char) p: Output function to install. @@ -240,7 +240,7 @@ void ets_write_char_uart(char c); void ets_install_putc1(void (*p)(char c)); /** - * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need ouput. + * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need output. * To install putc2, which is defaulted installed as NULL. * * @param void (*)(char) p: Output function to install. @@ -283,7 +283,7 @@ typedef void ETSTimerFunc(void *timer_arg);/**< timer handler*/ typedef struct _ETSTIMER_ { struct _ETSTIMER_ *timer_next; /**< timer linker*/ - uint32_t timer_expire; /**< abstruct time when timer expire*/ + uint32_t timer_expire; /**< abstract time when timer expire*/ uint32_t timer_period; /**< timer period, 0 means timer is not periodic repeated*/ ETSTimerFunc *timer_func; /**< timer handler*/ void *timer_arg; /**< timer handler argument*/ diff --git a/components/esp_rom/include/esp32/rom/gpio.h b/components/esp_rom/esp32/include/esp32/rom/gpio.h similarity index 97% rename from components/esp_rom/include/esp32/rom/gpio.h rename to components/esp_rom/esp32/include/esp32/rom/gpio.h index 62df27f02cf8..6a6b458718ab 100644 --- a/components/esp_rom/include/esp32/rom/gpio.h +++ b/components/esp_rom/esp32/include/esp32/rom/gpio.h @@ -62,7 +62,7 @@ typedef enum { * * @param uint32_t enable_mask : the gpios that need be changed. * - * @param uint32_t disable_mask : the gpios that need diable output. + * @param uint32_t disable_mask : the gpios that need disable output. * * @return None */ @@ -79,7 +79,7 @@ void gpio_output_set(uint32_t set_mask, uint32_t clear_mask, uint32_t enable_mas * * @param uint32_t enable_mask : the gpios that need be changed. * - * @param uint32_t disable_mask : the gpios that need diable output. + * @param uint32_t disable_mask : the gpios that need disable output. * * @return None */ diff --git a/components/esp_rom/include/esp32/rom/libc_stubs.h b/components/esp_rom/esp32/include/esp32/rom/libc_stubs.h similarity index 100% rename from components/esp_rom/include/esp32/rom/libc_stubs.h rename to components/esp_rom/esp32/include/esp32/rom/libc_stubs.h diff --git a/components/esp_rom/include/esp32/rom/lldesc.h b/components/esp_rom/esp32/include/esp32/rom/lldesc.h similarity index 100% rename from components/esp_rom/include/esp32/rom/lldesc.h rename to components/esp_rom/esp32/include/esp32/rom/lldesc.h diff --git a/components/esp_rom/include/esp32/rom/md5_hash.h b/components/esp_rom/esp32/include/esp32/rom/md5_hash.h similarity index 100% rename from components/esp_rom/include/esp32/rom/md5_hash.h rename to components/esp_rom/esp32/include/esp32/rom/md5_hash.h diff --git a/components/esp_rom/include/esp32/rom/rsa_pss.h b/components/esp_rom/esp32/include/esp32/rom/rsa_pss.h similarity index 100% rename from components/esp_rom/include/esp32/rom/rsa_pss.h rename to components/esp_rom/esp32/include/esp32/rom/rsa_pss.h diff --git a/components/esp_rom/include/esp32/rom/rtc.h b/components/esp_rom/esp32/include/esp32/rom/rtc.h similarity index 99% rename from components/esp_rom/include/esp32/rom/rtc.h rename to components/esp_rom/esp32/include/esp32/rom/rtc.h index 101b4bf56b53..a39b2f267a47 100644 --- a/components/esp_rom/include/esp32/rom/rtc.h +++ b/components/esp_rom/esp32/include/esp32/rom/rtc.h @@ -85,7 +85,7 @@ typedef enum { TGWDT_CPU_RESET = 11, /**<11, Time Group reset CPU*/ SW_CPU_RESET = 12, /**<12, Software reset CPU*/ RTCWDT_CPU_RESET = 13, /**<13, RTC Watch dog Reset CPU*/ - EXT_CPU_RESET = 14, /**<14, for APP CPU, reseted by PRO CPU*/ + EXT_CPU_RESET = 14, /**<14, for APP CPU, reset by PRO CPU*/ RTCWDT_BROWN_OUT_RESET = 15, /**<15, Reset when the vdd voltage is not stable*/ RTCWDT_RTC_RESET = 16 /**<16, RTC Watch dog reset digital core and rtc module*/ } RESET_REASON; diff --git a/components/esp_rom/include/esp32/rom/secure_boot.h b/components/esp_rom/esp32/include/esp32/rom/secure_boot.h similarity index 100% rename from components/esp_rom/include/esp32/rom/secure_boot.h rename to components/esp_rom/esp32/include/esp32/rom/secure_boot.h diff --git a/components/esp_rom/include/esp32/rom/sha.h b/components/esp_rom/esp32/include/esp32/rom/sha.h similarity index 62% rename from components/esp_rom/include/esp32/rom/sha.h rename to components/esp_rom/esp32/include/esp32/rom/sha.h index f43c19d16ac8..39d0578592d0 100644 --- a/components/esp_rom/include/esp32/rom/sha.h +++ b/components/esp_rom/esp32/include/esp32/rom/sha.h @@ -6,19 +6,11 @@ esp_sha_lock_memory_block() functions in esp32/sha.h to ensure exclusive access. */ -// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef _ROM_SHA_H_ #define _ROM_SHA_H_ diff --git a/components/esp_rom/include/esp32/rom/spi_flash.h b/components/esp_rom/esp32/include/esp32/rom/spi_flash.h similarity index 100% rename from components/esp_rom/include/esp32/rom/spi_flash.h rename to components/esp_rom/esp32/include/esp32/rom/spi_flash.h diff --git a/components/esp_rom/esp32/include/esp32/rom/tbconsole.h b/components/esp_rom/esp32/include/esp32/rom/tbconsole.h new file mode 100644 index 000000000000..cece0a83a4a9 --- /dev/null +++ b/components/esp_rom/esp32/include/esp32/rom/tbconsole.h @@ -0,0 +1,19 @@ +/* + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef _ROM_TBCONSOLE_H_ +#define _ROM_TBCONSOLE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +void start_tb_console(void); + +#ifdef __cplusplus +} +#endif + +#endif /* _ROM_TBCONSOLE_H_ */ diff --git a/components/esp_rom/include/esp32/rom/tjpgd.h b/components/esp_rom/esp32/include/esp32/rom/tjpgd.h similarity index 94% rename from components/esp_rom/include/esp32/rom/tjpgd.h rename to components/esp_rom/esp32/include/esp32/rom/tjpgd.h index 3c110a130287..0a44ebe2fbe8 100644 --- a/components/esp_rom/include/esp32/rom/tjpgd.h +++ b/components/esp_rom/esp32/include/esp32/rom/tjpgd.h @@ -71,7 +71,7 @@ struct JDEC { BYTE msx, msy; /* MCU size in unit of block (width, height) */ BYTE qtid[3]; /* Quantization table ID of each component */ SHORT dcv[3]; /* Previous DC element of each component */ - WORD nrst; /* Restart inverval */ + WORD nrst; /* Restart interval */ UINT width, height; /* Size of the input image (pixel) */ BYTE* huffbits[2][2]; /* Huffman bit distribution tables [id][dcac] */ WORD* huffcode[2][2]; /* Huffman code word tables [id][dcac] */ @@ -80,9 +80,9 @@ struct JDEC { void* workbuf; /* Working buffer for IDCT and RGB output */ BYTE* mcubuf; /* Working buffer for the MCU */ void* pool; /* Pointer to available memory pool */ - UINT sz_pool; /* Size of momory pool (bytes available) */ + UINT sz_pool; /* Size of memory pool (bytes available) */ UINT (*infunc)(JDEC*, BYTE*, UINT);/* Pointer to jpeg stream input function */ - void* device; /* Pointer to I/O device identifiler for the session */ + void* device; /* Pointer to I/O device identifier for the session */ }; diff --git a/components/esp_rom/include/esp32/rom/uart.h b/components/esp_rom/esp32/include/esp32/rom/uart.h similarity index 100% rename from components/esp_rom/include/esp32/rom/uart.h rename to components/esp_rom/esp32/include/esp32/rom/uart.h diff --git a/components/esp_rom/include/esp32c2/rom/apb_backup_dma.h b/components/esp_rom/esp32c2/include/esp32c2/rom/apb_backup_dma.h similarity index 100% rename from components/esp_rom/include/esp32c2/rom/apb_backup_dma.h rename to components/esp_rom/esp32c2/include/esp32c2/rom/apb_backup_dma.h diff --git a/components/esp_rom/include/esp32c2/rom/cache.h b/components/esp_rom/esp32c2/include/esp32c2/rom/cache.h similarity index 99% rename from components/esp_rom/include/esp32c2/rom/cache.h rename to components/esp_rom/esp32c2/include/esp32c2/rom/cache.h index 51e38469bed2..39d6bbf9f76e 100644 --- a/components/esp_rom/include/esp32c2/rom/cache.h +++ b/components/esp_rom/esp32c2/include/esp32c2/rom/cache.h @@ -445,7 +445,7 @@ void Cache_Travel_Tag_Memory(struct cache_mode * mode, uint32_t filter_addr, voi * * @param struct cache_mode * mode : the cache to calculate the virtual address and the cache mode. * - * @param uint32_t tag : the tag part fo a tag item, 12-14 bits. + * @param uint32_t tag : the tag part of a tag item, 12-14 bits. * * @param uint32_t addr_offset : the virtual address offset of the cache ways. * diff --git a/components/esp_rom/include/esp32c2/rom/crc.h b/components/esp_rom/esp32c2/include/esp32c2/rom/crc.h similarity index 100% rename from components/esp_rom/include/esp32c2/rom/crc.h rename to components/esp_rom/esp32c2/include/esp32c2/rom/crc.h diff --git a/components/esp_rom/include/esp32c2/rom/ecdsa.h b/components/esp_rom/esp32c2/include/esp32c2/rom/ecdsa.h similarity index 100% rename from components/esp_rom/include/esp32c2/rom/ecdsa.h rename to components/esp_rom/esp32c2/include/esp32c2/rom/ecdsa.h diff --git a/components/esp_rom/include/esp32c2/rom/efuse.h b/components/esp_rom/esp32c2/include/esp32c2/rom/efuse.h similarity index 98% rename from components/esp_rom/include/esp32c2/rom/efuse.h rename to components/esp_rom/esp32c2/include/esp32c2/rom/efuse.h index d4f5f8f3900d..bb838a67532b 100644 --- a/components/esp_rom/include/esp32c2/rom/efuse.h +++ b/components/esp_rom/esp32c2/include/esp32c2/rom/efuse.h @@ -39,7 +39,7 @@ typedef enum { } ets_efuse_block_t; /** - * @brief set timing accroding the apb clock, so no read error or write error happens. + * @brief set timing according the apb clock, so no read error or write error happens. * * @param clock: apb clock in HZ, only accept 5M(in FPGA), 10M(in FPGA), 20M, 40M, 80M. * @@ -162,7 +162,7 @@ bool ets_efuse_download_modes_disabled(void); * - 0 for uart force print. * - 1 for uart print when GPIO8 is low when digital reset. * 2 for uart print when GPIO8 is high when digital reset. - * 3 for uart force slient + * 3 for uart force silent */ uint32_t ets_efuse_get_uart_print_control(void); diff --git a/components/esp_rom/include/esp32c2/rom/esp_flash.h b/components/esp_rom/esp32c2/include/esp32c2/rom/esp_flash.h similarity index 100% rename from components/esp_rom/include/esp32c2/rom/esp_flash.h rename to components/esp_rom/esp32c2/include/esp32c2/rom/esp_flash.h diff --git a/components/esp_rom/include/esp32c2/rom/ets_sys.h b/components/esp_rom/esp32c2/include/esp32c2/rom/ets_sys.h similarity index 100% rename from components/esp_rom/include/esp32c2/rom/ets_sys.h rename to components/esp_rom/esp32c2/include/esp32c2/rom/ets_sys.h diff --git a/components/esp_rom/include/esp32c2/rom/gpio.h b/components/esp_rom/esp32c2/include/esp32c2/rom/gpio.h similarity index 98% rename from components/esp_rom/include/esp32c2/rom/gpio.h rename to components/esp_rom/esp32c2/include/esp32c2/rom/gpio.h index 1c4a803d1426..6cd67cf964e2 100644 --- a/components/esp_rom/include/esp32c2/rom/gpio.h +++ b/components/esp_rom/esp32c2/include/esp32c2/rom/gpio.h @@ -57,7 +57,7 @@ typedef enum { * * @param uint32_t enable_mask : the gpios that need be changed. * - * @param uint32_t disable_mask : the gpios that need diable output. + * @param uint32_t disable_mask : the gpios that need disable output. * * @return None */ diff --git a/components/esp_rom/include/esp32c2/rom/libc_stubs.h b/components/esp_rom/esp32c2/include/esp32c2/rom/libc_stubs.h similarity index 100% rename from components/esp_rom/include/esp32c2/rom/libc_stubs.h rename to components/esp_rom/esp32c2/include/esp32c2/rom/libc_stubs.h diff --git a/components/esp_rom/include/esp32c2/rom/lldesc.h b/components/esp_rom/esp32c2/include/esp32c2/rom/lldesc.h similarity index 100% rename from components/esp_rom/include/esp32c2/rom/lldesc.h rename to components/esp_rom/esp32c2/include/esp32c2/rom/lldesc.h diff --git a/components/esp_rom/include/esp32c2/rom/rom_layout.h b/components/esp_rom/esp32c2/include/esp32c2/rom/rom_layout.h similarity index 100% rename from components/esp_rom/include/esp32c2/rom/rom_layout.h rename to components/esp_rom/esp32c2/include/esp32c2/rom/rom_layout.h diff --git a/components/esp_rom/include/esp32c2/rom/rtc.h b/components/esp_rom/esp32c2/include/esp32c2/rom/rtc.h similarity index 100% rename from components/esp_rom/include/esp32c2/rom/rtc.h rename to components/esp_rom/esp32c2/include/esp32c2/rom/rtc.h diff --git a/components/esp_rom/include/esp32c2/rom/secure_boot.h b/components/esp_rom/esp32c2/include/esp32c2/rom/secure_boot.h similarity index 100% rename from components/esp_rom/include/esp32c2/rom/secure_boot.h rename to components/esp_rom/esp32c2/include/esp32c2/rom/secure_boot.h diff --git a/components/esp_rom/include/esp32c2/rom/sha.h b/components/esp_rom/esp32c2/include/esp32c2/rom/sha.h similarity index 100% rename from components/esp_rom/include/esp32c2/rom/sha.h rename to components/esp_rom/esp32c2/include/esp32c2/rom/sha.h diff --git a/components/esp_rom/include/esp32c2/rom/spi_flash.h b/components/esp_rom/esp32c2/include/esp32c2/rom/spi_flash.h similarity index 99% rename from components/esp_rom/include/esp32c2/rom/spi_flash.h rename to components/esp_rom/esp32c2/include/esp32c2/rom/spi_flash.h index 4c03ad36e233..f61a9e8d0bc5 100644 --- a/components/esp_rom/include/esp32c2/rom/spi_flash.h +++ b/components/esp_rom/esp32c2/include/esp32c2/rom/spi_flash.h @@ -434,7 +434,7 @@ void esp_rom_spiflash_fix_dummylen(uint8_t spi, uint8_t freqdiv); * * @param uint8_t *drvs: drvs[0]-bit[3:0] for cpiclk, bit[7:4] for spiq, drvs[1]-bit[3:0] for spid, drvs[1]-bit[7:4] for spid * drvs[2]-bit[3:0] for spihd, drvs[2]-bit[7:4] for spiwp. - * Values usually read from falsh by rom code, function usually callde by rom code. + * Values usually read from flash by rom code, function usually called by rom code. * if value with bit(3) set, the value is valid, bit[2:0] is the real value. * * @return None diff --git a/components/esp_rom/include/esp32c2/rom/uart.h b/components/esp_rom/esp32c2/include/esp32c2/rom/uart.h similarity index 98% rename from components/esp_rom/include/esp32c2/rom/uart.h rename to components/esp_rom/esp32c2/include/esp32c2/rom/uart.h index 454e0d83a11b..818e291fd34c 100644 --- a/components/esp_rom/include/esp32c2/rom/uart.h +++ b/components/esp_rom/esp32c2/include/esp32c2/rom/uart.h @@ -28,7 +28,7 @@ extern "C" { #define RX_BUFF_SIZE 0x400 #define TX_BUFF_SIZE 100 -//uart int enalbe register ctrl bits +//uart int enable register ctrl bits #define UART_RCV_INTEN BIT0 #define UART_TRX_INTEN BIT1 #define UART_LINE_STATUS_INTEN BIT2 @@ -263,7 +263,7 @@ char uart_rx_one_char_block(void); * * @param uint8_t *pString : the pointer to store the string. * - * @param uint8_t MaxStrlen : the max string length, incude '\0'. + * @param uint8_t MaxStrlen : the max string length, include '\0'. * * @return OK. */ diff --git a/components/esp_rom/include/esp32c3/rom/aes.h b/components/esp_rom/esp32c3/include/esp32c3/rom/aes.h similarity index 100% rename from components/esp_rom/include/esp32c3/rom/aes.h rename to components/esp_rom/esp32c3/include/esp32c3/rom/aes.h diff --git a/components/esp_rom/include/esp32c3/rom/apb_backup_dma.h b/components/esp_rom/esp32c3/include/esp32c3/rom/apb_backup_dma.h similarity index 100% rename from components/esp_rom/include/esp32c3/rom/apb_backup_dma.h rename to components/esp_rom/esp32c3/include/esp32c3/rom/apb_backup_dma.h diff --git a/components/esp_rom/include/esp32c3/rom/bigint.h b/components/esp_rom/esp32c3/include/esp32c3/rom/bigint.h similarity index 54% rename from components/esp_rom/include/esp32c3/rom/bigint.h rename to components/esp_rom/esp32c3/include/esp32c3/rom/bigint.h index b63172ea7f72..fbcfd46d81c3 100644 --- a/components/esp_rom/include/esp32c3/rom/bigint.h +++ b/components/esp_rom/esp32c3/include/esp32c3/rom/bigint.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef _ROM_BIGINT_H_ #define _ROM_BIGINT_H_ diff --git a/components/esp_rom/include/esp32c3/rom/cache.h b/components/esp_rom/esp32c3/include/esp32c3/rom/cache.h similarity index 99% rename from components/esp_rom/include/esp32c3/rom/cache.h rename to components/esp_rom/esp32c3/include/esp32c3/rom/cache.h index 148f47427fec..2711cc376467 100644 --- a/components/esp_rom/include/esp32c3/rom/cache.h +++ b/components/esp_rom/esp32c3/include/esp32c3/rom/cache.h @@ -605,7 +605,7 @@ void Cache_Travel_Tag_Memory(struct cache_mode * mode, uint32_t filter_addr, voi * * @param struct cache_mode * mode : the cache to calculate the virtual address and the cache mode. * - * @param uint32_t tag : the tag part fo a tag item, 12-14 bits. + * @param uint32_t tag : the tag part of a tag item, 12-14 bits. * * @param uint32_t addr_offset : the virtual address offset of the cache ways. * diff --git a/components/esp_rom/include/esp32c3/rom/crc.h b/components/esp_rom/esp32c3/include/esp32c3/rom/crc.h similarity index 81% rename from components/esp_rom/include/esp32c3/rom/crc.h rename to components/esp_rom/esp32c3/include/esp32c3/rom/crc.h index e683f4fd4194..549db7158c84 100644 --- a/components/esp_rom/include/esp32c3/rom/crc.h +++ b/components/esp_rom/esp32c3/include/esp32c3/rom/crc.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef ROM_CRC_H #define ROM_CRC_H diff --git a/components/esp_rom/include/esp32c3/rom/digital_signature.h b/components/esp_rom/esp32c3/include/esp32c3/rom/digital_signature.h similarity index 89% rename from components/esp_rom/include/esp32c3/rom/digital_signature.h rename to components/esp_rom/esp32c3/include/esp32c3/rom/digital_signature.h index 54c01681d40b..0d8778101e5f 100644 --- a/components/esp_rom/include/esp32c3/rom/digital_signature.h +++ b/components/esp_rom/esp32c3/include/esp32c3/rom/digital_signature.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_rom/include/esp32c3/rom/efuse.h b/components/esp_rom/esp32c3/include/esp32c3/rom/efuse.h similarity index 99% rename from components/esp_rom/include/esp32c3/rom/efuse.h rename to components/esp_rom/esp32c3/include/esp32c3/rom/efuse.h index 912af40d96cb..cf2767b7d5b2 100644 --- a/components/esp_rom/include/esp32c3/rom/efuse.h +++ b/components/esp_rom/esp32c3/include/esp32c3/rom/efuse.h @@ -55,7 +55,7 @@ typedef enum { } ets_efuse_block_t; /** - * @brief set timing accroding the apb clock, so no read error or write error happens. + * @brief set timing according the apb clock, so no read error or write error happens. * * @param clock: apb clock in HZ, only accept 5M(in FPGA), 10M(in FPGA), 20M, 40M, 80M. * @@ -208,7 +208,7 @@ bool ets_efuse_legacy_spi_boot_mode_disabled(void); * - 0 for uart force print. * - 1 for uart print when GPIO8 is low when digital reset. * 2 for uart print when GPIO8 is high when digital reset. - * 3 for uart force slient + * 3 for uart force silent */ uint32_t ets_efuse_get_uart_print_control(void); diff --git a/components/esp_rom/include/esp32c3/rom/esp_flash.h b/components/esp_rom/esp32c3/include/esp32c3/rom/esp_flash.h similarity index 64% rename from components/esp_rom/include/esp32c3/rom/esp_flash.h rename to components/esp_rom/esp32c3/include/esp32c3/rom/esp_flash.h index 40e5872c0907..3b1c97b2e848 100644 --- a/components/esp_rom/include/esp32c3/rom/esp_flash.h +++ b/components/esp_rom/esp32c3/include/esp32c3/rom/esp_flash.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_rom/include/esp32c3/rom/ets_sys.h b/components/esp_rom/esp32c3/include/esp32c3/rom/ets_sys.h similarity index 97% rename from components/esp_rom/include/esp32c3/rom/ets_sys.h rename to components/esp_rom/esp32c3/include/esp32c3/rom/ets_sys.h index 06b3b47d8c25..96ade75932ad 100644 --- a/components/esp_rom/include/esp32c3/rom/ets_sys.h +++ b/components/esp_rom/esp32c3/include/esp32c3/rom/ets_sys.h @@ -61,7 +61,7 @@ struct ETSEventTag { ETSParam par; /**< Event parameter, sometimes without usage, then will be set as 0*/ }; -typedef void (*ETSTask)(ETSEvent *e); /**< Type of the Task processer*/ +typedef void (*ETSTask)(ETSEvent *e); /**< Type of the Task processor*/ typedef void (* ets_idle_cb_t)(void *arg); /**< Type of the system idle callback*/ @@ -80,7 +80,7 @@ typedef void (* ets_idle_cb_t)(void *arg); /**< Type of the system idle callbac * @{ */ -extern const char *const exc_cause_table[40]; ///**< excption cause that defined by the core.*/ +extern const char *const exc_cause_table[40]; ///**< exception cause that defined by the core.*/ /** * @brief Set Pro cpu Entry code, code can be called in PRO CPU when booting is not completed. @@ -125,7 +125,7 @@ int ets_printf(const char *fmt, ...); uint8_t ets_get_printf_channel(void); /** - * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need ouput. + * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need output. * To install putc1, which is defaulted installed as ets_write_char_uart in none silent boot mode, as NULL in silent mode. * * @param void (*)(char) p: Output function to install. @@ -135,7 +135,7 @@ uint8_t ets_get_printf_channel(void); void ets_install_putc1(void (*p)(char c)); /** - * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need ouput. + * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need output. * To install putc2, which is defaulted installed as NULL. * * @param void (*)(char) p: Output function to install. @@ -178,7 +178,7 @@ typedef void ETSTimerFunc(void *timer_arg);/**< timer handler*/ typedef struct _ETSTIMER_ { struct _ETSTIMER_ *timer_next; /**< timer linker*/ - uint32_t timer_expire; /**< abstruct time when timer expire*/ + uint32_t timer_expire; /**< abstract time when timer expire*/ uint32_t timer_period; /**< timer period, 0 means timer is not periodic repeated*/ ETSTimerFunc *timer_func; /**< timer handler*/ void *timer_arg; /**< timer handler argument*/ diff --git a/components/esp_rom/include/esp32c3/rom/gpio.h b/components/esp_rom/esp32c3/include/esp32c3/rom/gpio.h similarity index 98% rename from components/esp_rom/include/esp32c3/rom/gpio.h rename to components/esp_rom/esp32c3/include/esp32c3/rom/gpio.h index 39c2564f3b25..8bbb1ce8eb5e 100644 --- a/components/esp_rom/include/esp32c3/rom/gpio.h +++ b/components/esp_rom/esp32c3/include/esp32c3/rom/gpio.h @@ -57,7 +57,7 @@ typedef enum { * * @param uint32_t enable_mask : the gpios that need be changed. * - * @param uint32_t disable_mask : the gpios that need diable output. + * @param uint32_t disable_mask : the gpios that need disable output. * * @return None */ diff --git a/components/esp_rom/include/esp32s2/rom/hmac.h b/components/esp_rom/esp32c3/include/esp32c3/rom/hmac.h similarity index 71% rename from components/esp_rom/include/esp32s2/rom/hmac.h rename to components/esp_rom/esp32c3/include/esp32c3/rom/hmac.h index f5f82d5b239e..7ec5dfc3c2d2 100644 --- a/components/esp_rom/include/esp32s2/rom/hmac.h +++ b/components/esp_rom/esp32c3/include/esp32c3/rom/hmac.h @@ -1,16 +1,8 @@ -// Copyright 2018 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef _ROM_HMAC_H_ #define _ROM_HMAC_H_ diff --git a/components/esp_rom/include/esp32c3/rom/libc_stubs.h b/components/esp_rom/esp32c3/include/esp32c3/rom/libc_stubs.h similarity index 100% rename from components/esp_rom/include/esp32c3/rom/libc_stubs.h rename to components/esp_rom/esp32c3/include/esp32c3/rom/libc_stubs.h diff --git a/components/esp_rom/include/esp32c3/rom/lldesc.h b/components/esp_rom/esp32c3/include/esp32c3/rom/lldesc.h similarity index 100% rename from components/esp_rom/include/esp32c3/rom/lldesc.h rename to components/esp_rom/esp32c3/include/esp32c3/rom/lldesc.h diff --git a/components/esp_rom/include/esp32c3/rom/md5_hash.h b/components/esp_rom/esp32c3/include/esp32c3/rom/md5_hash.h similarity index 100% rename from components/esp_rom/include/esp32c3/rom/md5_hash.h rename to components/esp_rom/esp32c3/include/esp32c3/rom/md5_hash.h diff --git a/components/esp_rom/include/esp32c3/rom/rom_layout.h b/components/esp_rom/esp32c3/include/esp32c3/rom/rom_layout.h similarity index 100% rename from components/esp_rom/include/esp32c3/rom/rom_layout.h rename to components/esp_rom/esp32c3/include/esp32c3/rom/rom_layout.h diff --git a/components/esp_rom/include/esp32c3/rom/rsa_pss.h b/components/esp_rom/esp32c3/include/esp32c3/rom/rsa_pss.h similarity index 54% rename from components/esp_rom/include/esp32c3/rom/rsa_pss.h rename to components/esp_rom/esp32c3/include/esp32c3/rom/rsa_pss.h index 4a838071e76e..90bf9de64fbe 100644 --- a/components/esp_rom/include/esp32c3/rom/rsa_pss.h +++ b/components/esp_rom/esp32c3/include/esp32c3/rom/rsa_pss.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef _ROM_RSA_PSS_H_ #define _ROM_RSA_PSS_H_ diff --git a/components/esp_rom/include/esp32c3/rom/rtc.h b/components/esp_rom/esp32c3/include/esp32c3/rom/rtc.h similarity index 100% rename from components/esp_rom/include/esp32c3/rom/rtc.h rename to components/esp_rom/esp32c3/include/esp32c3/rom/rtc.h diff --git a/components/esp_rom/include/esp32c3/rom/secure_boot.h b/components/esp_rom/esp32c3/include/esp32c3/rom/secure_boot.h similarity index 100% rename from components/esp_rom/include/esp32c3/rom/secure_boot.h rename to components/esp_rom/esp32c3/include/esp32c3/rom/secure_boot.h diff --git a/components/esp_rom/include/esp32c3/rom/sha.h b/components/esp_rom/esp32c3/include/esp32c3/rom/sha.h similarity index 65% rename from components/esp_rom/include/esp32c3/rom/sha.h rename to components/esp_rom/esp32c3/include/esp32c3/rom/sha.h index 54b1b21676a4..1ed5555e8496 100644 --- a/components/esp_rom/include/esp32c3/rom/sha.h +++ b/components/esp_rom/esp32c3/include/esp32c3/rom/sha.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef _ROM_SHA_H_ #define _ROM_SHA_H_ diff --git a/components/esp_rom/include/esp32c3/rom/spi_flash.h b/components/esp_rom/esp32c3/include/esp32c3/rom/spi_flash.h similarity index 99% rename from components/esp_rom/include/esp32c3/rom/spi_flash.h rename to components/esp_rom/esp32c3/include/esp32c3/rom/spi_flash.h index 5862ee724bc6..1fe10d339507 100644 --- a/components/esp_rom/include/esp32c3/rom/spi_flash.h +++ b/components/esp_rom/esp32c3/include/esp32c3/rom/spi_flash.h @@ -428,7 +428,7 @@ void esp_rom_spiflash_fix_dummylen(uint8_t spi, uint8_t freqdiv); * * @param uint8_t *drvs: drvs[0]-bit[3:0] for cpiclk, bit[7:4] for spiq, drvs[1]-bit[3:0] for spid, drvs[1]-bit[7:4] for spid * drvs[2]-bit[3:0] for spihd, drvs[2]-bit[7:4] for spiwp. - * Values usually read from falsh by rom code, function usually callde by rom code. + * Values usually read from flash by rom code, function usually called by rom code. * if value with bit(3) set, the value is valid, bit[2:0] is the real value. * * @return None diff --git a/components/esp_rom/include/esp32c3/rom/tjpgd.h b/components/esp_rom/esp32c3/include/esp32c3/rom/tjpgd.h similarity index 94% rename from components/esp_rom/include/esp32c3/rom/tjpgd.h rename to components/esp_rom/esp32c3/include/esp32c3/rom/tjpgd.h index 80d346a1cb10..56e17c62ac2f 100644 --- a/components/esp_rom/include/esp32c3/rom/tjpgd.h +++ b/components/esp_rom/esp32c3/include/esp32c3/rom/tjpgd.h @@ -71,7 +71,7 @@ struct JDEC { BYTE msx, msy; /* MCU size in unit of block (width, height) */ BYTE qtid[3]; /* Quantization table ID of each component */ SHORT dcv[3]; /* Previous DC element of each component */ - WORD nrst; /* Restart inverval */ + WORD nrst; /* Restart interval */ UINT width, height; /* Size of the input image (pixel) */ BYTE *huffbits[2][2]; /* Huffman bit distribution tables [id][dcac] */ WORD *huffcode[2][2]; /* Huffman code word tables [id][dcac] */ @@ -80,9 +80,9 @@ struct JDEC { void *workbuf; /* Working buffer for IDCT and RGB output */ BYTE *mcubuf; /* Working buffer for the MCU */ void *pool; /* Pointer to available memory pool */ - UINT sz_pool; /* Size of momory pool (bytes available) */ + UINT sz_pool; /* Size of memory pool (bytes available) */ UINT (*infunc)(JDEC *, BYTE *, UINT); /* Pointer to jpeg stream input function */ - void *device; /* Pointer to I/O device identifiler for the session */ + void *device; /* Pointer to I/O device identifier for the session */ }; diff --git a/components/esp_rom/include/esp32c3/rom/uart.h b/components/esp_rom/esp32c3/include/esp32c3/rom/uart.h similarity index 98% rename from components/esp_rom/include/esp32c3/rom/uart.h rename to components/esp_rom/esp32c3/include/esp32c3/rom/uart.h index a4fbd52077fc..fcbe425fc183 100644 --- a/components/esp_rom/include/esp32c3/rom/uart.h +++ b/components/esp_rom/esp32c3/include/esp32c3/rom/uart.h @@ -28,7 +28,7 @@ extern "C" { #define RX_BUFF_SIZE 0x400 #define TX_BUFF_SIZE 100 -//uart int enalbe register ctrl bits +//uart int enable register ctrl bits #define UART_RCV_INTEN BIT0 #define UART_TRX_INTEN BIT1 #define UART_LINE_STATUS_INTEN BIT2 @@ -253,7 +253,7 @@ char uart_rx_one_char_block(void); * * @param uint8_t *pString : the pointer to store the string. * - * @param uint8_t MaxStrlen : the max string length, incude '\0'. + * @param uint8_t MaxStrlen : the max string length, include '\0'. * * @return OK. */ diff --git a/components/esp_rom/include/esp32c5/rom/aes.h b/components/esp_rom/esp32c5/include/esp32c5/rom/aes.h similarity index 100% rename from components/esp_rom/include/esp32c5/rom/aes.h rename to components/esp_rom/esp32c5/include/esp32c5/rom/aes.h diff --git a/components/esp_rom/include/esp32c5/rom/bigint.h b/components/esp_rom/esp32c5/include/esp32c5/rom/bigint.h similarity index 100% rename from components/esp_rom/include/esp32c5/rom/bigint.h rename to components/esp_rom/esp32c5/include/esp32c5/rom/bigint.h diff --git a/components/esp_rom/include/esp32c5/rom/cache.h b/components/esp_rom/esp32c5/include/esp32c5/rom/cache.h similarity index 100% rename from components/esp_rom/include/esp32c5/rom/cache.h rename to components/esp_rom/esp32c5/include/esp32c5/rom/cache.h diff --git a/components/esp_rom/include/esp32c5/rom/crc.h b/components/esp_rom/esp32c5/include/esp32c5/rom/crc.h similarity index 100% rename from components/esp_rom/include/esp32c5/rom/crc.h rename to components/esp_rom/esp32c5/include/esp32c5/rom/crc.h diff --git a/components/esp_rom/include/esp32c5/rom/digital_signature.h b/components/esp_rom/esp32c5/include/esp32c5/rom/digital_signature.h similarity index 100% rename from components/esp_rom/include/esp32c5/rom/digital_signature.h rename to components/esp_rom/esp32c5/include/esp32c5/rom/digital_signature.h diff --git a/components/esp_rom/include/esp32c5/rom/ecdsa.h b/components/esp_rom/esp32c5/include/esp32c5/rom/ecdsa.h similarity index 100% rename from components/esp_rom/include/esp32c5/rom/ecdsa.h rename to components/esp_rom/esp32c5/include/esp32c5/rom/ecdsa.h diff --git a/components/esp_rom/include/esp32c5/rom/efuse.h b/components/esp_rom/esp32c5/include/esp32c5/rom/efuse.h similarity index 100% rename from components/esp_rom/include/esp32c5/rom/efuse.h rename to components/esp_rom/esp32c5/include/esp32c5/rom/efuse.h diff --git a/components/esp_rom/include/esp32c5/rom/esp_flash.h b/components/esp_rom/esp32c5/include/esp32c5/rom/esp_flash.h similarity index 100% rename from components/esp_rom/include/esp32c5/rom/esp_flash.h rename to components/esp_rom/esp32c5/include/esp32c5/rom/esp_flash.h diff --git a/components/esp_rom/include/esp32c5/rom/ets_sys.h b/components/esp_rom/esp32c5/include/esp32c5/rom/ets_sys.h similarity index 100% rename from components/esp_rom/include/esp32c5/rom/ets_sys.h rename to components/esp_rom/esp32c5/include/esp32c5/rom/ets_sys.h diff --git a/components/esp_rom/include/esp32c5/rom/gpio.h b/components/esp_rom/esp32c5/include/esp32c5/rom/gpio.h similarity index 100% rename from components/esp_rom/include/esp32c5/rom/gpio.h rename to components/esp_rom/esp32c5/include/esp32c5/rom/gpio.h diff --git a/components/esp_rom/include/esp32c5/rom/hmac.h b/components/esp_rom/esp32c5/include/esp32c5/rom/hmac.h similarity index 100% rename from components/esp_rom/include/esp32c5/rom/hmac.h rename to components/esp_rom/esp32c5/include/esp32c5/rom/hmac.h diff --git a/components/esp_rom/include/esp32c5/rom/libc_stubs.h b/components/esp_rom/esp32c5/include/esp32c5/rom/libc_stubs.h similarity index 100% rename from components/esp_rom/include/esp32c5/rom/libc_stubs.h rename to components/esp_rom/esp32c5/include/esp32c5/rom/libc_stubs.h diff --git a/components/esp_rom/include/esp32c5/rom/lldesc.h b/components/esp_rom/esp32c5/include/esp32c5/rom/lldesc.h similarity index 100% rename from components/esp_rom/include/esp32c5/rom/lldesc.h rename to components/esp_rom/esp32c5/include/esp32c5/rom/lldesc.h diff --git a/components/esp_rom/include/esp32c5/rom/md5_hash.h b/components/esp_rom/esp32c5/include/esp32c5/rom/md5_hash.h similarity index 100% rename from components/esp_rom/include/esp32c5/rom/md5_hash.h rename to components/esp_rom/esp32c5/include/esp32c5/rom/md5_hash.h diff --git a/components/esp_rom/include/esp32c5/rom/opi_flash.h b/components/esp_rom/esp32c5/include/esp32c5/rom/opi_flash.h similarity index 100% rename from components/esp_rom/include/esp32c5/rom/opi_flash.h rename to components/esp_rom/esp32c5/include/esp32c5/rom/opi_flash.h diff --git a/components/esp_rom/include/esp32c5/rom/rom_layout.h b/components/esp_rom/esp32c5/include/esp32c5/rom/rom_layout.h similarity index 100% rename from components/esp_rom/include/esp32c5/rom/rom_layout.h rename to components/esp_rom/esp32c5/include/esp32c5/rom/rom_layout.h diff --git a/components/esp_rom/include/esp32c5/rom/rsa_pss.h b/components/esp_rom/esp32c5/include/esp32c5/rom/rsa_pss.h similarity index 100% rename from components/esp_rom/include/esp32c5/rom/rsa_pss.h rename to components/esp_rom/esp32c5/include/esp32c5/rom/rsa_pss.h diff --git a/components/esp_rom/include/esp32c5/rom/rtc.h b/components/esp_rom/esp32c5/include/esp32c5/rom/rtc.h similarity index 100% rename from components/esp_rom/include/esp32c5/rom/rtc.h rename to components/esp_rom/esp32c5/include/esp32c5/rom/rtc.h diff --git a/components/esp_rom/include/esp32c5/rom/secure_boot.h b/components/esp_rom/esp32c5/include/esp32c5/rom/secure_boot.h similarity index 100% rename from components/esp_rom/include/esp32c5/rom/secure_boot.h rename to components/esp_rom/esp32c5/include/esp32c5/rom/secure_boot.h diff --git a/components/esp_rom/include/esp32c5/rom/sha.h b/components/esp_rom/esp32c5/include/esp32c5/rom/sha.h similarity index 100% rename from components/esp_rom/include/esp32c5/rom/sha.h rename to components/esp_rom/esp32c5/include/esp32c5/rom/sha.h diff --git a/components/esp_rom/include/esp32c5/rom/spi_flash.h b/components/esp_rom/esp32c5/include/esp32c5/rom/spi_flash.h similarity index 100% rename from components/esp_rom/include/esp32c5/rom/spi_flash.h rename to components/esp_rom/esp32c5/include/esp32c5/rom/spi_flash.h diff --git a/components/esp_rom/include/esp32c5/rom/tjpgd.h b/components/esp_rom/esp32c5/include/esp32c5/rom/tjpgd.h similarity index 100% rename from components/esp_rom/include/esp32c5/rom/tjpgd.h rename to components/esp_rom/esp32c5/include/esp32c5/rom/tjpgd.h diff --git a/components/esp_rom/include/esp32c5/rom/uart.h b/components/esp_rom/esp32c5/include/esp32c5/rom/uart.h similarity index 100% rename from components/esp_rom/include/esp32c5/rom/uart.h rename to components/esp_rom/esp32c5/include/esp32c5/rom/uart.h diff --git a/components/esp_rom/include/esp32c6/rom/aes.h b/components/esp_rom/esp32c6/include/esp32c6/rom/aes.h similarity index 100% rename from components/esp_rom/include/esp32c6/rom/aes.h rename to components/esp_rom/esp32c6/include/esp32c6/rom/aes.h diff --git a/components/esp_rom/include/esp32c6/rom/bigint.h b/components/esp_rom/esp32c6/include/esp32c6/rom/bigint.h similarity index 100% rename from components/esp_rom/include/esp32c6/rom/bigint.h rename to components/esp_rom/esp32c6/include/esp32c6/rom/bigint.h diff --git a/components/esp_rom/include/esp32c6/rom/cache.h b/components/esp_rom/esp32c6/include/esp32c6/rom/cache.h similarity index 99% rename from components/esp_rom/include/esp32c6/rom/cache.h rename to components/esp_rom/esp32c6/include/esp32c6/rom/cache.h index dfa657e865ba..7e0eaa67e76f 100644 --- a/components/esp_rom/include/esp32c6/rom/cache.h +++ b/components/esp_rom/esp32c6/include/esp32c6/rom/cache.h @@ -561,7 +561,7 @@ void Cache_Travel_Tag_Memory(struct cache_mode * mode, uint32_t filter_addr, voi * * @param struct cache_mode * mode : the cache to calculate the virtual address and the cache mode. * - * @param uint32_t tag : the tag part fo a tag item, 12-14 bits. + * @param uint32_t tag : the tag part of a tag item, 12-14 bits. * * @param uint32_t addr_offset : the virtual address offset of the cache ways. * diff --git a/components/esp_rom/include/esp32c6/rom/crc.h b/components/esp_rom/esp32c6/include/esp32c6/rom/crc.h similarity index 100% rename from components/esp_rom/include/esp32c6/rom/crc.h rename to components/esp_rom/esp32c6/include/esp32c6/rom/crc.h diff --git a/components/esp_rom/include/esp32c6/rom/digital_signature.h b/components/esp_rom/esp32c6/include/esp32c6/rom/digital_signature.h similarity index 100% rename from components/esp_rom/include/esp32c6/rom/digital_signature.h rename to components/esp_rom/esp32c6/include/esp32c6/rom/digital_signature.h diff --git a/components/esp_rom/include/esp32c6/rom/ecdsa.h b/components/esp_rom/esp32c6/include/esp32c6/rom/ecdsa.h similarity index 100% rename from components/esp_rom/include/esp32c6/rom/ecdsa.h rename to components/esp_rom/esp32c6/include/esp32c6/rom/ecdsa.h diff --git a/components/esp_rom/include/esp32c6/rom/efuse.h b/components/esp_rom/esp32c6/include/esp32c6/rom/efuse.h similarity index 99% rename from components/esp_rom/include/esp32c6/rom/efuse.h rename to components/esp_rom/esp32c6/include/esp32c6/rom/efuse.h index 6cd9f4b377ec..5854c3eb8a82 100644 --- a/components/esp_rom/include/esp32c6/rom/efuse.h +++ b/components/esp_rom/esp32c6/include/esp32c6/rom/efuse.h @@ -169,7 +169,7 @@ bool ets_efuse_download_modes_disabled(void); * - 0 for uart force print. * - 1 for uart print when GPIO8 is low when digital reset. * 2 for uart print when GPIO8 is high when digital reset. - * 3 for uart force slient + * 3 for uart force silent */ uint32_t ets_efuse_get_uart_print_control(void); diff --git a/components/esp_rom/include/esp32c6/rom/esp_flash.h b/components/esp_rom/esp32c6/include/esp32c6/rom/esp_flash.h similarity index 100% rename from components/esp_rom/include/esp32c6/rom/esp_flash.h rename to components/esp_rom/esp32c6/include/esp32c6/rom/esp_flash.h diff --git a/components/esp_rom/include/esp32c6/rom/ets_sys.h b/components/esp_rom/esp32c6/include/esp32c6/rom/ets_sys.h similarity index 97% rename from components/esp_rom/include/esp32c6/rom/ets_sys.h rename to components/esp_rom/esp32c6/include/esp32c6/rom/ets_sys.h index 7c04af3a54ce..d4b09896505c 100644 --- a/components/esp_rom/include/esp32c6/rom/ets_sys.h +++ b/components/esp_rom/esp32c6/include/esp32c6/rom/ets_sys.h @@ -61,7 +61,7 @@ struct ETSEventTag { ETSParam par; /**< Event parameter, sometimes without usage, then will be set as 0*/ }; -typedef void (*ETSTask)(ETSEvent *e); /**< Type of the Task processer*/ +typedef void (*ETSTask)(ETSEvent *e); /**< Type of the Task processor*/ typedef void (* ets_idle_cb_t)(void *arg); /**< Type of the system idle callback*/ @@ -80,7 +80,7 @@ typedef void (* ets_idle_cb_t)(void *arg); /**< Type of the system idle callbac * @{ */ -extern const char *const exc_cause_table[40]; ///**< excption cause that defined by the core.*/ +extern const char *const exc_cause_table[40]; ///**< exception cause that defined by the core.*/ /** * @brief Set Pro cpu Entry code, code can be called in PRO CPU when booting is not completed. @@ -135,7 +135,7 @@ uint8_t ets_get_printf_channel(void); void ets_write_char_uart(char c); /** - * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need ouput. + * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need output. * To install putc1, which is defaulted installed as ets_write_char_uart in none silent boot mode, as NULL in silent mode. * * @param void (*)(char) p: Output function to install. @@ -145,7 +145,7 @@ void ets_write_char_uart(char c); void ets_install_putc1(void (*p)(char c)); /** - * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need ouput. + * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need output. * To install putc2, which is defaulted installed as NULL. * * @param void (*)(char) p: Output function to install. @@ -188,7 +188,7 @@ typedef void ETSTimerFunc(void *timer_arg);/**< timer handler*/ typedef struct _ETSTIMER_ { struct _ETSTIMER_ *timer_next; /**< timer linker*/ - uint32_t timer_expire; /**< abstruct time when timer expire*/ + uint32_t timer_expire; /**< abstract time when timer expire*/ uint32_t timer_period; /**< timer period, 0 means timer is not periodic repeated*/ ETSTimerFunc *timer_func; /**< timer handler*/ void *timer_arg; /**< timer handler argument*/ diff --git a/components/esp_rom/include/esp32c6/rom/gpio.h b/components/esp_rom/esp32c6/include/esp32c6/rom/gpio.h similarity index 98% rename from components/esp_rom/include/esp32c6/rom/gpio.h rename to components/esp_rom/esp32c6/include/esp32c6/rom/gpio.h index b022c438baaa..6ac6dc21dafb 100644 --- a/components/esp_rom/include/esp32c6/rom/gpio.h +++ b/components/esp_rom/esp32c6/include/esp32c6/rom/gpio.h @@ -57,7 +57,7 @@ typedef enum { * * @param uint32_t enable_mask : the gpios that need be changed. * - * @param uint32_t disable_mask : the gpios that need diable output. + * @param uint32_t disable_mask : the gpios that need disable output. * * @return None */ diff --git a/components/esp_rom/include/esp32c6/rom/hmac.h b/components/esp_rom/esp32c6/include/esp32c6/rom/hmac.h similarity index 100% rename from components/esp_rom/include/esp32c6/rom/hmac.h rename to components/esp_rom/esp32c6/include/esp32c6/rom/hmac.h diff --git a/components/esp_rom/include/esp32c6/rom/libc_stubs.h b/components/esp_rom/esp32c6/include/esp32c6/rom/libc_stubs.h similarity index 100% rename from components/esp_rom/include/esp32c6/rom/libc_stubs.h rename to components/esp_rom/esp32c6/include/esp32c6/rom/libc_stubs.h diff --git a/components/esp_rom/include/esp32c6/rom/lldesc.h b/components/esp_rom/esp32c6/include/esp32c6/rom/lldesc.h similarity index 100% rename from components/esp_rom/include/esp32c6/rom/lldesc.h rename to components/esp_rom/esp32c6/include/esp32c6/rom/lldesc.h diff --git a/components/esp_rom/include/esp32c6/rom/md5_hash.h b/components/esp_rom/esp32c6/include/esp32c6/rom/md5_hash.h similarity index 100% rename from components/esp_rom/include/esp32c6/rom/md5_hash.h rename to components/esp_rom/esp32c6/include/esp32c6/rom/md5_hash.h diff --git a/components/esp_rom/include/esp32c6/rom/rom_layout.h b/components/esp_rom/esp32c6/include/esp32c6/rom/rom_layout.h similarity index 100% rename from components/esp_rom/include/esp32c6/rom/rom_layout.h rename to components/esp_rom/esp32c6/include/esp32c6/rom/rom_layout.h diff --git a/components/esp_rom/include/esp32c6/rom/rsa_pss.h b/components/esp_rom/esp32c6/include/esp32c6/rom/rsa_pss.h similarity index 100% rename from components/esp_rom/include/esp32c6/rom/rsa_pss.h rename to components/esp_rom/esp32c6/include/esp32c6/rom/rsa_pss.h diff --git a/components/esp_rom/include/esp32c6/rom/rtc.h b/components/esp_rom/esp32c6/include/esp32c6/rom/rtc.h similarity index 100% rename from components/esp_rom/include/esp32c6/rom/rtc.h rename to components/esp_rom/esp32c6/include/esp32c6/rom/rtc.h diff --git a/components/esp_rom/include/esp32c6/rom/secure_boot.h b/components/esp_rom/esp32c6/include/esp32c6/rom/secure_boot.h similarity index 100% rename from components/esp_rom/include/esp32c6/rom/secure_boot.h rename to components/esp_rom/esp32c6/include/esp32c6/rom/secure_boot.h diff --git a/components/esp_rom/include/esp32c6/rom/sha.h b/components/esp_rom/esp32c6/include/esp32c6/rom/sha.h similarity index 100% rename from components/esp_rom/include/esp32c6/rom/sha.h rename to components/esp_rom/esp32c6/include/esp32c6/rom/sha.h diff --git a/components/esp_rom/include/esp32h2/rom/spi_flash.h b/components/esp_rom/esp32c6/include/esp32c6/rom/spi_flash.h similarity index 99% rename from components/esp_rom/include/esp32h2/rom/spi_flash.h rename to components/esp_rom/esp32c6/include/esp32c6/rom/spi_flash.h index 2d782dee4f36..70816780e67a 100644 --- a/components/esp_rom/include/esp32h2/rom/spi_flash.h +++ b/components/esp_rom/esp32c6/include/esp32c6/rom/spi_flash.h @@ -421,7 +421,7 @@ void esp_rom_spiflash_fix_dummylen(uint8_t spi, uint8_t freqdiv); * * @param uint8_t *drvs: drvs[0]-bit[3:0] for cpiclk, bit[7:4] for spiq, drvs[1]-bit[3:0] for spid, drvs[1]-bit[7:4] for spid * drvs[2]-bit[3:0] for spihd, drvs[2]-bit[7:4] for spiwp. - * Values usually read from falsh by rom code, function usually callde by rom code. + * Values usually read from flash by rom code, function usually called by rom code. * if value with bit(3) set, the value is valid, bit[2:0] is the real value. * * @return None diff --git a/components/esp_rom/include/esp32c6/rom/tjpgd.h b/components/esp_rom/esp32c6/include/esp32c6/rom/tjpgd.h similarity index 94% rename from components/esp_rom/include/esp32c6/rom/tjpgd.h rename to components/esp_rom/esp32c6/include/esp32c6/rom/tjpgd.h index 3050f865c912..6a4d645b1175 100644 --- a/components/esp_rom/include/esp32c6/rom/tjpgd.h +++ b/components/esp_rom/esp32c6/include/esp32c6/rom/tjpgd.h @@ -76,7 +76,7 @@ struct JDEC { BYTE msx, msy; /* MCU size in unit of block (width, height) */ BYTE qtid[3]; /* Quantization table ID of each component */ SHORT dcv[3]; /* Previous DC element of each component */ - WORD nrst; /* Restart inverval */ + WORD nrst; /* Restart interval */ UINT width, height; /* Size of the input image (pixel) */ BYTE *huffbits[2][2]; /* Huffman bit distribution tables [id][dcac] */ WORD *huffcode[2][2]; /* Huffman code word tables [id][dcac] */ @@ -85,9 +85,9 @@ struct JDEC { void *workbuf; /* Working buffer for IDCT and RGB output */ BYTE *mcubuf; /* Working buffer for the MCU */ void *pool; /* Pointer to available memory pool */ - UINT sz_pool; /* Size of momory pool (bytes available) */ + UINT sz_pool; /* Size of memory pool (bytes available) */ UINT (*infunc)(JDEC *, BYTE *, UINT); /* Pointer to jpeg stream input function */ - void *device; /* Pointer to I/O device identifiler for the session */ + void *device; /* Pointer to I/O device identifier for the session */ }; diff --git a/components/esp_rom/include/esp32c6/rom/uart.h b/components/esp_rom/esp32c6/include/esp32c6/rom/uart.h similarity index 97% rename from components/esp_rom/include/esp32c6/rom/uart.h rename to components/esp_rom/esp32c6/include/esp32c6/rom/uart.h index 9045c42f6f6e..c21c0914403e 100644 --- a/components/esp_rom/include/esp32c6/rom/uart.h +++ b/components/esp_rom/esp32c6/include/esp32c6/rom/uart.h @@ -28,7 +28,7 @@ extern "C" { #define RX_BUFF_SIZE 0x400 #define TX_BUFF_SIZE 100 -//uart int enalbe register ctrl bits +//uart int enable register ctrl bits #define UART_RCV_INTEN BIT0 #define UART_TRX_INTEN BIT1 #define UART_LINE_STATUS_INTEN BIT2 @@ -263,14 +263,14 @@ char uart_rx_one_char_block(void); * * @param uint8_t *pString : the pointer to store the string. * - * @param uint8_t MaxStrlen : the max string length, incude '\0'. + * @param uint8_t MaxStrlen : the max string length, include '\0'. * * @return OK. */ ETS_STATUS UartRxString(uint8_t *pString, uint8_t MaxStrlen); /** - * @brief Process uart recevied information in the interrupt handler. + * @brief Process uart received information in the interrupt handler. * Please do not call this function in SDK. * * @param void *para : the message receive buffer. diff --git a/components/esp_rom/include/esp32c61/rom/bigint.h b/components/esp_rom/esp32c61/include/esp32c61/rom/bigint.h similarity index 100% rename from components/esp_rom/include/esp32c61/rom/bigint.h rename to components/esp_rom/esp32c61/include/esp32c61/rom/bigint.h diff --git a/components/esp_rom/include/esp32c61/rom/cache.h b/components/esp_rom/esp32c61/include/esp32c61/rom/cache.h similarity index 100% rename from components/esp_rom/include/esp32c61/rom/cache.h rename to components/esp_rom/esp32c61/include/esp32c61/rom/cache.h diff --git a/components/esp_rom/include/esp32c61/rom/crc.h b/components/esp_rom/esp32c61/include/esp32c61/rom/crc.h similarity index 100% rename from components/esp_rom/include/esp32c61/rom/crc.h rename to components/esp_rom/esp32c61/include/esp32c61/rom/crc.h diff --git a/components/esp_rom/include/esp32c61/rom/ecdsa.h b/components/esp_rom/esp32c61/include/esp32c61/rom/ecdsa.h similarity index 100% rename from components/esp_rom/include/esp32c61/rom/ecdsa.h rename to components/esp_rom/esp32c61/include/esp32c61/rom/ecdsa.h diff --git a/components/esp_rom/include/esp32c61/rom/efuse.h b/components/esp_rom/esp32c61/include/esp32c61/rom/efuse.h similarity index 99% rename from components/esp_rom/include/esp32c61/rom/efuse.h rename to components/esp_rom/esp32c61/include/esp32c61/rom/efuse.h index 2c957125798b..be4bdf9c7976 100644 --- a/components/esp_rom/include/esp32c61/rom/efuse.h +++ b/components/esp_rom/esp32c61/include/esp32c61/rom/efuse.h @@ -169,7 +169,7 @@ bool ets_efuse_download_modes_disabled(void); * - 0 for uart force print. * - 1 for uart print when GPIO8 is low when digital reset. * 2 for uart print when GPIO8 is high when digital reset. - * 3 for uart force slient + * 3 for uart force silent */ uint32_t ets_efuse_get_uart_print_control(void); diff --git a/components/esp_rom/include/esp32c61/rom/esp_flash.h b/components/esp_rom/esp32c61/include/esp32c61/rom/esp_flash.h similarity index 100% rename from components/esp_rom/include/esp32c61/rom/esp_flash.h rename to components/esp_rom/esp32c61/include/esp32c61/rom/esp_flash.h diff --git a/components/esp_rom/include/esp32c61/rom/ets_sys.h b/components/esp_rom/esp32c61/include/esp32c61/rom/ets_sys.h similarity index 97% rename from components/esp_rom/include/esp32c61/rom/ets_sys.h rename to components/esp_rom/esp32c61/include/esp32c61/rom/ets_sys.h index 516a694fcdb8..7160a95d80a9 100644 --- a/components/esp_rom/include/esp32c61/rom/ets_sys.h +++ b/components/esp_rom/esp32c61/include/esp32c61/rom/ets_sys.h @@ -61,7 +61,7 @@ struct ETSEventTag { ETSParam par; /**< Event parameter, sometimes without usage, then will be set as 0*/ }; -typedef void (*ETSTask)(ETSEvent *e); /**< Type of the Task processer*/ +typedef void (*ETSTask)(ETSEvent *e); /**< Type of the Task processor*/ typedef void (* ets_idle_cb_t)(void *arg); /**< Type of the system idle callback*/ @@ -80,7 +80,7 @@ typedef void (* ets_idle_cb_t)(void *arg); /**< Type of the system idle callbac * @{ */ -extern const char *const exc_cause_table[40]; ///**< excption cause that defined by the core.*/ +extern const char *const exc_cause_table[40]; ///**< exception cause that defined by the core.*/ /** * @brief Set Pro cpu Entry code, code can be called in PRO CPU when booting is not completed. @@ -135,7 +135,7 @@ uint8_t ets_get_printf_channel(void); void ets_write_char_uart(char c); /** - * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need ouput. + * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need output. * To install putc1, which is defaulted installed as ets_write_char_uart in none silent boot mode, as NULL in silent mode. * * @param void (*)(char) p: Output function to install. @@ -145,7 +145,7 @@ void ets_write_char_uart(char c); void ets_install_putc1(void (*p)(char c)); /** - * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need ouput. + * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need output. * To install putc2, which is defaulted installed as NULL. * * @param void (*)(char) p: Output function to install. @@ -188,7 +188,7 @@ typedef void ETSTimerFunc(void *timer_arg);/**< timer handler*/ typedef struct _ETSTIMER_ { struct _ETSTIMER_ *timer_next; /**< timer linker*/ - uint32_t timer_expire; /**< abstruct time when timer expire*/ + uint32_t timer_expire; /**< abstract time when timer expire*/ uint32_t timer_period; /**< timer period, 0 means timer is not periodic repeated*/ ETSTimerFunc *timer_func; /**< timer handler*/ void *timer_arg; /**< timer handler argument*/ diff --git a/components/esp_rom/include/esp32c61/rom/gpio.h b/components/esp_rom/esp32c61/include/esp32c61/rom/gpio.h similarity index 100% rename from components/esp_rom/include/esp32c61/rom/gpio.h rename to components/esp_rom/esp32c61/include/esp32c61/rom/gpio.h diff --git a/components/esp_rom/include/esp32c61/rom/libc_stubs.h b/components/esp_rom/esp32c61/include/esp32c61/rom/libc_stubs.h similarity index 100% rename from components/esp_rom/include/esp32c61/rom/libc_stubs.h rename to components/esp_rom/esp32c61/include/esp32c61/rom/libc_stubs.h diff --git a/components/esp_rom/include/esp32c61/rom/lldesc.h b/components/esp_rom/esp32c61/include/esp32c61/rom/lldesc.h similarity index 100% rename from components/esp_rom/include/esp32c61/rom/lldesc.h rename to components/esp_rom/esp32c61/include/esp32c61/rom/lldesc.h diff --git a/components/esp_rom/include/esp32c61/rom/md5_hash.h b/components/esp_rom/esp32c61/include/esp32c61/rom/md5_hash.h similarity index 100% rename from components/esp_rom/include/esp32c61/rom/md5_hash.h rename to components/esp_rom/esp32c61/include/esp32c61/rom/md5_hash.h diff --git a/components/esp_rom/include/esp32c61/rom/opi_flash.h b/components/esp_rom/esp32c61/include/esp32c61/rom/opi_flash.h similarity index 98% rename from components/esp_rom/include/esp32c61/rom/opi_flash.h rename to components/esp_rom/esp32c61/include/esp32c61/rom/opi_flash.h index e3412d196211..8a5236801c80 100644 --- a/components/esp_rom/include/esp32c61/rom/opi_flash.h +++ b/components/esp_rom/esp32c61/include/esp32c61/rom/opi_flash.h @@ -55,8 +55,8 @@ typedef struct { uint32_t addrBitLen; /*!< Address byte length*/ uint32_t *txData; /*!< Point to send data buffer*/ uint32_t txDataBitLen; /*!< Send data byte length.*/ - uint32_t *rxData; /*!< Point to recevie data buffer*/ - uint32_t rxDataBitLen; /*!< Recevie Data byte length.*/ + uint32_t *rxData; /*!< Point to receive data buffer*/ + uint32_t rxDataBitLen; /*!< Receive Data byte length.*/ uint32_t dummyBitLen; } esp_rom_spi_cmd_t; diff --git a/components/esp_rom/include/esp32c61/rom/rom_layout.h b/components/esp_rom/esp32c61/include/esp32c61/rom/rom_layout.h similarity index 100% rename from components/esp_rom/include/esp32c61/rom/rom_layout.h rename to components/esp_rom/esp32c61/include/esp32c61/rom/rom_layout.h diff --git a/components/esp_rom/include/esp32c61/rom/rtc.h b/components/esp_rom/esp32c61/include/esp32c61/rom/rtc.h similarity index 100% rename from components/esp_rom/include/esp32c61/rom/rtc.h rename to components/esp_rom/esp32c61/include/esp32c61/rom/rtc.h diff --git a/components/esp_rom/include/esp32c61/rom/secure_boot.h b/components/esp_rom/esp32c61/include/esp32c61/rom/secure_boot.h similarity index 100% rename from components/esp_rom/include/esp32c61/rom/secure_boot.h rename to components/esp_rom/esp32c61/include/esp32c61/rom/secure_boot.h diff --git a/components/esp_rom/include/esp32c61/rom/sha.h b/components/esp_rom/esp32c61/include/esp32c61/rom/sha.h similarity index 100% rename from components/esp_rom/include/esp32c61/rom/sha.h rename to components/esp_rom/esp32c61/include/esp32c61/rom/sha.h diff --git a/components/esp_rom/include/esp32c61/rom/spi_flash.h b/components/esp_rom/esp32c61/include/esp32c61/rom/spi_flash.h similarity index 99% rename from components/esp_rom/include/esp32c61/rom/spi_flash.h rename to components/esp_rom/esp32c61/include/esp32c61/rom/spi_flash.h index b3bcc3740924..0b6e0afb6d47 100644 --- a/components/esp_rom/include/esp32c61/rom/spi_flash.h +++ b/components/esp_rom/esp32c61/include/esp32c61/rom/spi_flash.h @@ -421,7 +421,7 @@ void esp_rom_spiflash_fix_dummylen(uint8_t spi, uint8_t freqdiv); * * @param uint8_t *drvs: drvs[0]-bit[3:0] for cpiclk, bit[7:4] for spiq, drvs[1]-bit[3:0] for spid, drvs[1]-bit[7:4] for spid * drvs[2]-bit[3:0] for spihd, drvs[2]-bit[7:4] for spiwp. - * Values usually read from falsh by rom code, function usually callde by rom code. + * Values usually read from flash by rom code, function usually called by rom code. * if value with bit(3) set, the value is valid, bit[2:0] is the real value. * * @return None diff --git a/components/esp_rom/include/esp32c61/rom/tjpgd.h b/components/esp_rom/esp32c61/include/esp32c61/rom/tjpgd.h similarity index 94% rename from components/esp_rom/include/esp32c61/rom/tjpgd.h rename to components/esp_rom/esp32c61/include/esp32c61/rom/tjpgd.h index b993c2f5324b..b494e70bbe97 100644 --- a/components/esp_rom/include/esp32c61/rom/tjpgd.h +++ b/components/esp_rom/esp32c61/include/esp32c61/rom/tjpgd.h @@ -76,7 +76,7 @@ struct JDEC { BYTE msx, msy; /* MCU size in unit of block (width, height) */ BYTE qtid[3]; /* Quantization table ID of each component */ SHORT dcv[3]; /* Previous DC element of each component */ - WORD nrst; /* Restart inverval */ + WORD nrst; /* Restart interval */ UINT width, height; /* Size of the input image (pixel) */ BYTE *huffbits[2][2]; /* Huffman bit distribution tables [id][dcac] */ WORD *huffcode[2][2]; /* Huffman code word tables [id][dcac] */ @@ -85,9 +85,9 @@ struct JDEC { void *workbuf; /* Working buffer for IDCT and RGB output */ BYTE *mcubuf; /* Working buffer for the MCU */ void *pool; /* Pointer to available memory pool */ - UINT sz_pool; /* Size of momory pool (bytes available) */ + UINT sz_pool; /* Size of memory pool (bytes available) */ UINT (*infunc)(JDEC *, BYTE *, UINT); /* Pointer to jpeg stream input function */ - void *device; /* Pointer to I/O device identifiler for the session */ + void *device; /* Pointer to I/O device identifier for the session */ }; diff --git a/components/esp_rom/include/esp32c61/rom/uart.h b/components/esp_rom/esp32c61/include/esp32c61/rom/uart.h similarity index 97% rename from components/esp_rom/include/esp32c61/rom/uart.h rename to components/esp_rom/esp32c61/include/esp32c61/rom/uart.h index 57e3cf6618a3..dba76699eae3 100644 --- a/components/esp_rom/include/esp32c61/rom/uart.h +++ b/components/esp_rom/esp32c61/include/esp32c61/rom/uart.h @@ -28,7 +28,7 @@ extern "C" { #define RX_BUFF_SIZE 0x400 #define TX_BUFF_SIZE 100 -//uart int enalbe register ctrl bits +//uart int enable register ctrl bits #define UART_RCV_INTEN BIT0 #define UART_TRX_INTEN BIT1 #define UART_LINE_STATUS_INTEN BIT2 @@ -263,14 +263,14 @@ char uart_rx_one_char_block(void); * * @param uint8_t *pString : the pointer to store the string. * - * @param uint8_t MaxStrlen : the max string length, incude '\0'. + * @param uint8_t MaxStrlen : the max string length, include '\0'. * * @return OK. */ ETS_STATUS UartRxString(uint8_t *pString, uint8_t MaxStrlen); /** - * @brief Process uart recevied information in the interrupt handler. + * @brief Process uart received information in the interrupt handler. * Please do not call this function in SDK. * * @param void *para : the message receive buffer. diff --git a/components/esp_rom/include/esp32h2/rom/aes.h b/components/esp_rom/esp32h2/include/esp32h2/rom/aes.h similarity index 100% rename from components/esp_rom/include/esp32h2/rom/aes.h rename to components/esp_rom/esp32h2/include/esp32h2/rom/aes.h diff --git a/components/esp_rom/include/esp32h2/rom/bigint.h b/components/esp_rom/esp32h2/include/esp32h2/rom/bigint.h similarity index 100% rename from components/esp_rom/include/esp32h2/rom/bigint.h rename to components/esp_rom/esp32h2/include/esp32h2/rom/bigint.h diff --git a/components/esp_rom/include/esp32h2/rom/cache.h b/components/esp_rom/esp32h2/include/esp32h2/rom/cache.h similarity index 99% rename from components/esp_rom/include/esp32h2/rom/cache.h rename to components/esp_rom/esp32h2/include/esp32h2/rom/cache.h index 37a8201b17e4..4559177976b7 100644 --- a/components/esp_rom/include/esp32h2/rom/cache.h +++ b/components/esp_rom/esp32h2/include/esp32h2/rom/cache.h @@ -564,7 +564,7 @@ void Cache_Travel_Tag_Memory(struct cache_mode * mode, uint32_t filter_addr, voi * * @param struct cache_mode * mode : the cache to calculate the virtual address and the cache mode. * - * @param uint32_t tag : the tag part fo a tag item, 12-14 bits. + * @param uint32_t tag : the tag part of a tag item, 12-14 bits. * * @param uint32_t addr_offset : the virtual address offset of the cache ways. * diff --git a/components/esp_rom/include/esp32h2/rom/crc.h b/components/esp_rom/esp32h2/include/esp32h2/rom/crc.h similarity index 100% rename from components/esp_rom/include/esp32h2/rom/crc.h rename to components/esp_rom/esp32h2/include/esp32h2/rom/crc.h diff --git a/components/esp_rom/include/esp32h2/rom/digital_signature.h b/components/esp_rom/esp32h2/include/esp32h2/rom/digital_signature.h similarity index 100% rename from components/esp_rom/include/esp32h2/rom/digital_signature.h rename to components/esp_rom/esp32h2/include/esp32h2/rom/digital_signature.h diff --git a/components/esp_rom/include/esp32h2/rom/ecdsa.h b/components/esp_rom/esp32h2/include/esp32h2/rom/ecdsa.h similarity index 100% rename from components/esp_rom/include/esp32h2/rom/ecdsa.h rename to components/esp_rom/esp32h2/include/esp32h2/rom/ecdsa.h diff --git a/components/esp_rom/include/esp32h2/rom/efuse.h b/components/esp_rom/esp32h2/include/esp32h2/rom/efuse.h similarity index 99% rename from components/esp_rom/include/esp32h2/rom/efuse.h rename to components/esp_rom/esp32h2/include/esp32h2/rom/efuse.h index dc612dff4b88..fbd1721211bb 100644 --- a/components/esp_rom/include/esp32h2/rom/efuse.h +++ b/components/esp_rom/esp32h2/include/esp32h2/rom/efuse.h @@ -170,7 +170,7 @@ bool ets_efuse_download_modes_disabled(void); * - 0 for uart force print. * - 1 for uart print when GPIO8 is low when digital reset. * 2 for uart print when GPIO8 is high when digital reset. - * 3 for uart force slient + * 3 for uart force silent */ uint32_t ets_efuse_get_uart_print_control(void); diff --git a/components/esp_rom/include/esp32h2/rom/esp_flash.h b/components/esp_rom/esp32h2/include/esp32h2/rom/esp_flash.h similarity index 100% rename from components/esp_rom/include/esp32h2/rom/esp_flash.h rename to components/esp_rom/esp32h2/include/esp32h2/rom/esp_flash.h diff --git a/components/esp_rom/include/esp32h2/rom/ets_sys.h b/components/esp_rom/esp32h2/include/esp32h2/rom/ets_sys.h similarity index 97% rename from components/esp_rom/include/esp32h2/rom/ets_sys.h rename to components/esp_rom/esp32h2/include/esp32h2/rom/ets_sys.h index b9247bc3bdf0..0b19741d5d03 100644 --- a/components/esp_rom/include/esp32h2/rom/ets_sys.h +++ b/components/esp_rom/esp32h2/include/esp32h2/rom/ets_sys.h @@ -61,7 +61,7 @@ struct ETSEventTag { ETSParam par; /**< Event parameter, sometimes without usage, then will be set as 0*/ }; -typedef void (*ETSTask)(ETSEvent *e); /**< Type of the Task processer*/ +typedef void (*ETSTask)(ETSEvent *e); /**< Type of the Task processor*/ typedef void (* ets_idle_cb_t)(void *arg); /**< Type of the system idle callback*/ @@ -80,7 +80,7 @@ typedef void (* ets_idle_cb_t)(void *arg); /**< Type of the system idle callbac * @{ */ -extern const char *const exc_cause_table[40]; ///**< excption cause that defined by the core.*/ +extern const char *const exc_cause_table[40]; ///**< exception cause that defined by the core.*/ /** * @brief Set Pro cpu Entry code, code can be called in PRO CPU when booting is not completed. @@ -135,7 +135,7 @@ uint8_t ets_get_printf_channel(void); void ets_write_char_uart(char c); /** - * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need ouput. + * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need output. * To install putc1, which is defaulted installed as ets_write_char_uart in none silent boot mode, as NULL in silent mode. * * @param void (*)(char) p: Output function to install. @@ -145,7 +145,7 @@ void ets_write_char_uart(char c); void ets_install_putc1(void (*p)(char c)); /** - * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need ouput. + * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need output. * To install putc2, which is defaulted installed as NULL. * * @param void (*)(char) p: Output function to install. @@ -188,7 +188,7 @@ typedef void ETSTimerFunc(void *timer_arg);/**< timer handler*/ typedef struct _ETSTIMER_ { struct _ETSTIMER_ *timer_next; /**< timer linker*/ - uint32_t timer_expire; /**< abstruct time when timer expire*/ + uint32_t timer_expire; /**< abstract time when timer expire*/ uint32_t timer_period; /**< timer period, 0 means timer is not periodic repeated*/ ETSTimerFunc *timer_func; /**< timer handler*/ void *timer_arg; /**< timer handler argument*/ diff --git a/components/esp_rom/include/esp32h2/rom/gpio.h b/components/esp_rom/esp32h2/include/esp32h2/rom/gpio.h similarity index 98% rename from components/esp_rom/include/esp32h2/rom/gpio.h rename to components/esp_rom/esp32h2/include/esp32h2/rom/gpio.h index 67fb476f5cad..5829765c6075 100644 --- a/components/esp_rom/include/esp32h2/rom/gpio.h +++ b/components/esp_rom/esp32h2/include/esp32h2/rom/gpio.h @@ -57,7 +57,7 @@ typedef enum { * * @param uint32_t enable_mask : the gpios that need be changed. * - * @param uint32_t disable_mask : the gpios that need diable output. + * @param uint32_t disable_mask : the gpios that need disable output. * * @return None */ diff --git a/components/esp_rom/include/esp32h2/rom/hmac.h b/components/esp_rom/esp32h2/include/esp32h2/rom/hmac.h similarity index 100% rename from components/esp_rom/include/esp32h2/rom/hmac.h rename to components/esp_rom/esp32h2/include/esp32h2/rom/hmac.h diff --git a/components/esp_rom/include/esp32h2/rom/libc_stubs.h b/components/esp_rom/esp32h2/include/esp32h2/rom/libc_stubs.h similarity index 100% rename from components/esp_rom/include/esp32h2/rom/libc_stubs.h rename to components/esp_rom/esp32h2/include/esp32h2/rom/libc_stubs.h diff --git a/components/esp_rom/include/esp32h2/rom/lldesc.h b/components/esp_rom/esp32h2/include/esp32h2/rom/lldesc.h similarity index 100% rename from components/esp_rom/include/esp32h2/rom/lldesc.h rename to components/esp_rom/esp32h2/include/esp32h2/rom/lldesc.h diff --git a/components/esp_rom/include/esp32h2/rom/md5_hash.h b/components/esp_rom/esp32h2/include/esp32h2/rom/md5_hash.h similarity index 100% rename from components/esp_rom/include/esp32h2/rom/md5_hash.h rename to components/esp_rom/esp32h2/include/esp32h2/rom/md5_hash.h diff --git a/components/esp_rom/include/esp32h2/rom/rom_layout.h b/components/esp_rom/esp32h2/include/esp32h2/rom/rom_layout.h similarity index 100% rename from components/esp_rom/include/esp32h2/rom/rom_layout.h rename to components/esp_rom/esp32h2/include/esp32h2/rom/rom_layout.h diff --git a/components/esp_rom/include/esp32h2/rom/rsa_pss.h b/components/esp_rom/esp32h2/include/esp32h2/rom/rsa_pss.h similarity index 100% rename from components/esp_rom/include/esp32h2/rom/rsa_pss.h rename to components/esp_rom/esp32h2/include/esp32h2/rom/rsa_pss.h diff --git a/components/esp_rom/include/esp32h2/rom/rtc.h b/components/esp_rom/esp32h2/include/esp32h2/rom/rtc.h similarity index 100% rename from components/esp_rom/include/esp32h2/rom/rtc.h rename to components/esp_rom/esp32h2/include/esp32h2/rom/rtc.h diff --git a/components/esp_rom/include/esp32h2/rom/secure_boot.h b/components/esp_rom/esp32h2/include/esp32h2/rom/secure_boot.h similarity index 100% rename from components/esp_rom/include/esp32h2/rom/secure_boot.h rename to components/esp_rom/esp32h2/include/esp32h2/rom/secure_boot.h diff --git a/components/esp_rom/include/esp32h2/rom/sha.h b/components/esp_rom/esp32h2/include/esp32h2/rom/sha.h similarity index 100% rename from components/esp_rom/include/esp32h2/rom/sha.h rename to components/esp_rom/esp32h2/include/esp32h2/rom/sha.h diff --git a/components/esp_rom/include/esp32c6/rom/spi_flash.h b/components/esp_rom/esp32h2/include/esp32h2/rom/spi_flash.h similarity index 99% rename from components/esp_rom/include/esp32c6/rom/spi_flash.h rename to components/esp_rom/esp32h2/include/esp32h2/rom/spi_flash.h index 2d782dee4f36..70816780e67a 100644 --- a/components/esp_rom/include/esp32c6/rom/spi_flash.h +++ b/components/esp_rom/esp32h2/include/esp32h2/rom/spi_flash.h @@ -421,7 +421,7 @@ void esp_rom_spiflash_fix_dummylen(uint8_t spi, uint8_t freqdiv); * * @param uint8_t *drvs: drvs[0]-bit[3:0] for cpiclk, bit[7:4] for spiq, drvs[1]-bit[3:0] for spid, drvs[1]-bit[7:4] for spid * drvs[2]-bit[3:0] for spihd, drvs[2]-bit[7:4] for spiwp. - * Values usually read from falsh by rom code, function usually callde by rom code. + * Values usually read from flash by rom code, function usually called by rom code. * if value with bit(3) set, the value is valid, bit[2:0] is the real value. * * @return None diff --git a/components/esp_rom/include/esp32h2/rom/uart.h b/components/esp_rom/esp32h2/include/esp32h2/rom/uart.h similarity index 97% rename from components/esp_rom/include/esp32h2/rom/uart.h rename to components/esp_rom/esp32h2/include/esp32h2/rom/uart.h index 9045c42f6f6e..c21c0914403e 100644 --- a/components/esp_rom/include/esp32h2/rom/uart.h +++ b/components/esp_rom/esp32h2/include/esp32h2/rom/uart.h @@ -28,7 +28,7 @@ extern "C" { #define RX_BUFF_SIZE 0x400 #define TX_BUFF_SIZE 100 -//uart int enalbe register ctrl bits +//uart int enable register ctrl bits #define UART_RCV_INTEN BIT0 #define UART_TRX_INTEN BIT1 #define UART_LINE_STATUS_INTEN BIT2 @@ -263,14 +263,14 @@ char uart_rx_one_char_block(void); * * @param uint8_t *pString : the pointer to store the string. * - * @param uint8_t MaxStrlen : the max string length, incude '\0'. + * @param uint8_t MaxStrlen : the max string length, include '\0'. * * @return OK. */ ETS_STATUS UartRxString(uint8_t *pString, uint8_t MaxStrlen); /** - * @brief Process uart recevied information in the interrupt handler. + * @brief Process uart received information in the interrupt handler. * Please do not call this function in SDK. * * @param void *para : the message receive buffer. diff --git a/components/esp_rom/include/esp32p4/rom/aes.h b/components/esp_rom/esp32p4/include/esp32p4/rom/aes.h similarity index 100% rename from components/esp_rom/include/esp32p4/rom/aes.h rename to components/esp_rom/esp32p4/include/esp32p4/rom/aes.h diff --git a/components/esp_rom/include/esp32p4/rom/bigint.h b/components/esp_rom/esp32p4/include/esp32p4/rom/bigint.h similarity index 100% rename from components/esp_rom/include/esp32p4/rom/bigint.h rename to components/esp_rom/esp32p4/include/esp32p4/rom/bigint.h diff --git a/components/esp_rom/include/esp32p4/rom/cache.h b/components/esp_rom/esp32p4/include/esp32p4/rom/cache.h similarity index 99% rename from components/esp_rom/include/esp32p4/rom/cache.h rename to components/esp_rom/esp32p4/include/esp32p4/rom/cache.h index 95f4a4db05ee..49b084b3ab9b 100644 --- a/components/esp_rom/include/esp32p4/rom/cache.h +++ b/components/esp_rom/esp32p4/include/esp32p4/rom/cache.h @@ -507,7 +507,7 @@ void ROM_Direct_Boot_Cache_Init(void); * * @param None * - * @return 0 if mmu map is sucessfully, others if not. + * @return 0 if mmu map is successfully, others if not. */ int ROM_Direct_Boot_MMU_Init(void); @@ -1517,7 +1517,7 @@ void Cache_Freeze_L2_Cache_Disable(void); void Cache_Travel_Tag_Memory(struct cache_mode *mode, uint32_t filter_addr, void (*process)(struct tag_group_info *, int res[]), int res[]); /** - * @brief Travel tag memory to run a call back function using 2rd tag api. + * @brief Travel tag memory to run a call back function using 2nd tag api. * ICache and DCache are suspend when doing this. * The callback will get the parameter tag_group_info, which will include a group of tag memory addresses and cache memory addresses. * Please do not call this function in your SDK application. @@ -1539,7 +1539,7 @@ void Cache_Travel_Tag_Memory2(struct cache_mode *mode, uint32_t filter_addr, voi * * @param struct cache_mode * mode : the cache to calculate the virtual address and the cache mode. * - * @param uint32_t tag : the tag part fo a tag item, 12-14 bits. + * @param uint32_t tag : the tag part of a tag item, 12-14 bits. * * @param uint32_t addr_offset : the virtual address offset of the cache ways. * diff --git a/components/esp_rom/include/esp32p4/rom/crc.h b/components/esp_rom/esp32p4/include/esp32p4/rom/crc.h similarity index 100% rename from components/esp_rom/include/esp32p4/rom/crc.h rename to components/esp_rom/esp32p4/include/esp32p4/rom/crc.h diff --git a/components/esp_rom/include/esp32p4/rom/digital_signature.h b/components/esp_rom/esp32p4/include/esp32p4/rom/digital_signature.h similarity index 100% rename from components/esp_rom/include/esp32p4/rom/digital_signature.h rename to components/esp_rom/esp32p4/include/esp32p4/rom/digital_signature.h diff --git a/components/esp_rom/include/esp32p4/rom/ecdsa.h b/components/esp_rom/esp32p4/include/esp32p4/rom/ecdsa.h similarity index 100% rename from components/esp_rom/include/esp32p4/rom/ecdsa.h rename to components/esp_rom/esp32p4/include/esp32p4/rom/ecdsa.h diff --git a/components/esp_rom/include/esp32p4/rom/efuse.h b/components/esp_rom/esp32p4/include/esp32p4/rom/efuse.h similarity index 99% rename from components/esp_rom/include/esp32p4/rom/efuse.h rename to components/esp_rom/esp32p4/include/esp32p4/rom/efuse.h index 60b7726d115a..60d8498dd016 100644 --- a/components/esp_rom/include/esp32p4/rom/efuse.h +++ b/components/esp_rom/esp32p4/include/esp32p4/rom/efuse.h @@ -58,7 +58,7 @@ typedef enum { } ets_efuse_block_t; /** - * @brief set timing accroding the apb clock, so no read error or write error happens. + * @brief set timing according the apb clock, so no read error or write error happens. * * @param clock: apb clock in HZ, only accept 5M(in FPGA), 10M(in FPGA), 20M, 40M, 80M. * @@ -226,7 +226,7 @@ bool ets_efuse_legacy_spi_boot_mode_disabled(void); * - 0 for uart force print. * - 1 for uart print when GPIO8 is low when digital reset. * 2 for uart print when GPIO8 is high when digital reset. - * 3 for uart force slient + * 3 for uart force silent */ uint32_t ets_efuse_get_uart_print_control(void); diff --git a/components/esp_rom/include/esp32p4/rom/esp_flash.h b/components/esp_rom/esp32p4/include/esp32p4/rom/esp_flash.h similarity index 100% rename from components/esp_rom/include/esp32p4/rom/esp_flash.h rename to components/esp_rom/esp32p4/include/esp32p4/rom/esp_flash.h diff --git a/components/esp_rom/include/esp32p4/rom/ets_sys.h b/components/esp_rom/esp32p4/include/esp32p4/rom/ets_sys.h similarity index 96% rename from components/esp_rom/include/esp32p4/rom/ets_sys.h rename to components/esp_rom/esp32p4/include/esp32p4/rom/ets_sys.h index 5ee1383cb16b..95d8b092fcce 100644 --- a/components/esp_rom/include/esp32p4/rom/ets_sys.h +++ b/components/esp_rom/esp32p4/include/esp32p4/rom/ets_sys.h @@ -58,11 +58,11 @@ struct ETSEventTag { ETSParam par; /**< Event parameter, sometimes without usage, then will be set as 0*/ }; -typedef void (*ETSTask)(ETSEvent *e); /**< Type of the Task processer*/ +typedef void (*ETSTask)(ETSEvent *e); /**< Type of the Task processor*/ typedef void (* ets_idle_cb_t)(void *arg); /**< Type of the system idle callback*/ /** - * @brief Start the Espressif Task Scheduler, which is an infinit loop. Please do not add code after it. + * @brief Start the Espressif Task Scheduler, which is an infinite loop. Please do not add code after it. * * @param none * @@ -82,9 +82,9 @@ void ets_run(void); void ets_set_idle_cb(ets_idle_cb_t func, void *arg); /** - * @brief Init a task with processer, priority, queue to receive Event, queue length. + * @brief Init a task with processor, priority, queue to receive Event, queue length. * - * @param ETSTask task : The task processer. + * @param ETSTask task : The task processor. * * @param uint8_t prio : Task priority, 0-31, bigger num with high priority, one priority with one task. * @@ -122,7 +122,7 @@ ETS_STATUS ets_post(uint8_t prio, ETSSignal sig, ETSParam par); * @{ */ -extern const char *const exc_cause_table[40]; ///**< excption cause that defined by the core.*/ +extern const char *const exc_cause_table[40]; ///**< exception cause that defined by the core.*/ /** * @brief Set Pro cpu Entry code, code can be called in PRO CPU when booting is not completed. @@ -179,7 +179,7 @@ uint8_t ets_get_printf_channel(void); void ets_write_char_uart(char c); /** - * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need ouput. + * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need output. * To install putc1, which is defaulted installed as ets_write_char_uart in none silent boot mode, as NULL in silent mode. * * @param void (*)(char) p: Output function to install. @@ -189,7 +189,7 @@ void ets_write_char_uart(char c); void ets_install_putc1(void (*p)(char c)); /** - * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need ouput. + * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need output. * To install putc2, which is defaulted installed as NULL. * * @param void (*)(char) p: Output function to install. @@ -232,7 +232,7 @@ typedef void ETSTimerFunc(void *timer_arg);/**< timer handler*/ typedef struct _ETSTIMER_ { struct _ETSTIMER_ *timer_next; /**< timer linker*/ - uint32_t timer_expire; /**< abstruct time when timer expire*/ + uint32_t timer_expire; /**< abstract time when timer expire*/ uint32_t timer_period; /**< timer period, 0 means timer is not periodic repeated*/ ETSTimerFunc *timer_func; /**< timer handler*/ void *timer_arg; /**< timer handler argument*/ diff --git a/components/esp_rom/include/esp32p4/rom/gpio.h b/components/esp_rom/esp32p4/include/esp32p4/rom/gpio.h similarity index 98% rename from components/esp_rom/include/esp32p4/rom/gpio.h rename to components/esp_rom/esp32p4/include/esp32p4/rom/gpio.h index 214eaff048c3..e59383319bcc 100644 --- a/components/esp_rom/include/esp32p4/rom/gpio.h +++ b/components/esp_rom/esp32p4/include/esp32p4/rom/gpio.h @@ -78,7 +78,7 @@ void gpio_init(void); * * @param uint32_t enable_mask : the gpios that need be changed. * - * @param uint32_t disable_mask : the gpios that need diable output. + * @param uint32_t disable_mask : the gpios that need disable output. * * @return None */ @@ -95,7 +95,7 @@ void gpio_output_set(uint32_t set_mask, uint32_t clear_mask, uint32_t enable_mas * * @param uint32_t enable_mask : the gpios that need be changed. * - * @param uint32_t disable_mask : the gpios that need diable output. + * @param uint32_t disable_mask : the gpios that need disable output. * * @return None */ diff --git a/components/esp_rom/include/esp32p4/rom/hmac.h b/components/esp_rom/esp32p4/include/esp32p4/rom/hmac.h similarity index 100% rename from components/esp_rom/include/esp32p4/rom/hmac.h rename to components/esp_rom/esp32p4/include/esp32p4/rom/hmac.h diff --git a/components/esp_rom/include/esp32p4/rom/key_mgr.h b/components/esp_rom/esp32p4/include/esp32p4/rom/key_mgr.h similarity index 100% rename from components/esp_rom/include/esp32p4/rom/key_mgr.h rename to components/esp_rom/esp32p4/include/esp32p4/rom/key_mgr.h diff --git a/components/esp_rom/include/esp32p4/rom/km.h b/components/esp_rom/esp32p4/include/esp32p4/rom/km.h similarity index 100% rename from components/esp_rom/include/esp32p4/rom/km.h rename to components/esp_rom/esp32p4/include/esp32p4/rom/km.h diff --git a/components/esp_rom/include/esp32p4/rom/libc_stubs.h b/components/esp_rom/esp32p4/include/esp32p4/rom/libc_stubs.h similarity index 100% rename from components/esp_rom/include/esp32p4/rom/libc_stubs.h rename to components/esp_rom/esp32p4/include/esp32p4/rom/libc_stubs.h diff --git a/components/esp_rom/include/esp32p4/rom/lldesc.h b/components/esp_rom/esp32p4/include/esp32p4/rom/lldesc.h similarity index 100% rename from components/esp_rom/include/esp32p4/rom/lldesc.h rename to components/esp_rom/esp32p4/include/esp32p4/rom/lldesc.h diff --git a/components/esp_rom/include/esp32p4/rom/md5_hash.h b/components/esp_rom/esp32p4/include/esp32p4/rom/md5_hash.h similarity index 100% rename from components/esp_rom/include/esp32p4/rom/md5_hash.h rename to components/esp_rom/esp32p4/include/esp32p4/rom/md5_hash.h diff --git a/components/esp_rom/include/esp32p4/rom/opi_flash.h b/components/esp_rom/esp32p4/include/esp32p4/rom/opi_flash.h similarity index 98% rename from components/esp_rom/include/esp32p4/rom/opi_flash.h rename to components/esp_rom/esp32p4/include/esp32p4/rom/opi_flash.h index 9eff17f2ef19..3184c98e3a39 100644 --- a/components/esp_rom/include/esp32p4/rom/opi_flash.h +++ b/components/esp_rom/esp32p4/include/esp32p4/rom/opi_flash.h @@ -57,8 +57,8 @@ typedef struct { uint32_t addrBitLen; /*!< Address byte length*/ uint32_t *txData; /*!< Point to send data buffer*/ uint32_t txDataBitLen; /*!< Send data byte length.*/ - uint32_t *rxData; /*!< Point to recevie data buffer*/ - uint32_t rxDataBitLen; /*!< Recevie Data byte length.*/ + uint32_t *rxData; /*!< Point to receive data buffer*/ + uint32_t rxDataBitLen; /*!< Receive Data byte length.*/ uint32_t dummyBitLen; } esp_rom_spi_cmd_t; diff --git a/components/esp_rom/include/esp32p4/rom/rom_layout.h b/components/esp_rom/esp32p4/include/esp32p4/rom/rom_layout.h similarity index 100% rename from components/esp_rom/include/esp32p4/rom/rom_layout.h rename to components/esp_rom/esp32p4/include/esp32p4/rom/rom_layout.h diff --git a/components/esp_rom/include/esp32p4/rom/rsa_pss.h b/components/esp_rom/esp32p4/include/esp32p4/rom/rsa_pss.h similarity index 100% rename from components/esp_rom/include/esp32p4/rom/rsa_pss.h rename to components/esp_rom/esp32p4/include/esp32p4/rom/rsa_pss.h diff --git a/components/esp_rom/include/esp32p4/rom/rtc.h b/components/esp_rom/esp32p4/include/esp32p4/rom/rtc.h similarity index 100% rename from components/esp_rom/include/esp32p4/rom/rtc.h rename to components/esp_rom/esp32p4/include/esp32p4/rom/rtc.h diff --git a/components/esp_rom/include/esp32p4/rom/secure_boot.h b/components/esp_rom/esp32p4/include/esp32p4/rom/secure_boot.h similarity index 100% rename from components/esp_rom/include/esp32p4/rom/secure_boot.h rename to components/esp_rom/esp32p4/include/esp32p4/rom/secure_boot.h diff --git a/components/esp_rom/include/esp32p4/rom/sha.h b/components/esp_rom/esp32p4/include/esp32p4/rom/sha.h similarity index 100% rename from components/esp_rom/include/esp32p4/rom/sha.h rename to components/esp_rom/esp32p4/include/esp32p4/rom/sha.h diff --git a/components/esp_rom/include/esp32p4/rom/spi_flash.h b/components/esp_rom/esp32p4/include/esp32p4/rom/spi_flash.h similarity index 99% rename from components/esp_rom/include/esp32p4/rom/spi_flash.h rename to components/esp_rom/esp32p4/include/esp32p4/rom/spi_flash.h index 761fc46bc7f1..72e5f90cfdfb 100644 --- a/components/esp_rom/include/esp32p4/rom/spi_flash.h +++ b/components/esp_rom/esp32p4/include/esp32p4/rom/spi_flash.h @@ -459,7 +459,7 @@ void esp_rom_spiflash_fix_dummylen(uint8_t spi, uint8_t freqdiv); * * @param uint8_t *drvs: drvs[0]-bit[3:0] for cpiclk, bit[7:4] for spiq, drvs[1]-bit[3:0] for spid, drvs[1]-bit[7:4] for spid * drvs[2]-bit[3:0] for spihd, drvs[2]-bit[7:4] for spiwp. - * Values usually read from falsh by rom code, function usually callde by rom code. + * Values usually read from flash by rom code, function usually called by rom code. * if value with bit(3) set, the value is valid, bit[2:0] is the real value. * * @return None diff --git a/components/esp_rom/include/esp32p4/rom/uart.h b/components/esp_rom/esp32p4/include/esp32p4/rom/uart.h similarity index 98% rename from components/esp_rom/include/esp32p4/rom/uart.h rename to components/esp_rom/esp32p4/include/esp32p4/rom/uart.h index 60258dceb689..b3a399356cda 100644 --- a/components/esp_rom/include/esp32p4/rom/uart.h +++ b/components/esp_rom/esp32p4/include/esp32p4/rom/uart.h @@ -28,7 +28,7 @@ extern "C" { #define RX_BUFF_SIZE 0x400 #define TX_BUFF_SIZE 100 -//uart int enalbe register ctrl bits +//uart int enable register ctrl bits #define UART_RCV_INTEN BIT0 #define UART_TRX_INTEN BIT1 #define UART_LINE_STATUS_INTEN BIT2 @@ -286,14 +286,14 @@ char uart_rx_one_char_block(void); * * @param uint8_t *pString : the pointer to store the string. * - * @param uint8_t MaxStrlen : the max string length, incude '\0'. + * @param uint8_t MaxStrlen : the max string length, include '\0'. * * @return OK. */ STATUS UartRxString(uint8_t *pString, uint8_t MaxStrlen); /** - * @brief Process uart recevied information in the interrupt handler. + * @brief Process uart received information in the interrupt handler. * Please do not call this function in SDK. * * @param void *para : the message receive buffer. diff --git a/components/esp_rom/include/esp32s2/rom/aes.h b/components/esp_rom/esp32s2/include/esp32s2/rom/aes.h similarity index 59% rename from components/esp_rom/include/esp32s2/rom/aes.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/aes.h index 9350e2511ea2..50497c252ec2 100644 --- a/components/esp_rom/include/esp32s2/rom/aes.h +++ b/components/esp_rom/esp32s2/include/esp32s2/rom/aes.h @@ -5,19 +5,11 @@ use the wrapper functions in hwcrypto/aes.h instead. */ -// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_rom/include/esp32s2/rom/bigint.h b/components/esp_rom/esp32s2/include/esp32s2/rom/bigint.h similarity index 59% rename from components/esp_rom/include/esp32s2/rom/bigint.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/bigint.h index eee19d46bbf9..418a41de3651 100644 --- a/components/esp_rom/include/esp32s2/rom/bigint.h +++ b/components/esp_rom/esp32s2/include/esp32s2/rom/bigint.h @@ -5,19 +5,11 @@ use the wrapper functions in hwcrypto/mpi.h instead. */ -// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef _ROM_BIGINT_H_ #define _ROM_BIGINT_H_ diff --git a/components/esp_rom/include/esp32s2/rom/cache.h b/components/esp_rom/esp32s2/include/esp32s2/rom/cache.h similarity index 99% rename from components/esp_rom/include/esp32s2/rom/cache.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/cache.h index cdfa143a7da8..7ee63be904ba 100644 --- a/components/esp_rom/include/esp32s2/rom/cache.h +++ b/components/esp_rom/esp32s2/include/esp32s2/rom/cache.h @@ -90,7 +90,7 @@ struct tag_item { uint32_t fifo_cnt:3; /*!< fifo cnt, 0 ~ 3 for 4 ways cache, 0 ~ 7 for 8 ways cache */ uint32_t lock:1; /*!< the cache line is locked or not */ uint32_t attr:3; /*!< the attribute of the external memory physical address */ - uint32_t access:1; /*!< software accessable, used by hardware */ + uint32_t access:1; /*!< software accessible, used by hardware */ uint32_t reserved:8; }; @@ -884,7 +884,7 @@ void Cache_Travel_Tag_Memory(struct cache_mode * mode, uint32_t filter_addr, voi * * @param struct cache_mode * mode : the cache to calculate the virtual address and the cache mode. * - * @param uint32_t tag : the tag part fo a tag item, 12-14 bits. + * @param uint32_t tag : the tag part of a tag item, 12-14 bits. * * @param uint32_t addr_offset : the virtual address offset of the cache ways. * diff --git a/components/esp_rom/include/esp32s2/rom/crc.h b/components/esp_rom/esp32s2/include/esp32s2/rom/crc.h similarity index 72% rename from components/esp_rom/include/esp32s2/rom/crc.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/crc.h index 0d1397957618..344a43f1b52a 100644 --- a/components/esp_rom/include/esp32s2/rom/crc.h +++ b/components/esp_rom/esp32s2/include/esp32s2/rom/crc.h @@ -1,16 +1,8 @@ -// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef ROM_CRC_H #define ROM_CRC_H diff --git a/components/esp_rom/include/esp32s2/rom/digital_signature.h b/components/esp_rom/esp32s2/include/esp32s2/rom/digital_signature.h similarity index 89% rename from components/esp_rom/include/esp32s2/rom/digital_signature.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/digital_signature.h index 9f23a5d6b861..8590b9c8be5f 100644 --- a/components/esp_rom/include/esp32s2/rom/digital_signature.h +++ b/components/esp_rom/esp32s2/include/esp32s2/rom/digital_signature.h @@ -1,19 +1,11 @@ /* ROM functions for hardware Digital Signature peripheral verification */ -// Copyright 2019 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2019-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_rom/include/esp32s2/rom/efuse.h b/components/esp_rom/esp32s2/include/esp32s2/rom/efuse.h similarity index 99% rename from components/esp_rom/include/esp32s2/rom/efuse.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/efuse.h index 6f4e8812b36a..290a5567ba6d 100644 --- a/components/esp_rom/include/esp32s2/rom/efuse.h +++ b/components/esp_rom/esp32s2/include/esp32s2/rom/efuse.h @@ -56,7 +56,7 @@ typedef enum { } ets_efuse_block_t; /** - * @brief set timing accroding the apb clock, so no read error or write error happens. + * @brief set timing according the apb clock, so no read error or write error happens. * * @param clock: apb clock in HZ, only accept 20M, 40M, 80M. * @@ -224,7 +224,7 @@ bool ets_efuse_legacy_spi_boot_mode_disabled(void); * - 0 for uart force print. * - 1 for uart print when GPIO46 is low when digital reset. * 2 for uart print when GPIO46 is high when digital reset. - * 3 for uart force slient + * 3 for uart force silent */ uint32_t ets_efuse_get_uart_print_control(void); diff --git a/components/esp_rom/include/esp32s2/rom/ets_sys.h b/components/esp_rom/esp32s2/include/esp32s2/rom/ets_sys.h similarity index 100% rename from components/esp_rom/include/esp32s2/rom/ets_sys.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/ets_sys.h diff --git a/components/esp_rom/include/esp32s2/rom/gpio.h b/components/esp_rom/esp32s2/include/esp32s2/rom/gpio.h similarity index 97% rename from components/esp_rom/include/esp32s2/rom/gpio.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/gpio.h index 991b20352d89..84e0af1adbd7 100644 --- a/components/esp_rom/include/esp32s2/rom/gpio.h +++ b/components/esp_rom/esp32s2/include/esp32s2/rom/gpio.h @@ -62,7 +62,7 @@ typedef enum { * * @param uint32_t enable_mask : the gpios that need be changed. * - * @param uint32_t disable_mask : the gpios that need diable output. + * @param uint32_t disable_mask : the gpios that need disable output. * * @return None */ @@ -79,7 +79,7 @@ void gpio_output_set(uint32_t set_mask, uint32_t clear_mask, uint32_t enable_mas * * @param uint32_t enable_mask : the gpios that need be changed. * - * @param uint32_t disable_mask : the gpios that need diable output. + * @param uint32_t disable_mask : the gpios that need disable output. * * @return None */ diff --git a/components/esp_rom/include/esp32c3/rom/hmac.h b/components/esp_rom/esp32s2/include/esp32s2/rom/hmac.h similarity index 71% rename from components/esp_rom/include/esp32c3/rom/hmac.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/hmac.h index 223fe884a3d5..09e8b1effda8 100644 --- a/components/esp_rom/include/esp32c3/rom/hmac.h +++ b/components/esp_rom/esp32s2/include/esp32s2/rom/hmac.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2018-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef _ROM_HMAC_H_ #define _ROM_HMAC_H_ diff --git a/components/esp_rom/include/esp32s2/rom/libc_stubs.h b/components/esp_rom/esp32s2/include/esp32s2/rom/libc_stubs.h similarity index 100% rename from components/esp_rom/include/esp32s2/rom/libc_stubs.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/libc_stubs.h diff --git a/components/esp_rom/include/esp32s2/rom/lldesc.h b/components/esp_rom/esp32s2/include/esp32s2/rom/lldesc.h similarity index 100% rename from components/esp_rom/include/esp32s2/rom/lldesc.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/lldesc.h diff --git a/components/esp_rom/include/esp32s2/rom/md5_hash.h b/components/esp_rom/esp32s2/include/esp32s2/rom/md5_hash.h similarity index 100% rename from components/esp_rom/include/esp32s2/rom/md5_hash.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/md5_hash.h diff --git a/components/esp_rom/include/esp32s2/rom/opi_flash.h b/components/esp_rom/esp32s2/include/esp32s2/rom/opi_flash.h similarity index 98% rename from components/esp_rom/include/esp32s2/rom/opi_flash.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/opi_flash.h index c7e789b02015..371db2185db9 100644 --- a/components/esp_rom/include/esp32s2/rom/opi_flash.h +++ b/components/esp_rom/esp32s2/include/esp32s2/rom/opi_flash.h @@ -21,8 +21,8 @@ typedef struct { uint32_t addrBitLen; /*!< Address byte length*/ uint32_t *txData; /*!< Point to send data buffer*/ uint32_t txDataBitLen; /*!< Send data byte length.*/ - uint32_t *rxData; /*!< Point to recevie data buffer*/ - uint32_t rxDataBitLen; /*!< Recevie Data byte length.*/ + uint32_t *rxData; /*!< Point to receive data buffer*/ + uint32_t rxDataBitLen; /*!< Receive Data byte length.*/ uint32_t dummyBitLen; } esp_rom_spi_cmd_t; diff --git a/components/esp_rom/include/esp32s2/rom/rsa_pss.h b/components/esp_rom/esp32s2/include/esp32s2/rom/rsa_pss.h similarity index 53% rename from components/esp_rom/include/esp32s2/rom/rsa_pss.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/rsa_pss.h index bfbaeb6a41d2..5ec11a0e241a 100644 --- a/components/esp_rom/include/esp32s2/rom/rsa_pss.h +++ b/components/esp_rom/esp32s2/include/esp32s2/rom/rsa_pss.h @@ -1,22 +1,15 @@ -// Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef _ROM_RSA_PSS_H_ #define _ROM_RSA_PSS_H_ #include #include +#include #ifdef __cplusplus extern "C" { diff --git a/components/esp_rom/include/esp32s2/rom/rtc.h b/components/esp_rom/esp32s2/include/esp32s2/rom/rtc.h similarity index 100% rename from components/esp_rom/include/esp32s2/rom/rtc.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/rtc.h diff --git a/components/esp_rom/include/esp32s2/rom/secure_boot.h b/components/esp_rom/esp32s2/include/esp32s2/rom/secure_boot.h similarity index 100% rename from components/esp_rom/include/esp32s2/rom/secure_boot.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/secure_boot.h diff --git a/components/esp_rom/include/esp32s2/rom/sha.h b/components/esp_rom/esp32s2/include/esp32s2/rom/sha.h similarity index 70% rename from components/esp_rom/include/esp32s2/rom/sha.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/sha.h index f04e9aec5077..ad3e4dd650af 100644 --- a/components/esp_rom/include/esp32s2/rom/sha.h +++ b/components/esp_rom/esp32s2/include/esp32s2/rom/sha.h @@ -6,19 +6,11 @@ esp_sha_lock_memory_block() functions in hwcrypto/sha.h to ensure exclusive access. */ -// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef _ROM_SHA_H_ #define _ROM_SHA_H_ diff --git a/components/esp_rom/include/esp32s2/rom/spi_flash.h b/components/esp_rom/esp32s2/include/esp32s2/rom/spi_flash.h similarity index 99% rename from components/esp_rom/include/esp32s2/rom/spi_flash.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/spi_flash.h index b496bc1b9916..6711e81aa094 100644 --- a/components/esp_rom/include/esp32s2/rom/spi_flash.h +++ b/components/esp_rom/esp32s2/include/esp32s2/rom/spi_flash.h @@ -416,7 +416,7 @@ void esp_rom_spiflash_fix_dummylen(uint8_t spi, uint8_t freqdiv); * * @param uint8_t *drvs: drvs[0]-bit[3:0] for cpiclk, bit[7:4] for spiq, drvs[1]-bit[3:0] for spid, drvs[1]-bit[7:4] for spid * drvs[2]-bit[3:0] for spihd, drvs[2]-bit[7:4] for spiwp. - * Values usually read from falsh by rom code, function usually callde by rom code. + * Values usually read from flash by rom code, function usually called by rom code. * if value with bit(3) set, the value is valid, bit[2:0] is the real value. * * @return None diff --git a/components/esp_rom/include/esp32s2/rom/uart.h b/components/esp_rom/esp32s2/include/esp32s2/rom/uart.h similarity index 98% rename from components/esp_rom/include/esp32s2/rom/uart.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/uart.h index 491d2c28fbeb..a3ebc5f2350a 100644 --- a/components/esp_rom/include/esp32s2/rom/uart.h +++ b/components/esp_rom/esp32s2/include/esp32s2/rom/uart.h @@ -28,7 +28,7 @@ extern "C" { #define RX_BUFF_SIZE 0x400 #define TX_BUFF_SIZE 100 -//uart int enalbe register ctrl bits +//uart int enable register ctrl bits #define UART_RCV_INTEN BIT0 #define UART_TRX_INTEN BIT1 #define UART_LINE_STATUS_INTEN BIT2 @@ -301,14 +301,14 @@ char uart_rx_one_char_block(void); * * @param uint8_t *pString : the pointer to store the string. * - * @param uint8_t MaxStrlen : the max string length, incude '\0'. + * @param uint8_t MaxStrlen : the max string length, include '\0'. * * @return OK. */ ETS_STATUS UartRxString(uint8_t *pString, uint8_t MaxStrlen); /** - * @brief Process uart recevied information in the interrupt handler. + * @brief Process uart received information in the interrupt handler. * Please do not call this function in SDK. * * @param void *para : the message receive buffer. diff --git a/components/esp_rom/include/esp32s2/rom/usb/cdc_acm.h b/components/esp_rom/esp32s2/include/esp32s2/rom/usb/cdc_acm.h similarity index 100% rename from components/esp_rom/include/esp32s2/rom/usb/cdc_acm.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/usb/cdc_acm.h diff --git a/components/esp_rom/include/esp32s2/rom/usb/chip_usb_dw_wrapper.h b/components/esp_rom/esp32s2/include/esp32s2/rom/usb/chip_usb_dw_wrapper.h similarity index 100% rename from components/esp_rom/include/esp32s2/rom/usb/chip_usb_dw_wrapper.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/usb/chip_usb_dw_wrapper.h diff --git a/components/esp_rom/include/esp32s2/rom/usb/cpio.h b/components/esp_rom/esp32s2/include/esp32s2/rom/usb/cpio.h similarity index 100% rename from components/esp_rom/include/esp32s2/rom/usb/cpio.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/usb/cpio.h diff --git a/components/esp_rom/include/esp32s2/rom/usb/usb_cdc.h b/components/esp_rom/esp32s2/include/esp32s2/rom/usb/usb_cdc.h similarity index 100% rename from components/esp_rom/include/esp32s2/rom/usb/usb_cdc.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/usb/usb_cdc.h diff --git a/components/esp_rom/include/esp32s2/rom/usb/usb_common.h b/components/esp_rom/esp32s2/include/esp32s2/rom/usb/usb_common.h similarity index 100% rename from components/esp_rom/include/esp32s2/rom/usb/usb_common.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/usb/usb_common.h diff --git a/components/esp_rom/include/esp32s2/rom/usb/usb_dc.h b/components/esp_rom/esp32s2/include/esp32s2/rom/usb/usb_dc.h similarity index 99% rename from components/esp_rom/include/esp32s2/rom/usb/usb_dc.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/usb/usb_dc.h index 5587cc22ba84..0d25f50fc1bd 100644 --- a/components/esp_rom/include/esp32s2/rom/usb/usb_dc.h +++ b/components/esp_rom/esp32s2/include/esp32s2/rom/usb/usb_dc.h @@ -365,7 +365,7 @@ int usb_dc_ep_read_continue(uint8_t ep); * @param[in] ep Endpoint address corresponding to the one * listed in the device configuration table * - * @return enpoint max packet size (mps) + * @return endpoint max packet size (mps) */ int usb_dc_ep_mps(uint8_t ep); @@ -384,7 +384,7 @@ void usb_dc_check_poll_for_interrupts(void); * * This takes the USB peripheral offline in such a way that it seems 'just busy' to the * host. This way, the chip can reboot (e.g. into bootloader mode) and pick up the USB - * configuration again, without the conenction to the host being interrupted. + * configuration again, without the connection to the host being interrupted. * * @note Actual persistence is depending on USBDC_PERSIST_ENA being set in flags, as this * is also used to e.g. reboot into DFU mode. diff --git a/components/esp_rom/include/esp32s2/rom/usb/usb_descriptor.h b/components/esp_rom/esp32s2/include/esp32s2/rom/usb/usb_descriptor.h similarity index 100% rename from components/esp_rom/include/esp32s2/rom/usb/usb_descriptor.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/usb/usb_descriptor.h diff --git a/components/esp_rom/include/esp32s3/rom/usb/usb_device.h b/components/esp_rom/esp32s2/include/esp32s2/rom/usb/usb_device.h similarity index 99% rename from components/esp_rom/include/esp32s3/rom/usb/usb_device.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/usb/usb_device.h index 87dbcda15b26..bd9739fa5237 100644 --- a/components/esp_rom/include/esp32s3/rom/usb/usb_device.h +++ b/components/esp_rom/esp32s2/include/esp32s2/rom/usb/usb_device.h @@ -248,7 +248,7 @@ int usb_read(uint8_t ep, uint8_t *data, uint32_t max_data_len, * @brief set STALL condition on the specified endpoint * * This function is called by USB device class handler code to set stall - * conditionin on endpoint. + * condition on endpoint. * * @param[in] ep Endpoint address corresponding to the one listed in * the device configuration table @@ -262,7 +262,7 @@ int usb_ep_set_stall(uint8_t ep); * @brief clears STALL condition on the specified endpoint * * This function is called by USB device class handler code to clear stall - * conditionin on endpoint. + * condition on endpoint. * * @param[in] ep Endpoint address corresponding to the one listed in * the device configuration table diff --git a/components/esp_rom/include/esp32s2/rom/usb/usb_dfu.h b/components/esp_rom/esp32s2/include/esp32s2/rom/usb/usb_dfu.h similarity index 100% rename from components/esp_rom/include/esp32s2/rom/usb/usb_dfu.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/usb/usb_dfu.h diff --git a/components/esp_rom/include/esp32s2/rom/usb/usb_os_glue.h b/components/esp_rom/esp32s2/include/esp32s2/rom/usb/usb_os_glue.h similarity index 100% rename from components/esp_rom/include/esp32s2/rom/usb/usb_os_glue.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/usb/usb_os_glue.h diff --git a/components/esp_rom/include/esp32s2/rom/usb/usb_persist.h b/components/esp_rom/esp32s2/include/esp32s2/rom/usb/usb_persist.h similarity index 100% rename from components/esp_rom/include/esp32s2/rom/usb/usb_persist.h rename to components/esp_rom/esp32s2/include/esp32s2/rom/usb/usb_persist.h diff --git a/components/esp_rom/include/esp32s3/rom/aes.h b/components/esp_rom/esp32s3/include/esp32s3/rom/aes.h similarity index 100% rename from components/esp_rom/include/esp32s3/rom/aes.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/aes.h diff --git a/components/esp_rom/include/esp32s3/rom/apb_backup_dma.h b/components/esp_rom/esp32s3/include/esp32s3/rom/apb_backup_dma.h similarity index 100% rename from components/esp_rom/include/esp32s3/rom/apb_backup_dma.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/apb_backup_dma.h diff --git a/components/esp_rom/include/esp32s3/rom/bigint.h b/components/esp_rom/esp32s3/include/esp32s3/rom/bigint.h similarity index 51% rename from components/esp_rom/include/esp32s3/rom/bigint.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/bigint.h index 2ab022d87d2b..49d4a2a93100 100644 --- a/components/esp_rom/include/esp32s3/rom/bigint.h +++ b/components/esp_rom/esp32s3/include/esp32s3/rom/bigint.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_rom/include/esp32s3/rom/cache.h b/components/esp_rom/esp32s3/include/esp32s3/rom/cache.h similarity index 99% rename from components/esp_rom/include/esp32s3/rom/cache.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/cache.h index e0be832c5684..1a90324a05da 100644 --- a/components/esp_rom/include/esp32s3/rom/cache.h +++ b/components/esp_rom/esp32s3/include/esp32s3/rom/cache.h @@ -160,7 +160,7 @@ struct tag_group_info { uint32_t vaddr_offset; /*!< virtual address offset of the cache ways */ uint32_t tag_addr[MAX_CACHE_WAYS]; /*!< tag memory address, only [0~mode.ways-1] is valid to use */ uint32_t cache_memory_offset[MAX_CACHE_WAYS]; /*!< cache memory address, only [0~mode.ways-1] is valid to use */ - uint8_t use_legacy; /*!< 1 for using legacy tag api, 0 for using 2rd tag api */ + uint8_t use_legacy; /*!< 1 for using legacy tag api, 0 for using 2nd tag api */ }; struct lock_config { @@ -1096,7 +1096,7 @@ void Cache_Travel_Tag_Memory2(struct cache_mode * mode, uint32_t filter_addr, vo * * @param struct cache_mode * mode : the cache to calculate the virtual address and the cache mode. * - * @param uint32_t tag : the tag part fo a tag item, 12-14 bits. + * @param uint32_t tag : the tag part of a tag item, 12-14 bits. * * @param uint32_t addr_offset : the virtual address offset of the cache ways. * diff --git a/components/esp_rom/include/esp32s3/rom/crc.h b/components/esp_rom/esp32s3/include/esp32s3/rom/crc.h similarity index 81% rename from components/esp_rom/include/esp32s3/rom/crc.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/crc.h index e47a2ff580ad..431b8d6efb93 100644 --- a/components/esp_rom/include/esp32s3/rom/crc.h +++ b/components/esp_rom/esp32s3/include/esp32s3/rom/crc.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_rom/include/esp32s3/rom/digital_signature.h b/components/esp_rom/esp32s3/include/esp32s3/rom/digital_signature.h similarity index 88% rename from components/esp_rom/include/esp32s3/rom/digital_signature.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/digital_signature.h index 36e71e7c4f39..e05b0a3712e4 100644 --- a/components/esp_rom/include/esp32s3/rom/digital_signature.h +++ b/components/esp_rom/esp32s3/include/esp32s3/rom/digital_signature.h @@ -1,16 +1,8 @@ -// Copyright 2019-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2019-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_rom/include/esp32s3/rom/efuse.h b/components/esp_rom/esp32s3/include/esp32s3/rom/efuse.h similarity index 99% rename from components/esp_rom/include/esp32s3/rom/efuse.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/efuse.h index c34ca57de109..a2aac78c9d22 100644 --- a/components/esp_rom/include/esp32s3/rom/efuse.h +++ b/components/esp_rom/esp32s3/include/esp32s3/rom/efuse.h @@ -56,7 +56,7 @@ typedef enum { } ets_efuse_block_t; /** - * @brief set timing accroding the apb clock, so no read error or write error happens. + * @brief set timing according the apb clock, so no read error or write error happens. * * @param clock: apb clock in HZ, only accept 5M(in FPGA), 10M(in FPGA), 20M, 40M, 80M. * @@ -209,7 +209,7 @@ bool ets_efuse_legacy_spi_boot_mode_disabled(void); * - 0 for uart force print. * - 1 for uart print when GPIO46 is low when digital reset. * 2 for uart print when GPIO46 is high when digital reset. - * 3 for uart force slient + * 3 for uart force silent */ uint32_t ets_efuse_get_uart_print_control(void); diff --git a/components/esp_rom/include/esp32s3/rom/ets_sys.h b/components/esp_rom/esp32s3/include/esp32s3/rom/ets_sys.h similarity index 98% rename from components/esp_rom/include/esp32s3/rom/ets_sys.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/ets_sys.h index 83c93b2eb6ae..7bc91572f2aa 100644 --- a/components/esp_rom/include/esp32s3/rom/ets_sys.h +++ b/components/esp_rom/esp32s3/include/esp32s3/rom/ets_sys.h @@ -61,7 +61,7 @@ struct ETSEventTag { ETSParam par; /**< Event parameter, sometimes without usage, then will be set as 0*/ }; -typedef void (*ETSTask)(ETSEvent *e); /**< Type of the Task processer*/ +typedef void (*ETSTask)(ETSEvent *e); /**< Type of the Task processor*/ typedef void (* ets_idle_cb_t)(void *arg); /**< Type of the system idle callback*/ @@ -80,7 +80,7 @@ typedef void (* ets_idle_cb_t)(void *arg); /**< Type of the system idle callbac * @{ */ -extern const char *const exc_cause_table[40]; ///**< excption cause that defined by the core.*/ +extern const char *const exc_cause_table[40]; ///**< exception cause that defined by the core.*/ /** * @brief Set Pro cpu Entry code, code can be called in PRO CPU when booting is not completed. @@ -145,7 +145,7 @@ uint8_t ets_get_printf_channel(void); void ets_write_char_uart(char c); /** - * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need ouput. + * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need output. * To install putc1, which is defaulted installed as ets_write_char_uart in none silent boot mode, as NULL in silent mode. * * @param void (*)(char) p: Output function to install. @@ -155,7 +155,7 @@ void ets_write_char_uart(char c); void ets_install_putc1(void (*p)(char c)); /** - * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need ouput. + * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need output. * To install putc2, which is defaulted installed as NULL. * * @param void (*)(char) p: Output function to install. @@ -198,7 +198,7 @@ typedef void ETSTimerFunc(void *timer_arg);/**< timer handler*/ typedef struct _ETSTIMER_ { struct _ETSTIMER_ *timer_next; /**< timer linker*/ - uint32_t timer_expire; /**< abstruct time when timer expire*/ + uint32_t timer_expire; /**< abstract time when timer expire*/ uint32_t timer_period; /**< timer period, 0 means timer is not periodic repeated*/ ETSTimerFunc *timer_func; /**< timer handler*/ void *timer_arg; /**< timer handler argument*/ diff --git a/components/esp_rom/include/esp32s3/rom/gpio.h b/components/esp_rom/esp32s3/include/esp32s3/rom/gpio.h similarity index 98% rename from components/esp_rom/include/esp32s3/rom/gpio.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/gpio.h index 13b9c9a60bb7..8958b03578bb 100644 --- a/components/esp_rom/include/esp32s3/rom/gpio.h +++ b/components/esp_rom/esp32s3/include/esp32s3/rom/gpio.h @@ -57,7 +57,7 @@ typedef enum { * * @param uint32_t enable_mask : the gpios that need be changed. * - * @param uint32_t disable_mask : the gpios that need diable output. + * @param uint32_t disable_mask : the gpios that need disable output. * * @return None */ diff --git a/components/esp_rom/include/esp32s3/rom/hmac.h b/components/esp_rom/esp32s3/include/esp32s3/rom/hmac.h similarity index 70% rename from components/esp_rom/include/esp32s3/rom/hmac.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/hmac.h index ac7ddf358ed4..2c65b0fc8593 100644 --- a/components/esp_rom/include/esp32s3/rom/hmac.h +++ b/components/esp_rom/esp32s3/include/esp32s3/rom/hmac.h @@ -1,16 +1,8 @@ -// Copyright 2018-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2018-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_rom/include/esp32s3/rom/libc_stubs.h b/components/esp_rom/esp32s3/include/esp32s3/rom/libc_stubs.h similarity index 100% rename from components/esp_rom/include/esp32s3/rom/libc_stubs.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/libc_stubs.h diff --git a/components/esp_rom/include/esp32s3/rom/lldesc.h b/components/esp_rom/esp32s3/include/esp32s3/rom/lldesc.h similarity index 100% rename from components/esp_rom/include/esp32s3/rom/lldesc.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/lldesc.h diff --git a/components/esp_rom/include/esp32s3/rom/md5_hash.h b/components/esp_rom/esp32s3/include/esp32s3/rom/md5_hash.h similarity index 100% rename from components/esp_rom/include/esp32s3/rom/md5_hash.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/md5_hash.h diff --git a/components/esp_rom/include/esp32s3/rom/opi_flash.h b/components/esp_rom/esp32s3/include/esp32s3/rom/opi_flash.h similarity index 98% rename from components/esp_rom/include/esp32s3/rom/opi_flash.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/opi_flash.h index 8976e7b53e72..3f5d8405498c 100644 --- a/components/esp_rom/include/esp32s3/rom/opi_flash.h +++ b/components/esp_rom/esp32s3/include/esp32s3/rom/opi_flash.h @@ -55,8 +55,8 @@ typedef struct { uint32_t addrBitLen; /*!< Address byte length*/ uint32_t *txData; /*!< Point to send data buffer*/ uint32_t txDataBitLen; /*!< Send data byte length.*/ - uint32_t *rxData; /*!< Point to recevie data buffer*/ - uint32_t rxDataBitLen; /*!< Recevie Data byte length.*/ + uint32_t *rxData; /*!< Point to receive data buffer*/ + uint32_t rxDataBitLen; /*!< Receive Data byte length.*/ uint32_t dummyBitLen; } esp_rom_spi_cmd_t; diff --git a/components/esp_rom/include/esp32s3/rom/rom_layout.h b/components/esp_rom/esp32s3/include/esp32s3/rom/rom_layout.h similarity index 100% rename from components/esp_rom/include/esp32s3/rom/rom_layout.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/rom_layout.h diff --git a/components/esp_rom/include/esp32s3/rom/rsa_pss.h b/components/esp_rom/esp32s3/include/esp32s3/rom/rsa_pss.h similarity index 53% rename from components/esp_rom/include/esp32s3/rom/rsa_pss.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/rsa_pss.h index 71ae5892263e..23cb04989194 100644 --- a/components/esp_rom/include/esp32s3/rom/rsa_pss.h +++ b/components/esp_rom/esp32s3/include/esp32s3/rom/rsa_pss.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_rom/include/esp32s3/rom/rtc.h b/components/esp_rom/esp32s3/include/esp32s3/rom/rtc.h similarity index 100% rename from components/esp_rom/include/esp32s3/rom/rtc.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/rtc.h diff --git a/components/esp_rom/include/esp32s3/rom/secure_boot.h b/components/esp_rom/esp32s3/include/esp32s3/rom/secure_boot.h similarity index 100% rename from components/esp_rom/include/esp32s3/rom/secure_boot.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/secure_boot.h diff --git a/components/esp_rom/include/esp32s3/rom/sha.h b/components/esp_rom/esp32s3/include/esp32s3/rom/sha.h similarity index 65% rename from components/esp_rom/include/esp32s3/rom/sha.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/sha.h index 4d8fe901955b..64a26c69052c 100644 --- a/components/esp_rom/include/esp32s3/rom/sha.h +++ b/components/esp_rom/esp32s3/include/esp32s3/rom/sha.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once #include diff --git a/components/esp_rom/include/esp32s3/rom/spi_flash.h b/components/esp_rom/esp32s3/include/esp32s3/rom/spi_flash.h similarity index 99% rename from components/esp_rom/include/esp32s3/rom/spi_flash.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/spi_flash.h index 069fc7dbf3be..519f89eec6f1 100644 --- a/components/esp_rom/include/esp32s3/rom/spi_flash.h +++ b/components/esp_rom/esp32s3/include/esp32s3/rom/spi_flash.h @@ -465,7 +465,7 @@ void esp_rom_spiflash_fix_dummylen(uint8_t spi, uint8_t freqdiv); * * @param uint8_t *drvs: drvs[0]-bit[3:0] for cpiclk, bit[7:4] for spiq, drvs[1]-bit[3:0] for spid, drvs[1]-bit[7:4] for spid * drvs[2]-bit[3:0] for spihd, drvs[2]-bit[7:4] for spiwp. - * Values usually read from falsh by rom code, function usually callde by rom code. + * Values usually read from flash by rom code, function usually called by rom code. * if value with bit(3) set, the value is valid, bit[2:0] is the real value. * * @return None diff --git a/components/esp_rom/include/esp32s3/rom/tjpgd.h b/components/esp_rom/esp32s3/include/esp32s3/rom/tjpgd.h similarity index 94% rename from components/esp_rom/include/esp32s3/rom/tjpgd.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/tjpgd.h index 40340dea58ce..9d832b423272 100644 --- a/components/esp_rom/include/esp32s3/rom/tjpgd.h +++ b/components/esp_rom/esp32s3/include/esp32s3/rom/tjpgd.h @@ -71,7 +71,7 @@ struct JDEC { BYTE msx, msy; /* MCU size in unit of block (width, height) */ BYTE qtid[3]; /* Quantization table ID of each component */ SHORT dcv[3]; /* Previous DC element of each component */ - WORD nrst; /* Restart inverval */ + WORD nrst; /* Restart interval */ UINT width, height; /* Size of the input image (pixel) */ BYTE *huffbits[2][2]; /* Huffman bit distribution tables [id][dcac] */ WORD *huffcode[2][2]; /* Huffman code word tables [id][dcac] */ @@ -80,9 +80,9 @@ struct JDEC { void *workbuf; /* Working buffer for IDCT and RGB output */ BYTE *mcubuf; /* Working buffer for the MCU */ void *pool; /* Pointer to available memory pool */ - UINT sz_pool; /* Size of momory pool (bytes available) */ + UINT sz_pool; /* Size of memory pool (bytes available) */ UINT (*infunc)(JDEC *, BYTE *, UINT); /* Pointer to jpeg stream input function */ - void *device; /* Pointer to I/O device identifiler for the session */ + void *device; /* Pointer to I/O device identifier for the session */ }; /* TJpgDec API functions */ diff --git a/components/esp_rom/include/esp32s3/rom/uart.h b/components/esp_rom/esp32s3/include/esp32s3/rom/uart.h similarity index 98% rename from components/esp_rom/include/esp32s3/rom/uart.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/uart.h index 864563f78835..b427f3226283 100644 --- a/components/esp_rom/include/esp32s3/rom/uart.h +++ b/components/esp_rom/esp32s3/include/esp32s3/rom/uart.h @@ -26,7 +26,7 @@ extern "C" { #define RX_BUFF_SIZE 0x400 #define TX_BUFF_SIZE 100 -//uart int enalbe register ctrl bits +//uart int enable register ctrl bits #define UART_RCV_INTEN BIT0 #define UART_TRX_INTEN BIT1 #define UART_LINE_STATUS_INTEN BIT2 @@ -261,7 +261,7 @@ char uart_rx_one_char_block(void); * * @param uint8_t *pString : the pointer to store the string. * - * @param uint8_t MaxStrlen : the max string length, incude '\0'. + * @param uint8_t MaxStrlen : the max string length, include '\0'. * * @return OK. */ diff --git a/components/esp_rom/include/esp32s3/rom/usb/cdc_acm.h b/components/esp_rom/esp32s3/include/esp32s3/rom/usb/cdc_acm.h similarity index 100% rename from components/esp_rom/include/esp32s3/rom/usb/cdc_acm.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/usb/cdc_acm.h diff --git a/components/esp_rom/include/esp32s3/rom/usb/chip_usb_dw_wrapper.h b/components/esp_rom/esp32s3/include/esp32s3/rom/usb/chip_usb_dw_wrapper.h similarity index 100% rename from components/esp_rom/include/esp32s3/rom/usb/chip_usb_dw_wrapper.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/usb/chip_usb_dw_wrapper.h diff --git a/components/esp_rom/include/esp32s3/rom/usb/cpio.h b/components/esp_rom/esp32s3/include/esp32s3/rom/usb/cpio.h similarity index 100% rename from components/esp_rom/include/esp32s3/rom/usb/cpio.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/usb/cpio.h diff --git a/components/esp_rom/include/esp32s3/rom/usb/usb_cdc.h b/components/esp_rom/esp32s3/include/esp32s3/rom/usb/usb_cdc.h similarity index 100% rename from components/esp_rom/include/esp32s3/rom/usb/usb_cdc.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/usb/usb_cdc.h diff --git a/components/esp_rom/include/esp32s3/rom/usb/usb_common.h b/components/esp_rom/esp32s3/include/esp32s3/rom/usb/usb_common.h similarity index 100% rename from components/esp_rom/include/esp32s3/rom/usb/usb_common.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/usb/usb_common.h diff --git a/components/esp_rom/include/esp32s3/rom/usb/usb_dc.h b/components/esp_rom/esp32s3/include/esp32s3/rom/usb/usb_dc.h similarity index 99% rename from components/esp_rom/include/esp32s3/rom/usb/usb_dc.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/usb/usb_dc.h index 725362fa191e..8640c70580c9 100644 --- a/components/esp_rom/include/esp32s3/rom/usb/usb_dc.h +++ b/components/esp_rom/esp32s3/include/esp32s3/rom/usb/usb_dc.h @@ -365,7 +365,7 @@ int usb_dc_ep_read_continue(uint8_t ep); * @param[in] ep Endpoint address corresponding to the one * listed in the device configuration table * - * @return enpoint max packet size (mps) + * @return endpoint max packet size (mps) */ int usb_dc_ep_mps(uint8_t ep); @@ -384,7 +384,7 @@ void usb_dc_check_poll_for_interrupts(void); * * This takes the USB peripheral offline in such a way that it seems 'just busy' to the * host. This way, the chip can reboot (e.g. into bootloader mode) and pick up the USB - * configuration again, without the conenction to the host being interrupted. + * configuration again, without the connection to the host being interrupted. * * @note Actual persistence is depending on USBDC_PERSIST_ENA being set in flags, as this * is also used to e.g. reboot into DFU mode. diff --git a/components/esp_rom/include/esp32s3/rom/usb/usb_descriptor.h b/components/esp_rom/esp32s3/include/esp32s3/rom/usb/usb_descriptor.h similarity index 100% rename from components/esp_rom/include/esp32s3/rom/usb/usb_descriptor.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/usb/usb_descriptor.h diff --git a/components/esp_rom/include/esp32s2/rom/usb/usb_device.h b/components/esp_rom/esp32s3/include/esp32s3/rom/usb/usb_device.h similarity index 99% rename from components/esp_rom/include/esp32s2/rom/usb/usb_device.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/usb/usb_device.h index 87dbcda15b26..bd9739fa5237 100644 --- a/components/esp_rom/include/esp32s2/rom/usb/usb_device.h +++ b/components/esp_rom/esp32s3/include/esp32s3/rom/usb/usb_device.h @@ -248,7 +248,7 @@ int usb_read(uint8_t ep, uint8_t *data, uint32_t max_data_len, * @brief set STALL condition on the specified endpoint * * This function is called by USB device class handler code to set stall - * conditionin on endpoint. + * condition on endpoint. * * @param[in] ep Endpoint address corresponding to the one listed in * the device configuration table @@ -262,7 +262,7 @@ int usb_ep_set_stall(uint8_t ep); * @brief clears STALL condition on the specified endpoint * * This function is called by USB device class handler code to clear stall - * conditionin on endpoint. + * condition on endpoint. * * @param[in] ep Endpoint address corresponding to the one listed in * the device configuration table diff --git a/components/esp_rom/include/esp32s3/rom/usb/usb_dfu.h b/components/esp_rom/esp32s3/include/esp32s3/rom/usb/usb_dfu.h similarity index 100% rename from components/esp_rom/include/esp32s3/rom/usb/usb_dfu.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/usb/usb_dfu.h diff --git a/components/esp_rom/include/esp32s3/rom/usb/usb_os_glue.h b/components/esp_rom/esp32s3/include/esp32s3/rom/usb/usb_os_glue.h similarity index 100% rename from components/esp_rom/include/esp32s3/rom/usb/usb_os_glue.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/usb/usb_os_glue.h diff --git a/components/esp_rom/include/esp32s3/rom/usb/usb_persist.h b/components/esp_rom/esp32s3/include/esp32s3/rom/usb/usb_persist.h similarity index 100% rename from components/esp_rom/include/esp32s3/rom/usb/usb_persist.h rename to components/esp_rom/esp32s3/include/esp32s3/rom/usb/usb_persist.h diff --git a/components/esp_rom/include/esp32/rom/miniz.h b/components/esp_rom/include/esp32/rom/miniz.h deleted file mode 100644 index f0baecabdcec..000000000000 --- a/components/esp_rom/include/esp32/rom/miniz.h +++ /dev/null @@ -1,8 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#warning "{target}/rom/miniz.h is deprecated, please use (#include "miniz.h") instead" -#include "../../miniz.h" diff --git a/components/esp_rom/include/esp32/rom/tbconsole.h b/components/esp_rom/include/esp32/rom/tbconsole.h deleted file mode 100644 index d6ca069cc75b..000000000000 --- a/components/esp_rom/include/esp32/rom/tbconsole.h +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#ifndef _ROM_TBCONSOLE_H_ -#define _ROM_TBCONSOLE_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -void start_tb_console(void); - -#ifdef __cplusplus -} -#endif - -#endif /* _ROM_TBCONSOLE_H_ */ diff --git a/components/esp_rom/include/esp32c2/rom/miniz.h b/components/esp_rom/include/esp32c2/rom/miniz.h deleted file mode 100644 index f0baecabdcec..000000000000 --- a/components/esp_rom/include/esp32c2/rom/miniz.h +++ /dev/null @@ -1,8 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#warning "{target}/rom/miniz.h is deprecated, please use (#include "miniz.h") instead" -#include "../../miniz.h" diff --git a/components/esp_rom/include/esp32c3/rom/miniz.h b/components/esp_rom/include/esp32c3/rom/miniz.h deleted file mode 100644 index f0baecabdcec..000000000000 --- a/components/esp_rom/include/esp32c3/rom/miniz.h +++ /dev/null @@ -1,8 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#warning "{target}/rom/miniz.h is deprecated, please use (#include "miniz.h") instead" -#include "../../miniz.h" diff --git a/components/esp_rom/include/esp32c5/rom/miniz.h b/components/esp_rom/include/esp32c5/rom/miniz.h deleted file mode 100644 index 357e60a9c128..000000000000 --- a/components/esp_rom/include/esp32c5/rom/miniz.h +++ /dev/null @@ -1,8 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#warning "{target}/rom/miniz.h is deprecated, please use (#include "miniz.h") instead" -#include "../../miniz.h" diff --git a/components/esp_rom/include/esp32c6/rom/miniz.h b/components/esp_rom/include/esp32c6/rom/miniz.h deleted file mode 100644 index f0baecabdcec..000000000000 --- a/components/esp_rom/include/esp32c6/rom/miniz.h +++ /dev/null @@ -1,8 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#warning "{target}/rom/miniz.h is deprecated, please use (#include "miniz.h") instead" -#include "../../miniz.h" diff --git a/components/esp_rom/include/esp32c61/rom/miniz.h b/components/esp_rom/include/esp32c61/rom/miniz.h deleted file mode 100644 index 357e60a9c128..000000000000 --- a/components/esp_rom/include/esp32c61/rom/miniz.h +++ /dev/null @@ -1,8 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#warning "{target}/rom/miniz.h is deprecated, please use (#include "miniz.h") instead" -#include "../../miniz.h" diff --git a/components/esp_rom/include/esp32s2/rom/miniz.h b/components/esp_rom/include/esp32s2/rom/miniz.h deleted file mode 100644 index f0baecabdcec..000000000000 --- a/components/esp_rom/include/esp32s2/rom/miniz.h +++ /dev/null @@ -1,8 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#warning "{target}/rom/miniz.h is deprecated, please use (#include "miniz.h") instead" -#include "../../miniz.h" diff --git a/components/esp_rom/include/esp32s3/rom/miniz.h b/components/esp_rom/include/esp32s3/rom/miniz.h deleted file mode 100644 index f0baecabdcec..000000000000 --- a/components/esp_rom/include/esp32s3/rom/miniz.h +++ /dev/null @@ -1,8 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#warning "{target}/rom/miniz.h is deprecated, please use (#include "miniz.h") instead" -#include "../../miniz.h" diff --git a/components/esp_rom/include/linux/soc/reset_reasons.h b/components/esp_rom/include/linux/soc/reset_reasons.h deleted file mode 100644 index 7cc86ffddfbc..000000000000 --- a/components/esp_rom/include/linux/soc/reset_reasons.h +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2021 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief Dummy to satisfy the requirement for this type on Linux targets. - * Look at other reset_reasons.h files in IDF. - */ -typedef enum { - RESET_REASON_CHIP_POWER_ON = 0x01, // Power on reset -} soc_reset_reason_t; - -#ifdef __cplusplus -} -#endif diff --git a/components/esp_rom/include/linux/rom/efuse.h b/components/esp_rom/linux/include/linux/rom/efuse.h similarity index 100% rename from components/esp_rom/include/linux/rom/efuse.h rename to components/esp_rom/linux/include/linux/rom/efuse.h diff --git a/components/esp_rom/include/linux/rom/ets_sys.h b/components/esp_rom/linux/include/linux/rom/ets_sys.h similarity index 100% rename from components/esp_rom/include/linux/rom/ets_sys.h rename to components/esp_rom/linux/include/linux/rom/ets_sys.h diff --git a/components/esp_rom/linux/include/linux/soc/reset_reasons.h b/components/esp_rom/linux/include/linux/soc/reset_reasons.h new file mode 100644 index 000000000000..f5bd2c1534f9 --- /dev/null +++ b/components/esp_rom/linux/include/linux/soc/reset_reasons.h @@ -0,0 +1,23 @@ +/* + * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Dummy to satisfy the requirement for this type on Linux targets. + * Look at other reset_reasons.h files in IDF. + */ +typedef enum { + RESET_REASON_CHIP_POWER_ON = 0x01, // Power on reset +} soc_reset_reason_t; + +#ifdef __cplusplus +} +#endif diff --git a/components/nvs_flash/test_nvs_host/Makefile b/components/nvs_flash/test_nvs_host/Makefile index 7e8659aebf89..e1849a6cb9ca 100644 --- a/components/nvs_flash/test_nvs_host/Makefile +++ b/components/nvs_flash/test_nvs_host/Makefile @@ -34,7 +34,7 @@ else COMPILER := gcc endif -CPPFLAGS += -I../private_include -I../include -I../src -I../../heap/include -I../../esp_rom/include -I../../esp_rom/include/linux -I../../log/include -I./ -I../../esp_common/include -I../../esp32/include -I ../../mbedtls/mbedtls/include -I ../../spi_flash/include -I ../../esp_partition/include -I ../../hal/include -I ../../xtensa/include -I ../../soc/linux/include -I ../../../tools/catch -fprofile-arcs -ftest-coverage -g2 -ggdb +CPPFLAGS += -I../private_include -I../include -I../src -I../../heap/include -I../../esp_rom/include -I../../esp_rom/include/linux -I../../esp_rom/linux/include/linux -I../../log/include -I./ -I../../esp_common/include -I../../esp32/include -I ../../mbedtls/mbedtls/include -I ../../spi_flash/include -I ../../esp_partition/include -I ../../hal/include -I ../../xtensa/include -I ../../soc/linux/include -I ../../../tools/catch -fprofile-arcs -ftest-coverage -g2 -ggdb CFLAGS += -fprofile-arcs -ftest-coverage -DLINUX_TARGET -DLINUX_HOST_LEGACY_TEST CXXFLAGS += -std=c++11 -Wall -Werror -DLINUX_TARGET -DLINUX_HOST_LEGACY_TEST LDFLAGS += -lstdc++ -Wall -fprofile-arcs -ftest-coverage diff --git a/docs/en/migration-guides/release-5.x/5.4/system.rst b/docs/en/migration-guides/release-5.x/5.4/system.rst index df98248613b8..ae7414bf5d16 100644 --- a/docs/en/migration-guides/release-5.x/5.4/system.rst +++ b/docs/en/migration-guides/release-5.x/5.4/system.rst @@ -8,3 +8,10 @@ Log - `esp_log_buffer_hex` is deprecated, use `ESP_LOG_BUFFER_HEX` instead. - `esp_log_buffer_char` is deprecated, use `ESP_LOG_BUFFER_CHAR` instead. + +ESP rom +--- + +- All target-specific header files has been moved from `components/esp_rom/include/{target}/` to `/esp_rom/{target}/include/{target}/`, and `components/esp_rom/CMakeLists.txt` has been modified accordingly. If you encounter an error indicating a missing header file, such as ``fatal error: esp32s3/rom/efuse.h: No such file or directory``, try removing the leading relative path from the header file include statement. In your current and future development, when including any header files from the components/esp_rom folder, directly include the header file name without the target-specific relative folder path. +- All target-specific `rom/miniz.h` files are removed because they are deprecated. + diff --git a/tools/ci/check_copyright_config.yaml b/tools/ci/check_copyright_config.yaml index 0e505ee60324..9850f85dd9ca 100644 --- a/tools/ci/check_copyright_config.yaml +++ b/tools/ci/check_copyright_config.yaml @@ -143,7 +143,7 @@ argtable3: md5_hash: include: - - 'components/esp_rom/include/**/rom/md5_hash.h' + - 'components/esp_rom/*/include/**/rom/md5_hash.h' allowed_licenses: - BSD-3-Clause - Apache-2.0 @@ -182,7 +182,7 @@ tinyusb: # with files licensed under a mix of Apache and BSD-3-Clause licenses. esp_rom_usb: include: - - 'components/esp_rom/include/*/rom/usb/' + - 'components/esp_rom/*/include/*/rom/usb/' allowed_licenses: - Apache-2.0 - BSD-3-Clause diff --git a/tools/ci/check_copyright_ignore.txt b/tools/ci/check_copyright_ignore.txt index 713934c48f14..b45b0680a9c8 100644 --- a/tools/ci/check_copyright_ignore.txt +++ b/tools/ci/check_copyright_ignore.txt @@ -410,6 +410,7 @@ components/esp_hid/private/bt_hidh.h components/esp_local_ctrl/src/esp_local_ctrl_priv.h components/esp_local_ctrl/src/esp_local_ctrl_transport_ble.c components/esp_phy/test/test_phy_rtc.c +components/esp_rom/esp32/include/esp32/rom/tjpgd.h components/esp_rom/esp32/ld/esp32.rom.api.ld components/esp_rom/esp32/ld/esp32.rom.eco3.ld components/esp_rom/esp32/ld/esp32.rom.ld @@ -421,6 +422,7 @@ components/esp_rom/esp32/ld/esp32.rom.newlib-nano.ld components/esp_rom/esp32/ld/esp32.rom.newlib-time.ld components/esp_rom/esp32/ld/esp32.rom.redefined.ld components/esp_rom/esp32/ld/esp32.rom.syscalls.ld +components/esp_rom/esp32c3/include/esp32c3/rom/tjpgd.h components/esp_rom/esp32c3/ld/esp32c3.rom.api.ld components/esp_rom/esp32c3/ld/esp32c3.rom.eco3.ld components/esp_rom/esp32c3/ld/esp32c3.rom.ld @@ -428,50 +430,22 @@ components/esp_rom/esp32c3/ld/esp32c3.rom.libgcc.ld components/esp_rom/esp32c3/ld/esp32c3.rom.newlib-nano.ld components/esp_rom/esp32c3/ld/esp32c3.rom.newlib.ld components/esp_rom/esp32c3/ld/esp32c3.rom.version.ld +components/esp_rom/esp32s2/include/esp32s2/rom/opi_flash.h components/esp_rom/esp32s2/ld/esp32s2.rom.api.ld components/esp_rom/esp32s2/ld/esp32s2.rom.ld components/esp_rom/esp32s2/ld/esp32s2.rom.libgcc.ld components/esp_rom/esp32s2/ld/esp32s2.rom.newlib-data.ld components/esp_rom/esp32s2/ld/esp32s2.rom.newlib-funcs.ld components/esp_rom/esp32s2/ld/esp32s2.rom.newlib-nano.ld +components/esp_rom/esp32s3/include/esp32s3/rom/opi_flash.h +components/esp_rom/esp32s3/include/esp32s3/rom/tjpgd.h components/esp_rom/esp32s3/ld/esp32s3.rom.api.ld components/esp_rom/esp32s3/ld/esp32s3.rom.ld components/esp_rom/esp32s3/ld/esp32s3.rom.libgcc.ld components/esp_rom/esp32s3/ld/esp32s3.rom.newlib-nano.ld components/esp_rom/esp32s3/ld/esp32s3.rom.newlib.ld components/esp_rom/esp32s3/ld/esp32s3.rom.version.ld -components/esp_rom/include/esp32/rom/aes.h -components/esp_rom/include/esp32/rom/bigint.h -components/esp_rom/include/esp32/rom/crc.h -components/esp_rom/include/esp32/rom/sha.h -components/esp_rom/include/esp32/rom/tbconsole.h -components/esp_rom/include/esp32/rom/tjpgd.h -components/esp_rom/include/esp32c3/rom/bigint.h -components/esp_rom/include/esp32c3/rom/crc.h -components/esp_rom/include/esp32c3/rom/digital_signature.h -components/esp_rom/include/esp32c3/rom/esp_flash.h -components/esp_rom/include/esp32c3/rom/hmac.h -components/esp_rom/include/esp32c3/rom/rsa_pss.h -components/esp_rom/include/esp32c3/rom/sha.h -components/esp_rom/include/esp32c3/rom/tjpgd.h -components/esp_rom/include/esp32s2/rom/aes.h -components/esp_rom/include/esp32s2/rom/bigint.h -components/esp_rom/include/esp32s2/rom/crc.h -components/esp_rom/include/esp32s2/rom/digital_signature.h -components/esp_rom/include/esp32s2/rom/hmac.h -components/esp_rom/include/esp32s2/rom/opi_flash.h -components/esp_rom/include/esp32s2/rom/rsa_pss.h -components/esp_rom/include/esp32s2/rom/sha.h -components/esp_rom/include/esp32s3/rom/bigint.h -components/esp_rom/include/esp32s3/rom/crc.h -components/esp_rom/include/esp32s3/rom/digital_signature.h -components/esp_rom/include/esp32s3/rom/hmac.h -components/esp_rom/include/esp32s3/rom/opi_flash.h -components/esp_rom/include/esp32s3/rom/rsa_pss.h -components/esp_rom/include/esp32s3/rom/sha.h -components/esp_rom/include/esp32s3/rom/tjpgd.h components/esp_rom/include/esp_rom_crc.h -components/esp_rom/include/linux/soc/reset_reasons.h components/esp_rom/linux/esp_rom_crc.c components/esp_rom/linux/esp_rom_md5.c components/esp_rom/patches/esp_rom_crc.c diff --git a/tools/ci/check_public_headers_exceptions.txt b/tools/ci/check_public_headers_exceptions.txt index eef90d868b0e..faa9bc92d86f 100644 --- a/tools/ci/check_public_headers_exceptions.txt +++ b/tools/ci/check_public_headers_exceptions.txt @@ -16,7 +16,6 @@ components/freertos/FreeRTOS-Kernel-SMP/portable/xtensa/include/freertos/ components/log/include/esp_log_internal.h -components/esp_rom/include/esp32s2/rom/rsa_pss.h # LWIP: sockets.h uses #include_next<>, which doesn't work correctly with the checker @@ -85,23 +84,23 @@ components/esp_coex/include/private/esp_coexist_adapter.h components/esp_coex/include/esp_coex_i154.h ### To be fixed: headers that rely on implicit inclusion # -components/esp_rom/include/esp32/rom/rtc.h -components/esp_rom/include/esp32c3/rom/rtc.h -components/esp_rom/include/esp32s2/rom/rtc.h -components/esp_rom/include/esp32s3/rom/rtc.h -components/esp_rom/include/esp32c2/rom/rtc.h -components/esp_rom/include/esp32c5/rom/rtc.h -components/esp_rom/include/esp32c6/rom/rtc.h -components/esp_rom/include/esp32h2/rom/rtc.h -components/esp_rom/include/esp32p4/rom/rtc.h -components/esp_rom/include/esp32c61/rom/rtc.h -components/esp_rom/include/esp32/rom/sha.h -components/esp_rom/include/esp32/rom/secure_boot.h -components/esp_rom/include/esp32c3/rom/spi_flash.h -components/esp_rom/include/esp32s2/rom/spi_flash.h -components/esp_rom/include/esp32s2/rom/cache.h -components/esp_rom/include/esp32s2/rom/secure_boot.h -components/esp_rom/include/esp32s2/rom/opi_flash.h +components/esp_rom/esp32/include/esp32/rom/rtc.h +components/esp_rom/esp32c3/include/esp32c3/rom/rtc.h +components/esp_rom/esp32s2/include/esp32s2/rom/rtc.h +components/esp_rom/esp32s3/include/esp32s3/rom/rtc.h +components/esp_rom/esp32c2/include/esp32c2/rom/rtc.h +components/esp_rom/esp32c5/include/esp32c5/rom/rtc.h +components/esp_rom/esp32c6/include/esp32c6/rom/rtc.h +components/esp_rom/esp32h2/include/esp32h2/rom/rtc.h +components/esp_rom/esp32p4/include/esp32p4/rom/rtc.h +components/esp_rom/esp32c61/include/esp32c61/rom/rtc.h +components/esp_rom/esp32/include/esp32/rom/sha.h +components/esp_rom/esp32/include/esp32/rom/secure_boot.h +components/esp_rom/esp32c3/include/esp32c3/rom/spi_flash.h +components/esp_rom/esp32s2/include/esp32s2/rom/spi_flash.h +components/esp_rom/esp32s2/include/esp32s2/rom/cache.h +components/esp_rom/esp32s2/include/esp32s2/rom/secure_boot.h +components/esp_rom/esp32s2/include/esp32s2/rom/opi_flash.h components/esp_ringbuf/include/freertos/ringbuf.h components/esp_netif/include/esp_netif_defaults.h components/esp_netif/include/esp_netif_net_stack.h @@ -124,8 +123,8 @@ components/spi_flash/include/esp_private/spi_flash_os.h ### To be fixed: files which don't compile for esp32s2 target: components/esp_psram/include/esp32/himem.h -components/esp_rom/include/esp32/rom/ets_sys.h -components/esp_rom/include/esp32/rom/uart.h +components/esp_rom/esp32/include/esp32/rom/ets_sys.h +components/esp_rom/esp32/include/esp32/rom/uart.h ### To be fixed: files which don't compile for esp32s3 target: From 1f2100fc4dbb7192ac005918d943d20f3b2ed1dc Mon Sep 17 00:00:00 2001 From: Jiang Guang Ming Date: Thu, 27 Jun 2024 11:39:51 +0800 Subject: [PATCH 33/73] fix(esp_rom): cleanup esp_rom CMakeList.txt --- components/esp_rom/CMakeLists.txt | 7 ------- 1 file changed, 7 deletions(-) diff --git a/components/esp_rom/CMakeLists.txt b/components/esp_rom/CMakeLists.txt index 9a97104f9a44..b592f5866ebb 100644 --- a/components/esp_rom/CMakeLists.txt +++ b/components/esp_rom/CMakeLists.txt @@ -17,9 +17,6 @@ if(target STREQUAL "linux") "${target}/esp_rom_md5.c" "${target}/esp_rom_efuse.c") else() - if(CONFIG_IDF_TARGET_ESP32C5) - list(APPEND include_dirs "include/${target_folder}/..") - endif() list(APPEND sources "patches/esp_rom_crc.c" "patches/esp_rom_uart.c" "patches/esp_rom_spiflash.c" @@ -129,10 +126,6 @@ if(BOOTLOADER_BUILD) elseif(target STREQUAL "esp32s2") rom_linker_script("spiflash_legacy") - - elseif(target STREQUAL "esp32c6") - # The linking of the bootloader needs to use the rom_i2c_writeReg_Mask in esp32c6.rom.phy.ld - rom_linker_script("phy") endif() if(CONFIG_ESP_ROM_HAS_NEWLIB) From 4c62b82180c497e67f5adc85e5947c8135a979ea Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Thu, 27 Jun 2024 16:17:05 +0800 Subject: [PATCH 34/73] docs(ulp): fix doxygen comment formatting --- components/ulp/lp_core/include/ulp_lp_core.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/ulp/lp_core/include/ulp_lp_core.h b/components/ulp/lp_core/include/ulp_lp_core.h index 447c814ddace..d737d638aca8 100644 --- a/components/ulp/lp_core/include/ulp_lp_core.h +++ b/components/ulp/lp_core/include/ulp_lp_core.h @@ -31,9 +31,9 @@ typedef struct { uint32_t wakeup_source; /*!< Wakeup source flags */ uint32_t lp_timer_sleep_duration_us; /*!< Sleep duration when ULP_LP_CORE_WAKEUP_SOURCE_LP_TIMER is specified. Measurement unit: us */ #if ESP_ROM_HAS_LP_ROM - bool skip_lp_rom_boot; /* !< Skips the LP rom code and boots directly into the app code placed in LP RAM, - this gives faster boot time for time sensitive use-cases at the cost of skipping - setup e.g. of UART */ + bool skip_lp_rom_boot; /*!< Skips the LP rom code and boots directly into the app code placed in LP RAM, + this gives faster boot time for time sensitive use-cases at the cost of skipping + setup e.g. of UART */ #endif //ESP_ROM_HAS_LP_ROM } ulp_lp_core_cfg_t; From 2b701047619539ddcbd5a423a222af9ed20a372a Mon Sep 17 00:00:00 2001 From: wuzhenghui Date: Wed, 26 Jun 2024 18:04:36 +0800 Subject: [PATCH 35/73] fix(esp_hw_support): wait eFuse controller idle after sleep wakeup --- .../esp_hw_support/port/esp32c5/pmu_sleep.c | 4 ++++ .../esp_hw_support/port/esp32c6/pmu_sleep.c | 4 ++++ .../esp_hw_support/port/esp32p4/pmu_sleep.c | 3 +++ components/hal/esp32c5/include/hal/efuse_ll.h | 14 ++++++++++++++ components/hal/esp32c6/include/hal/efuse_ll.h | 16 +++++++++++++++- components/hal/esp32p4/include/hal/efuse_ll.h | 14 ++++++++++++++ 6 files changed, 54 insertions(+), 1 deletion(-) diff --git a/components/esp_hw_support/port/esp32c5/pmu_sleep.c b/components/esp_hw_support/port/esp32c5/pmu_sleep.c index f7f8185c13fc..363b73e7cec4 100644 --- a/components/esp_hw_support/port/esp32c5/pmu_sleep.c +++ b/components/esp_hw_support/port/esp32c5/pmu_sleep.c @@ -280,6 +280,10 @@ uint32_t pmu_sleep_start(uint32_t wakeup_opt, uint32_t reject_opt, uint32_t lslp bool pmu_sleep_finish(bool dslp) { (void)dslp; + + // Wait eFuse memory update done. + while(efuse_ll_get_controller_state() != EFUSE_CONTROLLER_STATE_IDLE); + return pmu_ll_hp_is_sleep_reject(PMU_instance()->hal->dev); } diff --git a/components/esp_hw_support/port/esp32c6/pmu_sleep.c b/components/esp_hw_support/port/esp32c6/pmu_sleep.c index b6c11b8632ed..a50e7bec68a2 100644 --- a/components/esp_hw_support/port/esp32c6/pmu_sleep.c +++ b/components/esp_hw_support/port/esp32c6/pmu_sleep.c @@ -347,6 +347,10 @@ uint32_t pmu_sleep_start(uint32_t wakeup_opt, uint32_t reject_opt, uint32_t lslp bool pmu_sleep_finish(bool dslp) { (void)dslp; + + // Wait eFuse memory update done. + while(efuse_ll_get_controller_state() != EFUSE_CONTROLLER_STATE_IDLE); + return pmu_ll_hp_is_sleep_reject(PMU_instance()->hal->dev); } diff --git a/components/esp_hw_support/port/esp32p4/pmu_sleep.c b/components/esp_hw_support/port/esp32p4/pmu_sleep.c index 0b3d5cbaf281..1f86803d4936 100644 --- a/components/esp_hw_support/port/esp32p4/pmu_sleep.c +++ b/components/esp_hw_support/port/esp32p4/pmu_sleep.c @@ -333,6 +333,9 @@ TCM_IRAM_ATTR bool pmu_sleep_finish(bool dslp) pmu_sleep_shutdown_ldo(); } + // Wait eFuse memory update done. + while(efuse_ll_get_controller_state() != EFUSE_CONTROLLER_STATE_IDLE); + unsigned chip_version = efuse_hal_chip_revision(); if (!ESP_CHIP_REV_ABOVE(chip_version, 1)) { REGI2C_WRITE_MASK(I2C_CPLL, I2C_CPLL_OC_DIV_7_0, 6); // lower default cpu_pll freq to 400M diff --git a/components/hal/esp32c5/include/hal/efuse_ll.h b/components/hal/esp32c5/include/hal/efuse_ll.h index 8e283d1a7a0f..414b241bd3a9 100644 --- a/components/hal/esp32c5/include/hal/efuse_ll.h +++ b/components/hal/esp32c5/include/hal/efuse_ll.h @@ -18,6 +18,15 @@ extern "C" { #endif +typedef enum { + EFUSE_CONTROLLER_STATE_RESET = 0, ///< efuse_controllerid is on reset state. + EFUSE_CONTROLLER_STATE_IDLE = 1, ///< efuse_controllerid is on idle state. + EFUSE_CONTROLLER_STATE_READ_INIT = 2, ///< efuse_controllerid is on read init state. + EFUSE_CONTROLLER_STATE_READ_BLK0 = 3, ///< efuse_controllerid is on reading block0 state. + EFUSE_CONTROLLER_STATE_BLK0_CRC_CHECK = 4, ///< efuse_controllerid is on checking block0 crc state. + EFUSE_CONTROLLER_STATE_READ_RS_BLK = 5, ///< efuse_controllerid is on reading RS block state. +} efuse_controller_state_t; + // Always inline these functions even no gcc optimization is applied. /******************* eFuse fields *************************/ @@ -134,6 +143,11 @@ __attribute__((always_inline)) static inline void efuse_ll_rs_bypass_update(void /******************* eFuse control functions *************************/ +__attribute__((always_inline)) static inline uint32_t efuse_ll_get_controller_state(void) +{ + return EFUSE.status.state; +} + #ifdef __cplusplus } #endif diff --git a/components/hal/esp32c6/include/hal/efuse_ll.h b/components/hal/esp32c6/include/hal/efuse_ll.h index fc687bc9decf..c7d5f4a0bbcd 100644 --- a/components/hal/esp32c6/include/hal/efuse_ll.h +++ b/components/hal/esp32c6/include/hal/efuse_ll.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -16,6 +16,15 @@ extern "C" { #endif +typedef enum { + EFUSE_CONTROLLER_STATE_RESET = 0, ///< efuse_controllerid is on reset state. + EFUSE_CONTROLLER_STATE_IDLE = 1, ///< efuse_controllerid is on idle state. + EFUSE_CONTROLLER_STATE_READ_INIT = 2, ///< efuse_controllerid is on read init state. + EFUSE_CONTROLLER_STATE_READ_BLK0 = 3, ///< efuse_controllerid is on reading block0 state. + EFUSE_CONTROLLER_STATE_BLK0_CRC_CHECK = 4, ///< efuse_controllerid is on checking block0 crc state. + EFUSE_CONTROLLER_STATE_READ_RS_BLK = 5, ///< efuse_controllerid is on reading RS block state. +} efuse_controller_state_t; + // Always inline these functions even no gcc optimization is applied. /******************* eFuse fields *************************/ @@ -175,6 +184,11 @@ __attribute__((always_inline)) static inline void efuse_ll_set_pwr_off_num(uint1 EFUSE.wr_tim_conf2.pwr_off_num = value; } +__attribute__((always_inline)) static inline uint32_t efuse_ll_get_controller_state(void) +{ + return EFUSE.status.state; +} + /******************* eFuse control functions *************************/ #ifdef __cplusplus diff --git a/components/hal/esp32p4/include/hal/efuse_ll.h b/components/hal/esp32p4/include/hal/efuse_ll.h index 3032dd041b8f..c287b964dc64 100644 --- a/components/hal/esp32p4/include/hal/efuse_ll.h +++ b/components/hal/esp32p4/include/hal/efuse_ll.h @@ -16,6 +16,15 @@ extern "C" { #endif +typedef enum { + EFUSE_CONTROLLER_STATE_RESET = 0, ///< efuse_controllerid is on reset state. + EFUSE_CONTROLLER_STATE_IDLE = 1, ///< efuse_controllerid is on idle state. + EFUSE_CONTROLLER_STATE_READ_INIT = 2, ///< efuse_controllerid is on read init state. + EFUSE_CONTROLLER_STATE_READ_BLK0 = 3, ///< efuse_controllerid is on reading block0 state. + EFUSE_CONTROLLER_STATE_BLK0_CRC_CHECK = 4, ///< efuse_controllerid is on checking block0 crc state. + EFUSE_CONTROLLER_STATE_READ_RS_BLK = 5, ///< efuse_controllerid is on reading RS block state. +} efuse_controller_state_t; + // Always inline these functions even no gcc optimization is applied. /******************* eFuse fields *************************/ @@ -130,6 +139,11 @@ __attribute__((always_inline)) static inline void efuse_ll_rs_bypass_update(void EFUSE.wr_tim_conf0_rs_bypass.update = 1; } +__attribute__((always_inline)) static inline uint32_t efuse_ll_get_controller_state(void) +{ + return EFUSE.status.state; +} + /******************* eFuse control functions *************************/ #ifdef __cplusplus From 9e3424709aa24f909fd49d91e4aa58381e184804 Mon Sep 17 00:00:00 2001 From: Aditya Patwardhan Date: Thu, 11 Apr 2024 15:12:01 +0530 Subject: [PATCH 36/73] fix(bootloader_support): Allow SOFT_DIS_JTAG in verify_release_mode --- .../bootloader_support/src/flash_encrypt.c | 53 ++++++++++++------- .../bootloader_support/src/secure_boot.c | 53 +++++++++++-------- 2 files changed, 66 insertions(+), 40 deletions(-) diff --git a/components/bootloader_support/src/flash_encrypt.c b/components/bootloader_support/src/flash_encrypt.c index 4c0cf8615a9d..5b37480dc236 100644 --- a/components/bootloader_support/src/flash_encrypt.c +++ b/components/bootloader_support/src/flash_encrypt.c @@ -357,23 +357,48 @@ bool esp_flash_encryption_cfg_verify_release_mode(void) ESP_LOGW(TAG, "Not disabled UART bootloader cache (set DIS_DOWNLOAD_ICACHE->1)"); } #endif + bool soft_dis_jtag = false; +#if SOC_EFUSE_SOFT_DIS_JTAG + size_t soft_dis_jtag_cnt_val = 0; + esp_efuse_read_field_cnt(ESP_EFUSE_SOFT_DIS_JTAG, &soft_dis_jtag_cnt_val); + soft_dis_jtag = (soft_dis_jtag_cnt_val == ESP_EFUSE_SOFT_DIS_JTAG[0]->bit_count); + if (soft_dis_jtag) { + bool hmac_key_found = false; + hmac_key_found = esp_efuse_find_purpose(ESP_EFUSE_KEY_PURPOSE_HMAC_DOWN_JTAG, NULL); + hmac_key_found |= esp_efuse_find_purpose(ESP_EFUSE_KEY_PURPOSE_HMAC_DOWN_ALL, NULL); + if (!hmac_key_found) { + ESP_LOGW(TAG, "SOFT_DIS_JTAG is set but HMAC key with respective purpose not found"); + soft_dis_jtag = false; + } + } +#endif + if (!soft_dis_jtag) { #if SOC_EFUSE_DIS_PAD_JTAG - secure = esp_efuse_read_field_bit(ESP_EFUSE_DIS_PAD_JTAG); - result &= secure; - if (!secure) { - ESP_LOGW(TAG, "Not disabled JTAG PADs (set DIS_PAD_JTAG->1)"); - } + secure = esp_efuse_read_field_bit(ESP_EFUSE_DIS_PAD_JTAG); + result &= secure; + if (!secure) { + ESP_LOGW(TAG, "Not disabled JTAG PADs (set DIS_PAD_JTAG->1)"); + } #endif #if SOC_EFUSE_DIS_USB_JTAG - secure = esp_efuse_read_field_bit(ESP_EFUSE_DIS_USB_JTAG); - result &= secure; - if (!secure) { - ESP_LOGW(TAG, "Not disabled USB JTAG (set DIS_USB_JTAG->1)"); - } + secure = esp_efuse_read_field_bit(ESP_EFUSE_DIS_USB_JTAG); + result &= secure; + if (!secure) { + ESP_LOGW(TAG, "Not disabled USB JTAG (set DIS_USB_JTAG->1)"); + } #endif +#if SOC_EFUSE_HARD_DIS_JTAG + secure = esp_efuse_read_field_bit(ESP_EFUSE_HARD_DIS_JTAG); + result &= secure; + if (!secure) { + ESP_LOGW(TAG, "Not disabled JTAG (set HARD_DIS_JTAG->1)"); + } +#endif + } + #if SOC_EFUSE_DIS_DIRECT_BOOT secure = esp_efuse_read_field_bit(ESP_EFUSE_DIS_DIRECT_BOOT); result &= secure; @@ -382,14 +407,6 @@ bool esp_flash_encryption_cfg_verify_release_mode(void) } #endif -#if SOC_EFUSE_HARD_DIS_JTAG - secure = esp_efuse_read_field_bit(ESP_EFUSE_HARD_DIS_JTAG); - result &= secure; - if (!secure) { - ESP_LOGW(TAG, "Not disabled JTAG (set HARD_DIS_JTAG->1)"); - } -#endif - #if SOC_EFUSE_DIS_BOOT_REMAP secure = esp_efuse_read_field_bit(ESP_EFUSE_DIS_BOOT_REMAP); result &= secure; diff --git a/components/bootloader_support/src/secure_boot.c b/components/bootloader_support/src/secure_boot.c index 9015bdfd5abe..b077469e0429 100644 --- a/components/bootloader_support/src/secure_boot.c +++ b/components/bootloader_support/src/secure_boot.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -298,38 +298,47 @@ bool esp_secure_boot_cfg_verify_release_mode(void) } #endif -#if SOC_EFUSE_HARD_DIS_JTAG - secure = esp_efuse_read_field_bit(ESP_EFUSE_HARD_DIS_JTAG); - result &= secure; - if (!secure) { - ESP_LOGW(TAG, "Not disabled JTAG (set HARD_DIS_JTAG->1)"); - } -#endif - + bool soft_dis_jtag = false; #if SOC_EFUSE_SOFT_DIS_JTAG size_t soft_dis_jtag_cnt_val = 0; esp_efuse_read_field_cnt(ESP_EFUSE_SOFT_DIS_JTAG, &soft_dis_jtag_cnt_val); - if (soft_dis_jtag_cnt_val != ESP_EFUSE_SOFT_DIS_JTAG[0]->bit_count) { - result &= secure; - ESP_LOGW(TAG, "Not disabled JTAG in the soft way (set SOFT_DIS_JTAG->max)"); + soft_dis_jtag = (soft_dis_jtag_cnt_val == ESP_EFUSE_SOFT_DIS_JTAG[0]->bit_count); + if (soft_dis_jtag) { + bool hmac_key_found = false; + hmac_key_found = esp_efuse_find_purpose(ESP_EFUSE_KEY_PURPOSE_HMAC_DOWN_JTAG, NULL); + hmac_key_found |= esp_efuse_find_purpose(ESP_EFUSE_KEY_PURPOSE_HMAC_DOWN_ALL, NULL); + if (!hmac_key_found) { + ESP_LOGW(TAG, "SOFT_DIS_JTAG is set but HMAC key with respective purpose not found"); + soft_dis_jtag = false; + } } #endif + if (!soft_dis_jtag) { +#if SOC_EFUSE_HARD_DIS_JTAG + secure = esp_efuse_read_field_bit(ESP_EFUSE_HARD_DIS_JTAG); + result &= secure; + if (!secure) { + ESP_LOGW(TAG, "Not disabled JTAG (set HARD_DIS_JTAG->1)"); + } +#endif + #if SOC_EFUSE_DIS_PAD_JTAG - secure = esp_efuse_read_field_bit(ESP_EFUSE_DIS_PAD_JTAG); - result &= secure; - if (!secure) { - ESP_LOGW(TAG, "Not disabled JTAG PADs (set DIS_PAD_JTAG->1)"); - } + secure = esp_efuse_read_field_bit(ESP_EFUSE_DIS_PAD_JTAG); + result &= secure; + if (!secure) { + ESP_LOGW(TAG, "Not disabled JTAG PADs (set DIS_PAD_JTAG->1)"); + } #endif #if SOC_EFUSE_DIS_USB_JTAG - secure = esp_efuse_read_field_bit(ESP_EFUSE_DIS_USB_JTAG); - result &= secure; - if (!secure) { - ESP_LOGW(TAG, "Not disabled USB JTAG (set DIS_USB_JTAG->1)"); - } + secure = esp_efuse_read_field_bit(ESP_EFUSE_DIS_USB_JTAG); + result &= secure; + if (!secure) { + ESP_LOGW(TAG, "Not disabled USB JTAG (set DIS_USB_JTAG->1)"); + } #endif + } #ifdef CONFIG_SECURE_BOOT_ENABLE_AGGRESSIVE_KEY_REVOKE secure = esp_efuse_read_field_bit(ESP_EFUSE_SECURE_BOOT_AGGRESSIVE_REVOKE); From b88eb1c1e56e5640158bb9b55a89598495a524c6 Mon Sep 17 00:00:00 2001 From: Frantisek Hrbata Date: Wed, 12 Jun 2024 15:44:24 +0200 Subject: [PATCH 37/73] docs: move and update idf.py size sub-commands documentation The documentation for the IDF Size tool has been relocated from the performance section to the tools section and updated to reflect the current refactored version of esp-idf-size. Signed-off-by: Frantisek Hrbata --- docs/en/api-guides/performance/size.rst | 306 +-------------------- docs/en/api-guides/tools/idf-size.rst | 266 ++++++++++++++++++ docs/en/api-guides/tools/index.rst | 1 + docs/zh_CN/api-guides/performance/size.rst | 306 +-------------------- docs/zh_CN/api-guides/tools/idf-size.rst | 1 + docs/zh_CN/api-guides/tools/index.rst | 1 + 6 files changed, 273 insertions(+), 608 deletions(-) create mode 100644 docs/en/api-guides/tools/idf-size.rst create mode 100644 docs/zh_CN/api-guides/tools/idf-size.rst diff --git a/docs/en/api-guides/performance/size.rst b/docs/en/api-guides/performance/size.rst index b38a2b7d1e01..f88f8a38bc94 100644 --- a/docs/en/api-guides/performance/size.rst +++ b/docs/en/api-guides/performance/size.rst @@ -3,8 +3,6 @@ Minimizing Binary Size :link_to_translation:`zh_CN:[中文]` -{IDF_TARGET_REDUCED_BY_IRAM: default="DRAM", esp32="IRAM and/or DRAM (depending on sizes)"} - The ESP-IDF build system compiles all source files in the project and ESP-IDF, but only functions and variables that are actually referenced by the program are linked into the final binary. In some cases, it is necessary to reduce the total size of the firmware binary, e.g., in order to fit it into the available flash partition size. The first step to reducing the total firmware binary size is measuring what is causing the size to increase. @@ -14,312 +12,12 @@ The first step to reducing the total firmware binary size is measuring what is c Measuring Static Sizes ---------------------- -To optimize both the firmware binary size and the memory usage, it is necessary to measure statically-allocated RAM (``data``, ``bss``), code (``text``), and read-only data (``rodata``) in your project. - -Using the :ref:`idf.py` sub-commands ``size``, ``size-components``, and ``size-files`` provides a summary of memory used by the project: - -.. note:: - - It is possible to add ``-DOUTPUT_FORMAT=csv`` or ``-DOUTPUT_FORMAT=json`` to get the output in CSV or JSON format. - -Size Summary ``idf.py size`` -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. only:: esp32 - - .. code-block:: bash - - $ idf.py size - [...] - Total sizes: - Used static DRAM: 10608 bytes ( 170128 remain, 5.9% used) - .data size: 8464 bytes - .bss size: 2144 bytes - Used static IRAM: 48834 bytes ( 82238 remain, 37.3% used) - .text size: 47807 bytes - .vectors size: 1027 bytes - Used Flash size : 117391 bytes - .text: 80103 bytes - .rodata: 37032 bytes - Total image size: 174689 bytes (.bin may be padded larger) - - -.. only:: not esp32 - - .. code-block:: bash - - $ idf.py size - [...] - Total sizes: - Used stat D/IRAM: 53743 bytes ( 122385 remain, 30.5% used) - .data size: 6504 bytes - .bss size: 1984 bytes - .text size: 44228 bytes - .vectors size: 1027 bytes - Used Flash size : 118879 bytes - .text: 83467 bytes - .rodata: 35156 bytes - Total image size: 170638 bytes (.bin may be padded larger) - -This output breaks down the size of all static memory regions in the firmware binary: - -.. only:: esp32 - - .. code-block:: bash - - $ idf.py size - [...] - Total sizes: - Used static DRAM: 10608 bytes ( 170128 remain, 5.9% used) - .data size: 8464 bytes - .bss size: 2144 bytes - Used static IRAM: 48834 bytes ( 82238 remain, 37.3% used) - .text size: 47807 bytes - .vectors size: 1027 bytes - Used Flash size : 117391 bytes - .text: 80103 bytes - .rodata: 37032 bytes - Total image size: 174689 bytes (.bin may be padded larger) - - - ``Used static DRAM``: Total amount of DRAM allocated at compile time. ``remain`` indicates the amount of DRAM left to be used as heap memory at runtime. Note that due to meta data overhead, implementation constraints, and startup heap allocations, the actual size of the DRAM heap is smaller. - - - ``.data size``: Amount of DRAM allocated at compile time for the ``.data`` (i.e., all statically allocated variables that are initialized to non-zero values). ``.data`` also consumes space in the binary image to store the non-zero initialization values. - - ``.bss size``: Amount of DRAM allocated at compile time for ``.bss`` (i.e., all statically allocated variables that are initialized to zero). ``.bss`` does not consume extra space in flash. - - - ``Used static IRAM``: Total amount of IRAM allocated at compile time. ``remain`` indicates the amount of IRAM left to be used as heap memory at runtime. Note that due to meta data overhead, implementation constraints, and startup heap allocations, the actual size of the IRAM heap is smaller. - - - ``.text size``: Amount of IRAM used for ``.text`` (i.e., all code that is executed from :ref:`IRAM `). ``.text`` also consumes space in the binary image as the code is initially stored there and is then copied over to IRAM on startup. - - - ``Used Flash size``: Total amount of flash used (excluding usage by DRAM and IRAM) - - - ``.text``: Amount of flash used for ``.text`` (i.e., all code that is executed via the flash cache, see :ref:`IROM `). - - ``.rodata``: Amount of flash used for ``.rodata`` (i.e., read-only data that is loaded via the flash cache, see :ref:`DROM `). - - - ``Total image size`` is the estimated total size of the binary file. - -.. only:: not esp32 - - .. code-block:: bash - - $ idf.py size - [...] - Total sizes: - Used stat D/IRAM: 53743 bytes ( 122385 remain, 30.5% used) - .data size: 6504 bytes - .bss size: 1984 bytes - .text size: 44228 bytes - .vectors size: 1027 bytes - Used Flash size : 118879 bytes - .text: 83467 bytes - .rodata: 35156 bytes - Total image size: 170638 bytes (.bin may be padded larger) - - - ``Used stat D/IRAM``: Total amount of D/IRAM used at compile time. ``remain`` indicates the amount of D/IRAM left to be used as heap memory at runtime. Note that due to meta data overhead, implementation constraints, and startup heap allocations, the actual size of the DRAM heap is smaller. - - - ``.data size``: Amount of D/IRAM allocated at compile time for the ``.data`` (i.e., all statically allocated variables that are initialized to non-zero values). ``.data`` also consumes space in the binary image to store the non-zero initialization values. - - ``.bss size``: Amount of D/IRAM allocated at compile time for ``.bss`` (i.e., all statically allocated variables that are initialized to zero). ``.bss`` does not consume extra space in flash. - - ``.text size``: Amount of D/IRAM used for ``.text`` (i.e., all code that is executed from internal RAM). ``.text`` also consumes space in the binary image as the code is initially stored there and is then copied over to D/IRAM on startup. - - - ``Used Flash size``: Total amount of flash used (excluding usage by D/IRAM) - - - ``.text``: Amount of flash used for ``.text`` (i.e., all code that is executed via the flash cache, see :ref:`IROM `). - - ``.rodata``: Amount of flash used for ``.rodata`` (i.e., read-only data that is loaded via the flash cache, see :ref:`DROM `). - - - ``Total image size`` is the estimated total size of the binary file. - - -Component Usage Summary ``idf.py size-components`` -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The summary output provided by ``idf.py size`` does not give enough details to find the main contributor to excessive binary size. To analyze in detail, use ``idf.py size-components``. - -.. code-block:: bash - - $ idf.py size-components - [...] - Total sizes: - DRAM .data size: 14956 bytes - DRAM .bss size: 15808 bytes - Used static DRAM: 30764 bytes ( 149972 available, 17.0% used) - Used static IRAM: 83918 bytes ( 47154 available, 64.0% used) - Flash code: 559943 bytes - Flash rodata: 176736 bytes - Total image size:~ 835553 bytes (.bin may be padded larger) - Per-archive contributions to ELF file: - Archive File DRAM .data & .bss & other IRAM D/IRAM Flash code & rodata Total - libnet80211.a 1267 6044 0 5490 0 107445 18484 138730 - liblwip.a 21 3838 0 0 0 97465 16116 117440 - libmbedtls.a 60 524 0 0 0 27655 69907 98146 - libmbedcrypto.a 64 81 0 30 0 76645 11661 88481 - libpp.a 2427 1292 0 20851 0 37208 4708 66486 - libc.a 4 0 0 0 0 57056 6455 63515 - libphy.a 1439 715 0 7798 0 33074 0 43026 - libwpa_supplicant.a 12 848 0 0 0 35505 1446 37811 - libfreertos.a 3104 740 0 15711 0 367 4228 24150 - libnvs_flash.a 0 24 0 0 0 14347 2924 17295 - libspi_flash.a 1562 294 0 8851 0 1840 1913 14460 - libesp_system.a 245 206 0 3078 0 5990 3817 13336 - libesp-tls.a 0 4 0 0 0 5637 3524 9165 - [... removed some lines here ...] - libesp_rom.a 0 0 0 112 0 0 0 112 - libcxx.a 0 0 0 0 0 47 0 47 - (exe) 0 0 0 3 0 3 12 18 - libesp_pm.a 0 0 0 0 0 8 0 8 - libesp_eth.a 0 0 0 0 0 0 0 0 - libmesh.a 0 0 0 0 0 0 0 0 - -The first lines of the output from ``idf.py size-components`` are the same as that from ``idf.py size``. After this, a table is printed as ``Per-archive contributions to ELF file``. This means how much each static library archive has contributed to the final binary size. - -Generally, one static library archive is built per component, although some are binary libraries included by a particular component, for example, ``libnet80211.a`` is included by ``esp_wifi`` component. There are also toolchain libraries such as ``libc.a`` and ``libgcc.a`` listed here, these provide Standard C/C++ Library and toolchain built-in functionality. - -If your project is simple and only has a ``main`` component, then all of the project's code will be shown under ``libmain.a``. If your project includes its own components (see :doc:`/api-guides/build-system`), then they will each be shown on a separate line. - -The table is sorted in descending order of the total contribution of the static archive to the binary size. - -The columns are as follows: - -.. list:: - - - ``DRAM .data & .bss & other`` - ``.data`` and ``.bss`` are the same as for the totals shown above. Both are static variables and reduce the total available RAM at runtime, but ``.bss`` does not contribute to the binary file size. ``other`` is a column for any custom section types that also contribute to RAM size. Usually, the value is 0. - :esp32: - ``IRAM`` - is the same as for the totals shown above. It refers to code linked to execute from IRAM, which uses space in the binary file and also reduces IRAM that can be dynamically allocated at runtime using ``HEAP_CAP_32BIT``. - :esp32: - ``D/IRAM`` - shows IRAM space which, due to occupying D/IRAM space, is also reducing available DRAM available as heap at runtime. - :not esp32: - ``IRAM`` - is the same as for the totals shown above. It refers to code linked to execute from IRAM, which uses space in the binary file and also reduces DRAM available as heap at runtime. - - ``Flash code & rodata`` - these are the same as the totals above, IROM and DROM space accessed from the flash cache that contribute to the binary size. - -Source File Usage Summary ``idf.py size-files`` -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -For even more details, run ``idf.py size-files`` to get a summary of the contribution each object file has made to the final binary size. Each object file corresponds to a single source file. - -.. code-block:: bash - - $ idf.py size-files - [...] - Total sizes: - DRAM .data size: 14956 bytes - DRAM .bss size: 15808 bytes - Used static DRAM: 30764 bytes ( 149972 available, 17.0% used) - Used static IRAM: 83918 bytes ( 47154 available, 64.0% used) - Flash code: 559943 bytes - Flash rodata: 176736 bytes - Total image size:~ 835553 bytes (.bin may be padded larger) - Per-file contributions to ELF file: - Object File DRAM .data & .bss & other IRAM D/IRAM Flash code & rodata Total - x509_crt_bundle.S.o 0 0 0 0 0 0 64212 64212 - wl_cnx.o 2 3183 0 221 0 13119 3286 19811 - phy_chip_v7.o 721 614 0 1642 0 16820 0 19797 - ieee80211_ioctl.o 740 96 0 437 0 15325 2627 19225 - pp.o 1142 45 0 8871 0 5030 537 15625 - ieee80211_output.o 2 20 0 2118 0 11617 914 14671 - ieee80211_sta.o 1 41 0 1498 0 10858 2218 14616 - lib_a-vfprintf.o 0 0 0 0 0 13829 752 14581 - lib_a-svfprintf.o 0 0 0 0 0 13251 752 14003 - ssl_tls.c.o 60 0 0 0 0 12769 463 13292 - sockets.c.o 0 648 0 0 0 11096 1030 12774 - nd6.c.o 8 932 0 0 0 11515 314 12769 - phy_chip_v7_cal.o 477 53 0 3499 0 8561 0 12590 - pm.o 32 364 0 2673 0 7788 782 11639 - ieee80211_scan.o 18 288 0 0 0 8889 1921 11116 - lib_a-svfiprintf.o 0 0 0 0 0 9654 1206 10860 - lib_a-vfiprintf.o 0 0 0 0 0 10069 734 10803 - ieee80211_ht.o 0 4 0 1186 0 8628 898 10716 - phy_chip_v7_ana.o 241 48 0 2657 0 7677 0 10623 - bignum.c.o 0 4 0 0 0 9652 752 10408 - tcp_in.c.o 0 52 0 0 0 8750 1282 10084 - trc.o 664 88 0 1726 0 6245 1108 9831 - tasks.c.o 8 704 0 7594 0 0 1475 9781 - ecp_curves.c.o 28 0 0 0 0 7384 2325 9737 - ecp.c.o 0 64 0 0 0 8864 286 9214 - ieee80211_hostap.o 1 41 0 0 0 8578 585 9205 - wdev.o 121 125 0 4499 0 3684 580 9009 - tcp_out.c.o 0 0 0 0 0 5686 2161 7847 - tcp.c.o 2 26 0 0 0 6161 1617 7806 - ieee80211_input.o 0 0 0 0 0 6797 973 7770 - wpa.c.o 0 656 0 0 0 6828 55 7539 - [... additional lines removed ...] - -After the summary of total sizes, a table of ``Per-file contributions to ELF file`` is printed. - -The columns are the same as shown above for ``idy.py size-components``, but this time the granularity is the contribution of each individual object file to the binary size. - -For example, we can see that the file ``x509_crt_bundle.S.o`` contributed 64,212 bytes to the total firmware size, all as ``.rodata`` in flash. Therefore we can guess that this application is using the :doc:`/api-reference/protocols/esp_crt_bundle` feature and not using this feature would save at last this many bytes from the firmware size. - -Some of the object files are linked from binary libraries and therefore you will not find a corresponding source file. To locate which component a source file belongs to, it is generally possible to search in the ESP-IDF source tree or look in the :ref:`linker-map-file` for the full path. - -Comparing Two Binaries -^^^^^^^^^^^^^^^^^^^^^^ - -If making some changes that affect binary size, it is possible to use an ESP-IDF tool to break down the exact differences in size. - -This operation is not part of ``idf.py``, it is necessary to run the `esp_idf_size `_ Python tool directly. - -To do so, first, locate the linker map file with the name ``PROJECTNAME.map`` in the build directory. The ``esp_idf_size`` tool performs its analysis based on the output of the linker map file. - -To compare with another binary, you also need its corresponding ``.map`` file saved from the build directory. - -For example, to compare two builds, one of which with the default :ref:`CONFIG_COMPILER_OPTIMIZATION` setting ``Debug (-Og)`` configuration while another with ``Optimize for size (-Os)``: - -.. code-block:: bash - - $ python -m esp_idf_size --diff build_Og/https_request.map build_Os/https_request.map - MAP file: build_Os/https_request.map - MAP file: build_Og/https_request.map - Difference is counted as - , i.e. a positive number means that is larger. - Total sizes of : Difference - DRAM .data size: 14516 bytes 14956 -440 - DRAM .bss size: 15792 bytes 15808 -16 - Used static DRAM: 30308 bytes ( 150428 available, 16.8% used) 30764 -456 ( +456 available, +0 total) - Used static IRAM: 78498 bytes ( 52574 available, 59.9% used) 83918 -5420 ( +5420 available, +0 total) - Flash code: 509183 bytes 559943 -50760 - Flash rodata: 170592 bytes 176736 -6144 - Total image size:~ 772789 bytes (.bin may be padded larger) 835553 -62764 - -We can see from the ``Difference`` column that changing this one setting caused the whole binary to be over 60 KB smaller and over 5 KB more RAM is available. - -It is also possible to use the ``diff`` mode to output a table of component-level (static library archive) differences: - -.. note:: - - To get the output in JSON or CSV format using ``esp_idf_size``, it is possible to use the ``--format`` option. - -.. code-block:: bash - - python -m esp_idf_size --archives --diff build_Og/https_request.map build_Oshttps_request.map - -Also at the individual source file level: - -.. code-block:: bash - - python -m esp_idf_size --files --diff build_Og/https_request.map build_Oshttps_request.map - -Other options, like writing the output to a file, are available, pass ``--help`` to see the full list. - -.. _idf-size-linker-failed: - -Showing Size When Linker Fails -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -If too much static memory is allocated, the linker will fail with an error such as ``DRAM segment data does not fit``, ``region `iram0_0_seg' overflowed by 44 bytes``, or similar. - -In these cases, ``idf.py size`` will not succeed either. However, it is possible to run ``esp_idf_size`` manually to view the **partial static memory usage**. The memory usage will miss the variables that could not be linked, so there still appears to be some free space. - -The map file argument is ``.map`` in the build directory. - -.. code-block:: bash - - python -m esp_idf_size build/project_name.map - -It is also possible to view the equivalent of ``size-components`` or ``size-files`` output: - -.. code-block:: bash - - python -m esp_idf_size --archives build/project_name.map - python -m esp_idf_size --files build/project_name.map +To optimize both the firmware binary size and the memory usage, it is necessary to measure statically-allocated RAM (``data``, ``bss``), code (``text``), and read-only data (``rodata``) in your project. The :ref:`idf.py` sub-commands ``size``, ``size-components``, and ``size-files`` can be used to examine statically-allocated RAM usage at different levels of detail. For more information, please see the :doc:`/api-guides/tools/idf-size` tool. .. _linker-map-file: Linker Map File -^^^^^^^^^^^^^^^ +--------------- .. note:: diff --git a/docs/en/api-guides/tools/idf-size.rst b/docs/en/api-guides/tools/idf-size.rst new file mode 100644 index 000000000000..d456f5392e0f --- /dev/null +++ b/docs/en/api-guides/tools/idf-size.rst @@ -0,0 +1,266 @@ +******** +IDF Size +******** + +IDF Size is a tool for analyzing statically-allocated memory in ESP-IDF project. The main functionality is provided by the esp-idf-size_ Python package, while :ref:`idf.py` offers a more user-friendly and higher-level interface through the ``size``, ``size-components``, and ``size-files`` sub-commands. These sub-commands allow you to specify various options, such as the report's output format. For more details, please use the ``--help`` option. ESP-IDF also includes a handy ``idf_size.py`` wrapper to invoke the esp-idf-size_ Python module. For more information, use the command ``idf_size.py --help``. + +Size Summary ``idf.py size`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This output provides a summary of the statically-allocated memory for different memory types in the firmware binary: + +.. code-block:: bash + + $ idf.py size + Memory Type Usage Summary + ┏━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓ + ┃ Memory Type/Section ┃ Used [bytes] ┃ Used [%] ┃ Remain [bytes] ┃ Total [bytes] ┃ + ┡━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩ + │ Flash Code │ 80666 │ 2.41 │ 3261638 │ 3342304 │ + │ .text │ 80666 │ 2.41 │ │ │ + │ IRAM │ 51835 │ 39.55 │ 79237 │ 131072 │ + │ .text │ 50807 │ 38.76 │ │ │ + │ .vectors │ 1027 │ 0.78 │ │ │ + │ Flash Data │ 38224 │ 0.91 │ 4156048 │ 4194272 │ + │ .rodata │ 37968 │ 0.91 │ │ │ + │ .appdesc │ 256 │ 0.01 │ │ │ + │ DRAM │ 11236 │ 6.22 │ 169500 │ 180736 │ + │ .data │ 8988 │ 4.97 │ │ │ + │ .bss │ 2248 │ 1.24 │ │ │ + │ RTC SLOW │ 24 │ 0.29 │ 8168 │ 8192 │ + │ .rtc_slow_reserved │ 24 │ 0.29 │ │ │ + └───────────────────────┴──────────────┴──────────┴────────────────┴───────────────┘ + Total image size: 179712 bytes (.bin may be padded larger) + +Espressif chips include various :doc:`/api-guides/memory-types`, which are detailed in the `Technical Reference Manual (TRM) <{IDF_TARGET_TRM_EN_URL}>`__. These memory types are listed in the ``Memory Type`` column, along with the ELF ``Sections`` that are loaded into each type. The ``Used`` columns display the memory usage for each specific memory type or section. The ``Remain`` column indicates the remaining available memory for the specified memory type. The ``Total`` column shows the total available memory for that memory type, based on the memory region sizes defined in the linker script that map into the memory type. + +.. note:: + + The ``Total`` memory available for each memory type, like ``IRAM``, is determined by the memory region sizes specified in the link map file, which is generated by the linker script, with the MEMORY command, during the build process. The esp-idf-size tool includes YAML files for each target, detailing memory type ranges based on the TRM. The memory ranges from the link map file are mapped to these memory type ranges. This process calculates the total memory available for different memory types. Note that the total available size may differ from what is stated in the TRM, as some memory portions may be reserved for purposes such as the bootloader or cache, depending on the configuration. The remaining memory is calculated by subtracting the sizes of output ``Sections`` loaded to the specific memory type from the ``Total`` size. + +.. note:: + + Certain memory types might map to the same hardware memory. On some targets, ``IRAM`` and ``DRAM`` could be mapped to the same hardware memory but at different virtual addresses, accessible through data and instruction buses. These memory types are referred to as ``DIRAM`` in the ``Memory Type`` column. + +Below is a description of the most interesting memory types and output sections. Please note that all output sections with a non-zero size are included in the summary. Their names are determined by the output section names specified in the linker script. + +- ``DRAM``: Total amount of DRAM allocated at compile time. ``Remain`` indicates the amount of DRAM left to be used as heap memory at runtime. Note that due to meta data overhead, implementation constraints, and startup heap allocations, the actual size of the DRAM heap is smaller. + + - ``.data``: Amount of DRAM allocated at compile time for the ``.data`` (i.e., all statically allocated variables that are initialized to non-zero values). ``.data`` also consumes space in the binary image to store the non-zero initialization values. + + - ``.bss``: Amount of DRAM allocated at compile time for ``.bss`` (i.e., all statically allocated variables that are initialized to zero). ``.bss`` does not consume extra space in flash. + +- ``IRAM``: Total amount of IRAM allocated at compile time. ``Remain`` indicates the amount of IRAM left to be used as heap memory at runtime. Note that due to meta data overhead, implementation constraints, and startup heap allocations, the actual size of the IRAM heap is smaller. + + - ``.text``: Amount of IRAM used for ``.text`` (i.e., all code that is executed from :ref:`IRAM `). ``.text`` also consumes space in the binary image as the code is initially stored there and is then copied over to IRAM on startup. + +- ``Flash Code``: Code executed from flash. + + - ``.text``: Amount of flash used for ``.text`` (i.e., all code that is executed via the flash cache, see :ref:`IROM `). +- ``Flash Data``: Data stored in flash. + + - ``.rodata``: Amount of flash used for ``.rodata`` (i.e., read-only data that is loaded via the flash cache, see :ref:`DROM `). + +- ``Total image size`` is the estimated total size of the binary file. + +Component Usage Summary ``idf.py size-components`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The summary output from ``idf.py size`` lacks sufficient detail to identify the primary cause of excessive binary size. For a more detailed analysis, use ``idf.py size-components``, which indicates the contribution of each static library archive to the final binary size. + +.. code-block:: bash + + $ idf.py size-components + Per-archive contributions to ELF file + ┏━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┓ + ┃ Archive File ┃ Total Size ┃ DRAM ┃ .bss ┃ .data ┃ IRAM ┃ .text ┃ .vectors ┃ Flash Code ┃ .text ┃ Flash Data ┃ .rodata ┃ .appdesc ┃ RTC SLOW ┃ .rtc_slow_reserved ┃ + ┡━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━╇━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━┩ + │ libnet80211.a │ 116712 │ 9454 │ 8393 │ 1061 │ 5310 │ 5310 │ 0 │ 89698 │ 89698 │ 12250 │ 12250 │ 0 │ 0 │ 0 │ + │ libmbedcrypto.a │ 105863 │ 141 │ 81 │ 60 │ 0 │ 0 │ 0 │ 71251 │ 71251 │ 34471 │ 34471 │ 0 │ 0 │ 0 │ + │ liblwip.a │ 85394 │ 2470 │ 2458 │ 12 │ 0 │ 0 │ 0 │ 79486 │ 79486 │ 3438 │ 3438 │ 0 │ 0 │ 0 │ + │ libpp.a │ 66484 │ 3915 │ 1444 │ 2471 │ 20004 │ 20004 │ 0 │ 37714 │ 37714 │ 4851 │ 4851 │ 0 │ 0 │ 0 │ + │ libc.a │ 59525 │ 576 │ 316 │ 260 │ 0 │ 0 │ 0 │ 55513 │ 55513 │ 3436 │ 3436 │ 0 │ 0 │ 0 │ + │ libesp_app_format.a │ 53209 │ 10 │ 10 │ 0 │ 0 │ 0 │ 0 │ 417 │ 417 │ 52782 │ 52526 │ 256 │ 0 │ 0 │ + │ libwpa_supplicant.a │ 45251 │ 1241 │ 1233 │ 8 │ 0 │ 0 │ 0 │ 42315 │ 42315 │ 1695 │ 1695 │ 0 │ 0 │ 0 │ + │ libphy.a │ 44360 │ 1229 │ 637 │ 592 │ 8922 │ 8922 │ 0 │ 34209 │ 34209 │ 0 │ 0 │ 0 │ 0 │ 0 │ + │ libfreertos.a │ 21108 │ 3841 │ 741 │ 3100 │ 15594 │ 15594 │ 0 │ 467 │ 467 │ 1206 │ 1206 │ 0 │ 0 │ 0 │ + │ libesp_hw_support.a │ 15147 │ 256 │ 96 │ 160 │ 5654 │ 5654 │ 0 │ 8264 │ 8264 │ 949 │ 949 │ 0 │ 24 │ 24 │ + │ libnvs_flash.a │ 14522 │ 24 │ 24 │ 0 │ 0 │ 0 │ 0 │ 14250 │ 14250 │ 248 │ 248 │ 0 │ 0 │ 0 │ + │ libesp_system.a │ 13304 │ 793 │ 313 │ 480 │ 4267 │ 4267 │ 0 │ 7575 │ 7575 │ 669 │ 669 │ 0 │ 0 │ 0 │ + │ libhal.a │ 13078 │ 4000 │ 8 │ 3992 │ 5810 │ 5810 │ 0 │ 3143 │ 3143 │ 125 │ 125 │ 0 │ 0 │ 0 │ + │ libheap.a │ 12009 │ 12 │ 8 │ 4 │ 7298 │ 7298 │ 0 │ 3109 │ 3109 │ 1590 │ 1590 │ 0 │ 0 │ 0 │ + │ libspi_flash.a │ 11613 │ 1348 │ 24 │ 1324 │ 8932 │ 8932 │ 0 │ 865 │ 865 │ 468 │ 468 │ 0 │ 0 │ 0 │ + │ libesp_driver_uart.a │ 7255 │ 228 │ 32 │ 196 │ 0 │ 0 │ 0 │ 6434 │ 6434 │ 593 │ 593 │ 0 │ 0 │ 0 │ + │ libesp_netif.a │ 5954 │ 33 │ 29 │ 4 │ 0 │ 0 │ 0 │ 5758 │ 5758 │ 163 │ 163 │ 0 │ 0 │ 0 │ + │ libvfs.a │ 4180 │ 236 │ 44 │ 192 │ 0 │ 0 │ 0 │ 3757 │ 3757 │ 187 │ 187 │ 0 │ 0 │ 0 │ + │ libesp_mm.a │ 4003 │ 160 │ 124 │ 36 │ 1002 │ 1002 │ 0 │ 2627 │ 2627 │ 214 │ 214 │ 0 │ 0 │ 0 │ + │ libesp_wifi.a │ 3919 │ 527 │ 47 │ 480 │ 357 │ 357 │ 0 │ 2993 │ 2993 │ 42 │ 42 │ 0 │ 0 │ 0 │ + │ libesp_timer.a │ 3471 │ 56 │ 24 │ 32 │ 1621 │ 1621 │ 0 │ 1659 │ 1659 │ 135 │ 135 │ 0 │ 0 │ 0 │ + │ libxtensa.a │ 3412 │ 1044 │ 0 │ 1044 │ 2213 │ 1789 │ 424 │ 119 │ 119 │ 36 │ 36 │ 0 │ 0 │ 0 │ + │ libnewlib.a │ 3352 │ 360 │ 200 │ 160 │ 1535 │ 1535 │ 0 │ 1346 │ 1346 │ 111 │ 111 │ 0 │ 0 │ 0 │ + │ libesp_event.a │ 3137 │ 4 │ 4 │ 0 │ 0 │ 0 │ 0 │ 2992 │ 2992 │ 141 │ 141 │ 0 │ 0 │ 0 │ + │ libesp_phy.a │ 2400 │ 53 │ 36 │ 17 │ 235 │ 235 │ 0 │ 1868 │ 1868 │ 244 │ 244 │ 0 │ 0 │ 0 │ + │ libbootloader_support.a │ 1939 │ 0 │ 0 │ 0 │ 1805 │ 1805 │ 0 │ 94 │ 94 │ 40 │ 40 │ 0 │ 0 │ 0 │ + │ libesp_partition.a │ 1865 │ 8 │ 8 │ 0 │ 0 │ 0 │ 0 │ 1689 │ 1689 │ 168 │ 168 │ 0 │ 0 │ 0 │ + │ libesp_common.a │ 1793 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 51 │ 51 │ 1742 │ 1742 │ 0 │ 0 │ 0 │ + │ liblog.a │ 1706 │ 280 │ 272 │ 8 │ 276 │ 276 │ 0 │ 1102 │ 1102 │ 48 │ 48 │ 0 │ 0 │ 0 │ + │ libefuse.a │ 1672 │ 64 │ 4 │ 60 │ 0 │ 0 │ 0 │ 1427 │ 1427 │ 181 │ 181 │ 0 │ 0 │ 0 │ + │ libsoc.a │ 1540 │ 0 │ 0 │ 0 │ 37 │ 37 │ 0 │ 39 │ 39 │ 1464 │ 1464 │ 0 │ 0 │ 0 │ + │ libstdc++.a │ 1502 │ 21 │ 17 │ 4 │ 0 │ 0 │ 0 │ 1282 │ 1282 │ 199 │ 199 │ 0 │ 0 │ 0 │ + │ libesp_ringbuf.a │ 1121 │ 0 │ 0 │ 0 │ 1024 │ 1024 │ 0 │ 0 │ 0 │ 97 │ 97 │ 0 │ 0 │ 0 │ + │ libmain.a │ 1027 │ 8 │ 8 │ 0 │ 0 │ 0 │ 0 │ 964 │ 964 │ 55 │ 55 │ 0 │ 0 │ 0 │ + │ libpthread.a │ 678 │ 20 │ 12 │ 8 │ 0 │ 0 │ 0 │ 604 │ 604 │ 54 │ 54 │ 0 │ 0 │ 0 │ + │ libesp_vfs_console.a │ 599 │ 12 │ 12 │ 0 │ 0 │ 0 │ 0 │ 415 │ 415 │ 172 │ 172 │ 0 │ 0 │ 0 │ + │ libxt_hal.a │ 475 │ 0 │ 0 │ 0 │ 443 │ 443 │ 0 │ 0 │ 0 │ 32 │ 32 │ 0 │ 0 │ 0 │ + │ librtc.a │ 456 │ 0 │ 0 │ 0 │ 456 │ 456 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ + │ libcore.a │ 331 │ 33 │ 33 │ 0 │ 0 │ 0 │ 0 │ 255 │ 255 │ 43 │ 43 │ 0 │ 0 │ 0 │ + │ libesp_coex.a │ 277 │ 0 │ 0 │ 0 │ 118 │ 118 │ 0 │ 159 │ 159 │ 0 │ 0 │ 0 │ 0 │ 0 │ + │ libapp_update.a │ 186 │ 4 │ 4 │ 0 │ 0 │ 0 │ 0 │ 152 │ 152 │ 30 │ 30 │ 0 │ 0 │ 0 │ + │ libesp_rom.a │ 102 │ 0 │ 0 │ 0 │ 102 │ 102 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ + │ libgcc.a │ 89 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 89 │ 89 │ 0 │ 0 │ 0 │ 0 │ 0 │ + │ libcxx.a │ 52 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 52 │ 52 │ 0 │ 0 │ 0 │ 0 │ 0 │ + │ libnvs_sec_provider.a │ 5 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 5 │ 5 │ 0 │ 0 │ 0 │ 0 │ 0 │ + │ (exe) │ 3 │ 0 │ 0 │ 0 │ 3 │ 0 │ 3 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ + └─────────────────────────┴────────────┴──────┴──────┴───────┴───────┴───────┴──────────┴────────────┴───────┴────────────┴─────────┴──────────┴──────────┴────────────────────┘ + + +Generally, one static library archive is built per component, although some are binary libraries included by a particular component, for example, ``libnet80211.a`` is included by ``esp_wifi`` component. There are also toolchain libraries such as ``libc.a`` and ``libgcc.a`` listed here, these provide Standard C/C++ Library and toolchain built-in functionality. + +If the project is simple and only has a ``main`` component, then all of the project's code will be shown under ``libmain.a``. If the project includes its own components (see :doc:`/api-guides/build-system`), then they will each be shown on a separate line. + +The table is sorted in descending order of the total contribution of the static archive to the binary size. The columns indicate memory types and output sections as detailed in the Size Summary. + +.. note:: + + The ``(exe)`` archive is a special archive that contains object files directly linked into the final binary, meaning they are not part of any archive file. + +.. note:: + + The size of the ``.rodata`` section in the ``Flash Data`` memory type may appear very large for a single archive. This occurs due to linker relaxations. The linker may attempt to combine object file sections with ``MERGE`` and ``STRINGS`` flags from all archives into one to perform tail string optimization. Consequently, one archive may end up with a very large ``.rodata`` section, containing string literals from other archives. This is evident in the ``.rodata`` section of the ``libesp_app_format.a`` archive. + + +Source File Usage Summary ``idf.py size-files`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +For even more details, run ``idf.py size-files`` to get a summary of the contribution each object file has made to the final binary size. Each object file corresponds to a single source file. + +.. code-block:: bash + + $ idf.py size-files + Per-file contributions to ELF file + ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━━┳━━━━━━┳━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┓ + ┃ Object File ┃ Total Size ┃ DRAM ┃ .bss ┃ .data ┃ IRAM ┃ .text ┃ .vectors ┃ Flash Code ┃ .text ┃ Flash Data ┃ .rodata ┃ .appdesc ┃ RTC SLOW ┃ .rtc_slow_reserved ┃ + ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━╇━━━━━━╇━━━━━━━╇━━━━━━╇━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━┩ + │ esp_app_desc.c.obj │ 72313 │ 10 │ 10 │ 0 │ 0 │ 0 │ 0 │ 417 │ 417 │ 71886 │ 71630 │ 256 │ 0 │ 0 │ + │ x509_crt_bundle.S.obj │ 67810 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 67810 │ 67810 │ 0 │ 0 │ 0 │ + │ ecp_curves.c.obj │ 36415 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 6875 │ 6875 │ 29540 │ 29540 │ 0 │ 0 │ 0 │ + │ phy_chip_v7.o │ 19384 │ 783 │ 533 │ 250 │ 2186 │ 2186 │ 0 │ 16415 │ 16415 │ 0 │ 0 │ 0 │ 0 │ 0 │ + │ wl_cnx.o │ 18567 │ 3891 │ 3889 │ 2 │ 277 │ 277 │ 0 │ 13343 │ 13343 │ 1056 │ 1056 │ 0 │ 0 │ 0 │ + │ ieee80211_output.o │ 15498 │ 27 │ 25 │ 2 │ 2083 │ 2083 │ 0 │ 12840 │ 12840 │ 548 │ 548 │ 0 │ 0 │ 0 │ + │ pp.o │ 14722 │ 1207 │ 53 │ 1154 │ 7286 │ 7286 │ 0 │ 5590 │ 5590 │ 639 │ 639 │ 0 │ 0 │ 0 │ + │ libc_a-vfprintf.o │ 14084 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 13508 │ 13508 │ 576 │ 576 │ 0 │ 0 │ 0 │ + │ phy_chip_v7_cal.o │ 13997 │ 229 │ 54 │ 175 │ 4039 │ 4039 │ 0 │ 9729 │ 9729 │ 0 │ 0 │ 0 │ 0 │ 0 │ + │ pm.o │ 13958 │ 532 │ 488 │ 44 │ 3630 │ 3630 │ 0 │ 8823 │ 8823 │ 973 │ 973 │ 0 │ 0 │ 0 │ + │ libc_a-svfprintf.o │ 13753 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 13177 │ 13177 │ 576 │ 576 │ 0 │ 0 │ 0 │ + │ ieee80211_sta.o │ 13711 │ 50 │ 38 │ 12 │ 1443 │ 1443 │ 0 │ 11181 │ 11181 │ 1037 │ 1037 │ 0 │ 0 │ 0 │ + │ ieee80211_ioctl.o │ 13479 │ 120 │ 116 │ 4 │ 271 │ 271 │ 0 │ 11127 │ 11127 │ 1961 │ 1961 │ 0 │ 0 │ 0 │ + │ ieee80211_scan.o │ 12037 │ 327 │ 309 │ 18 │ 0 │ 0 │ 0 │ 11119 │ 11119 │ 591 │ 591 │ 0 │ 0 │ 0 │ + │ ieee80211_hostap.o │ 11970 │ 42 │ 41 │ 1 │ 0 │ 0 │ 0 │ 10898 │ 10898 │ 1030 │ 1030 │ 0 │ 0 │ 0 │ + │ nd6.c.obj │ 11815 │ 940 │ 932 │ 8 │ 0 │ 0 │ 0 │ 10764 │ 10764 │ 111 │ 111 │ 0 │ 0 │ 0 │ + │ phy_chip_v7_ana.o │ 11039 │ 217 │ 50 │ 167 │ 2697 │ 2697 │ 0 │ 8125 │ 8125 │ 0 │ 0 │ 0 │ 0 │ 0 │ + │ ieee80211_ht.o │ 11033 │ 5 │ 4 │ 1 │ 1179 │ 1179 │ 0 │ 8466 │ 8466 │ 1383 │ 1383 │ 0 │ 0 │ 0 │ + │ sae.c.obj │ 11003 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 10971 │ 10971 │ 32 │ 32 │ 0 │ 0 │ 0 │ + │ tasks.c.obj │ 10753 │ 712 │ 696 │ 16 │ 9416 │ 9416 │ 0 │ 0 │ 0 │ 625 │ 625 │ 0 │ 0 │ 0 │ + │ libc_a-svfiprintf.o │ 10446 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 9398 │ 9398 │ 1048 │ 1048 │ 0 │ 0 │ 0 │ + │ libc_a-vfiprintf.o │ 10092 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 9516 │ 9516 │ 576 │ 576 │ 0 │ 0 │ 0 │ + │ wpa.c.obj │ 9688 │ 872 │ 872 │ 0 │ 0 │ 0 │ 0 │ 8816 │ 8816 │ 0 │ 0 │ 0 │ 0 │ 0 │ + │ tcp_in.c.obj │ 8904 │ 52 │ 52 │ 0 │ 0 │ 0 │ 0 │ 8698 │ 8698 │ 154 │ 154 │ 0 │ 0 │ 0 │ + [... additional lines removed ...] + + +The table is sorted in descending order of the total contribution of the object files to the binary size. The columns indicate memory types and output sections as detailed in the Size Summary. + +For example, we can see that the file ``x509_crt_bundle.S.o`` contributed 67,810 bytes to the total firmware size, all as ``.rodata`` in flash. Therefore we can guess that this application is using the :doc:`/api-reference/protocols/esp_crt_bundle` feature and not using this feature would save at last this many bytes from the firmware size. + +Some of the object files are linked from binary libraries and therefore you will not find a corresponding source file. To locate which component a source file belongs to, it is generally possible to search in the ESP-IDF source tree or look in the :ref:`linker-map-file` for the full path. + +Comparing Two Binaries +^^^^^^^^^^^^^^^^^^^^^^ + +When making changes that impact binary size, you can use the IDF Size tool to analyze the precise differences in size. The ``--diff`` option can be used with all previously mentioned sub-commands, allowing you to specify a path to a project build for comparison with the current project. + +For example to compare two ``hello_world`` project builds, follow these steps. First, create two copies of the ``hello_world`` project directory. Name the first project directory ``hello_world_Og``. This project will use the default :ref:`CONFIG_COMPILER_OPTIMIZATION` compiler optimization setting ``Debug (-Og)`` and will serve as the ``REFERENCE`` project. Name the second project directory ``hello_world_Os``. This project will use the ``Optimize for size (-Os)`` setting, which can be enabled using ``idf.py menuconfig``. This will be the ``CURRENT`` project. Build both projects. Then, from within the ``hello_world_Os`` project directory, run the following command: + + +.. code-block:: bash + + $ idf.py size --diff ../hello_world_Og + + CURRENT project file: "hello_world_Os/build/hello_world.map" + REFERENCE project file: "hello_world_Og/build/hello_world.map" + Difference is counted as CURRENT - REFERENCE, i.e. a positive number means that CURRENT is larger. + Memory Type Usage Summary + ┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓ + ┃ Memory Type/Section ┃ Used [bytes] ┃ Used [%] ┃ Remain [bytes] ┃ Total [bytes] ┃ + ┡━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━┩ + │ Flash Code │ 74498 -6168 │ 2.23 -0.18 │ 3267806 +6168 │ 3342304 0 │ + │ .text │ 74498 -6168 │ 2.23 -0.18 │ │ │ + │ IRAM │ 45539 -6296 │ 34.74 -4.8 │ 85533 +6296 │ 131072 0 │ + │ .text │ 44511 -6296 │ 33.96 -4.8 │ │ │ + │ Flash Data │ 35784 -2440 │ 0.85 -0.06 │ 4158488 +2440 │ 4194272 0 │ + │ .rodata │ 35528 -2440 │ 0.85 -0.06 │ │ │ + │ DRAM │ 10844 -392 │ 6.0 -0.22 │ 169892 +392 │ 180736 0 │ + │ .data │ 8612 -376 │ 4.76 -0.21 │ │ │ + │ .bss │ 2232 -16 │ 1.23 -0.01 │ │ │ + └─────────────────────┴──────────────┴──────────────┴────────────────┴────────────────┘ + Total image size: 164432 -15280 bytes (.bin may be padded larger) + +In addition to the previously mentioned Size Summary example, each column now also shows the size differences. Each difference is shown as ``CURRENT - REFERENCE``, meaning the current project sizes minus the sizes in the project specified with the `--diff` option. In this example, the final binary image of the ``hello_world_Os`` project is 15,280 bytes smaller than that of the ``hello_world_Og`` project. Additionally, the ``hello_world_Os`` project uses 6,168 bytes less in `Flash Code` memory, leaving 6,168 bytes more available in ``Flash Code``, with no difference in the total available memory. + +You can also use the diff mode to generate a table showing the differences at the component level (static library archive): + +.. code-block:: bash + + $ idf.py size-components --diff ../hello_world_Og + +Additionally, at the level of each individual source file: + +.. code-block:: bash + + $ idf.py size-files --diff ../hello_world_Og + +.. _idf-size-linker-failed: + +Showing Size When Linker Fails +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If too much static memory is allocated, the linker will fail with an error such as ``DRAM segment data does not fit``, ``region `iram0_0_seg' overflowed by 44 bytes``, or similar. + +In these cases, ``idf.py size`` will also fail. However, you can run ``idf_size.py``, which is a convenient wrapper that allows you to call ``esp-idf-size`` directly from within the ESP-IDF environment and see the partial static memory usage. The ``idf_size.py`` script requires a link map file as an argument, which is located in the project's build directory as ``.map``. + +.. code-block:: bash + + $ idf_size.py .map + warning: DRAM overflow detected!: output section or its part .dram0.bss(addr: 1073422848, size: 2240) does not fit into any memory region and will be assigned to the preceding dram0_0_seg memory region + warning: DRAM overflow detected!: output section or its part .dram0.data(addr: 1073414144, size: 8704) does not fit into any memory region and will be assigned to the preceding dram0_0_seg memory region + Memory Type Usage Summary + ┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓ + ┃ Memory Type/Section ┃ Used [bytes] ┃ Used [%] ┃ Remain [bytes] ┃ Total [bytes] ┃ + ┡━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩ + │ Flash Code │ 79759 │ 2.39 │ 3262545 │ 3342304 │ + │ .text │ 79759 │ 2.39 │ │ │ + │ IRAM │ 51106 │ 38.99 │ 79966 │ 131072 │ + │ .text │ 50079 │ 38.21 │ │ │ + │ .vectors │ 1027 │ 0.78 │ │ │ + │ Flash Data │ 38576 │ 0.92 │ 4155696 │ 4194272 │ + │ .rodata │ 38320 │ 0.91 │ │ │ + │ .appdesc │ 256 │ 0.01 │ │ │ + │ DRAM │ 10944 │ 0 │ -10944 │ 0 │ + │ .data_overflow │ 8704 │ 0 │ │ │ + │ .bss_overflow │ 2240 │ 0 │ │ │ + └─────────────────────┴──────────────┴──────────┴────────────────┴───────────────┘ + Total image size: 178145 bytes (.bin may be padded larger) + +Sections that do not fit into the memory region will have the suffix ``_overflow``. + +.. _esp-idf-size: https://github.com/espressif/esp-idf-size diff --git a/docs/en/api-guides/tools/index.rst b/docs/en/api-guides/tools/index.rst index 2f3251c3a244..1b25030209ff 100644 --- a/docs/en/api-guides/tools/index.rst +++ b/docs/en/api-guides/tools/index.rst @@ -11,4 +11,5 @@ Tools idf-component-manager idf-clang-tidy idf-tools + idf-size :esp32 or esp32c3: qemu diff --git a/docs/zh_CN/api-guides/performance/size.rst b/docs/zh_CN/api-guides/performance/size.rst index a8731a84556b..1a9545e7dcf4 100644 --- a/docs/zh_CN/api-guides/performance/size.rst +++ b/docs/zh_CN/api-guides/performance/size.rst @@ -3,8 +3,6 @@ :link_to_translation:`en:[English]` -{IDF_TARGET_REDUCED_BY_IRAM: default="DRAM", esp32="IRAM 和/或 DRAM(取决于大小)"} - ESP-IDF 构建系统会编译项目和 ESP-IDF 中所有源文件,但只有程序实际引用的函数和变量才会链接到最终的二进制文件中。在某些情况下,需要减小固件二进制文件的总大小,例如,为使固件适配 flash 分区大小。 要减小固件二进制文件总大小,首先要找到导致其大小增加的原因。 @@ -14,312 +12,12 @@ ESP-IDF 构建系统会编译项目和 ESP-IDF 中所有源文件,但只有程 测量静态数据大小 --------------------------- -为了优化固件二进制文件大小和内存使用,需要测量项目中静态分配的 RAM (``data``, ``bss``),代码 (``text``) 和只读数据 (``rodata``)。 - -使用 :ref:`idf.py` 的子命令 ``size``, ``size-components`` 和 ``size-files`` 可以输出项目使用内存概况: - -.. note:: - - 添加 ``-DOUTPUT_FORMAT=csv`` 或 ``-DOUTPUT_FORMAT=json``,即可用 CSV 或 JSON 格式输出文件。 - -数据大小概况 ``idf.py size`` -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. only:: esp32 - - .. code-block:: bash - - $ idf.py size - [...] - Total sizes: - Used static DRAM: 10608 bytes ( 170128 remain, 5.9% used) - .data size: 8464 bytes - .bss size: 2144 bytes - Used static IRAM: 48834 bytes ( 82238 remain, 37.3% used) - .text size: 47807 bytes - .vectors size: 1027 bytes - Used Flash size : 117391 bytes - .text: 80103 bytes - .rodata: 37032 bytes - Total image size: 174689 bytes (.bin may be padded larger) - - -.. only:: not esp32 - - .. code-block:: bash - - $ idf.py size - [...] - Total sizes: - Used stat D/IRAM: 53743 bytes ( 122385 remain, 30.5% used) - .data size: 6504 bytes - .bss size: 1984 bytes - .text size: 44228 bytes - .vectors size: 1027 bytes - Used Flash size : 118879 bytes - .text: 83467 bytes - .rodata: 35156 bytes - Total image size: 170638 bytes (.bin may be padded larger) - -该输出结果细分了固件二进制文件中所有静态内存区域的大小: - -.. only:: esp32 - - .. code-block:: bash - - $ idf.py size - [...] - Total sizes: - Used static DRAM: 10608 bytes ( 170128 remain, 5.9% used) - .data size: 8464 bytes - .bss size: 2144 bytes - Used static IRAM: 48834 bytes ( 82238 remain, 37.3% used) - .text size: 47807 bytes - .vectors size: 1027 bytes - Used Flash size : 117391 bytes - .text: 80103 bytes - .rodata: 37032 bytes - Total image size: 174689 bytes (.bin may be padded larger) - - - ``Used static DRAM``:编译时分配的 DRAM 大小。 ``remain`` 表示在运行时可用作堆内存的 DRAM 余量。请注意,由于元数据开销、实现限制和启动时的堆分配,实际的 DRAM 堆会更小。 - - - ``.data size``:编译时为 ``.data`` (即所有初始化值为非零值的静态变量)分配的 DRAM 大小。 ``.data`` 还在二进制映像中占用空间来存储非零初始化值。 - - ``.bss size``:编译时为 ``.bss`` (即所有初始化值为零的静态变量)分配的 DRAM 大小。``.bss`` 不会在 flash 中占用额外空间。 - - - ``Used static IRAM``:编译时分配的 IRAM 大小。 ``remain`` 表示在运行时可用作堆内存的 IRAM 余量。请注意,由于元数据开销、实现限制和启动时的堆分配,实际的 IRAM 堆会更小。 - - - ``.text size``:用于 ``.text`` 的 IRAM 大小(即所有从 :ref:`IRAM ` 执行的代码)。由于代码最初存储在 ``.text`` 中,在启动时才会复制到 IRAM,因此 ``.text`` 在二进制映像中也会占用空间。 - - - ``Used Flash size``:使用的 flash 大小(不包括 DRAM 和 IRAM 的使用量)。 - - - ``.text``:用于 ``.text`` (即通过 flash 缓存执行的所有代码,请参阅 :ref:`IROM `)的 flash 大小。 - - ``.rodata``:用于 ``.rodata`` (即通过 flash 缓存加载的只读数据,参阅 :ref:`DROM `)的 flash 大小。 - - - ``Total image size`` 是二进制文件的预估总大小。 - -.. only:: not esp32 - - .. code-block:: bash - - $ idf.py size - [...] - Total sizes: - Used stat D/IRAM: 53743 bytes ( 122385 remain, 30.5% used) - .data size: 6504 bytes - .bss size: 1984 bytes - .text size: 44228 bytes - .vectors size: 1027 bytes - Used Flash size : 118879 bytes - .text: 83467 bytes - .rodata: 35156 bytes - Total image size: 170638 bytes (.bin may be padded larger) - - - ``Used stat D/IRAM``:编译时使用的 D/IRAM 大小。``remain`` 表示在运行时可用作堆内存的 D/IRAM 余量。请注意,由于元数据开销、实现限制和启动时的堆分配,实际的 DRAM 堆会更小。 - - - ``.data size``:编译时为 ``.data`` (即所有初始化值为非零值的静态变量)分配的 D/IRAM 大小。 ``.data`` 还在二进制映像中占用空间来存储非零初始化值。 - - ``.bss size``:编译时为 ``.bss`` (即所有初始化值为零的静态变量)分配的 D/IRAM 大小。``.bss`` 不会在 flash 中占用额外空间。 - - ``.text size``:用于 ``.text`` 的 D/IRAM 大小(即所有从内部 RAM 执行的代码)。由于代码最初存储在 ``.text`` 中,在启动时才会复制到 D/IRAM,因此 ``.text`` 在二进制映像中也会占用空间。 - - - ``Used Flash size``:使用的 flash 总大小(不包括 D/IRAM 的使用量)。 - - - ``.text``:用于 ``.text`` (即通过 flash 缓存执行的所有代码,请参阅 :ref:`IROM `)的 flash 大小。 - - ``.rodata``:用于 ``.rodata`` (即通过 flash 缓存加载的只读数据,参阅 :ref:`DROM `)的 flash 大小。 - - - ``Total image size`` is the estimated total size of the binary file. - - -组件使用概况 ``idf.py size-components`` -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -``idf.py size`` 的输出结果不够详细,无法找出导致二进制文件过大的主要原因。要进行更详细的分析,请使用 ``idf.py size-components`` 。 - -.. code-block:: bash - - $ idf.py size-components - [...] - Total sizes: - DRAM .data size: 14956 bytes - DRAM .bss size: 15808 bytes - Used static DRAM: 30764 bytes ( 149972 available, 17.0% used) - Used static IRAM: 83918 bytes ( 47154 available, 64.0% used) - Flash code: 559943 bytes - Flash rodata: 176736 bytes - Total image size:~ 835553 bytes (.bin may be padded larger) - Per-archive contributions to ELF file: - Archive File DRAM .data & .bss & other IRAM D/IRAM Flash code & rodata Total - libnet80211.a 1267 6044 0 5490 0 107445 18484 138730 - liblwip.a 21 3838 0 0 0 97465 16116 117440 - libmbedtls.a 60 524 0 0 0 27655 69907 98146 - libmbedcrypto.a 64 81 0 30 0 76645 11661 88481 - libpp.a 2427 1292 0 20851 0 37208 4708 66486 - libc.a 4 0 0 0 0 57056 6455 63515 - libphy.a 1439 715 0 7798 0 33074 0 43026 - libwpa_supplicant.a 12 848 0 0 0 35505 1446 37811 - libfreertos.a 3104 740 0 15711 0 367 4228 24150 - libnvs_flash.a 0 24 0 0 0 14347 2924 17295 - libspi_flash.a 1562 294 0 8851 0 1840 1913 14460 - libesp_system.a 245 206 0 3078 0 5990 3817 13336 - libesp-tls.a 0 4 0 0 0 5637 3524 9165 - [... removed some lines here ...] - libesp_rom.a 0 0 0 112 0 0 0 112 - libcxx.a 0 0 0 0 0 47 0 47 - (exe) 0 0 0 3 0 3 12 18 - libesp_pm.a 0 0 0 0 0 8 0 8 - libesp_eth.a 0 0 0 0 0 0 0 0 - libmesh.a 0 0 0 0 0 0 0 0 - -``idf.py size-components`` 输出的前几行与 ``idf.py size`` 相同,此外还会输出 ``Per-archive contributions to ELF file`` 表格,显示每个静态库对最终二进制文件大小的贡献程度。 - -通常,每个组件都会构建一个静态库归档文件,尽管部分是由特定组件包含的二进制库,例如, ``esp_wifi`` 组件包含了 ``libnet80211.a``。此外,这里还列出了一些工具链库,例如 ``libc.a`` 和 ``libgcc.a``,用于提供 C/C++ 标准库和工具链内置功能。 - -对于只有一个 ``main`` 组件的简单项目,可在 ``libmain.a`` 目录下找到所有项目代码。若项目包含其特有组件(参阅 :doc:`/api-guides/build-system`),则每个组件将单独在一行中显示。 - -该表格按静态库归档文件对最终二进制文件大小的贡献程度降序排序。 - -各列含义如下: - -.. list:: - - - ``DRAM .data & .bss & other`` - ``.data`` 和 ``.bss`` 分别与上方显示的总数相同。两者都是静态变量,且都会减少运行时的可用 RAM,但 ``.bss`` 不会增加二进制文件大小。 ``other`` 列指任何会增加 RAM 大小的自定义数据段,该值通常为 0。 - :esp32: - ``IRAM`` - 该列与上方显示的总数相同,表示链接到从 IRAM 执行的代码,这些代码占用二进制文件空间,并且会减少执行 ``HEAP_CAP_32BIT`` 时可动态分配的 IRAM。 - :esp32: - ``D/IRAM`` - 显示了 IRAM 占用的空间。D/IRAM 占用的空间会减少运行时可用作堆内存的 DRAM 空间。 - :not esp32: - ``IRAM`` - 与上方显示的总数相同,表示链接到从 IRAM 执行的代码,这些代码占用二进制文件空间,并且会减少运行时可用作堆内存的 DRAM 空间。 - - ``Flash code & rodata`` - 这些值与上方显示总数相同,指通过 flash 缓存访问的 IROM 和 DROM 空间,对二进制文件大小的贡献。 - -源文件使用概况 ``idf.py size-files`` -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -要了解更多详情,请运行 ``idf.py size-files``,获取每个目标文件对最终二进制文件大小的贡献概况。每个目标文件对应一个单独的源文件。 - -.. code-block:: bash - - $ idf.py size-files - [...] - Total sizes: - DRAM .data size: 14956 bytes - DRAM .bss size: 15808 bytes - Used static DRAM: 30764 bytes ( 149972 available, 17.0% used) - Used static IRAM: 83918 bytes ( 47154 available, 64.0% used) - Flash code: 559943 bytes - Flash rodata: 176736 bytes - Total image size:~ 835553 bytes (.bin may be padded larger) - Per-file contributions to ELF file: - Object File DRAM .data & .bss & other IRAM D/IRAM Flash code & rodata Total - x509_crt_bundle.S.o 0 0 0 0 0 0 64212 64212 - wl_cnx.o 2 3183 0 221 0 13119 3286 19811 - phy_chip_v7.o 721 614 0 1642 0 16820 0 19797 - ieee80211_ioctl.o 740 96 0 437 0 15325 2627 19225 - pp.o 1142 45 0 8871 0 5030 537 15625 - ieee80211_output.o 2 20 0 2118 0 11617 914 14671 - ieee80211_sta.o 1 41 0 1498 0 10858 2218 14616 - lib_a-vfprintf.o 0 0 0 0 0 13829 752 14581 - lib_a-svfprintf.o 0 0 0 0 0 13251 752 14003 - ssl_tls.c.o 60 0 0 0 0 12769 463 13292 - sockets.c.o 0 648 0 0 0 11096 1030 12774 - nd6.c.o 8 932 0 0 0 11515 314 12769 - phy_chip_v7_cal.o 477 53 0 3499 0 8561 0 12590 - pm.o 32 364 0 2673 0 7788 782 11639 - ieee80211_scan.o 18 288 0 0 0 8889 1921 11116 - lib_a-svfiprintf.o 0 0 0 0 0 9654 1206 10860 - lib_a-vfiprintf.o 0 0 0 0 0 10069 734 10803 - ieee80211_ht.o 0 4 0 1186 0 8628 898 10716 - phy_chip_v7_ana.o 241 48 0 2657 0 7677 0 10623 - bignum.c.o 0 4 0 0 0 9652 752 10408 - tcp_in.c.o 0 52 0 0 0 8750 1282 10084 - trc.o 664 88 0 1726 0 6245 1108 9831 - tasks.c.o 8 704 0 7594 0 0 1475 9781 - ecp_curves.c.o 28 0 0 0 0 7384 2325 9737 - ecp.c.o 0 64 0 0 0 8864 286 9214 - ieee80211_hostap.o 1 41 0 0 0 8578 585 9205 - wdev.o 121 125 0 4499 0 3684 580 9009 - tcp_out.c.o 0 0 0 0 0 5686 2161 7847 - tcp.c.o 2 26 0 0 0 6161 1617 7806 - ieee80211_input.o 0 0 0 0 0 6797 973 7770 - wpa.c.o 0 656 0 0 0 6828 55 7539 - [... additional lines removed ...] - -文件总大小概况下方会显示 ``Per-file contributions to ELF file`` 表格。 - -该表格的列与上文运行 ``idy.py size-components`` 显示的列相同,但该表格的粒度更细,展示了每个目标文件对二进制文件大小的贡献。 - -例如,文件 ``x509_crt_bundle.S.o`` 对总固件大小贡献了 64,212 字节,全都存储在 flash 中的 ``.rodata`` 区域。由此可以推知,该应用程序正在使用 :doc:`/api-reference/protocols/esp_crt_bundle` 功能。如果不使用该功能,固件大小至少可以减少 64,212 字节。 - -某些目标文件从二进制库中链接至此,因此无法找到对应源文件。要确定一个源文件属于哪个组件,通常可以在 ESP-IDF 源代码树中搜索,或者在 :ref:`linker-map-file` 中查找完整路径。 - -比较两个二进制文件 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -如果某些改动影响了二进制文件大小,可以使用 ESP-IDF 工具来详细分析文件大小的确切差异。 - -该操作不是通过运行 ``idf.py`` 进行的,而是需要直接运行 Python 工具 `esp_idf_size `_ 。 - -执行该操作,首先需要在构建目录中找到链接器映射文件 ``PROJECTNAME.map``。 ``esp_idf_size`` 工具会基于链接器映射文件的输出结果分析文件大小差异。 - -要与另一个二进制文件进行比较,还需要保存该文件对应的 ``.map`` 文件,该文件位于构建目录中。 - -例如,要比较两个构建文件,其中一个使用默认的 :ref:`CONFIG_COMPILER_OPTIMIZATION` ``Debug (-Og)`` 配置,而另一个使用 ``Optimize for size (-Os)`` 配置: - -.. code-block:: bash - - $ python -m esp_idf_size --diff build_Og/https_request.map build_Os/https_request.map - MAP file: build_Os/https_request.map - MAP file: build_Og/https_request.map - Difference is counted as - , i.e. a positive number means that is larger. - Total sizes of : Difference - DRAM .data size: 14516 bytes 14956 -440 - DRAM .bss size: 15792 bytes 15808 -16 - Used static DRAM: 30308 bytes ( 150428 available, 16.8% used) 30764 -456 ( +456 available, +0 total) - Used static IRAM: 78498 bytes ( 52574 available, 59.9% used) 83918 -5420 ( +5420 available, +0 total) - Flash code: 509183 bytes 559943 -50760 - Flash rodata: 170592 bytes 176736 -6144 - Total image size:~ 772789 bytes (.bin may be padded larger) 835553 -62764 - -从 ``Difference`` 列可以看出,改变该设置导致整个二进制文件减小了 60 KB 以上,并且可用的 RAM 增加了 5 KB 以上。 - -还可以使用 ``diff`` 模式来输出表格,显示组件级(静态库)的差异: - -.. note:: - - 运行 ``esp_idf_size`` 时可以使用 ``--format`` 选项输出 JSON 或 CSV 格式的结果。 - -.. code-block:: bash - - python -m esp_idf_size --archives --diff build_Og/https_request.map build_Oshttps_request.map - -同样适用于比较单个源文件级的差异: - -.. code-block:: bash - - python -m esp_idf_size --files --diff build_Og/https_request.map build_Oshttps_request.map - -了解将输出写入文件等其他选项,可以输入 ``--help`` 查看完整列表。 - -.. _idf-size-linker-failed: - -链接器失败时显示文件大小 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -如果被分配的静态内存大小超越上限,链接器会失败并显示错误信息,例如 ``DRAM segment data does not fit`` 和 ``region `iram0_0_seg' overflowed by 44 bytes`` 等。 - -在这些情况下, ``idf.py size`` 也无法成功执行。然而,通过手动运行 ``esp_idf_size``,可以查看 **部分静态内存使用情况** 。内存使用情况将不包含无法链接的变量,因此仍然会显示有部分可用空间。 - -映射文件参数为构建目录下的 ``.map`` 文件。 - -.. code-block:: bash - - python -m esp_idf_size build/project_name.map - -还可以查看类似于 ``size-components`` 或 ``size-files`` 输出的内容: - -.. code-block:: bash - - python -m esp_idf_size --archives build/project_name.map - python -m esp_idf_size --files build/project_name.map +为了优化固件二进制文件大小和内存使用,需要测量项目中静态分配的 RAM (``data``, ``bss``),代码 (``text``) 和只读数据 (``rodata``)。:ref:`idf.py` 工具的子命令 ``size``、``size-components`` 和 ``size-files`` 可分别用于检查不同级别静态分配的 RAM 使用情况。详情请参阅 :doc:`/api-guides/tools/idf-size` 工具。 .. _linker-map-file: 链接器映射文件 -^^^^^^^^^^^^^^^^^^^^^^^^^^^ +--------------------------- .. note:: diff --git a/docs/zh_CN/api-guides/tools/idf-size.rst b/docs/zh_CN/api-guides/tools/idf-size.rst new file mode 100644 index 000000000000..7c33412d2c8b --- /dev/null +++ b/docs/zh_CN/api-guides/tools/idf-size.rst @@ -0,0 +1 @@ +.. include:: ../../../en/api-guides/tools/idf-size.rst diff --git a/docs/zh_CN/api-guides/tools/index.rst b/docs/zh_CN/api-guides/tools/index.rst index 6702bcd48f14..44916de2606e 100644 --- a/docs/zh_CN/api-guides/tools/index.rst +++ b/docs/zh_CN/api-guides/tools/index.rst @@ -11,4 +11,5 @@ idf-component-manager idf-clang-tidy idf-tools + idf-size :esp32 or esp32c3: qemu From a57aa71190b9fb6aedb0e5a04dbe6d035fb38c0f Mon Sep 17 00:00:00 2001 From: Aditya Patwardhan Date: Mon, 11 Mar 2024 16:39:52 +0530 Subject: [PATCH 38/73] feat(security): Add security_features_app example to demonstrate security features --- .../bootloader_support/src/flash_encrypt.c | 14 +- .../bootloader_support/src/secure_boot.c | 10 +- examples/security/.build-test-rules.yml | 4 + .../security_features_app/CMakeLists.txt | 8 + .../security/security_features_app/README.md | 502 ++++++++++++++++++ .../encrypted_data/README.md | 3 + .../security_features_app/main/CMakeLists.txt | 3 + .../main/Kconfig.projbuild | 18 + .../main/security_features_app_main.c | 179 +++++++ .../security_features_app/partitions.csv | 7 + .../qemu/efuse_esp32c3.hex | 35 ++ .../qemu/flash_image.bin | Bin 0 -> 4194304 bytes .../qemu/qemu_flash_args | 5 + .../security_features_app/sdkconfig.ci | 4 + .../security_features_app/sdkconfig.defaults | 31 ++ .../sdkconfig.defaults.esp32c3 | 8 + .../test/secure_jtag_token.bin | 1 + 17 files changed, 820 insertions(+), 12 deletions(-) create mode 100644 examples/security/security_features_app/CMakeLists.txt create mode 100644 examples/security/security_features_app/README.md create mode 100644 examples/security/security_features_app/encrypted_data/README.md create mode 100644 examples/security/security_features_app/main/CMakeLists.txt create mode 100644 examples/security/security_features_app/main/Kconfig.projbuild create mode 100644 examples/security/security_features_app/main/security_features_app_main.c create mode 100644 examples/security/security_features_app/partitions.csv create mode 100644 examples/security/security_features_app/qemu/efuse_esp32c3.hex create mode 100644 examples/security/security_features_app/qemu/flash_image.bin create mode 100644 examples/security/security_features_app/qemu/qemu_flash_args create mode 100644 examples/security/security_features_app/sdkconfig.ci create mode 100644 examples/security/security_features_app/sdkconfig.defaults create mode 100644 examples/security/security_features_app/sdkconfig.defaults.esp32c3 create mode 100644 examples/security/security_features_app/test/secure_jtag_token.bin diff --git a/components/bootloader_support/src/flash_encrypt.c b/components/bootloader_support/src/flash_encrypt.c index 5b37480dc236..4f568cea1c25 100644 --- a/components/bootloader_support/src/flash_encrypt.c +++ b/components/bootloader_support/src/flash_encrypt.c @@ -357,23 +357,23 @@ bool esp_flash_encryption_cfg_verify_release_mode(void) ESP_LOGW(TAG, "Not disabled UART bootloader cache (set DIS_DOWNLOAD_ICACHE->1)"); } #endif - bool soft_dis_jtag = false; + bool soft_dis_jtag_complete = false; #if SOC_EFUSE_SOFT_DIS_JTAG size_t soft_dis_jtag_cnt_val = 0; esp_efuse_read_field_cnt(ESP_EFUSE_SOFT_DIS_JTAG, &soft_dis_jtag_cnt_val); - soft_dis_jtag = (soft_dis_jtag_cnt_val == ESP_EFUSE_SOFT_DIS_JTAG[0]->bit_count); - if (soft_dis_jtag) { + soft_dis_jtag_complete = (soft_dis_jtag_cnt_val == ESP_EFUSE_SOFT_DIS_JTAG[0]->bit_count); + if (soft_dis_jtag_complete) { bool hmac_key_found = false; - hmac_key_found = esp_efuse_find_purpose(ESP_EFUSE_KEY_PURPOSE_HMAC_DOWN_JTAG, NULL); - hmac_key_found |= esp_efuse_find_purpose(ESP_EFUSE_KEY_PURPOSE_HMAC_DOWN_ALL, NULL); + hmac_key_found = esp_efuse_find_purpose(ESP_EFUSE_KEY_PURPOSE_HMAC_DOWN_JTAG, NULL); + hmac_key_found |= esp_efuse_find_purpose(ESP_EFUSE_KEY_PURPOSE_HMAC_DOWN_ALL, NULL); if (!hmac_key_found) { ESP_LOGW(TAG, "SOFT_DIS_JTAG is set but HMAC key with respective purpose not found"); - soft_dis_jtag = false; + soft_dis_jtag_complete = false; } } #endif - if (!soft_dis_jtag) { + if (!soft_dis_jtag_complete) { #if SOC_EFUSE_DIS_PAD_JTAG secure = esp_efuse_read_field_bit(ESP_EFUSE_DIS_PAD_JTAG); result &= secure; diff --git a/components/bootloader_support/src/secure_boot.c b/components/bootloader_support/src/secure_boot.c index b077469e0429..9df2e6278c32 100644 --- a/components/bootloader_support/src/secure_boot.c +++ b/components/bootloader_support/src/secure_boot.c @@ -298,23 +298,23 @@ bool esp_secure_boot_cfg_verify_release_mode(void) } #endif - bool soft_dis_jtag = false; + bool soft_dis_jtag_complete = false; #if SOC_EFUSE_SOFT_DIS_JTAG size_t soft_dis_jtag_cnt_val = 0; esp_efuse_read_field_cnt(ESP_EFUSE_SOFT_DIS_JTAG, &soft_dis_jtag_cnt_val); - soft_dis_jtag = (soft_dis_jtag_cnt_val == ESP_EFUSE_SOFT_DIS_JTAG[0]->bit_count); - if (soft_dis_jtag) { + soft_dis_jtag_complete = (soft_dis_jtag_cnt_val == ESP_EFUSE_SOFT_DIS_JTAG[0]->bit_count); + if (soft_dis_jtag_complete) { bool hmac_key_found = false; hmac_key_found = esp_efuse_find_purpose(ESP_EFUSE_KEY_PURPOSE_HMAC_DOWN_JTAG, NULL); hmac_key_found |= esp_efuse_find_purpose(ESP_EFUSE_KEY_PURPOSE_HMAC_DOWN_ALL, NULL); if (!hmac_key_found) { ESP_LOGW(TAG, "SOFT_DIS_JTAG is set but HMAC key with respective purpose not found"); - soft_dis_jtag = false; + soft_dis_jtag_complete = false; } } #endif - if (!soft_dis_jtag) { + if (!soft_dis_jtag_complete) { #if SOC_EFUSE_HARD_DIS_JTAG secure = esp_efuse_read_field_bit(ESP_EFUSE_HARD_DIS_JTAG); result &= secure; diff --git a/examples/security/.build-test-rules.yml b/examples/security/.build-test-rules.yml index c540531f5579..5313911a78a6 100644 --- a/examples/security/.build-test-rules.yml +++ b/examples/security/.build-test-rules.yml @@ -29,3 +29,7 @@ examples/security/nvs_encryption_hmac: - nvs_sec_provider depends_filepatterns: - examples/security/nvs_encryption_hmac/**/* + +examples/security/security_features_app: + disable: + - if: IDF_TARGET not in ["esp32c3"] diff --git a/examples/security/security_features_app/CMakeLists.txt b/examples/security/security_features_app/CMakeLists.txt new file mode 100644 index 000000000000..4a35c3aa0f76 --- /dev/null +++ b/examples/security/security_features_app/CMakeLists.txt @@ -0,0 +1,8 @@ +# The following lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(security_features_app) + +target_add_binary_data(${CMAKE_PROJECT_NAME}.elf "${CONFIG_EXAMPLE_SECURE_JTAG_TOKEN_PATH}" TEXT) diff --git a/examples/security/security_features_app/README.md b/examples/security/security_features_app/README.md new file mode 100644 index 000000000000..9272b81c2278 --- /dev/null +++ b/examples/security/security_features_app/README.md @@ -0,0 +1,502 @@ +| Supported Targets | ESP32-C3 | +| ----------------- | -------- | + + +# All Secure + +This example demonstrates how to enable all of the available security features on the esp32c3 target at once. +This example shall use combination of host based python tools and firmware for enabling all the related security eFuses. +For simplicity the security features such as Secure Boot V2, Flash Encryption, NVS Encryption shall be enabled through host based python tools (e.g., espefuse). +Some additional security eFuses shall be enabled in the firmware. + +**The device that has followed all the steps mentioned below can be used for production use-cases.** + +> [!CAUTION] +> The instructions in the example directly burn eFuses and once done, it cannot be reverted. Please go through the below steps carefully before executing the example. All the steps must be followed without any changes and in the exact sequence, otherwise the device may end up in an unrecoverable state. + +### Hardware Required + +* A development board with ESP32C3 SoC +* A USB cable for power supply and programming + +**Note: The hardware is not required if you plan to run the example with help of QEMU.** + +## Pre-requisites + +### 1. Set ESPPORT +In the example, we need to use the Serial port in nearly all the commands. To make it easier, we shall set the ESPPORT environment variable at once and reuse it later. See the documentation about [Connecting the ESP device to PC](https://docs.espressif.com/projects/esp-idf/en/v5.2.1/esp32c3/get-started/establish-serial-connection.html#connect-esp32-c3-to-pc) to find out the Serial port. + +``` +export ESPPORT=/* Serial port to which esp is connected */ +``` + +

+ Setup serial port for QEMU + If you are enabling eFuses on esp32c3 emulated using QEMU then we shall set the serial port as follows: + + export ESPPORT=socket://localhost:5555 + + Please note that this value is set in correspondence with the command to start serial connection with QEMU, do not change the values. + +
+ +**Please make sure to perform this step every time when you open a new terminal to use `esptool/espefuse` commands.** + +### 2. Erase flash + +We shall erase the flash on the device to ensure a clean state. + +```idf.py -p $ESPPORT erase_flash``` + + +### 3. Install esptool +We shall require esptool utility which can be installed as follows: + +```pip install esptool``` + +### 4. Installing qemu (optional) + +If you want to enable the security features on an esp32c3 which has been virtually emulated using qemu then you need to install the necessary packages. + +The detailed instructions on how to use QEMU can be found in the [QEMU documentation](https://docs.espressif.com/projects/esp-idf/en/latest/esp32c3/api-guides/tools/qemu.html#qemu-emulator). + + +## Enabling Security Features + +We shall enable the necessary security features one by one as follows: + +### Enabling Secure Boot V2 +For more details about Secure Boot V2 protocol checkout the [Secure boot V2 documentation](https://docs.espressif.com/projects/esp-idf/en/latest/esp32c3/security/secure-boot-v2.html). + +Please follow below steps to enable Secure Boot V2: + + +1. Generate Signing Key + + ``` + espsecure.py generate_signing_key --version 2 --scheme rsa3072 secure_boot_signing_key.pem + ``` + +2. Generate Public Key Digest + + ``` + espsecure.py digest_sbv2_public_key --keyfile secure_boot_signing_key.pem --output digest.bin + ``` + +3. Burn the key digest in eFuse + + ``` + espefuse.py --port $ESPPORT --chip esp32c3 burn_key BLOCK_KEY0 digest.bin SECURE_BOOT_DIGEST0 + ``` + + where $ESPPORT is the serial port to which the esp32c3 chip is connected. + We have used `BLOCK_KEY0` here to store the Secure Boot V2 digest. Generally, the `BLOCK` can be a free key block from `BLOCK_KE0` to `BLOCK_KEY5`. + + +4. Enable Secure Boot V2 + + ``` + espefuse.py --port $ESPPORT --chip esp32c3 burn_efuse SECURE_BOOT_EN + ``` + +With above steps the Secure Boot V2 feature shall be enabled. The firmware build step is configured to generate signed binaries for `bootloader` and `application` by default (so there is no need to manually sign). +The necessary `security eFuses` are yet to be burned. They shall be burned by the application when first launched. + +#### Use multiple Secure Boot V2 signing keys +**It is recommended to use multiple secure boot v2 signing keys**. + +When the application is built (later in the workflow) the `bootloader` and `application` shall only be signed with the first key. To sign it with multiple keys, please follow below additional steps: + +- Repeat `Step 1` to `Step 3` for `secure_boot_signing_key_2.pem` and `secure_boot_signing_key_3.pem` respectively. +- Sign it with remaining two keys by executing following commands for `secure_boot_signing_key_2.pem` and `secure_boot_signing_key_3.pem` respectively: + + ``` + espsecure.py sign_data --version 2 --keyfile /* Signing key placeholder */ --output bootloader-signed.bin build/bootloader/bootloader.bin + + espsecure.py sign_data --version 2 --keyfile /* Signing key placeholder */ --output my-app-signed.bin build/security_features.bin + ``` + + +### Enabling Flash Encryption + +Details about the Flash Encryption protocol can be found at the [Flash Encryption documentation](https://docs.espressif.com/projects/esp-idf/en/stable/esp32c3/security/flash-encryption.html) +The indicates the status of Flash Encryption feature for the chip. The example also demonstrates writing and reading encrypted partitions in flash. + +Please follow below steps to enable Flash Encryption: + +1. Generate Flash Encryption keys + + ``` + espsecure.py generate_flash_encryption_key my_flash_encryption_key.bin + ``` + + Note: It is recommended to ensure that the RNG used by host machine to generate the flash encryption key has good entropy + +2. Burn Flash Encryption keys + + ``` + espefuse.py --port $ESPPORT burn_key BLOCK_KEY1 my_flash_encryption_key.bin XTS_AES_128_KEY + ``` + + We have used `BLOCK_KEY1` here to store the Flash Encryption key. Generally, the `BLOCK` can be a free key block from `BLOCK_KE0` to `BLOCK_KEY4`. + +3. Enable Flash Encryption + + ``` + espefuse.py --port $ESPPORT --chip esp32c3 burn_efuse SPI_BOOT_CRYPT_CNT 7 + ``` + +At this point the Flash Encryption feature is enabled for the device. The necessary `security eFuses` shall be enabled by the `security_features` firmware. + +#### Encrypting the partitions +After the application is built (Later in the workflow), all partitions that need encryption can be encrypted with the following command: + +``` +espsecure.py encrypt_flash_data --aes_xts --keyfile my_flash_encryption_key.bin --address /* Placeholder for partition offset */ --output /* Placeholder for Output File */ /* Placeholder for File to encrypt */ +``` + +The bootloader offset for esp32c3 is `0x0`. The partition table offset for the example has been set to `0xD000` which can be changed through menuconfig. The partition offset for other partitions can be obtained by running ```idf.py partition-table``` + +For this example we need to encrypt only the following 3 partitions: `bootloader.bin`, `partition-table.bin`, `security_features.bin`. + +It can be done with following commands: + +``` +espsecure.py encrypt_flash_data --aes_xts --keyfile my_flash_encryption_key.bin --address 0x0 --output encrypted_data/bootloader-enc.bin build/bootloader/bootloader.bin + +espsecure.py encrypt_flash_data --aes_xts --keyfile my_flash_encryption_key.bin --address 0xD000 --output encrypted_data/partition-table-enc.bin build/partition_table/partition-table.bin + +espsecure.py encrypt_flash_data --aes_xts --keyfile my_flash_encryption_key.bin --address 0x20000 --output encrypted_data/security_features-enc.bin build/security_features_app.bin +``` + +Please refer to [Encrypted Partition](https://docs.espressif.com/projects/esp-idf/en/latest/esp32c3/security/flash-encryption.html#encrypted-partitions) to check which partitions must be encrypted by default. + +### Enabling NVS Encryption + +We shall use the `HMAC based NVS encryption scheme`, Please find more details in the [NVS encryption documentation](https://docs.espressif.com/projects/esp-idf/en/latest/esp32c3/api-reference/storage/nvs_encryption.html#nvs-encryption-hmac-peripheral-based-scheme) + +For generation of NVS encryption keys and NVS partition, we shall use [NVS partition generator](https://docs.espressif.com/projects/esp-idf/en/latest/esp32c3/api-reference/storage/nvs_partition_gen.html#nvs-partition-generator-utility) +We shall use the [nvs_partition_gen.py](../../../components/nvs_flash/nvs_partition_generator/nvs_partition_gen.py) script for the operations. + +1. Generate HMAC key and NVS encryption key + + ``` + python3 $IDF_PATH/components/nvs_flash/nvs_partition_generator/nvs_partition_gen.py generate-key --keyfile nvs_encr_key.bin --key_protect_hmac --kp_hmac_keygen --kp_hmac_keyfile hmac_key.bin + ``` +2. Burn the HMAC key in eFuse + + ``` + espefuse.py --port $ESPPORT burn_key BLOCK_KEY2 keys/hmac_key.bin HMAC_UP + ``` + + We have used `BLOCK_KEY2` here to store the HMAC key. Generally, `BLOCK` can be a free keyblock between `BLOCK_KEY0` and `BLOCK_KEY5`. + + If you want to change the value of the eFuse key block for this example, make sure to update the same value in `menuconfig → Component config → NVS Security Provider → eFuse key ID storing the HMAC key`. + +3. Generate encrypted NVS partition. + + If you dont want to put external data in the NVS partition then you may skip this step. + See [Generating NVS partition](https://docs.espressif.com/projects/esp-idf/en/stable/esp32c3/api-reference/storage/nvs_partition_gen.html#generate-encrypted-nvs-partition) for detailed information on generating the encrypted NVS partition. + Execute following command to generate the encrypted NVS partition. + + ``` + python3 nvs_partition_gen.py encrypt /* CSV placeholder */ nvs_encr_partition.bin /* NVS partition offset */ --inputkey keys/nvs_encr_key.bin + ``` + * `CSV placeholder`: CSV file which contains data of the NVS partition. See [CSV file format](https://docs.espressif.com/projects/esp-idf/en/stable/esp32c3/api-reference/storage/nvs_partition_gen.html#csv-file-format) for more details. + * `NVS partition offset`: NVS partition offset. Can be found out by executing `idf.py partition-table` + +4. This shall generate `nvs_encr_partition.bin` which we shall flash later at the [Flash stage](README.md#flash) of the workflow. + +### Enabling Secure JTAG Return Material Access (RMA) + +The target provides an ability to disable JTAG access in the device for the software. Which can be re-enabled in future after authentication using a unique token generated beforehand. This way the module can be opened up by bypassing security features after authentication for debugging purposes after it has returned back to the manufacturer due to some issue. This way when a security wise locked device comes back to the ODM/OEM due to some issue, the module can be opened up by bypassing security features after successful authentication. + +1. Generate the HMAC key + + ``` + python3 ../hmac_soft_jtag/jtag_example_helper.py generate_hmac_key secure_jtag_hmac_key.bin + ``` + This key needs to be stored at a secure place in order to re-generate the secure token afterwards. + +2. Generate the secure token + + ``` + python3 ../hmac_soft_jtag/jtag_example_helper.py generate_token secure_jtag_hmac_key.bin secure_jtag_token.bin + ``` + + The example directly consumes this token data and re-enables the software disabled JTAG interface. The re-enablement can be tested by attempting a JTAG connection with the device after JTAG is enabled by the firmware. More details about JTAG debugging can be found [here](https://docs.espressif.com/projects/esp-idf/en/stable/esp32c3/api-guides/jtag-debugging/index.html) + If this is not generated, the example uses a test-only token which is present in the folder. + +3. Burn the key in the eFuse + + ``` + espefuse.py --port $ESPPORT --chip esp32c3 burn_key BLOCK_KEY3 secure_jtag_hmac_key.bin HMAC_DOWN_JTAG + ``` + + We have used `BLOCK_KEY3` here to store the HMAC key. Generally, `BLOCK` can be a free keyblock between `BLOCK_KEY0` and `BLOCK_KEY5`. + +4. Disable software access for JTAG + + ``` + espefuse.py --port $ESPPORT burn_efuse SOFT_DIS_JTAG 7 + ``` + After this the JTAG cannot be accessed before it is re-enabled through software with correct token. + +5. Configuring appropriate JTAG interface + + By default esp32c3 is set to use the [built-in JTAG interface](https://docs.espressif.com/projects/esp-idf/en/v4.3/esp32c3/api-guides/jtag-debugging/configure-builtin-jtag.html). Please follow the steps given [here](https://docs.espressif.com/projects/esp-idf/en/v4.3/esp32c3/api-guides/jtag-debugging/configure-other-jtag.html) to configure the alternative JTAG interface. + Please note that JTAG configuration cannot be done once the application firmware is flashed on the device. + +## Build + +### Set the target + +The target can be set with following command: + +``` +idf.py set-target esp32c3 +``` + +### Build the example + +The example can be built with following command + +``` +idf.py build +``` + +### Secure Boot V2 signing +The example is configured to build the signed binaries for the `bootloader.bin` and `security_features.bin` (application). +These shall be signed with the first secure boot key. + +If you want to use multiple Secure Boot V2 signing keys for the image then please perform the step of [Signing with multiple Secure Boot V2 keys](README.md#use-multiple-secure-boot-v2-signing-keys). + +### Encrypting partitions + +At this point, we shall encrypt all the necessary partitions. Please perform [Encrypting the partitions](README.md#encrypting-the-partitions) step to do the same. + + +## Flash +At this point we shall have all the necessary partitions which are ready to flash. + +The offsets at which the partitions need to be flashed can be found out by executing `idf.py partition-table`. + +The partitions can be flashed with help of the `esptool` utility. + +``` +esptool.py -p $ESPPORT write_flash /* Placeholder for offset */ /* Placeholder for file name */ +``` +Along with these, esptool command may need some additional options. +Please check the output of `idf.py build` command executed earlier for all the necessary options that need to be provided with esptool. + +For this example the following command can be used +``` +esptool.py --chip esp32c3 -b 115200 --before default_reset --after no_reset --no-stub -p $ESPPORT write_flash 0x0 encrypted_data/bootloader-enc.bin 0xd000 encrypted_data/partition-table-enc.bin 0x20000 encrypted_data/security_features-enc.bin --force +``` + +
+ Generate flash image for qemu +In case of qemu the flash image can be generated with help of the following command: + +``` +esptool.py --chip esp32c3 merge_bin --fill-flash-size 4MB -o qemu/security_features_flash_image.bin @qemu/qemu_flash_args +``` +The same file shall be used by the command to execute the image on qemu. + +
+ +## Monitor the output + +Run the monitor tool to view serial output + +``` +idf.py -p $ESPPORT monitor +``` + +## Example Output + +On the first boot-up, there would be prints about firmware not being secure. Please ignore the prints as we shall enable all necessary security eFuses in our application. On the Second boot onwards, you shall not see any such prints. + +### ROM bootloader verifying software bootloader. +``` +ESP-ROM:esp32c3-api1-20210207 +Build:Feb 7 2021 +rst:0x1 (POWERON),boot:0x8 (SPI_FAST_FLASH_BOOT) +SPIWP:0xee +mode:DIO, clock div:1 +Valid secure boot key blocks: 0 +secure boot verification succeeded +load:0x3fcd5990,len:0x3b94 +load:0x403cc710,len:0xb9c +load:0x403ce710,len:0x5ba8 +entry 0x403cc71a +``` +#### Early logs for Secure Boot V2 and Flash Encryption + +``` +I (101) esp_image: Verifying image signature... +I (106) secure_boot_v2: Verifying with RSA-PSS... +I (107) secure_boot_v2: Signature verified successfully! +I (108) boot: Loaded app from partition at offset 0x20000 +I (109) secure_boot_v2: enabling secure boot v2... +I (109) secure_boot_v2: secure boot v2 is already enabled, continuing.. +I (110) boot: Checking flash encryption... +I (110) flash_encrypt: flash encryption is enabled (0 plaintext flashes left) +I (111) boot: Disabling RNG early entropy source... +``` +#### Flash Encryption warning on first boot (should be ignored) + +``` +W (156) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header. +E (157) flash_encrypt: Flash encryption settings error: app is configured for RELEASE but efuses are set for DEVELOPMENT +E (160) flash_encrypt: Mismatch found in security options in bootloader menuconfig and efuse settings. Device is not secure. +``` + +#### Unused Secure Boot V2 Digests getting revoked +``` +I (162) efuse: Batch mode of writing fields is enabled +W (163) secure_boot: Unused SECURE_BOOT_DIGEST1 should be revoked. Fixing.. +W (164) secure_boot: Unused SECURE_BOOT_DIGEST2 should be revoked. Fixing.. +I (165) efuse: BURN BLOCK0 +I (175) efuse: BURN BLOCK0 - OK (all write block bits are set) +I (177) efuse: Batch mode. Prepared fields are committed +I (177) secure_boot: Fixed +I (179) efuse: BURN BLOCK0 +I (189) efuse: BURN BLOCK0 - OK (all write block bits are set) +``` + +#### Enablement of relevant security eFuses +``` +W (199) flash_encrypt: Not disabled UART bootloader encryption (set DIS_DOWNLOAD_MANUAL_ENCRYPT->1) +W (199) flash_encrypt: Not disabled UART bootloader cache (set DIS_DOWNLOAD_ICACHE->1) +W (199) flash_encrypt: Not disabled JTAG PADs (set DIS_PAD_JTAG->1) +W (199) flash_encrypt: Not disabled USB JTAG (set DIS_USB_JTAG->1) +W (199) flash_encrypt: Not disabled direct boot mode (set DIS_DIRECT_BOOT->1) +W (199) flash_encrypt: Not write-protected DIS_ICACHE (set WR_DIS_DIS_ICACHE->1) +I (199) flash_encrypt: Disable UART bootloader encryption... +I (199) efuse: BURN BLOCK0 +I (209) efuse: BURN BLOCK0 - OK (all write block bits are set) +I (219) flash_encrypt: Disable UART bootloader cache... +I (219) efuse: BURN BLOCK0 +I (229) efuse: BURN BLOCK0 - OK (all write block bits are set) +I (229) flash_encrypt: Disable JTAG... +I (229) efuse: BURN BLOCK0 +I (239) efuse: BURN BLOCK0 - OK (all write block bits are set) +I (249) efuse: BURN BLOCK0 +I (249) efuse: BURN BLOCK0 - OK (all write block bits are set) +I (259) efuse: BURN BLOCK0 +I (269) efuse: BURN BLOCK0 - OK (all write block bits are set) +I (269) efuse: BURN BLOCK0 +I (279) efuse: BURN BLOCK0 - OK (all write block bits are set) +I (289) efuse: BURN BLOCK0 +I (299) efuse: BURN BLOCK0 - OK (all write block bits are set) +W (299) secure_boot: Not disabled JTAG in the soft way (set SOFT_DIS_JTAG->max) +W (299) secure_boot: Not enabled AGGRESSIVE KEY REVOKE (set SECURE_BOOT_AGGRESSIVE_REVOKE->1) +I (299) secure_boot: Enabling Security download mode... +I (299) secure_boot: Disable hardware & software JTAG... +I (299) efuse: BURN BLOCK0 +I (309) efuse: BURN BLOCK0 - OK (all write block bits are set) +I (319) efuse: BURN BLOCK0 +I (329) efuse: BURN BLOCK0 - OK (all write block bits are set) +I (329) secure_boot: Prevent read disabling of additional efuses... +``` + +#### Final status of Secure Boot V2 and Flash Encryption + +``` +I (329) security_features_app: Flash Encryption is enabled in Release Mode +I (329) security_features_app: Secure Boot is enabled in Release Mode +``` + +#### Flash Encryption demo + +``` +Erasing partition "storage" (0x1000 bytes) +Writing data with esp_partition_write: +I (339) security_features_app: 0x3fc8fa40 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f |................| +I (339) security_features_app: 0x3fc8fa50 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f |................| +Reading with esp_partition_read: +I (339) security_features_app: 0x3fc8fa60 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f |................| +I (339) security_features_app: 0x3fc8fa70 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f |................| +Reading with esp_flash_read: +I (339) security_features_app: 0x3fc8fa60 b3 e8 57 98 45 1f 33 de 71 30 71 9b 48 a2 d7 71 |..W.E.3.q0q.H..q| +I (339) security_features_app: 0x3fc8fa70 28 fd fb 54 39 fb 4f 47 be cd 7a e1 55 70 09 6d |(..T9.OG..z.Up.m| +``` + +#### NVS encryption + +These logs show that, the initialisation of the encrypted NVS partitions is successful. +``` +I (349) nvs: NVS partition "nvs" is encrypted. +I (359) security_features_app: NVS partition "custom_nvs" is encrypted. +``` + +## Enable Security Features with help of QEMU + +Espressif fork of [QEMU](https://github.com/espressif/qemu) offers the ability to emulate `esp32c3` target on the host machine with help of `QEMU`. That way all of the above security features can be enabled on the esp32c3 that is emulated on the host machine. A major advantage of this is that no hardware is lost while trying out the security features. + +Below are the commands that can be used to to emulate the esp32c3 device on host machine. + +### Configure eFuse for QEMU + +1. Generate the qemu eFuse file: +A hex file containing the eFuse configuration of ESP32C3 v0.3 (ECO3) has been kept in the same folder. This file can be used to generate the qemu eFuse binary with help of following command. + + ``` + xxd -r -p qemu/efuse_esp32c3.hex qemu/efuse_esp32c3.bin + ``` + +2. Setup serial connection to interact with QEMU + + The below command shall enable a serial connection to the esp32c3 emulated using qemu. The `espefuse` utility when invoked in other terminal can interact with this for performing eFuse related operations. + + + ``` + qemu-system-riscv32 -nographic \ + -machine esp32c3 \ + -drive file=qemu/flash_image.bin,if=mtd,format=raw \ + -global driver=esp32c3.gpio,property=strap_mode,value=0x02 \ + -drive file=qemu/efuse_esp32c3.bin,if=none,format=raw,id=efuse \ + -global driver=nvram.esp32c3.efuse,property=drive,value=efuse \ + -serial tcp::5555,server,nowait + ``` + + This command shall start a serial connection with QEMU. Keep this running in one terminal and execute espefuse commands in an alternate terminal. + + After espefuse commands are used to update the eFuses of the emulated esp the eFuse file generated in *Step 1* shall get ovwewritten. To revert to the original state, execute the command provided in *Step 1* once again. + + +3. Execute the commands to enable security features + + At this point you can execute all the commands mentioned above for [enabling security features](README.md#enabling-security-features). Please keep the above qemu instance running in one terminal and execute all `esptool/espefuse` related commands in a different terminal. + + **For qemu, `before=no_reset` option needs to be provided additionally to every espefuse command. Please make sure you add this just after `-p $ESPPORT` in the command** + + After all the `esptool/espefuse` operations are completed you can close this terminal by pressing `q + Enter` in the same terminal. + +4. Build the example + + Perform the [Build](README.md#build) step and all necessary substeps (e.g. encrypting partition). Please make sure the file names of newly generated files and their locations in the commands are not changed. + +5. Build qemu image + + The qemu image can be built with following command + + ``` + esptool.py --chip esp32c3 merge_bin --fill-flash-size 4MB -o qemu/security_features_flash_image.bin @qemu/qemu_flash_args + ``` + +### Run example on QEMU + +The following command can be used to run example on qemu + +``` +qemu-system-riscv32 -nographic \ + -machine esp32c3 \ + -drive file=qemu/security_features_flash_image.bin,if=mtd,format=raw \ + -drive file=qemu/efuse_esp32c3.bin,if=none,format=raw,id=efuse \ + -global driver=nvram.esp32c3.efuse,property=drive,value=efuse \ + -serial mon:stdio +``` + +The qemu session can be closed by pressing `CTRL+ a` and then immediately pressing `x`. diff --git a/examples/security/security_features_app/encrypted_data/README.md b/examples/security/security_features_app/encrypted_data/README.md new file mode 100644 index 000000000000..466196d14c86 --- /dev/null +++ b/examples/security/security_features_app/encrypted_data/README.md @@ -0,0 +1,3 @@ +# Encrypted data + +This folder shall contain the encrypted files generated with the command. diff --git a/examples/security/security_features_app/main/CMakeLists.txt b/examples/security/security_features_app/main/CMakeLists.txt new file mode 100644 index 000000000000..c9b76807b063 --- /dev/null +++ b/examples/security/security_features_app/main/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRCS "security_features_app_main.c" + INCLUDE_DIRS "." + REQUIRED_IDF_TARGETS esp32c3) diff --git a/examples/security/security_features_app/main/Kconfig.projbuild b/examples/security/security_features_app/main/Kconfig.projbuild new file mode 100644 index 000000000000..5f6cf77e15aa --- /dev/null +++ b/examples/security/security_features_app/main/Kconfig.projbuild @@ -0,0 +1,18 @@ +menu "Example Configuration" + + config EXAMPLE_JTAG_REENABLE_EFUSE_BLOCK + int "JTAG Re-enable efuse key id" + default 3 + range 0 5 + help + The value of the eFuse key id in which the HMAC key is stored for the JTAG re-enablement. + The example readily assumes that the respective hmac key is burned in the eFuse at this value + + config EXAMPLE_SECURE_JTAG_TOKEN_PATH + string "Secure JTAG token path" + default "secure_jtag_token.bin" + help + The path to the binary file containing the token to re-enable JTAG. + This path is relative to the root directory of the example project. + +endmenu diff --git a/examples/security/security_features_app/main/security_features_app_main.c b/examples/security/security_features_app/main/security_features_app_main.c new file mode 100644 index 000000000000..59876fc787ed --- /dev/null +++ b/examples/security/security_features_app/main/security_features_app_main.c @@ -0,0 +1,179 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Unlicense OR CC0-1.0 + */ +/* Flash encryption Example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "soc/efuse_reg.h" +#include "esp_efuse.h" +#include "esp_chip_info.h" +#include "esp_flash.h" +#include "esp_partition.h" +#include "esp_flash_encrypt.h" +#include "esp_efuse_table.h" +#include "esp_secure_boot.h" +#include "nvs_flash.h" +#include "nvs_sec_provider.h" +#include "inttypes.h" + +static const char* TAG = "security_features_app"; + +#define CUSTOM_NVS_PART_NAME "custom_nvs" + +extern const uint8_t secure_jtag_token_start[] asm("_binary_secure_jtag_token_bin_start"); +extern const uint8_t secure_jtag_token_end[] asm("_binary_secure_jtag_token_bin_end"); + +#define SECURE_JTAG_TOKEN_LENGTH 32 + +static void example_read_write_flash(void) +{ + const esp_partition_t* partition = esp_partition_find_first( + ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, "storage"); + assert(partition); + + printf("Erasing partition \"%s\" (0x%" PRIx32 " bytes)\n", partition->label, partition->size); + + ESP_ERROR_CHECK(esp_partition_erase_range(partition, 0, partition->size)); + + /* Generate the data which will be written */ + const size_t data_size = 32; + uint8_t plaintext_data[data_size]; + for (uint8_t i = 0; i < data_size; ++i) { + plaintext_data[i] = i; + } + + printf("Writing data with esp_partition_write:\n"); + ESP_LOG_BUFFER_HEXDUMP(TAG, plaintext_data, data_size, ESP_LOG_INFO); + ESP_ERROR_CHECK(esp_partition_write(partition, 0, plaintext_data, data_size)); + + uint8_t read_data[data_size]; + printf("Reading with esp_partition_read:\n"); + ESP_ERROR_CHECK(esp_partition_read(partition, 0, read_data, data_size)); + ESP_LOG_BUFFER_HEXDUMP(TAG, read_data, data_size, ESP_LOG_INFO); + + printf("Reading with esp_flash_read:\n"); + ESP_ERROR_CHECK(esp_flash_read(NULL, read_data, partition->address, data_size)); + ESP_LOG_BUFFER_HEXDUMP(TAG, read_data, data_size, ESP_LOG_INFO); +} + +static esp_err_t example_custom_nvs_part_init(const char *name) +{ +#if CONFIG_NVS_ENCRYPTION + esp_err_t ret = ESP_FAIL; + nvs_sec_cfg_t cfg = {}; + nvs_sec_scheme_t *sec_scheme_handle = NULL; + nvs_sec_config_hmac_t sec_scheme_cfg = NVS_SEC_PROVIDER_CFG_HMAC_DEFAULT(); + ret = nvs_sec_provider_register_hmac(&sec_scheme_cfg, &sec_scheme_handle); + if (ret != ESP_OK) { + return ret; + } + + ret = nvs_flash_read_security_cfg_v2(sec_scheme_handle, &cfg); + if (ret != ESP_OK) { + /* We shall not generate keys here as that must have been done in default NVS partition initialization case */ + ESP_LOGE(TAG, "Failed to read NVS security cfg: [0x%02X] (%s)", ret, esp_err_to_name(ret)); + return ret; + } + + ret = nvs_flash_secure_init_partition(name, &cfg); + if (ret == ESP_OK) { + ESP_LOGI(TAG, "NVS partition \"%s\" is encrypted.", name); + } + return ret; +#else + return nvs_flash_init_partition(name); +#endif +} + +void app_main(void) +{ + bool restart_required = false; + bool sb_release_mode = esp_secure_boot_cfg_verify_release_mode(); + if (!sb_release_mode) { + restart_required = true; + ESP_LOGI(TAG, "Secure Boot V2 not in Release mode\nSetting Release mode..."); + esp_efuse_batch_write_begin(); + if (esp_secure_boot_enable_secure_features() == ESP_OK) { + esp_efuse_batch_write_commit(); + sb_release_mode = esp_secure_boot_cfg_verify_release_mode(); + } else { + esp_efuse_batch_write_cancel(); + } + + if (!sb_release_mode) { + ESP_LOGE(TAG, "Failed to set Secure Boot V2 to Release mode"); + } + } + + bool fe_release_mode = esp_flash_encryption_cfg_verify_release_mode(); + if (!fe_release_mode) { + restart_required = true; + ESP_LOGI(TAG, "Flash encryption not in Release mode\nSetting Release mode..."); + esp_flash_encryption_set_release_mode(); + fe_release_mode = esp_flash_encryption_cfg_verify_release_mode(); + if (!fe_release_mode) { + ESP_LOGE(TAG, "Failed to set Flash Encryption to Release mode"); + } + } + + if (restart_required) { + ESP_LOGI(TAG, "Restarting now"); + esp_restart(); + } + + if (fe_release_mode) { + ESP_LOGI(TAG, "Flash Encryption is enabled in Release Mode"); + } else { + ESP_LOGE(TAG, "Flash Encryption is not enabled in Release mode"); + } + + if (sb_release_mode) { + ESP_LOGI(TAG, "Secure Boot is enabled in Release Mode"); + } else { + ESP_LOGE(TAG, "Secure Boot is not enabled in Release mode"); + } + + example_read_write_flash(); + /* Initialize the default NVS partition */ + esp_err_t ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK(ret); + + /* Initialize the custom NVS partition */ + ret = example_custom_nvs_part_init(CUSTOM_NVS_PART_NAME); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { + ESP_ERROR_CHECK(nvs_flash_erase_partition(CUSTOM_NVS_PART_NAME)); + ret = example_custom_nvs_part_init(CUSTOM_NVS_PART_NAME); + } + ESP_ERROR_CHECK(ret); + ESP_LOGI(TAG, "JTAG Status: Not enabled"); + ESP_LOGI(TAG, "Enabling in .."); + for (int i = 0; i < 5; i++) { + ESP_LOGI(TAG, "%d...", i); + vTaskDelay(1 / portTICK_PERIOD_MS); + } + ESP_LOGI(TAG, "Enabling JTAG"); + size_t secure_jtag_token_length = strlen((const char *)secure_jtag_token_start); + if (secure_jtag_token_length != SECURE_JTAG_TOKEN_LENGTH) { + ESP_LOGE(TAG, "Invalid JTAG token length %d, should be %d", secure_jtag_token_length, SECURE_JTAG_TOKEN_LENGTH); + } + ret = esp_hmac_jtag_enable(CONFIG_EXAMPLE_JTAG_REENABLE_EFUSE_BLOCK, secure_jtag_token_start); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "Failed to enable JTAG"); + } + +} diff --git a/examples/security/security_features_app/partitions.csv b/examples/security/security_features_app/partitions.csv new file mode 100644 index 000000000000..c29eb4ecb1f5 --- /dev/null +++ b/examples/security/security_features_app/partitions.csv @@ -0,0 +1,7 @@ +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, , 0x6000, +# Extra partition to demonstrate reading/writing of encrypted flash +storage, data, 0xff, , 0x1000, encrypted +factory, app, factory, , 1M, +# Custom NVS data partition +custom_nvs, data, nvs, , 0x6000, diff --git a/examples/security/security_features_app/qemu/efuse_esp32c3.hex b/examples/security/security_features_app/qemu/efuse_esp32c3.hex new file mode 100644 index 000000000000..4435ec5c83df --- /dev/null +++ b/examples/security/security_features_app/qemu/efuse_esp32c3.hex @@ -0,0 +1,35 @@ +000000000000000000000000000000000000000000000000000000000000 +00000000000000000c000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 +00000000 diff --git a/examples/security/security_features_app/qemu/flash_image.bin b/examples/security/security_features_app/qemu/flash_image.bin new file mode 100644 index 0000000000000000000000000000000000000000..a1bc830d88921aed3de834e3411ecfc97be4b1cf GIT binary patch literal 4194304 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 z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0{_tt9SZ;e000c~w;sj5Ldbvt0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 TV8DO@0|pEjFkrxd0R#I$dTxqV literal 0 HcmV?d00001 diff --git a/examples/security/security_features_app/qemu/qemu_flash_args b/examples/security/security_features_app/qemu/qemu_flash_args new file mode 100644 index 000000000000..c587939fe2ad --- /dev/null +++ b/examples/security/security_features_app/qemu/qemu_flash_args @@ -0,0 +1,5 @@ +--flash_mode dio --flash_freq 80m --flash_size keep + +0x0 encrypted_data/bootloader-enc.bin +0x20000 encrypted_data/security_features-enc.bin +0xd000 encrypted_data/partition-table-enc.bin diff --git a/examples/security/security_features_app/sdkconfig.ci b/examples/security/security_features_app/sdkconfig.ci new file mode 100644 index 000000000000..676e16ab7719 --- /dev/null +++ b/examples/security/security_features_app/sdkconfig.ci @@ -0,0 +1,4 @@ +# This file uses insecure configurations for testing purpose +# Do not use this configurations for you project +CONFIG_SECURE_BOOT_SIGNING_KEY="test/test_secure_boot_signing_key.pem" +CONFIG_EXAMPLE_SECURE_JTAG_TOKEN_PATH="test/secure_jtag_token.bin" diff --git a/examples/security/security_features_app/sdkconfig.defaults b/examples/security/security_features_app/sdkconfig.defaults new file mode 100644 index 000000000000..32987b85f3b2 --- /dev/null +++ b/examples/security/security_features_app/sdkconfig.defaults @@ -0,0 +1,31 @@ +# This example uses an extra partition to demonstrate encrypted/non-encrypted reads/writes. +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_OFFSET=0xD000 + +# Secure Boot V2 +CONFIG_SECURE_SIGNED_ON_BOOT=y +CONFIG_SECURE_SIGNED_ON_UPDATE=y +CONFIG_SECURE_SIGNED_APPS=y +CONFIG_SECURE_BOOT_V2_RSA_ENABLED=y +CONFIG_SECURE_SIGNED_APPS_RSA_SCHEME=y +CONFIG_SECURE_BOOT=y +CONFIG_SECURE_BOOT_V2_ENABLED=y +CONFIG_SECURE_BOOT_BUILD_SIGNED_BINARIES=y +CONFIG_SECURE_BOOT_SIGNING_KEY="secure_boot_signing_key.pem" + +CONFIG_SECURE_BOOT_FLASH_BOOTLOADER_DEFAULT=y + +# Please note that this does not make the device insecure as JTAG shall be soft disabled with instructions from README along + +CONFIG_SECURE_BOOT_INSECURE=y +CONFIG_SECURE_BOOT_ALLOW_JTAG=y + +# Flash Encryption +CONFIG_SECURE_FLASH_ENC_ENABLED=y +CONFIG_SECURE_FLASH_ENCRYPTION_MODE_RELEASE=y +CONFIG_SECURE_FLASH_ENCRYPT_ONLY_IMAGE_LEN_IN_APP_PART=y +CONFIG_SECURE_FLASH_CHECK_ENC_EN_IN_APP=y +CONFIG_SECURE_ROM_DL_MODE_ENABLED=y +CONFIG_SECURE_ENABLE_SECURE_ROM_DL_MODE=y diff --git a/examples/security/security_features_app/sdkconfig.defaults.esp32c3 b/examples/security/security_features_app/sdkconfig.defaults.esp32c3 new file mode 100644 index 000000000000..ca0101a31779 --- /dev/null +++ b/examples/security/security_features_app/sdkconfig.defaults.esp32c3 @@ -0,0 +1,8 @@ + +CONFIG_SECURE_BOOT_ENABLE_AGGRESSIVE_KEY_REVOKE=y + + +# NVS encryption +CONFIG_NVS_ENCRYPTION=y +CONFIG_NVS_SEC_KEY_PROTECT_USING_HMAC=y +CONFIG_NVS_SEC_HMAC_EFUSE_KEY_ID=2 diff --git a/examples/security/security_features_app/test/secure_jtag_token.bin b/examples/security/security_features_app/test/secure_jtag_token.bin new file mode 100644 index 000000000000..e547179e7482 --- /dev/null +++ b/examples/security/security_features_app/test/secure_jtag_token.bin @@ -0,0 +1 @@ + {qػa768Lpg {qػa768LpgŔ1㏉a>z(̍Q \ No newline at end of file From 40059dedde35578070e38245913427dae8f21b21 Mon Sep 17 00:00:00 2001 From: "nilesh.kale" Date: Thu, 20 Jun 2024 18:08:09 +0530 Subject: [PATCH 39/73] feat: updated procedure for generating token in jtag_example_helper.py This commit updated API for generating token providing ability to pass more arguments and updated readme file as well. --- examples/security/hmac_soft_jtag/README.md | 3 +- .../hmac_soft_jtag/jtag_example_helper.py | 19 +++++++-- .../test/test_hmac_key.bin | Bin 0 -> 32 bytes .../test/test_nvs_encr_keys.bin | 2 + .../test/test_secure_boot_signing_key.pem | 39 ++++++++++++++++++ .../test/test_secure_jtag_token.bin | 1 + 6 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 examples/security/security_features_app/test/test_hmac_key.bin create mode 100644 examples/security/security_features_app/test/test_nvs_encr_keys.bin create mode 100644 examples/security/security_features_app/test/test_secure_boot_signing_key.pem create mode 100644 examples/security/security_features_app/test/test_secure_jtag_token.bin diff --git a/examples/security/hmac_soft_jtag/README.md b/examples/security/hmac_soft_jtag/README.md index ccc2f523088a..9ead91db1fd2 100644 --- a/examples/security/hmac_soft_jtag/README.md +++ b/examples/security/hmac_soft_jtag/README.md @@ -46,8 +46,9 @@ espefuse.py -p $ESPPORT burn_key .bin HMAC_DOWN_ALL **Step 4:** Generate token data from the HMAC key. Keep this token data handy before re-enabling JTAG access. ```bash -python jtag_example_helper.py generate_token .bin +python jtag_example_helper.py generate_token .bin ``` +**Note**: The OUTPUT_FILE argument is optional. If provided, the token data will be stored in the specified file in either binary format (.bin) or hexadecimal format (.hex) based on the file extension. If no OUTPUT_FILE is specified, the token data will be printed to the console. ### Configure the project diff --git a/examples/security/hmac_soft_jtag/jtag_example_helper.py b/examples/security/hmac_soft_jtag/jtag_example_helper.py index d355a9d2db2c..1674245f8981 100644 --- a/examples/security/hmac_soft_jtag/jtag_example_helper.py +++ b/examples/security/hmac_soft_jtag/jtag_example_helper.py @@ -6,15 +6,27 @@ import hmac import os import subprocess +from typing import Optional -def generate_token_data(hmac_key_file: str) -> None: +def generate_token_data(hmac_key_file: str, output_file: Optional[str] = None) -> None: with open(hmac_key_file, 'rb') as file: key_data = file.read() data = bytes([0] * 32) token_data = hmac.HMAC(key_data, data, hashlib.sha256).digest() token_hex = binascii.hexlify(token_data).decode('utf-8') - print(token_hex) + + if output_file: + if output_file.endswith('.bin'): + with open(output_file, 'wb') as out_file: + out_file.write(token_data) + elif output_file.endswith('.hex'): + with open(output_file, 'w') as out_file: + out_file.write(token_hex) + else: + print(f'Unsupported file format for output file: {output_file}') + else: + print(token_hex) def generate_hmac_key(hmac_key_file: str) -> None: @@ -69,6 +81,7 @@ def main() -> None: token_generator_parser = subparsers.add_parser('generate_token') token_generator_parser.add_argument('hmac_key_file', help='File containing the HMAC key') + token_generator_parser.add_argument('output_file', nargs='?', help='File to store the generated token (optional)') args = parser.parse_args() @@ -77,7 +90,7 @@ def main() -> None: elif args.command == 'generate_hmac_key': generate_hmac_key(args.hmac_key_file) elif args.command == 'generate_token': - generate_token_data(args.hmac_key_file) + generate_token_data(args.hmac_key_file, args.output_file) else: parser.print_help() diff --git a/examples/security/security_features_app/test/test_hmac_key.bin b/examples/security/security_features_app/test/test_hmac_key.bin new file mode 100644 index 0000000000000000000000000000000000000000..63a3db0d80f516ed0dd96849983316de7889ca4e GIT binary patch literal 32 ocmb0*te>34cSe_)V;Qgd>TP@1sk&`p2rh2A{h`}i{PxLX0LdB-82|tP literal 0 HcmV?d00001 diff --git a/examples/security/security_features_app/test/test_nvs_encr_keys.bin b/examples/security/security_features_app/test/test_nvs_encr_keys.bin new file mode 100644 index 000000000000..02faea963f19 --- /dev/null +++ b/examples/security/security_features_app/test/test_nvs_encr_keys.bin @@ -0,0 +1,2 @@ +/f ~=ʝͷiq:+e6 ᯪJ_(l@" +.fn \ No newline at end of file diff --git a/examples/security/security_features_app/test/test_secure_boot_signing_key.pem b/examples/security/security_features_app/test/test_secure_boot_signing_key.pem new file mode 100644 index 000000000000..bce9437fe538 --- /dev/null +++ b/examples/security/security_features_app/test/test_secure_boot_signing_key.pem @@ -0,0 +1,39 @@ +-----BEGIN RSA PRIVATE KEY----- +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 +-----END RSA PRIVATE KEY----- diff --git a/examples/security/security_features_app/test/test_secure_jtag_token.bin b/examples/security/security_features_app/test/test_secure_jtag_token.bin new file mode 100644 index 000000000000..e547179e7482 --- /dev/null +++ b/examples/security/security_features_app/test/test_secure_jtag_token.bin @@ -0,0 +1 @@ + {qػa768Lpg {qػa768LpgŔ1㏉a>z(̍Q \ No newline at end of file From 68df525394ed5506ce34e6406d226034afc9f1f8 Mon Sep 17 00:00:00 2001 From: "radek.tandler" Date: Wed, 6 Dec 2023 17:25:58 +0100 Subject: [PATCH 40/73] feat(examples/security): Extend flash_encryption example with fatfs encryption Updated the flash_encryption example to demonstrate the usage of fatfs encryption. Updated existing test case to ensure accurate and reliable testing. Documentation of storage section extended by security relarted summary. Closes https://github.com/espressif/esp-idf/issues/11551 Closes https://github.com/espressif/esp-idf/issues/13668 --- docs/en/api-reference/storage/index.rst | 46 ++- .../storage/storage-security.rst | 24 ++ docs/zh_CN/api-reference/storage/index.rst | 1 + .../storage/storage-security.rst | 1 + examples/security/flash_encryption/README.md | 314 +++++++++++++++--- .../flash_encryption/main/CMakeLists.txt | 1 + .../main/flash_encrypt_fatfs.c | 192 +++++++++++ .../main/flash_encrypt_fatfs.h | 18 + .../main/flash_encrypt_main.c | 40 ++- .../flash_encryption/partitions_example.csv | 13 +- .../pytest_flash_encryption.py | 6 + .../flash_encryption/sdkconfig.defaults | 4 +- 12 files changed, 605 insertions(+), 55 deletions(-) create mode 100644 docs/en/api-reference/storage/storage-security.rst create mode 100644 docs/zh_CN/api-reference/storage/storage-security.rst create mode 100644 examples/security/flash_encryption/main/flash_encrypt_fatfs.c create mode 100644 examples/security/flash_encryption/main/flash_encrypt_fatfs.h diff --git a/docs/en/api-reference/storage/index.rst b/docs/en/api-reference/storage/index.rst index 2ff6698d7089..3e31007594e9 100644 --- a/docs/en/api-reference/storage/index.rst +++ b/docs/en/api-reference/storage/index.rst @@ -12,6 +12,8 @@ This section contains reference of the high-level storage APIs. They are based o - :doc:`FAT ` is a standard file system which can be used in SPI flash or on SD/MMC cards - :doc:`Wear Levelling ` library implements a flash translation layer (FTL) suitable for SPI NOR flash. It is used as a container for FAT partitions in flash. +Topics related to :doc:`Storage Security ` are described in separate section. + .. note:: It is suggested to use high-level APIs (``esp_partition`` or file system) instead of low-level driver APIs to access the SPI NOR flash. @@ -33,5 +35,47 @@ This section contains reference of the high-level storage APIs. They are based o spiffs vfs wear-levelling + storage-security.rst + +.. list-table:: Code examples for this API section + :widths: 25 75 + :header-rows: 0 -Code examples for this API section are provided in the :example:`storage` directory of ESP-IDF examples. + * - **Link** + - **Description** + * - :doc:`FAT ` + - + * - :example:`` + - Demonstrates using FATFS over wear leveling on internal flash. + * - :example:`ext_flash_fatfs ` + - Demonstrates using FATFS over wear leveling on external flash. + * - :example:`fatfsgen ` + - Demonstrates the capabilities of Python-based tooling for FATFS images available on host computers. + * - :doc:`Non-Volatile Storage library (NVS) ` + - + * - :example:`nvs_rw_blob ` + - Shows the use of the C-style API to read and write blob data types in NVS flash. + * - :example:`nvs_rw_value ` + - Shows the use of the C-style API to read and write integer data types in NVS flash. + * - :example:`nvs_rw_value_cxx ` + - Shows the use of the C++-style API to read and write integer data types in NVS flash. + * - :example:`nvsgen ` + - Demonstrates how to use the Python-based NVS image generation tool to create an NVS partition image from the contents of a CSV file. + * - :doc:`SPIFFS ` + - + * - :example:`spiffs ` + - Shows the use of the SPIFFS API to initialize the filesystem and work with files using POSIX functions. + * - :example:`spiffsgen ` + - Demonstrates the capabilities of Python-based tooling for SPIFFS images available on host computers. + * - :doc:`Partitions API ` + - + * - :example:`partition_api ` + - Provides an overview of API functions to look up particular partitions, perform basic I/O operations, and use partitions via CPU memory mapping. + * - :example:`parttool ` + - Demonstrates the capabilities of Python-based tooling for partition images available on host computers. + * - :doc:`Virtual File System (VFS) ` + - + * - :example:`littlefs ` + - Shows the use of the LittleFS component to initialize the filesystem and work with a file using POSIX functions. + * - :example:`semihost_vfs ` + - Demonstrates the use of the VFS API to let an ESP-based device access a file on a JTAG-connected host using POSIX functions. diff --git a/docs/en/api-reference/storage/storage-security.rst b/docs/en/api-reference/storage/storage-security.rst new file mode 100644 index 000000000000..496bbfffbc6f --- /dev/null +++ b/docs/en/api-reference/storage/storage-security.rst @@ -0,0 +1,24 @@ +Storage Security +================ + +:link_to_translation:`zh_CN:[中文]` + +Overview of Available Resources +------------------------------- + +Data privacy is achieved by using the :doc:`../../security/flash-encryption` feature. This mechanism is currently used by FATFS and LittleFS and is recommended for new storage type implementations based on the Partitions API. +NVS storage uses a proprietary :doc:`NVS encryption ` implementation. + +Workflows focused on overall system security are described in the :doc:`Host Based Workflows <../../security/host-based-security-workflows>`. +Workflows related to the combination of multiple secured storage components in one project are presented in the :example:`Flash Encryption Example `. + +.. list-table:: Relevant storage security examples + :widths: 25 75 + :header-rows: 0 + + * - **Link** + - **Description** + * - :example:`nvs_encryption_hmac ` + - Demonstrates NVS encryption with an HMAC-based encryption key protection scheme. + * - :example:`flash_encryption ` + - Provides a combined example showing the coexistence of NVS encryption, FATFS encryption, and encrypted custom data access via the Partitions API. Security related workflows for both development and production are also provided. diff --git a/docs/zh_CN/api-reference/storage/index.rst b/docs/zh_CN/api-reference/storage/index.rst index 38b614ae4ac9..04077378ac74 100644 --- a/docs/zh_CN/api-reference/storage/index.rst +++ b/docs/zh_CN/api-reference/storage/index.rst @@ -33,5 +33,6 @@ spiffs vfs wear-levelling + storage-security.rst 此部分 API 代码示例存放在 ESP-IDF 示例项目的 :example:`storage` 目录下。 diff --git a/docs/zh_CN/api-reference/storage/storage-security.rst b/docs/zh_CN/api-reference/storage/storage-security.rst new file mode 100644 index 000000000000..2f40fa446711 --- /dev/null +++ b/docs/zh_CN/api-reference/storage/storage-security.rst @@ -0,0 +1 @@ +.. include:: ../../../en/api-reference/storage/storage-security.rst diff --git a/examples/security/flash_encryption/README.md b/examples/security/flash_encryption/README.md index c499289ff5fb..cf4c7364369d 100644 --- a/examples/security/flash_encryption/README.md +++ b/examples/security/flash_encryption/README.md @@ -3,11 +3,27 @@ # Flash Encryption -The example checks if the flash encryption feature is enabled/disabled and if enabled prints the flash encryption mode (DEVELOPMENT / RELEASE) and FLASH_CRYPT_CNT (for ESP32) or SPI_BOOT_CRYPT_CNT (for ESP32-S2 and newer targets) eFuse value. +The example demonstrates the flash encryption application by providing a code using FATFS and NVS partitions on a device with the flash encryption enabled. +As the flash encryption can be enabled either in Development or Release mode, a guidance of how to use either mode is provided. -The example also demonstrates writing and reading encrypted partitions in flash. +The example code checks if the flash encryption feature is enabled/disabled and if enabled, it prints a status information of all the eFuses related to the flash encryption mode (Development/Release) and FLASH_CRYPT_CNT (for ESP32) or SPI_BOOT_CRYPT_CNT (for ESP32-S2 and newer targets). -## How to use example +The example also demonstrates: + +1. Writing and reading encrypted partitions in the flash memory. +2. Initialization of FATFS, formatting, writing and reading file. Both encrypted as well as non-encrypted. +3. Initialization of encrypted NVS partition. Both auto-generated as well as pre-generated NVS key scenarios are presented. +4. Flashing the example in Development as well as Release mode. + +### NVS example +The example demonstrates default and custom NVS partition initialisation when the flash encryption is enabled. From the code perspective the use of NVS API is transparent regardless of the flash encryption mode. + +### FATFS example +FATFS example function finds non-encrypted partition `fat_not_encr`, erases it, creates FATFS, formats and mounts the file system. Then it creates file `/spiflash/inner.txt` using `fopen`, writes test string using `fprintf` and closes the file using `fclose`. Then it uses `fopen` and `fgets` to read the string back to verify it is correctly written. The last step of the example on unencrypted partition uses `esp_flash_read` to locate the test string in the underlying partition without involving potential cryptographic layer. The test string offset from the beginning of the partition is returned to the second part of the example. + +The second part of the example repeats FATFS related steps on the encrypted partition named `fat_encrypted`. The same sequence of steps as in the non encrypted partition means, that the file data should be present on the same offset in the partition. Therefore, direct partition reading using `esp_flash_read` uses the offset returned by the first part of example. Depending on encryption settings in the menuconfig, the test string is then read in the visible form `(SECURE_FLASH_ENC_ENABLED not set)` or in encrypted form `(SECURE_FLASH_ENC_ENABLED=y)` + +## How to use the example ### Hardware Required @@ -16,67 +32,211 @@ The example also demonstrates writing and reading encrypted partitions in flash. ``` idf.py menuconfig ``` -#### Configuration for flash encryption -* Enable the flash encryption mode (Development or Release) under Security Features. Default usage mode is Development (recommended during test and development phase). -Note: After enabling flash encryption, the bootloader size increases, which means that the offset of the partition table must be changed to 0x9000 from 0x8000 to prevent the bootloader from overlapping with the partition table. In this example, the default offset of the partition table is 0x9000. +#### Flash encryption configuration +Enable the flash encryption mode (Development or Release) under (`menuconfig -> Security Features`). Default usage mode is Development (recommended during test and development phase). + +Note: After enabling flash encryption, the bootloader size increases, which means that default offset of the partition table (`menuconfig -> Partition Table -> Offset of partition table`) has to be increased from default value of 0x8000 to prevent the bootloader from overlapping with the partition table. In this example, the offset of the partition table is incereased to 0xD000. -For better security, the NVS encryption is enabled by default when the flash encryption is enabled. If you choose to disable the NVS encryption, you can skip the NVS configuration step given below. +If you chose the Release mode, for better security, you can also disable UART ROM download mode using (`menuconfig -> Security features -> UART ROM download mode -> Permanently disabled`) +Note: This option, after first start of application, makes the device forever inaccessible using UART. Use it with care. + +This example demonstrates working with several non-default partitions, therefore a custom partition configuration file is selected. The custom file option (`menuconfig -> Partition Table -> Partition table = Custom partition table CSV`) and the name of file is set in (`menuconfig -> Partition Table -> Custom partition CSV file`). The additional entries in the custom partition table CSV file on top of default ones are described in the NVS and FATFS related subsections below. + +For better security, the NVS encryption (`menuconfig -> Component config -> NVS -> Enable NVS encryption`) is enabled by default when the flash encryption is enabled in the menuconfig. If you decide to disable the NVS encryption, you can skip the NVS configuration step given below. #### Configuration for NVS encryption -For using NVS encryption, the partition table must contain the [NVS key partition](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/storage/nvs_flash.html#nvs-key-partition). Two partition tables containing the NVS keys partition are provided for NVS encryption under the partition table option . They can be selected with the project configuration menu (`menuconfig -> Partition Table`). This particular example uses a custom partition table as it requires a `storage` partition along with the `nvs_keys` partition. +With the NVS encryption is enabled, the partition table must contain additional [NVS key partition](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/storage/nvs_flash.html#nvs-key-partition) atop of all the NVS partitions holding data. This example uses two NVS partitions (`storage`, `nvs`) and one NVS key partition `nvs_keys`. All the partitions required are already preconfigured in `partitions_example.csv` + +The partition configuration for the NVS encryption involves generating NVS encryption keys to be stored in [NVS key partition](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/storage/nvs_flash.html#nvs-key-partition). The NVS encryption keys can be either automatically generated by ESP32-based chip during the first run of the application, or generated and flashed to the device by the application developer. + +Automatic generation of NVS encryption keys on ESP32-based chips: +When the NVS encryption is enabled, the `nvs_flash_init` API function can internally generate the XTS encryption keys on the ESP32-based chip. The API function finds the first [NVS key partition](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/storage/nvs_flash.html#nvs-key-partition), i.e. a partition of type `data` and subtype `nvs_keys` and when this partition is empty, the API function automatically generates NVS keys. (Consult the [`nvs_flash_init`](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/storage/nvs_flash.html#_CPPv414nvs_flash_initv) API documentation in the ESP-IDF programming guide for more details). + +**Please note that `nvs_keys` partition has to be completely erased before starting the application. Otherwise the application may generate `ESP_ERR_NVS_CORRUPT_KEY_PART` error code assuming that `nvs_keys` partition was not empty and contains malformed data.** + +Flash pre-generated NVS encryption keys: +This method is useful when application developer requires presence of known NVS encryption keys on a device. I.e. to allow easier analysis of the NVS partition on a host computer. +For convenience, file `sample_encryption_keys.bin` with a sample of pre-generated NVS encryption keys is provided. -The configuration for NVS encryption involves generating the XTS encryption keys in the [NVS key partition](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/storage/nvs_flash.html#nvs-key-partition) partition. It can be done with one of the following method. +#### Configuration for FATFS encryption +FATFS encryption example uses two additional partitions in the partition table. Both partitions are of type `data` and subtype `fat`. The first partition `fat_encrypted` has the encrypted flag set, the second partition `fat_not_encr` has the encryption flag off. Both partitions are defined in the partition configuration file `partitions_example.csv` -1. Generate the XTS encryption keys on the ESP chip: +### Building - When NVS encryption is enabled the `nvs_flash_init` API function can internally generate the XTS encryption keys on the ESP chip. The API function finds the first [NVS key partition](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/storage/nvs_flash.html#nvs-key-partition) i.e. a partition of type `data` and subtype `nvs_keys`. - Then the API function automatically generates and stores the - nvs keys in that partition. New keys are generated and stored only when the respective key partition is empty. (Consult the [`nvs_flash_init`](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/storage/nvs_flash.html#_CPPv414nvs_flash_initv) API documentation in the ESP-IDF programming guide for more details). +``` +idf.py build +``` + +### Flashing - **Please note that `nvs_keys` partition must be completely erased before starting the application. Otherwise the application may generate `ESP_ERR_NVS_CORRUPT_KEY_PART` error code assuming that `nvs_keys` partition was not empty and contains malformatted data.** +There are two flash encryption modes: Development and Release. +ESP32-based device's bootloader in the Development mode can encrypt the data to be flashed, whilst the bootloader in the Release mode cannot. Therefore the data to be flashed in Release mode has to be encrypted on a host system in advance. The workflows for both options are described below. -2. Use pre-generated XTS encryption keys: - This method will be required by the user when the `XTS encryption keys` in [NVS key partition](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/storage/nvs_flash.html#nvs-key-partition) are not generated by the application. - The pre generated `Sample XTS encryption keys` can be stored on the flash with help of the following two commands +Prerequisites: +- Flashing port of connected ESP32-based device is stored in the environment variable PORT, e.g. `export PORT=/dev/cu.usbserial-14320` +- Current directory is set to the example root, e.g. `esp-idf/examples/security/flash_encryption` + +#### Development mode + +1. Build and flash the partition table: +``` +idf.py --port $PORT partition-table partition-table-flash +``` - i) Build and flash the partition table: - ``` - idf.py partition-table partition-table-flash - ``` - ii) Store the `sample_encryption_keys.bin` in the `nvs_key`partition (on the flash) with the help of [parttool.py](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/partition-tables.html#partition-tool-parttool-py): - ``` - parttool.py --port /dev/ttyUSB0 --partition-table-offset 0x9000 write_partition --partition-name="nvs_key" --input sample_encryption_keys.bin - ``` - The sample [NVS key partition](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/storage/nvs_flash.html#nvs-key-partition) partition used in this example is generated with the help of [NVS Partition Generator Utility](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/storage/nvs_partition_gen.html#nvs-partition-generator-utility) - . +2. If you want use pre-generated NVS encryption keys, flash the `sample_encryption_keys.bin` into the `nvs_key`partition (on the flash) with the help of [parttool.py](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/partition-tables.html#partition-tool-parttool-py): +``` +parttool.py --port $PORT --partition-table-offset 0xD000 write_partition --partition-name="nvs_key" --input sample_encryption_keys.bin +``` +The sample [NVS key partition](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/storage/nvs_flash.html#nvs-key-partition) partition used in this example is generated with the help of [NVS Partition Generator Utility](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/storage/nvs_partition_gen.html#nvs-partition-generator-utility) -### Build and Flash -When building the project and flashing it to the board FOR THE FIRST TIME after enabling flash encryption feature in menuconfig, run following command to program the target and monitor the output: +3. When building the project and flashing it to the board FOR THE FIRST TIME (after enabling the flash encryption feature in menuconfig), run the following command to program the target and monitor the output: ``` -idf.py -p PORT flash monitor +idf.py --port $PORT flash monitor ``` (To exit the serial monitor, type ``Ctrl-]``.) -See the Getting Started Guide for full steps to configure and use ESP-IDF to build projects. +4. When reprogramming the device, subsequently use the following command for encrypted write of the new non-encrypted application's binary: + +``` +idf.py --port $PORT encrypted-app-flash monitor +``` + +5. Please note that above-mentioned command programs only the 'app' partition. In order to reprogram all the partitions (bootloader, partition table and application) and let the bootloader encrypt them on the device, use: + +``` +idf.py --port $PORT encrypted-flash monitor +``` + +#### Release mode + +Full example including host generated NVS encryption keys and pre-encryption of the flash on the host is provided for ESP32 ECO3. +Steps: + +1. Generate an unique flash encryption key on a host +``` +espsecure.py generate_flash_encryption_key example_flash_encryption_key.bin +``` + +Alternatively, if you want to further develop the workflow, it might be useful to use all-zeroes "easy to restore" flash encryption key instead. However, never use this key in a production! +``` +dd if=/dev/zero of=example_flash_encryption_key.bin bs=1 count=32 +``` + +2. NVS encryption key +This workflow uses NVS encryption key provided by the example repository. It will be flashed to the `nvs_key` partition. +File name is `sample_encryption_keys.bin` + +3. Prepare data partitions to be flashed +Developers requiring pre-initialized partitions can use NVS Partition Generator Utility for NVS or FAT File System Generator for FAT filesystem. +This example assumes empty partitions. + +``` +dd if=/dev/zero bs=1 count=0x1000 of=build/storage.bin +dd if=/dev/zero bs=1 count=0x6000 of=build/nvs.bin +dd if=/dev/zero bs=1 count=0x6000 of=build/custom_nvs.bin +dd if=/dev/zero bs=1 count=0x96000 of=build/fat_encrypted.bin +dd if=/dev/zero bs=1 count=0x96000 of=build/fat_not_encr.bin +``` + +4. Encrypt flash artefacts on a host using flash encryption key. +First, figure out the offsets of particular artefacts in the flash memory, as it is one of the inputs to the encryption algorithm. +Lookup the section listing partition table in output of the command `idf.py build` i.e. +``` +Partition table binary generated. Contents: +******************************************************************************* +# ESP-IDF Partition Table +# Name, Type, SubType, Offset, Size, Flags +nvs,data,nvs,0xe000,24K, +storage,data,255,0x14000,4K,encrypted +factory,app,factory,0x20000,1M, +nvs_key,data,nvs_keys,0x120000,4K,encrypted +custom_nvs,data,nvs,0x121000,24K, +fat_encrypted,data,fat,0x127000,600K,encrypted +fat_not_encr,data,fat,0x1bd000,600K, +******************************************************************************* +``` + +The offsets of the bootloader, application code and the partition table binaries can be found in `build/flash_args` +``` +0x1000 bootloader/bootloader.bin +0x20000 flash_encryption.bin +0xd000 partition_table/partition-table.bin +``` + +From the example application perspective it is necessary to encrypt every artefact except for 'nvs', 'custom_nvs' and 'fat_not_encr' partitions, as their content is expected to be plaintext. + +``` +espsecure.py encrypt_flash_data --keyfile example_flash_encryption_key.bin --output build/bootloader_encrypted.bin --address 0x1000 build/bootloader/bootloader.bin +espsecure.py encrypt_flash_data --keyfile example_flash_encryption_key.bin --output build/flash_encryption_encrypted.bin --address 0x20000 build/flash_encryption.bin +espsecure.py encrypt_flash_data --keyfile example_flash_encryption_key.bin --output build/partition_table_encrypted.bin --address 0xd000 build/partition_table/partition-table.bin +espsecure.py encrypt_flash_data --keyfile example_flash_encryption_key.bin --output build/storage_encrypted.bin --address 0x14000 build/storage.bin +espsecure.py encrypt_flash_data --keyfile example_flash_encryption_key.bin --output build/sample_encryption_keys_encrypted.bin --address 0x120000 sample_encryption_keys.bin +espsecure.py encrypt_flash_data --keyfile example_flash_encryption_key.bin --output build/fat_encrypted_encrypted.bin --address 0x127000 build/fat_encrypted.bin +``` + +5. Merge all the flash artefacts into one file +``` +esptool.py --chip ESP32 merge_bin -o build\merged_encrypted_flash.bin --flash_mode dio --flash_size 4MB \ +0x1000 build/bootloader_encrypted.bin \ +0xd000 build/partition_table_encrypted.bin \ +0xe000 build/nvs.bin \ +0x14000 build/storage_encrypted.bin \ +0x20000 build/flash_encryption_encrypted.bin \ +0x120000 build/sample_encryption_keys_encrypted.bin \ +0x121000 build/nvs.bin \ +0x127000 build/fat_encrypted_encrypted.bin \ +0x1bd000 build/fat_not_encr.bin +``` +Ignore the warning `Warning: Image file at 0x1000 doesn't look like an image file, so not changing any flash settings.` + +Output flash binary file is `build\merged_encrypted_flash.bin` + +6. Burn the encryption key and set the efuses in ESP32-based device +This step can be performed only once. If the workflow is using non-zero flash encryption key generated in step 1, keep the encryption key file on a safe place for future application updates. + +``` +espefuse.py --chip esp32 --do-not-confirm --port $PORT burn_key flash_encryption example_flash_encryption_key.bin +espefuse.py --chip esp32 --do-not-confirm --port $PORT burn_efuse FLASH_CRYPT_CONFIG 0xf +espefuse.py --chip esp32 --do-not-confirm --port $PORT burn_efuse FLASH_CRYPT_CNT 127 +``` -When reprogramming the device subsequently use following command for encrypted write of new plaintext application: +7. Burn security eFuses +WARNING: This step can be performed only once! +``` +espefuse.py --chip esp32 --do-not-confirm --port $PORT burn_efuse DISABLE_DL_ENCRYPT 0x1 +espefuse.py --chip esp32 --do-not-confirm --port $PORT burn_efuse DISABLE_DL_DECRYPT 0x1 +espefuse.py --chip esp32 --do-not-confirm --port $PORT burn_efuse DISABLE_DL_CACHE 0x1 +espefuse.py --chip esp32 --do-not-confirm --port $PORT burn_efuse JTAG_DISABLE 0x1 +``` +8. Flash the image to the ESP32-based device ``` -idf.py -p PORT encrypted-app-flash monitor +python -m esptool --chip esp32 --port $PORT -b 460800 write_flash --force --flash_mode dio \ +--flash_size 4MB --flash_freq 40m \ +0x0000 build\merged_encrypted_flash.bin ``` -Please note above command programs only the app partition. In order to reprogram all partitions (bootloader, partition table and application) in encrypted form use: +9. Monitor the output, then reset the device +``` +idf.py --port $PORT monitor +``` +10. You can verify the efuse settings using ``` -idf.py -p PORT encrypted-flash monitor +espefuse.py --chip esp32 --port $PORT summary ``` +For subsequent application update, only steps 4,5,8 are required. + + ## Example Output +### Development mode + When running the example without enabling flash encryption, the output would be as follows (on ESP32): ``` @@ -94,8 +254,25 @@ I (398) example: 0x3ffb4db0 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f Reading with spi_flash_read: I (408) example: 0x3ffb4da0 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f |................| I (418) example: 0x3ffb4db0 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f |................| +.... +I (509) example: FAT partition "fat_not_encr" is not encrypted. Size is (0x96000 bytes) +.... +I (3429) example: Read partition using esp_flash_read until test string is found +I (3649) example: 0x3ffb4f90 74 68 65 20 71 75 69 63 6b 20 62 72 6f 77 6e 20 |the quick brown | +I (3649) example: 0x3ffb4fa0 66 6f 78 20 6a 75 6d 70 65 64 20 6f 76 65 72 20 |fox jumped over | +I (3659) example: 0x3ffb4fb0 74 68 65 20 6c 61 7a 79 20 64 6f 67 |the lazy dog| +I (3669) example: Test string was found at offset (0x7000) +.... +I (3679) example: FAT partition "fat_encrypted" is not encrypted. Size is (0x96000 bytes) +.... +I (7099) example: Read partition using esp_flash_read at expected offset (0x7000) +I (7099) example: 0x3ffb4f84 74 68 65 20 71 75 69 63 6b 20 62 72 6f 77 6e 20 |the quick brown | +I (7099) example: 0x3ffb4f94 66 6f 78 20 6a 75 6d 70 65 64 20 6f 76 65 72 20 |fox jumped over | +I (7109) example: 0x3ffb4fa4 74 68 65 20 6c 61 7a 79 20 64 6f 67 |the lazy dog| +I (7119) example: Data matches test string ``` - +Note: Above, the partition `fat_encrypted` has flag `encrypted` set in partition table, but it's actual state +is `not encrypted` until the flash encryption is enabled in security part of menuconfig as demonstrated below. After enabling flash encryption in Development mode, the output shows the process of enabling the flash encryption: ``` @@ -132,19 +309,78 @@ I (471) example: 0x3ffb4db0 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f Reading with spi_flash_read: I (491) example: 0x3ffb4b30 35 9b f2 07 b4 6d 40 89 28 b4 1e 22 98 7b 4a 36 |5....m@.(..".{J6| I (491) example: 0x3ffb4b40 ba 89 81 67 77 a3 60 5e 0a e7 51 01 b3 58 c2 f6 |...gw.`^..Q..X..| +.... +I (583) example: FAT partition "fat_not_encr" is not encrypted. Size is (0x96000 bytes) +.... +I (3863) example: Read partition using esp_flash_read until test string is found +I (4083) example: 0x3ffb4fb0 74 68 65 20 71 75 69 63 6b 20 62 72 6f 77 6e 20 |the quick brown | +I (4083) example: 0x3ffb4fc0 66 6f 78 20 6a 75 6d 70 65 64 20 6f 76 65 72 20 |fox jumped over | +I (4093) example: 0x3ffb4fd0 74 68 65 20 6c 61 7a 79 20 64 6f 67 |the lazy dog| +I (4103) example: Test string was found at offset (0x7000) +.... +I (4113) example: FAT partition "fat_encrypted" is encrypted. Size is (0x96000 bytes) +.... +I (8033) example: Read partition using esp_flash_read at expected offset (0x7000) +I (8033) example: 0x3ffb4fa4 a7 ea d5 a7 ed cf f6 f7 4a a2 54 a0 4f 92 73 7b |........J.T.O.s{| +I (8043) example: 0x3ffb4fb4 63 eb 5d fc 14 b9 da 3b f2 be d0 94 de eb b2 dc |c.]....;........| +I (8053) example: 0x3ffb4fc4 38 aa 14 62 b7 23 61 7d b6 34 43 53 |8..b.#a}.4CS| +I (8063) example: Data does not match test string ``` - If the NVS encryption is enabled, then the output will show the status of the encrypted partition as follows ``` I (667) example_nvs: NVS partition "nvs" is encrypted. ``` + +### Release mode + +In the Release mode no in-place encryption happens after the first reset, as the bootloader assumes the flashed data is already encrypted. The log below shows the run of application after successfully finished flashing. +``` +Example to check Flash Encryption status +This is esp32 chip with 2 CPU core(s), WiFi/BT/BLE, silicon revision v1.0, 4MB external flash +FLASH_CRYPT_CNT eFuse value is 127 +Flash encryption feature is enabled in RELEASE mode +Erasing partition "storage" (0x1000 bytes) +Writing data with esp_partition_write: +I (483) example: 0x3ffb5000 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f |................| +I (483) example: 0x3ffb5010 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f |................| +Reading with esp_partition_read: +I (493) example: 0x3ffb4fe0 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f |................| +I (503) example: 0x3ffb4ff0 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f |................| +Reading with esp_flash_read: +I (513) example: 0x3ffb4fe0 16 0a 38 06 c8 29 31 32 b2 1f 5a ca da e9 47 99 |..8..)12..Z...G.| +I (523) example: 0x3ffb4ff0 1d ca d6 6d 55 ad 31 57 d3 d9 df 77 43 f9 4c ca |...mU.1W...wC.L.| +.... +I (543) example_fatfs: FAT partition "fat_not_encr" is not encrypted. Size is (0x96000 bytes) +.... +I (3573) example_fatfs: Read partition using esp_flash_read until test string is found +I (3793) example_fatfs: 0x3ffb4fc0 74 68 65 20 71 75 69 63 6b 20 62 72 6f 77 6e 20 |the quick brown | +I (3803) example_fatfs: 0x3ffb4fd0 66 6f 78 20 6a 75 6d 70 65 64 20 6f 76 65 72 20 |fox jumped over | +I (3803) example_fatfs: 0x3ffb4fe0 74 68 65 20 6c 61 7a 79 20 64 6f 67 |the lazy dog| +I (3813) example_fatfs: Test string was found at offset (0x7000) +.... +I (3823) example_fatfs: FAT partition "fat_encrypted" is encrypted. Size is (0x96000 bytes) +.... +I (7303) example_fatfs: Read partition using esp_flash_read at expected offset (0x7000) +I (7303) example_fatfs: 0x3ffb4fb4 3b 8f f4 e1 c1 f4 73 43 d9 28 3f 57 f3 2b d2 b0 |;.....sC.(?W.+..| +I (7313) example_fatfs: 0x3ffb4fc4 41 7a 8f 09 81 1d 92 51 74 8a ee 2a c3 64 8f 75 |Az.....Qt..*.d.u| +I (7323) example_fatfs: 0x3ffb4fd4 61 fe 08 b6 b4 0c cb 08 5a b8 65 29 |a.......Z.e)| +I (7333) example_fatfs: Data does not match test string +``` +If the NVS encryption is enabled, then the output will show the status of the encrypted partition as follows +``` +I (7373) nvs: NVS partition "nvs" is encrypted. +I (7413) example: NVS partition "custom_nvs" is encrypted. +``` + ## Troubleshooting It is also possible to use esptool.py utility to read the eFuse values and check if flash encryption is enabled or not ``` -python $IDF_PATH/components/esptool_py/esptool/espefuse.py --port PORT summary +python $IDF_PATH/components/esptool_py/esptool/espefuse.py --port $PORT summary ``` -If FLASH_CRYPT_CNT (for ESP32) or SPI_BOOT_CRYPT_CNT (for ESP32-S2 and newer targets) eFuse value is non-zero flash encryption is enabled +If FLASH_CRYPT_CNT (for ESP32) or SPI_BOOT_CRYPT_CNT (for ESP32-S2 and newer targets) eFuse value is non-zero, the flash encryption is enabled + + diff --git a/examples/security/flash_encryption/main/CMakeLists.txt b/examples/security/flash_encryption/main/CMakeLists.txt index 75ea85b111f7..13c6fc5328e5 100644 --- a/examples/security/flash_encryption/main/CMakeLists.txt +++ b/examples/security/flash_encryption/main/CMakeLists.txt @@ -1,2 +1,3 @@ idf_component_register(SRCS "flash_encrypt_main.c" + "flash_encrypt_fatfs.c" INCLUDE_DIRS ".") diff --git a/examples/security/flash_encryption/main/flash_encrypt_fatfs.c b/examples/security/flash_encryption/main/flash_encrypt_fatfs.c new file mode 100644 index 000000000000..4b4c75f4ab43 --- /dev/null +++ b/examples/security/flash_encryption/main/flash_encrypt_fatfs.c @@ -0,0 +1,192 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Unlicense OR CC0-1.0 + */ +/* Flash encryption Example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ +#include +#include +#include "esp_flash.h" +#include "esp_partition.h" +#include "esp_vfs.h" +#include "esp_vfs_fat.h" +#include "sdkconfig.h" + +#include "flash_encrypt_fatfs.h" + +static size_t example_fatfs_partition_test(const esp_partition_t* partition, const size_t text_data_offset); + +static const char* TAG = "example_fatfs"; + +void example_read_write_fatfs(void) +{ + const esp_partition_t* partition = NULL; + + // Not encrypted partition test + partition = esp_partition_find_first( + ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_FAT, CUSTOM_FAT_PART_NAME_NE); + assert(partition); + + size_t open_test_string_offset = example_fatfs_partition_test(partition, SIZE_MAX); + assert(open_test_string_offset != SIZE_MAX); + + // Encrypted partition test + partition = esp_partition_find_first( + ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_FAT, CUSTOM_FAT_PART_NAME_E); + assert(partition); + + example_fatfs_partition_test(partition, open_test_string_offset); +} + +// Performs fatfs test on the partition. +// Erases, formats, writes and reads text file containing "test string". +// Then: +// If parameter text_data_offset == SIZE_MAX, it tries to find test string on the partition using +// esp_partition_read. Returns offset from the beginning of the partition if "test string" is found, otherwise returns SIZE_MAX +// If parameter text_data_offset != SIZE_MAX, it compares the flash content at the text_data_offset with the "test string" +// If data matches, returns text_data_offset, if it doesn't match, returns SIZE_MAX +static size_t example_fatfs_partition_test(const esp_partition_t* partition, const size_t text_data_offset) +{ + const char* TEST_FAT_STRING = "the quick brown fox jumped over the lazy dog"; + // Mount path for the partition + const char *base_path = "/spiflash"; + + // Handle of the wear levelling library instance + wl_handle_t s_wl_handle = WL_INVALID_HANDLE; + esp_err_t err = ESP_FAIL; + + ESP_LOGI(TAG, "FAT partition \"%s\" is %sencrypted. Size is (0x%" PRIx32 " bytes) ", + partition->label, + (partition->encrypted) ? "" : "not ", + (long unsigned int)partition->size + ); + + ESP_LOGI(TAG, "Erasing partition"); + ESP_ERROR_CHECK(esp_partition_erase_range(partition, 0, partition->size)); + + ESP_LOGI(TAG, "Formatting FAT filesystem"); + err = esp_vfs_fat_spiflash_format_rw_wl(base_path, partition->label); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to format FATFS (%s)", esp_err_to_name(err)); + return SIZE_MAX; + } + + ESP_LOGI(TAG, "Mounting FAT filesystem"); + // To mount device we need name of device partition, define base_path + // and allow format partition in case if it is new one and was not formatted before + const esp_vfs_fat_mount_config_t mount_config = { + .max_files = 4, + .format_if_mount_failed = false, + .allocation_unit_size = CONFIG_WL_SECTOR_SIZE + }; + err = esp_vfs_fat_spiflash_mount_rw_wl(base_path, partition->label, &mount_config, &s_wl_handle); + + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to mount FATFS (%s)", esp_err_to_name(err)); + return SIZE_MAX; + } + + const size_t RD_BUFF_LEN = 64; + char read_buffer[RD_BUFF_LEN]; + char *device_filename; + + device_filename = "/spiflash/inner.txt"; + + // Open file for writing + ESP_LOGI(TAG, "Opening file"); + FILE *f; + f = fopen(device_filename, "wb"); + if (f == NULL) { + ESP_LOGE(TAG, "Failed to open file for writing"); + return SIZE_MAX; + } + fprintf(f, TEST_FAT_STRING); + fclose(f); + + ESP_LOGI(TAG, "Written to file: '%s'", TEST_FAT_STRING); + + // Open file for reading + ESP_LOGI(TAG, "Reading file"); + f = fopen(device_filename, "rb"); + if (f == NULL) { + ESP_LOGE(TAG, "Failed to open file for reading"); + return SIZE_MAX; + } + fgets(read_buffer, sizeof(read_buffer), f); + fclose(f); + // strip newline + char *pos = strchr(read_buffer, '\n'); + if (pos) { + *pos = '\0'; + } + ESP_LOGI(TAG, "Read from file: '%s'", read_buffer); + + // Unmount FATFS + ESP_LOGI(TAG, "Unmounting FAT filesystem"); + ESP_ERROR_CHECK(esp_vfs_fat_spiflash_unmount_rw_wl(base_path, s_wl_handle)); + + if (text_data_offset == SIZE_MAX) { + + // try to find the TEST_FAT_STRING on the partition using esp_flash_read read. + ESP_LOGI(TAG, "Read partition using esp_flash_read until test string is found"); + + size_t read_offset = 0; + size_t read_len = RD_BUFF_LEN; + void* text_addr = NULL; + + assert(partition->size > RD_BUFF_LEN); + assert(RD_BUFF_LEN > strlen(TEST_FAT_STRING)); + + // read from partition until it's end + while (true) { + ESP_ERROR_CHECK(esp_flash_read(NULL, read_buffer, partition->address + read_offset, read_len)); + + // try to find characters, break the loop if found + // buffer is read_buffer, len is read_len + text_addr = memmem(read_buffer, read_len, TEST_FAT_STRING, strlen(TEST_FAT_STRING)); + if (text_addr != NULL) { + ESP_LOG_BUFFER_HEXDUMP(TAG, text_addr, strlen(TEST_FAT_STRING), ESP_LOG_INFO); + + // calculate offset from the beginning of the partition + size_t test_str_part_offset = (text_addr - (void*)read_buffer) + read_offset; + ESP_LOGI(TAG, "Test string was found at offset (0x%" PRIx32 ")", (long unsigned int)test_str_part_offset); + return test_str_part_offset; + } + + // advance read buffer by the RD_BUFF_LEN - strlen(TEST_FAT_STRING) + read_offset += (RD_BUFF_LEN - strlen(TEST_FAT_STRING)); + if ((read_offset + strlen(TEST_FAT_STRING)) > partition->size) { + // remaining unread space is not long enough to hold the searched string + break; + } else { + // remaining unread space is either the size of buffer or just the rest up to the end of partition + read_len = (partition->size >= (read_offset + RD_BUFF_LEN)) ? RD_BUFF_LEN : partition->size - read_offset; + } + } + } else { + // offset, where the expected test string should be is in text_data_offset. Try to read it, compare and report + ESP_LOGI(TAG, "Read partition using esp_flash_read at expected offset (0x%" PRIx32 ") ", (long unsigned int)text_data_offset); + + assert(text_data_offset <= partition->size); + assert((text_data_offset + strlen(TEST_FAT_STRING)) <= partition->size); + + // read from flash + ESP_ERROR_CHECK(esp_flash_read(NULL, read_buffer, partition->address + text_data_offset, strlen(TEST_FAT_STRING))); + + ESP_LOG_BUFFER_HEXDUMP(TAG, read_buffer, strlen(TEST_FAT_STRING), ESP_LOG_INFO); + if (memcmp(read_buffer, TEST_FAT_STRING, strlen(TEST_FAT_STRING)) == 0) { + ESP_LOGI(TAG, "Data matches test string"); + return text_data_offset; + } + ESP_LOGI(TAG, "Data does not match test string"); + } + + return SIZE_MAX; +} diff --git a/examples/security/flash_encryption/main/flash_encrypt_fatfs.h b/examples/security/flash_encryption/main/flash_encrypt_fatfs.h new file mode 100644 index 000000000000..ff4e29e3cd91 --- /dev/null +++ b/examples/security/flash_encryption/main/flash_encrypt_fatfs.h @@ -0,0 +1,18 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Unlicense OR CC0-1.0 + */ +/* Flash encryption Example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +#define CUSTOM_FAT_PART_NAME_NE "fat_not_encr" +#define CUSTOM_FAT_PART_NAME_E "fat_encrypted" + +void example_read_write_fatfs(void); diff --git a/examples/security/flash_encryption/main/flash_encrypt_main.c b/examples/security/flash_encryption/main/flash_encrypt_main.c index a38d7c465cf6..de290c04b95a 100644 --- a/examples/security/flash_encryption/main/flash_encrypt_main.c +++ b/examples/security/flash_encryption/main/flash_encrypt_main.c @@ -19,6 +19,8 @@ #include "esp_efuse_table.h" #include "nvs_flash.h" +#include "flash_encrypt_fatfs.h" + static void example_print_chip_info(void); static void example_print_flash_encryption_status(void); static void example_read_write_flash(void); @@ -35,6 +37,23 @@ static const char* TAG = "example"; #define TARGET_CRYPT_CNT_WIDTH 3 #endif +// return true, if partitions necessary to demonstrate fatfs encryption are present in the flash +static bool can_perform_fatfs_example(void) +{ + const esp_partition_t *fatfs_ne = esp_partition_find_first( + ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_FAT, CUSTOM_FAT_PART_NAME_NE); + + const esp_partition_t *fatfs_e = esp_partition_find_first( + ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_FAT, CUSTOM_FAT_PART_NAME_E); + + if ((fatfs_ne != NULL) && (fatfs_e != NULL)) { + ESP_LOGI(TAG, "Partitions %s and %s for FATFS example are present", CUSTOM_FAT_PART_NAME_NE, CUSTOM_FAT_PART_NAME_E); + return true; + } + + return false; +} + static esp_err_t example_custom_nvs_part_init(const char *name) { #if CONFIG_NVS_ENCRYPTION @@ -71,6 +90,11 @@ void app_main(void) example_print_chip_info(); example_print_flash_encryption_status(); example_read_write_flash(); + + if (can_perform_fatfs_example()) { + example_read_write_fatfs(); + } + /* Initialize the default NVS partition */ esp_err_t ret = nvs_flash_init(); if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { @@ -95,15 +119,15 @@ static void example_print_chip_info(void) uint32_t flash_size; esp_chip_info(&chip_info); printf("This is %s chip with %d CPU core(s), WiFi%s%s, ", - CONFIG_IDF_TARGET, - chip_info.cores, - (chip_info.features & CHIP_FEATURE_BT) ? "/BT" : "", - (chip_info.features & CHIP_FEATURE_BLE) ? "/BLE" : ""); + CONFIG_IDF_TARGET, + chip_info.cores, + (chip_info.features & CHIP_FEATURE_BT) ? "/BT" : "", + (chip_info.features & CHIP_FEATURE_BLE) ? "/BLE" : ""); unsigned major_rev = chip_info.revision / 100; unsigned minor_rev = chip_info.revision % 100; printf("silicon revision v%d.%d, ", major_rev, minor_rev); - if(esp_flash_get_size(NULL, &flash_size) != ESP_OK) { + if (esp_flash_get_size(NULL, &flash_size) != ESP_OK) { printf("Get flash size failed"); return; } @@ -111,7 +135,6 @@ static void example_print_chip_info(void) (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external"); } - static void example_print_flash_encryption_status(void) { uint32_t flash_crypt_cnt = 0; @@ -123,15 +146,14 @@ static void example_print_flash_encryption_status(void) printf("Flash encryption feature is disabled\n"); } else { printf("Flash encryption feature is enabled in %s mode\n", - mode == ESP_FLASH_ENC_MODE_DEVELOPMENT ? "DEVELOPMENT" : "RELEASE"); + mode == ESP_FLASH_ENC_MODE_DEVELOPMENT ? "DEVELOPMENT" : "RELEASE"); } } - static void example_read_write_flash(void) { const esp_partition_t* partition = esp_partition_find_first( - ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, "storage"); + ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, "storage"); assert(partition); printf("Erasing partition \"%s\" (0x%" PRIx32 " bytes)\n", partition->label, partition->size); diff --git a/examples/security/flash_encryption/partitions_example.csv b/examples/security/flash_encryption/partitions_example.csv index 736d14c87746..34e837753f74 100644 --- a/examples/security/flash_encryption/partitions_example.csv +++ b/examples/security/flash_encryption/partitions_example.csv @@ -1,9 +1,12 @@ # Name, Type, SubType, Offset, Size, Flags -nvs, data, nvs, , 0x6000, +nvs, data, nvs, , 0x6000, # Extra partition to demonstrate reading/writing of encrypted flash -storage, data, 0xff, , 0x1000, encrypted -factory, app, factory, , 1M, +storage, data, 0xff, , 0x1000, encrypted +factory, app, factory, , 1M, # nvs_key partition contains the key that encrypts the NVS partition named nvs. The nvs_key partition needs to be encrypted. -nvs_key, data, nvs_keys, , 0x1000, encrypted, +nvs_key, data, nvs_keys, , 0x1000, encrypted, # Custom NVS data partition -custom_nvs, data, nvs, , 0x6000, +custom_nvs, data, nvs, , 0x6000, +# FATFS partitions, one non-encrypted, one encrypted +fat_encrypted, data, fat, , 600k, encrypted +fat_not_encr, data, fat, , 600k, diff --git a/examples/security/flash_encryption/pytest_flash_encryption.py b/examples/security/flash_encryption/pytest_flash_encryption.py index dd1c8fa1a629..3879bbf35007 100644 --- a/examples/security/flash_encryption/pytest_flash_encryption.py +++ b/examples/security/flash_encryption/pytest_flash_encryption.py @@ -53,6 +53,12 @@ def _test_flash_encryption(dut: Dut) -> None: plain_hex_str, 'with esp_flash_read', expected_str, + 'FAT partition "fat_not_encr" is not encrypted.', + 'Read partition using esp_flash_read until test string is found', + 'Test string was found at offset', + 'FAT partition "fat_encrypted" is encrypted.', + 'Read partition using esp_flash_read at expected offset', + 'Data does not match test string', # The status of NVS encryption for the "nvs" partition 'NVS partition "nvs" is encrypted.', # The status of NVS encryption for the "custom_nvs" partition diff --git a/examples/security/flash_encryption/sdkconfig.defaults b/examples/security/flash_encryption/sdkconfig.defaults index 1aa06bec6c1a..eebcca2674f8 100644 --- a/examples/security/flash_encryption/sdkconfig.defaults +++ b/examples/security/flash_encryption/sdkconfig.defaults @@ -1,5 +1,7 @@ -# This example uses an extra partition to demonstrate encrypted/non-encrypted reads/writes. +# This example uses an extra partitions to demonstrate encrypted/non-encrypted reads/writes. CONFIG_PARTITION_TABLE_CUSTOM=y CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions_example.csv" CONFIG_PARTITION_TABLE_FILENAME="partitions_example.csv" CONFIG_PARTITION_TABLE_OFFSET=0xD000 + +CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y From 7797b3bf0ea693808dbae8ab7c653022e4af365c Mon Sep 17 00:00:00 2001 From: Konstantin Kondrashov Date: Thu, 27 Jun 2024 18:36:27 +0300 Subject: [PATCH 41/73] fix(efuse): Fix qemu test for efuse example with virt_sb_v2_and_fe config --- examples/system/efuse/sdkconfig.ci.virt_sb_v2_and_fe.esp32.qemu | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/system/efuse/sdkconfig.ci.virt_sb_v2_and_fe.esp32.qemu b/examples/system/efuse/sdkconfig.ci.virt_sb_v2_and_fe.esp32.qemu index e1dde3dd6ff3..34762006f96e 100644 --- a/examples/system/efuse/sdkconfig.ci.virt_sb_v2_and_fe.esp32.qemu +++ b/examples/system/efuse/sdkconfig.ci.virt_sb_v2_and_fe.esp32.qemu @@ -7,7 +7,7 @@ CONFIG_EFUSE_VIRTUAL=n CONFIG_ESP32_REV_MIN_3=y CONFIG_ESP32_REV_MIN=3 -CONFIG_PARTITION_TABLE_OFFSET=0xD000 +CONFIG_PARTITION_TABLE_OFFSET=0xE000 CONFIG_PARTITION_TABLE_CUSTOM=y CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="test/partitions_efuse_emul.csv" From 2ba6f989b7b2efab0851e3f6783c8ee13cf9bf55 Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Fri, 28 Jun 2024 09:51:57 +0800 Subject: [PATCH 42/73] fix(wdt): bringup WDTs for CP MP --- .../esp_rom/test_apps/.build-test-rules.yml | 3 - .../test_apps/rom_impl_components/README.md | 4 +- .../main/test_reset_reason.c | 95 ++------ components/hal/esp32c5/include/hal/lpwdt_ll.h | 150 +++++------- components/hal/esp32c5/include/hal/mwdt_ll.h | 216 ++++++++---------- .../esp32c5/include/soc/Kconfig.soc_caps.in | 4 + .../soc/esp32c5/include/soc/clk_tree_defs.h | 4 +- components/soc/esp32c5/include/soc/soc_caps.h | 2 +- 8 files changed, 171 insertions(+), 307 deletions(-) diff --git a/components/esp_rom/test_apps/.build-test-rules.yml b/components/esp_rom/test_apps/.build-test-rules.yml index 4f7be9378812..7d6745313d3c 100644 --- a/components/esp_rom/test_apps/.build-test-rules.yml +++ b/components/esp_rom/test_apps/.build-test-rules.yml @@ -7,9 +7,6 @@ components/esp_rom/test_apps/linux_rom_apis: components/esp_rom/test_apps/rom_impl_components: disable: # For ROM impl build tests, disable them if none of the tested features are supported in the ROM - - if: CONFIG_NAME == "no_rom_impl_components" and IDF_TARGET == "esp32c5" - temporary: true - reason: build failed. track in IDFCI-2204 - if: CONFIG_NAME == "rom_impl_components" and ((ESP_ROM_HAS_HAL_WDT != 1 and ESP_ROM_HAS_HAL_SYSTIMER != 1) and (ESP_ROM_HAS_HEAP_TLSF != 1 and ESP_ROM_HAS_SPI_FLASH != 1)) - if: CONFIG_NAME == "no_rom_impl_components" and ((ESP_ROM_HAS_HAL_WDT != 1 and ESP_ROM_HAS_HAL_SYSTIMER != 1) and (ESP_ROM_HAS_HEAP_TLSF != 1 and ESP_ROM_HAS_SPI_FLASH != 1)) - if: SOC_WDT_SUPPORTED != 1 diff --git a/components/esp_rom/test_apps/rom_impl_components/README.md b/components/esp_rom/test_apps/rom_impl_components/README.md index bf47d80ec649..3a502b1f86f4 100644 --- a/components/esp_rom/test_apps/rom_impl_components/README.md +++ b/components/esp_rom/test_apps/rom_impl_components/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | diff --git a/components/esp_system/test_apps/esp_system_unity_tests/main/test_reset_reason.c b/components/esp_system/test_apps/esp_system_unity_tests/main/test_reset_reason.c index f13473b237c9..3008f15b62cd 100644 --- a/components/esp_system/test_apps/esp_system_unity_tests/main/test_reset_reason.c +++ b/components/esp_system/test_apps/esp_system_unity_tests/main/test_reset_reason.c @@ -28,76 +28,11 @@ #define CHECK_RTC_MEM 1 #endif //CONFIG_SOC_RTC_FAST_MEM_SUPPORTED || CONFIG_SOC_RTC_SLOW_MEM_SUPPORTED -#if CONFIG_IDF_TARGET_ESP32 -#define DEEPSLEEP "DEEPSLEEP_RESET" -#define LOAD_STORE_ERROR "LoadStoreError" -#define RESET "SW_CPU_RESET" -#define INT_WDT_PANIC "Interrupt wdt timeout on CPU0" -#define INT_WDT "TG1WDT_SYS_RESET" -#define RTC_WDT "RTCWDT_RTC_RESET" -#if CONFIG_ESP32_REV_MIN_FULL >= 300 -#define BROWNOUT "RTCWDT_BROWN_OUT_RESET" +#if CONFIG_IDF_TARGET_ESP32P4 +#define INT_WDT_HW_ESP_RST ESP_RST_WDT // On P4 there is only one reset reason for MWDT0/1 #else -#define BROWNOUT "SW_CPU_RESET" -#endif // CONFIG_ESP32_REV_MIN_FULL >= 300 -#define STORE_ERROR "StoreProhibited" -#define INT_WDT_HW_ESP_RST ESP_RST_INT_WDT - -#elif CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 -#define DEEPSLEEP "DSLEEP" -#define LOAD_STORE_ERROR "LoadStoreError" -#define RESET "RTC_SW_CPU_RST" -#define INT_WDT_PANIC "Interrupt wdt timeout on CPU0" -#define INT_WDT "TG1WDT_SYS_RST" -#define RTC_WDT "RTCWDT_RTC_RST" -#define BROWNOUT "BROWN_OUT_RST" -#define STORE_ERROR "StoreProhibited" -#define INT_WDT_HW_ESP_RST ESP_RST_INT_WDT - -#elif CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32H2 -#define DEEPSLEEP "DSLEEP" -#define LOAD_STORE_ERROR "Store access fault" -#define RESET "RTC_SW_CPU_RST" -#define INT_WDT_PANIC "Interrupt wdt timeout on CPU0" -#define INT_WDT "TG1WDT_SYS_RST" -#define RTC_WDT "RTCWDT_RTC_RST" -#define BROWNOUT "BROWNOUT_RST" -#define STORE_ERROR LOAD_STORE_ERROR -#define INT_WDT_HW_ESP_RST ESP_RST_INT_WDT -#elif CONFIG_IDF_TARGET_ESP32C2 -#define DEEPSLEEP "DSLEEP" -#define LOAD_STORE_ERROR "Store access fault" -#define RESET "RTC_SW_CPU_RST" -#define INT_WDT_PANIC "Interrupt wdt timeout on CPU0" -#define INT_WDT "TG0WDT_SYS_RST" -#define RTC_WDT "RTCWDT_RTC_RST" -#define BROWNOUT "BROWNOUT_RST" -#define STORE_ERROR LOAD_STORE_ERROR #define INT_WDT_HW_ESP_RST ESP_RST_INT_WDT - -#elif CONFIG_IDF_TARGET_ESP32C6 -#define DEEPSLEEP "DSLEEP" -#define LOAD_STORE_ERROR "Store access fault" -#define RESET "SW_CPU" -#define INT_WDT_PANIC "Interrupt wdt timeout on CPU0" -#define INT_WDT "TG1_WDT_HPSYS" -#define RTC_WDT "LP_WDT_SYS" -#define BROWNOUT "LP_BOD_SYS" -#define STORE_ERROR LOAD_STORE_ERROR -#define INT_WDT_HW_ESP_RST ESP_RST_INT_WDT - -#elif CONFIG_IDF_TARGET_ESP32P4 -#define DEEPSLEEP "DSLEEP" -#define LOAD_STORE_ERROR "Store access fault" -#define RESET "SW_CPU_RESET" -#define INT_WDT_PANIC "Interrupt wdt timeout on CPU0" -#define INT_WDT "HP_SYS_HP_WDT_RESET" -#define RTC_WDT "LP_WDT_SYS" -#define BROWNOUT "LP_BOD_SYS" -#define STORE_ERROR LOAD_STORE_ERROR -#define INT_WDT_HW_ESP_RST ESP_RST_WDT // On P4 there is only one reset reason for MWDT0/1 - -#endif // CONFIG_IDF_TARGET_ESP32 +#endif // CONFIG_IDF_TARGET_ESP32P4 /* This test needs special test runners: rev1 silicon, and SPI flash with * fast start-up time. Otherwise reset reason will be RTCWDT_RESET. @@ -165,7 +100,7 @@ static void check_reset_reason_deep_sleep(void) } -TEST_CASE_MULTIPLE_STAGES("reset reason ESP_RST_DEEPSLEEP", "[reset_reason][reset="DEEPSLEEP"]", +TEST_CASE_MULTIPLE_STAGES("reset reason ESP_RST_DEEPSLEEP", "[reset_reason]", do_deep_sleep, check_reset_reason_deep_sleep); @@ -198,11 +133,11 @@ static void check_reset_reason_panic(void) #endif //CHECK_RTC_MEM } -TEST_CASE_MULTIPLE_STAGES("reset reason ESP_RST_PANIC after exception", "[reset_reason][reset="LOAD_STORE_ERROR","RESET"]", +TEST_CASE_MULTIPLE_STAGES("reset reason ESP_RST_PANIC after exception", "[reset_reason]", do_exception, check_reset_reason_panic); -TEST_CASE_MULTIPLE_STAGES("reset reason ESP_RST_PANIC after abort", "[reset_reason][reset=abort,"RESET"]", +TEST_CASE_MULTIPLE_STAGES("reset reason ESP_RST_PANIC after abort", "[reset_reason]", do_abort, check_reset_reason_panic); @@ -236,12 +171,12 @@ static void check_reset_reason_sw(void) #endif //CHECK_RTC_MEM } -TEST_CASE_MULTIPLE_STAGES("reset reason ESP_RST_SW after restart", "[reset_reason][reset="RESET"]", +TEST_CASE_MULTIPLE_STAGES("reset reason ESP_RST_SW after restart", "[reset_reason]", do_restart, check_reset_reason_sw); #if CONFIG_FREERTOS_NUMBER_OF_CORES > 1 -TEST_CASE_MULTIPLE_STAGES("reset reason ESP_RST_SW after restart from APP CPU", "[reset_reason][reset="RESET"]", +TEST_CASE_MULTIPLE_STAGES("reset reason ESP_RST_SW after restart from APP CPU", "[reset_reason]", do_restart_from_app_cpu, check_reset_reason_sw); #endif @@ -286,12 +221,12 @@ static void check_reset_reason_int_wdt_hw(void) } TEST_CASE_MULTIPLE_STAGES("reset reason ESP_RST_INT_WDT after interrupt watchdog (panic)", - "[reset_reason][reset="INT_WDT_PANIC","RESET"]", + "[reset_reason]", do_int_wdt, check_reset_reason_int_wdt_sw); TEST_CASE_MULTIPLE_STAGES("reset reason ESP_RST_INT_WDT after interrupt watchdog (hw)", - "[reset_reason][reset="INT_WDT"]", + "[reset_reason]", do_int_wdt_hw, check_reset_reason_int_wdt_hw); @@ -324,7 +259,7 @@ static void check_reset_reason_task_wdt(void) } TEST_CASE_MULTIPLE_STAGES("reset reason ESP_RST_TASK_WDT after task watchdog", - "[reset_reason][reset="RESET"]", + "[reset_reason]", do_task_wdt, check_reset_reason_task_wdt); #endif // CONFIG_ESP_TASK_WDT_EN @@ -352,7 +287,7 @@ static void check_reset_reason_any_wdt(void) } TEST_CASE_MULTIPLE_STAGES("reset reason ESP_RST_WDT after RTC watchdog", - "[reset_reason][reset="RTC_WDT"]", + "[reset_reason]", do_rtc_wdt, check_reset_reason_any_wdt); @@ -379,7 +314,7 @@ static void check_reset_reason_brownout(void) } TEST_CASE_MULTIPLE_STAGES("reset reason ESP_RST_BROWNOUT after brownout event", - "[reset_reason][ignore][reset="BROWNOUT"]", + "[reset_reason][ignore]", do_brownout, check_reset_reason_brownout); @@ -457,11 +392,11 @@ static void test2_finish(void) printf("test - OK\n"); } -TEST_CASE_MULTIPLE_STAGES("reset reason ESP_RST_SW after restart in a task with spiram stack", "[spiram_stack][reset="RESET"]", +TEST_CASE_MULTIPLE_STAGES("reset reason ESP_RST_SW after restart in a task with spiram stack", "[spiram_stack]", init_restart_task, test1_finish); -TEST_CASE_MULTIPLE_STAGES("reset reason ESP_RST_PANIC after an exception in a task with spiram stack", "[spiram_stack][reset="STORE_ERROR","RESET"]", +TEST_CASE_MULTIPLE_STAGES("reset reason ESP_RST_PANIC after an exception in a task with spiram stack", "[spiram_stack]", init_task_do_exception, test2_finish); diff --git a/components/hal/esp32c5/include/hal/lpwdt_ll.h b/components/hal/esp32c5/include/hal/lpwdt_ll.h index c2c5008bae3e..2df130e8f997 100644 --- a/components/hal/esp32c5/include/hal/lpwdt_ll.h +++ b/components/hal/esp32c5/include/hal/lpwdt_ll.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -68,9 +68,7 @@ ESP_STATIC_ASSERT(WDT_RESET_SIG_LENGTH_3_2us == LP_WDT_RESET_LENGTH_3200_NS, "Ad */ FORCE_INLINE_ATTR void lpwdt_ll_enable(lp_wdt_dev_t *hw) { - // TODO: [ESP32C5] IDF-8635 - // hw->config0.wdt_en = 1; - abort(); + hw->config0.wdt_en = 1; } /** @@ -83,9 +81,7 @@ FORCE_INLINE_ATTR void lpwdt_ll_enable(lp_wdt_dev_t *hw) */ FORCE_INLINE_ATTR void lpwdt_ll_disable(lp_wdt_dev_t *hw) { - // TODO: [ESP32C5] IDF-8635 - // hw->config0.wdt_en = 0; - abort(); + hw->config0.wdt_en = 0; } /** @@ -96,10 +92,7 @@ FORCE_INLINE_ATTR void lpwdt_ll_disable(lp_wdt_dev_t *hw) */ FORCE_INLINE_ATTR bool lpwdt_ll_check_if_enabled(lp_wdt_dev_t *hw) { - // TODO: [ESP32C5] IDF-8635 - // return (hw->config0.wdt_en) ? true : false; - abort(); - return (bool)0; + return (hw->config0.wdt_en) ? true : false; } /** @@ -122,29 +115,27 @@ FORCE_INLINE_ATTR bool lpwdt_ll_check_if_enabled(lp_wdt_dev_t *hw) */ FORCE_INLINE_ATTR void lpwdt_ll_config_stage(lp_wdt_dev_t *hw, wdt_stage_t stage, uint32_t timeout_ticks, wdt_stage_action_t behavior) { - // TODO: [ESP32C5] IDF-8635 - // switch (stage) { - // case WDT_STAGE0: - // hw->config0.wdt_stg0 = behavior; - // //Account of implicty multiplier applied to stage 0 timeout tick config value - // hw->config1.val = timeout_ticks >> (1 + REG_GET_FIELD(EFUSE_RD_REPEAT_DATA1_REG, EFUSE_WDT_DELAY_SEL)); - // break; - // case WDT_STAGE1: - // hw->config0.wdt_stg1 = behavior; - // hw->config2.val = timeout_ticks; - // break; - // case WDT_STAGE2: - // hw->config0.wdt_stg2 = behavior; - // hw->config3.val = timeout_ticks; - // break; - // case WDT_STAGE3: - // hw->config0.wdt_stg3 = behavior; - // hw->config4.val = timeout_ticks; - // break; - // default: - // abort(); - // } - abort(); + switch (stage) { + case WDT_STAGE0: + hw->config0.wdt_stg0 = behavior; + //Account of implicty multiplier applied to stage 0 timeout tick config value + hw->config1.val = timeout_ticks >> (1 + REG_GET_FIELD(EFUSE_RD_REPEAT_DATA1_REG, EFUSE_WDT_DELAY_SEL)); + break; + case WDT_STAGE1: + hw->config0.wdt_stg1 = behavior; + hw->config2.val = timeout_ticks; + break; + case WDT_STAGE2: + hw->config0.wdt_stg2 = behavior; + hw->config3.val = timeout_ticks; + break; + case WDT_STAGE3: + hw->config0.wdt_stg3 = behavior; + hw->config4.val = timeout_ticks; + break; + default: + abort(); + } } /** @@ -155,24 +146,22 @@ FORCE_INLINE_ATTR void lpwdt_ll_config_stage(lp_wdt_dev_t *hw, wdt_stage_t stage */ FORCE_INLINE_ATTR void lpwdt_ll_disable_stage(lp_wdt_dev_t *hw, wdt_stage_t stage) { - // TODO: [ESP32C5] IDF-8635 - // switch (stage) { - // case WDT_STAGE0: - // hw->config0.wdt_stg0 = WDT_STAGE_ACTION_OFF; - // break; - // case WDT_STAGE1: - // hw->config0.wdt_stg1 = WDT_STAGE_ACTION_OFF; - // break; - // case WDT_STAGE2: - // hw->config0.wdt_stg2 = WDT_STAGE_ACTION_OFF; - // break; - // case WDT_STAGE3: - // hw->config0.wdt_stg3 = WDT_STAGE_ACTION_OFF; - // break; - // default: - // abort(); - // } - abort(); + switch (stage) { + case WDT_STAGE0: + hw->config0.wdt_stg0 = WDT_STAGE_ACTION_OFF; + break; + case WDT_STAGE1: + hw->config0.wdt_stg1 = WDT_STAGE_ACTION_OFF; + break; + case WDT_STAGE2: + hw->config0.wdt_stg2 = WDT_STAGE_ACTION_OFF; + break; + case WDT_STAGE3: + hw->config0.wdt_stg3 = WDT_STAGE_ACTION_OFF; + break; + default: + abort(); + } } /** @@ -183,9 +172,7 @@ FORCE_INLINE_ATTR void lpwdt_ll_disable_stage(lp_wdt_dev_t *hw, wdt_stage_t stag */ FORCE_INLINE_ATTR void lpwdt_ll_set_cpu_reset_length(lp_wdt_dev_t *hw, wdt_reset_sig_length_t length) { - // TODO: [ESP32C5] IDF-8635 - // hw->config0.wdt_cpu_reset_length = length; - abort(); + hw->config0.wdt_cpu_reset_length = length; } /** @@ -196,9 +183,7 @@ FORCE_INLINE_ATTR void lpwdt_ll_set_cpu_reset_length(lp_wdt_dev_t *hw, wdt_reset */ FORCE_INLINE_ATTR void lpwdt_ll_set_sys_reset_length(lp_wdt_dev_t *hw, wdt_reset_sig_length_t length) { - // TODO: [ESP32C5] IDF-8635 - // hw->config0.wdt_sys_reset_length = length; - abort(); + hw->config0.wdt_sys_reset_length = length; } /** @@ -213,9 +198,7 @@ FORCE_INLINE_ATTR void lpwdt_ll_set_sys_reset_length(lp_wdt_dev_t *hw, wdt_reset */ FORCE_INLINE_ATTR void lpwdt_ll_set_flashboot_en(lp_wdt_dev_t *hw, bool enable) { - // TODO: [ESP32C5] IDF-8635 - // hw->config0.wdt_flashboot_mod_en = (enable) ? 1 : 0; - abort(); + hw->config0.wdt_flashboot_mod_en = (enable) ? 1 : 0; } /** @@ -226,9 +209,7 @@ FORCE_INLINE_ATTR void lpwdt_ll_set_flashboot_en(lp_wdt_dev_t *hw, bool enable) */ FORCE_INLINE_ATTR void lpwdt_ll_set_procpu_reset_en(lp_wdt_dev_t *hw, bool enable) { - // TODO: [ESP32C5] IDF-8635 - // hw->config0.wdt_procpu_reset_en = (enable) ? 1 : 0; - abort(); + hw->config0.wdt_procpu_reset_en = (enable) ? 1 : 0; } /** @@ -239,9 +220,7 @@ FORCE_INLINE_ATTR void lpwdt_ll_set_procpu_reset_en(lp_wdt_dev_t *hw, bool enabl */ FORCE_INLINE_ATTR void lpwdt_ll_set_appcpu_reset_en(lp_wdt_dev_t *hw, bool enable) { - // TODO: [ESP32C5] IDF-8635 - // hw->config0.wdt_appcpu_reset_en = (enable) ? 1 : 0; - abort(); + hw->config0.wdt_appcpu_reset_en = (enable) ? 1 : 0; } /** @@ -252,9 +231,7 @@ FORCE_INLINE_ATTR void lpwdt_ll_set_appcpu_reset_en(lp_wdt_dev_t *hw, bool enabl */ FORCE_INLINE_ATTR void lpwdt_ll_set_pause_in_sleep_en(lp_wdt_dev_t *hw, bool enable) { - // TODO: [ESP32C5] IDF-8635 - // hw->config0.wdt_pause_in_slp = (enable) ? 1 : 0; - abort(); + hw->config0.wdt_pause_in_slp = (enable) ? 1 : 0; } /** @@ -268,9 +245,7 @@ FORCE_INLINE_ATTR void lpwdt_ll_set_pause_in_sleep_en(lp_wdt_dev_t *hw, bool ena */ FORCE_INLINE_ATTR void lpwdt_ll_set_chip_reset_en(lp_wdt_dev_t *hw, bool enable) { - // TODO: [ESP32C5] IDF-8635 - // hw->config0.wdt_chip_reset_en = (enable) ? 1 : 0; - abort(); + hw->config0.wdt_chip_reset_en = (enable) ? 1 : 0; } /** @@ -281,9 +256,7 @@ FORCE_INLINE_ATTR void lpwdt_ll_set_chip_reset_en(lp_wdt_dev_t *hw, bool enable) */ FORCE_INLINE_ATTR void lpwdt_ll_set_chip_reset_width(lp_wdt_dev_t *hw, uint32_t width) { - // TODO: [ESP32C5] IDF-8635 - // HAL_FORCE_MODIFY_U32_REG_FIELD(hw->config0, wdt_chip_reset_width, width); - abort(); + HAL_FORCE_MODIFY_U32_REG_FIELD(hw->config0, wdt_chip_reset_width, width); } /** @@ -295,9 +268,7 @@ FORCE_INLINE_ATTR void lpwdt_ll_set_chip_reset_width(lp_wdt_dev_t *hw, uint32_t */ FORCE_INLINE_ATTR void lpwdt_ll_feed(lp_wdt_dev_t *hw) { - // TODO: [ESP32C5] IDF-8635 - // hw->feed.rtc_wdt_feed = 1; - abort(); + hw->feed.rtc_wdt_feed = 1; } /** @@ -307,9 +278,7 @@ FORCE_INLINE_ATTR void lpwdt_ll_feed(lp_wdt_dev_t *hw) */ FORCE_INLINE_ATTR void lpwdt_ll_write_protect_enable(lp_wdt_dev_t *hw) { - // TODO: [ESP32C5] IDF-8635 - // hw->wprotect.val = 0; - abort(); + hw->wprotect.val = 0; } /** @@ -319,9 +288,7 @@ FORCE_INLINE_ATTR void lpwdt_ll_write_protect_enable(lp_wdt_dev_t *hw) */ FORCE_INLINE_ATTR void lpwdt_ll_write_protect_disable(lp_wdt_dev_t *hw) { - // TODO: [ESP32C5] IDF-8635 - // hw->wprotect.val = LP_WDT_WKEY_VALUE; - abort(); + hw->wprotect.val = LP_WDT_WKEY_VALUE; } /** @@ -332,9 +299,7 @@ FORCE_INLINE_ATTR void lpwdt_ll_write_protect_disable(lp_wdt_dev_t *hw) */ FORCE_INLINE_ATTR void lpwdt_ll_set_intr_enable(lp_wdt_dev_t *hw, bool enable) { - // TODO: [ESP32C5] IDF-8635 - // hw->int_ena.lp_wdt_int_ena = (enable) ? 1 : 0; - abort(); + hw->int_ena.lp_wdt_int_ena = (enable) ? 1 : 0; } /** @@ -345,10 +310,7 @@ FORCE_INLINE_ATTR void lpwdt_ll_set_intr_enable(lp_wdt_dev_t *hw, bool enable) */ FORCE_INLINE_ATTR bool lpwdt_ll_check_intr_status(lp_wdt_dev_t *hw) { - // TODO: [ESP32C5] IDF-8635 - // return (hw->int_st.lp_wdt_int_st) ? true : false; - abort(); - return (bool)0; + return (hw->int_st.lp_wdt_int_st) ? true : false; } /** @@ -358,9 +320,7 @@ FORCE_INLINE_ATTR bool lpwdt_ll_check_intr_status(lp_wdt_dev_t *hw) */ FORCE_INLINE_ATTR void lpwdt_ll_clear_intr_status(lp_wdt_dev_t *hw) { - // TODO: [ESP32C5] IDF-8635 - // hw->int_clr.lp_wdt_int_clr = 1; - abort(); + hw->int_clr.lp_wdt_int_clr = 1; } #ifdef __cplusplus diff --git a/components/hal/esp32c5/include/hal/mwdt_ll.h b/components/hal/esp32c5/include/hal/mwdt_ll.h index c4e386a6646f..c4665a2eedff 100644 --- a/components/hal/esp32c5/include/hal/mwdt_ll.h +++ b/components/hal/esp32c5/include/hal/mwdt_ll.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -25,7 +25,7 @@ extern "C" { #include "hal/misc.h" /* Pre-calculated prescaler to achieve 500 ticks/us (MWDT1_TICKS_PER_US) when using default clock (MWDT_CLK_SRC_DEFAULT ) */ -#define MWDT_LL_DEFAULT_CLK_PRESCALER 20000 +#define MWDT_LL_DEFAULT_CLK_PRESCALER 24000 /* Possible values for TIMG_WDT_STGx */ #define TIMG_WDT_STG_SEL_OFF 0 @@ -64,9 +64,7 @@ ESP_STATIC_ASSERT(WDT_RESET_SIG_LENGTH_3_2us == TIMG_WDT_RESET_LENGTH_3200_NS, " */ FORCE_INLINE_ATTR void mwdt_ll_enable(timg_dev_t *hw) { - // TODO: [ESP32C5] IDF-8650 - // hw->wdtconfig0.wdt_en = 1; - abort(); + hw->wdtconfig0.wdt_en = 1; } /** @@ -79,9 +77,7 @@ FORCE_INLINE_ATTR void mwdt_ll_enable(timg_dev_t *hw) */ FORCE_INLINE_ATTR void mwdt_ll_disable(timg_dev_t *hw) { - // TODO: [ESP32C5] IDF-8650 - // hw->wdtconfig0.wdt_en = 0; - abort(); + hw->wdtconfig0.wdt_en = 0; } /** @@ -92,10 +88,7 @@ FORCE_INLINE_ATTR void mwdt_ll_disable(timg_dev_t *hw) */ FORCE_INLINE_ATTR bool mwdt_ll_check_if_enabled(timg_dev_t *hw) { - // TODO: [ESP32C5] IDF-8650 - // return (hw->wdtconfig0.wdt_en) ? true : false; - abort(); - return (bool)0; + return (hw->wdtconfig0.wdt_en) ? true : false; } /** @@ -108,31 +101,29 @@ FORCE_INLINE_ATTR bool mwdt_ll_check_if_enabled(timg_dev_t *hw) */ FORCE_INLINE_ATTR void mwdt_ll_config_stage(timg_dev_t *hw, wdt_stage_t stage, uint32_t timeout, wdt_stage_action_t behavior) { - // TODO: [ESP32C5] IDF-8650 - // switch (stage) { - // case WDT_STAGE0: - // hw->wdtconfig0.wdt_stg0 = behavior; - // hw->wdtconfig2.wdt_stg0_hold = timeout; - // break; - // case WDT_STAGE1: - // hw->wdtconfig0.wdt_stg1 = behavior; - // hw->wdtconfig3.wdt_stg1_hold = timeout; - // break; - // case WDT_STAGE2: - // hw->wdtconfig0.wdt_stg2 = behavior; - // hw->wdtconfig4.wdt_stg2_hold = timeout; - // break; - // case WDT_STAGE3: - // hw->wdtconfig0.wdt_stg3 = behavior; - // hw->wdtconfig5.wdt_stg3_hold = timeout; - // break; - // default: - // HAL_ASSERT(false && "unsupported WDT stage"); - // break; - // } - // //Config registers are updated asynchronously - // hw->wdtconfig0.wdt_conf_update_en = 1; - abort(); + switch (stage) { + case WDT_STAGE0: + hw->wdtconfig0.wdt_stg0 = behavior; + hw->wdtconfig2.wdt_stg0_hold = timeout; + break; + case WDT_STAGE1: + hw->wdtconfig0.wdt_stg1 = behavior; + hw->wdtconfig3.wdt_stg1_hold = timeout; + break; + case WDT_STAGE2: + hw->wdtconfig0.wdt_stg2 = behavior; + hw->wdtconfig4.wdt_stg2_hold = timeout; + break; + case WDT_STAGE3: + hw->wdtconfig0.wdt_stg3 = behavior; + hw->wdtconfig5.wdt_stg3_hold = timeout; + break; + default: + HAL_ASSERT(false && "unsupported WDT stage"); + break; + } + //Config registers are updated asynchronously + hw->wdtconfig0.wdt_conf_update_en = 1; } /** @@ -143,27 +134,25 @@ FORCE_INLINE_ATTR void mwdt_ll_config_stage(timg_dev_t *hw, wdt_stage_t stage, u */ FORCE_INLINE_ATTR void mwdt_ll_disable_stage(timg_dev_t *hw, uint32_t stage) { - // TODO: [ESP32C5] IDF-8650 - // switch (stage) { - // case WDT_STAGE0: - // hw->wdtconfig0.wdt_stg0 = WDT_STAGE_ACTION_OFF; - // break; - // case WDT_STAGE1: - // hw->wdtconfig0.wdt_stg1 = WDT_STAGE_ACTION_OFF; - // break; - // case WDT_STAGE2: - // hw->wdtconfig0.wdt_stg2 = WDT_STAGE_ACTION_OFF; - // break; - // case WDT_STAGE3: - // hw->wdtconfig0.wdt_stg3 = WDT_STAGE_ACTION_OFF; - // break; - // default: - // HAL_ASSERT(false && "unsupported WDT stage"); - // break; - // } - // //Config registers are updated asynchronously - // hw->wdtconfig0.wdt_conf_update_en = 1; - abort(); + switch (stage) { + case WDT_STAGE0: + hw->wdtconfig0.wdt_stg0 = WDT_STAGE_ACTION_OFF; + break; + case WDT_STAGE1: + hw->wdtconfig0.wdt_stg1 = WDT_STAGE_ACTION_OFF; + break; + case WDT_STAGE2: + hw->wdtconfig0.wdt_stg2 = WDT_STAGE_ACTION_OFF; + break; + case WDT_STAGE3: + hw->wdtconfig0.wdt_stg3 = WDT_STAGE_ACTION_OFF; + break; + default: + HAL_ASSERT(false && "unsupported WDT stage"); + break; + } + //Config registers are updated asynchronously + hw->wdtconfig0.wdt_conf_update_en = 1; } /** @@ -174,11 +163,9 @@ FORCE_INLINE_ATTR void mwdt_ll_disable_stage(timg_dev_t *hw, uint32_t stage) */ FORCE_INLINE_ATTR void mwdt_ll_set_cpu_reset_length(timg_dev_t *hw, wdt_reset_sig_length_t length) { - // TODO: [ESP32C5] IDF-8650 - // hw->wdtconfig0.wdt_cpu_reset_length = length; - // //Config registers are updated asynchronously - // hw->wdtconfig0.wdt_conf_update_en = 1; - abort(); + hw->wdtconfig0.wdt_cpu_reset_length = length; + //Config registers are updated asynchronously + hw->wdtconfig0.wdt_conf_update_en = 1; } /** @@ -189,11 +176,9 @@ FORCE_INLINE_ATTR void mwdt_ll_set_cpu_reset_length(timg_dev_t *hw, wdt_reset_si */ FORCE_INLINE_ATTR void mwdt_ll_set_sys_reset_length(timg_dev_t *hw, wdt_reset_sig_length_t length) { - // TODO: [ESP32C5] IDF-8650 - // hw->wdtconfig0.wdt_sys_reset_length = length; - // //Config registers are updated asynchronously - // hw->wdtconfig0.wdt_conf_update_en = 1; - abort(); + hw->wdtconfig0.wdt_sys_reset_length = length; + //Config registers are updated asynchronously + hw->wdtconfig0.wdt_conf_update_en = 1; } /** @@ -208,11 +193,9 @@ FORCE_INLINE_ATTR void mwdt_ll_set_sys_reset_length(timg_dev_t *hw, wdt_reset_si */ FORCE_INLINE_ATTR void mwdt_ll_set_flashboot_en(timg_dev_t *hw, bool enable) { - // TODO: [ESP32C5] IDF-8650 - // hw->wdtconfig0.wdt_flashboot_mod_en = (enable) ? 1 : 0; - // //Config registers are updated asynchronously - // hw->wdtconfig0.wdt_conf_update_en = 1; - abort(); + hw->wdtconfig0.wdt_flashboot_mod_en = (enable) ? 1 : 0; + //Config registers are updated asynchronously + hw->wdtconfig0.wdt_conf_update_en = 1; } /** @@ -223,13 +206,11 @@ FORCE_INLINE_ATTR void mwdt_ll_set_flashboot_en(timg_dev_t *hw, bool enable) */ FORCE_INLINE_ATTR void mwdt_ll_set_prescaler(timg_dev_t *hw, uint32_t prescaler) { - // TODO: [ESP32C5] IDF-8650 - // // In case the compiler optimise a 32bit instruction (e.g. s32i) into 8/16bit instruction (e.g. s8i, which is not allowed to access a register) - // // We take care of the "read-modify-write" procedure by ourselves. - // HAL_FORCE_MODIFY_U32_REG_FIELD(hw->wdtconfig1, wdt_clk_prescale, prescaler); - // //Config registers are updated asynchronously - // hw->wdtconfig0.wdt_conf_update_en = 1; - abort(); + // In case the compiler optimise a 32bit instruction (e.g. s32i) into 8/16bit instruction (e.g. s8i, which is not allowed to access a register) + // We take care of the "read-modify-write" procedure by ourselves. + HAL_FORCE_MODIFY_U32_REG_FIELD(hw->wdtconfig1, wdt_clk_prescale, prescaler); + //Config registers are updated asynchronously + hw->wdtconfig0.wdt_conf_update_en = 1; } /** @@ -241,9 +222,7 @@ FORCE_INLINE_ATTR void mwdt_ll_set_prescaler(timg_dev_t *hw, uint32_t prescaler) */ FORCE_INLINE_ATTR void mwdt_ll_feed(timg_dev_t *hw) { - // TODO: [ESP32C5] IDF-8650 - // hw->wdtfeed.wdt_feed = 1; - abort(); + hw->wdtfeed.wdt_feed = 1; } /** @@ -255,9 +234,7 @@ FORCE_INLINE_ATTR void mwdt_ll_feed(timg_dev_t *hw) */ FORCE_INLINE_ATTR void mwdt_ll_write_protect_enable(timg_dev_t *hw) { - // TODO: [ESP32C5] IDF-8650 - // hw->wdtwprotect.wdt_wkey = 0; - abort(); + hw->wdtwprotect.wdt_wkey = 0; } /** @@ -267,9 +244,7 @@ FORCE_INLINE_ATTR void mwdt_ll_write_protect_enable(timg_dev_t *hw) */ FORCE_INLINE_ATTR void mwdt_ll_write_protect_disable(timg_dev_t *hw) { - // TODO: [ESP32C5] IDF-8650 - // hw->wdtwprotect.wdt_wkey = TIMG_WDT_WKEY_VALUE; - abort(); + hw->wdtwprotect.wdt_wkey = TIMG_WDT_WKEY_VALUE; } /** @@ -279,9 +254,7 @@ FORCE_INLINE_ATTR void mwdt_ll_write_protect_disable(timg_dev_t *hw) */ FORCE_INLINE_ATTR void mwdt_ll_clear_intr_status(timg_dev_t *hw) { - // TODO: [ESP32C5] IDF-8650 - // hw->int_clr_timers.wdt_int_clr = 1; - abort(); + hw->int_clr_timers.wdt_int_clr = 1; } /** @@ -292,9 +265,7 @@ FORCE_INLINE_ATTR void mwdt_ll_clear_intr_status(timg_dev_t *hw) */ FORCE_INLINE_ATTR void mwdt_ll_set_intr_enable(timg_dev_t *hw, bool enable) { - // TODO: [ESP32C5] IDF-8650 - // hw->int_ena_timers.wdt_int_ena = (enable) ? 1 : 0; - abort(); + hw->int_ena_timers.wdt_int_ena = (enable) ? 1 : 0; } /** @@ -305,28 +276,27 @@ FORCE_INLINE_ATTR void mwdt_ll_set_intr_enable(timg_dev_t *hw, bool enable) */ FORCE_INLINE_ATTR void mwdt_ll_set_clock_source(timg_dev_t *hw, mwdt_clock_source_t clk_src) { - // TODO: [ESP32C5] IDF-8650 - // uint8_t clk_id = 0; - // switch (clk_src) { - // case MWDT_CLK_SRC_XTAL: - // clk_id = 0; - // break; - // case MWDT_CLK_SRC_PLL_F80M: - // clk_id = 1; - // break; - // case MWDT_CLK_SRC_RC_FAST: - // clk_id = 2; - // break; - // default: - // HAL_ASSERT(false); - // break; - // } - // // if (hw == &TIMERG0) { - // PCR.timergroup0_wdt_clk_conf.tg0_wdt_clk_sel = clk_id; - // } else { - // PCR.timergroup1_wdt_clk_conf.tg1_wdt_clk_sel = clk_id; - // } - abort(); + uint8_t clk_id = 0; + switch (clk_src) { + case MWDT_CLK_SRC_XTAL: + clk_id = 0; + break; + case MWDT_CLK_SRC_PLL_F80M: + clk_id = 1; + break; + case MWDT_CLK_SRC_RC_FAST: + clk_id = 2; + break; + default: + HAL_ASSERT(false); + break; + } + + if (hw == &TIMERG0) { + PCR.timergroup0_wdt_clk_conf.tg0_wdt_clk_sel = clk_id; + } else { + PCR.timergroup1_wdt_clk_conf.tg1_wdt_clk_sel = clk_id; + } } /** @@ -338,13 +308,11 @@ FORCE_INLINE_ATTR void mwdt_ll_set_clock_source(timg_dev_t *hw, mwdt_clock_sourc __attribute__((always_inline)) static inline void mwdt_ll_enable_clock(timg_dev_t *hw, bool en) { - // TODO: [ESP32C5] IDF-8650 - // if (hw == &TIMERG0) { - // PCR.timergroup0_wdt_clk_conf.tg0_wdt_clk_en = en; - // } else { - // PCR.timergroup1_wdt_clk_conf.tg1_wdt_clk_en = en; - // } - abort(); + if (hw == &TIMERG0) { + PCR.timergroup0_wdt_clk_conf.tg0_wdt_clk_en = en; + } else { + PCR.timergroup1_wdt_clk_conf.tg1_wdt_clk_en = en; + } } diff --git a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in index 93af5d0285a5..62b05f280d05 100644 --- a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in @@ -147,6 +147,10 @@ config SOC_CLK_TREE_SUPPORTED bool default y +config SOC_WDT_SUPPORTED + bool + default y + config SOC_SPI_FLASH_SUPPORTED bool default y diff --git a/components/soc/esp32c5/include/soc/clk_tree_defs.h b/components/soc/esp32c5/include/soc/clk_tree_defs.h index 05cb03e456fc..7772be70959b 100644 --- a/components/soc/esp32c5/include/soc/clk_tree_defs.h +++ b/components/soc/esp32c5/include/soc/clk_tree_defs.h @@ -482,11 +482,11 @@ typedef enum { // TODO: [ESP32C5] IDF-8701, IDF-8702, IDF-8703 (inherit from C6 /** * @brief MWDT clock source */ -typedef enum { // TODO: [ESP32C5] IDF-8650 (inherit from C6) +typedef enum { MWDT_CLK_SRC_XTAL = SOC_MOD_CLK_XTAL, /*!< Select XTAL as the source clock */ MWDT_CLK_SRC_PLL_F80M = SOC_MOD_CLK_PLL_F80M, /*!< Select PLL fixed 80 MHz as the source clock */ MWDT_CLK_SRC_RC_FAST = SOC_MOD_CLK_RC_FAST, /*!< Select RTC fast as the source clock */ - MWDT_CLK_SRC_DEFAULT = SOC_MOD_CLK_XTAL, /*!< Select PLL fixed 80 MHz as the default clock choice */ + MWDT_CLK_SRC_DEFAULT = SOC_MOD_CLK_XTAL, /*!< Select XTAL fixed 48 MHz as the default clock choice */ } soc_periph_mwdt_clk_src_t; //////////////////////////////////////////////////LEDC///////////////////////////////////////////////////////////////// diff --git a/components/soc/esp32c5/include/soc/soc_caps.h b/components/soc/esp32c5/include/soc/soc_caps.h index d4e4cea3498b..9ae9117a5cc0 100644 --- a/components/soc/esp32c5/include/soc/soc_caps.h +++ b/components/soc/esp32c5/include/soc/soc_caps.h @@ -67,7 +67,7 @@ // #define SOC_ULP_LP_UART_SUPPORTED 1 // TODO: [ESP32C5] IDF-8633 #define SOC_CLK_TREE_SUPPORTED 1 // #define SOC_ASSIST_DEBUG_SUPPORTED 1 // TODO: [ESP32C5] IDF-8663 -// #define SOC_WDT_SUPPORTED 1 // TODO: [ESP32C5] IDF-8650 +#define SOC_WDT_SUPPORTED 1 #define SOC_SPI_FLASH_SUPPORTED 1 // TODO: [ESP32C5] IDF-8715 // #define SOC_BITSCRAMBLER_SUPPORTED 1 // TODO: [ESP32C5] IDF-8711 #define SOC_ECDSA_SUPPORTED 1 From 3ab055992a301e78f61571252736d3fdce4844a9 Mon Sep 17 00:00:00 2001 From: shenmengjing Date: Fri, 28 Jun 2024 10:42:35 +0800 Subject: [PATCH 43/73] docs: Add a note in CN translations --- docs/en/api-reference/system/ulp-lp-core.rst | 2 +- docs/en/api-reference/system/ulp-risc-v.rst | 2 +- docs/zh_CN/api-reference/system/ulp-lp-core.rst | 4 ++++ docs/zh_CN/api-reference/system/ulp-risc-v.rst | 5 +++++ 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/docs/en/api-reference/system/ulp-lp-core.rst b/docs/en/api-reference/system/ulp-lp-core.rst index dd3540e6da6a..eb190c53cb8f 100644 --- a/docs/en/api-reference/system/ulp-lp-core.rst +++ b/docs/en/api-reference/system/ulp-lp-core.rst @@ -103,7 +103,7 @@ To access the ULP LP-Core program variables from the main program, the generated .. note:: - Variables declared in the global scope of the LP-Core program reside in either the ``.bss`` or ``.data`` section of the binary. These sections are initialized when the LP-Core binary is loaded and executed. Accessing these variables from the main program on the HP-Core before the first LP-Core run may result in undefined behavior. + Variables declared in the global scope of the LP-Core program reside in either the ``.bss`` or ``.data`` section of the binary. These sections are initialized when the LP-Core binary is loaded and executed. Accessing these variables from the main program on the HP-Core before the first LP-Core run may result in undefined behavior. Starting the ULP LP-Core Program diff --git a/docs/en/api-reference/system/ulp-risc-v.rst b/docs/en/api-reference/system/ulp-risc-v.rst index 7b78fca49927..c205f11bac15 100644 --- a/docs/en/api-reference/system/ulp-risc-v.rst +++ b/docs/en/api-reference/system/ulp-risc-v.rst @@ -105,7 +105,7 @@ To access the ULP RISC-V program variables from the main program, the generated .. note:: - Variables declared in the global scope of the ULP RISC-V program reside in either the ``.bss`` or ``.data`` section of the binary. These sections are initialized when the ULP RISC-V binary is loaded and executed. Accessing these variables from the main program on the main CPU before the first ULP RISC-V run may result in undefined behavior. + Variables declared in the global scope of the ULP RISC-V program reside in either the ``.bss`` or ``.data`` section of the binary. These sections are initialized when the ULP RISC-V binary is loaded and executed. Accessing these variables from the main program on the main CPU before the first ULP RISC-V run may result in undefined behavior. Mutual Exclusion diff --git a/docs/zh_CN/api-reference/system/ulp-lp-core.rst b/docs/zh_CN/api-reference/system/ulp-lp-core.rst index b68341b2a2fd..5b0985814839 100644 --- a/docs/zh_CN/api-reference/system/ulp-lp-core.rst +++ b/docs/zh_CN/api-reference/system/ulp-lp-core.rst @@ -101,6 +101,10 @@ ULP LP-Core 代码会与 ESP-IDF 项目共同编译,生成一个单独的二 ulp_measurement_count = 64; } +.. note:: + + LP-Core 程序全局变量存储在二进制文件的 ``.bss`` 或者 ``.data`` 部分。这些部分在加载和执行 LP-Core 二进制文件时被初始化。在首次运行 LP-Core 之前,从 HP-Core 主程序访问这些变量可能会导致未定义行为。 + 启动 ULP LP-Core 程序 -------------------------------- diff --git a/docs/zh_CN/api-reference/system/ulp-risc-v.rst b/docs/zh_CN/api-reference/system/ulp-risc-v.rst index 231ce100dff0..56d42d637103 100644 --- a/docs/zh_CN/api-reference/system/ulp-risc-v.rst +++ b/docs/zh_CN/api-reference/system/ulp-risc-v.rst @@ -103,6 +103,11 @@ ULP RISC-V 协处理器代码以 C 语言(或汇编语言)编写,使用基 ulp_measurement_count = 64; } +.. note:: + + ULP RISC-V 程序全局变量存储在二进制文件的 ``.bss`` 或者 ``.data`` 部分。这些部分在加载和执行 ULP RISC-V 二进制文件时被初始化。在首次运行 ULP RISC-V 之前,从主 CPU 上的主程序访问这些变量可能会导致未定义行为。 + + 互斥 ^^^^^^^ From 722ce211af300d26854366b6b8d9e4ac32ec6b84 Mon Sep 17 00:00:00 2001 From: morris Date: Thu, 20 Jun 2024 23:46:21 +0800 Subject: [PATCH 44/73] fix(rmt): power up memory block --- components/driver/deprecated/driver/rmt.h | 8 ++-- components/driver/deprecated/rmt_legacy.c | 8 +++- components/hal/esp32/include/hal/rmt_ll.h | 31 +++++++++++--- components/hal/esp32c3/include/hal/rmt_ll.h | 38 +++++++++++++----- components/hal/esp32c5/include/hal/rmt_ll.h | 40 ++++++++++++++----- components/hal/esp32c6/include/hal/rmt_ll.h | 38 +++++++++++++----- components/hal/esp32h2/include/hal/rmt_ll.h | 38 +++++++++++++----- components/hal/esp32p4/include/hal/rmt_ll.h | 40 ++++++++++++++----- components/hal/esp32s2/include/hal/rmt_ll.h | 38 +++++++++++++----- components/hal/esp32s3/include/hal/rmt_ll.h | 40 ++++++++++++++----- components/hal/rmt_hal.c | 4 +- .../soc/esp32c5/include/soc/clk_tree_defs.h | 36 ----------------- .../soc/esp32c5/include/soc/rmt_struct.h | 2 +- .../blink/sdkconfig.defaults.esp32c5 | 2 +- examples/peripherals/.build-test-rules.yml | 2 + 15 files changed, 240 insertions(+), 125 deletions(-) diff --git a/components/driver/deprecated/driver/rmt.h b/components/driver/deprecated/driver/rmt.h index c99bde31bedd..e162b147aa87 100644 --- a/components/driver/deprecated/driver/rmt.h +++ b/components/driver/deprecated/driver/rmt.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -152,10 +152,10 @@ esp_err_t rmt_set_tx_carrier(rmt_channel_t channel, bool carrier_en, uint16_t hi esp_err_t rmt_set_mem_pd(rmt_channel_t channel, bool pd_en); /** -* @brief Get RMT memory low power mode. +* @brief Check if the RMT memory is force powered down * -* @param channel RMT channel -* @param pd_en Pointer to accept RMT memory low power mode. +* @param channel RMT channel (actually this function is configured for all channels) +* @param pd_en Pointer to accept the result * * @return * - ESP_ERR_INVALID_ARG Parameter error diff --git a/components/driver/deprecated/rmt_legacy.c b/components/driver/deprecated/rmt_legacy.c index 67e8133df2b1..65a9cdaeec83 100644 --- a/components/driver/deprecated/rmt_legacy.c +++ b/components/driver/deprecated/rmt_legacy.c @@ -252,7 +252,11 @@ esp_err_t rmt_set_mem_pd(rmt_channel_t channel, bool pd_en) { ESP_RETURN_ON_FALSE(channel < RMT_CHANNEL_MAX, ESP_ERR_INVALID_ARG, TAG, RMT_CHANNEL_ERROR_STR); RMT_ENTER_CRITICAL(); - rmt_ll_power_down_mem(rmt_contex.hal.regs, pd_en); + if (pd_en) { + rmt_ll_mem_force_power_off(rmt_contex.hal.regs); + } else { + rmt_ll_mem_power_by_pmu(rmt_contex.hal.regs); + } RMT_EXIT_CRITICAL(); return ESP_OK; } @@ -261,7 +265,7 @@ esp_err_t rmt_get_mem_pd(rmt_channel_t channel, bool *pd_en) { ESP_RETURN_ON_FALSE(channel < RMT_CHANNEL_MAX, ESP_ERR_INVALID_ARG, TAG, RMT_CHANNEL_ERROR_STR); RMT_ENTER_CRITICAL(); - *pd_en = rmt_ll_is_mem_powered_down(rmt_contex.hal.regs); + *pd_en = rmt_ll_is_mem_force_powered_down(rmt_contex.hal.regs); RMT_EXIT_CRITICAL(); return ESP_OK; } diff --git a/components/hal/esp32/include/hal/rmt_ll.h b/components/hal/esp32/include/hal/rmt_ll.h index 4e49d01f5fcd..147c6c089dbe 100644 --- a/components/hal/esp32/include/hal/rmt_ll.h +++ b/components/hal/esp32/include/hal/rmt_ll.h @@ -88,14 +88,33 @@ static inline void rmt_ll_enable_periph_clock(rmt_dev_t *dev, bool enable) } /** - * @brief Power down memory + * @brief Force power on the RMT memory block, regardless of the outside PMU logic * * @param dev Peripheral instance address - * @param enable True to power down, False to power up */ -static inline void rmt_ll_power_down_mem(rmt_dev_t *dev, bool enable) +static inline void rmt_ll_mem_force_power_on(rmt_dev_t *dev) { - dev->conf_ch[0].conf0.mem_pd = enable; // Only conf0 register of channel0 has `mem_pd` + (void)dev; +} + +/** + * @brief Force power off the RMT memory block, regardless of the outside PMU logic + * + * @param dev Peripheral instance address + */ +static inline void rmt_ll_mem_force_power_off(rmt_dev_t *dev) +{ + dev->conf_ch[0].conf0.mem_pd = 1; +} + +/** + * @brief Power control the RMT memory block by the outside PMU logic + * + * @param dev Peripheral instance address + */ +static inline void rmt_ll_mem_power_by_pmu(rmt_dev_t *dev) +{ + dev->conf_ch[0].conf0.mem_pd = 0; } /** @@ -120,7 +139,7 @@ static inline void rmt_ll_enable_mem_access_nonfifo(rmt_dev_t *dev, bool enable) * @param divider_numerator Numerator part of the divider */ static inline void rmt_ll_set_group_clock_src(rmt_dev_t *dev, uint32_t channel, rmt_clock_source_t src, - uint32_t divider_integral, uint32_t divider_denominator, uint32_t divider_numerator) + uint32_t divider_integral, uint32_t divider_denominator, uint32_t divider_numerator) { (void)divider_integral; (void)divider_denominator; @@ -631,7 +650,7 @@ static inline uint32_t rmt_ll_tx_get_idle_level(rmt_dev_t *dev, uint32_t channel return dev->conf_ch[channel].conf1.idle_out_lv; } -static inline bool rmt_ll_is_mem_powered_down(rmt_dev_t *dev) +static inline bool rmt_ll_is_mem_force_powered_down(rmt_dev_t *dev) { // Only conf0 register of channel0 has `mem_pd` return dev->conf_ch[0].conf0.mem_pd; diff --git a/components/hal/esp32c3/include/hal/rmt_ll.h b/components/hal/esp32c3/include/hal/rmt_ll.h index 0bfe6d6609f4..c76924fedf28 100644 --- a/components/hal/esp32c3/include/hal/rmt_ll.h +++ b/components/hal/esp32c3/include/hal/rmt_ll.h @@ -87,15 +87,36 @@ static inline void rmt_ll_enable_periph_clock(rmt_dev_t *dev, bool enable) } /** - * @brief Power down memory + * @brief Force power on the RMT memory block, regardless of the outside PMU logic * * @param dev Peripheral instance address - * @param enable True to power down, False to power up */ -static inline void rmt_ll_power_down_mem(rmt_dev_t *dev, bool enable) +static inline void rmt_ll_mem_force_power_on(rmt_dev_t *dev) { - dev->sys_conf.mem_force_pu = !enable; - dev->sys_conf.mem_force_pd = enable; + dev->sys_conf.mem_force_pu = 1; + dev->sys_conf.mem_force_pd = 0; +} + +/** + * @brief Force power off the RMT memory block, regardless of the outside PMU logic + * + * @param dev Peripheral instance address + */ +static inline void rmt_ll_mem_force_power_off(rmt_dev_t *dev) +{ + dev->sys_conf.mem_force_pd = 1; + dev->sys_conf.mem_force_pu = 0; +} + +/** + * @brief Power control the RMT memory block by the outside PMU logic + * + * @param dev Peripheral instance address + */ +static inline void rmt_ll_mem_power_by_pmu(rmt_dev_t *dev) +{ + dev->sys_conf.mem_force_pd = 0; + dev->sys_conf.mem_force_pu = 0; } /** @@ -812,12 +833,9 @@ static inline uint32_t rmt_ll_tx_get_idle_level(rmt_dev_t *dev, uint32_t channel return dev->tx_conf[channel].idle_out_lv; } -static inline bool rmt_ll_is_mem_powered_down(rmt_dev_t *dev) +static inline bool rmt_ll_is_mem_force_powered_down(rmt_dev_t *dev) { - // the RTC domain can also power down RMT memory - // so it's probably not enough to detect whether it's powered down or not - // mem_force_pd has higher priority than mem_force_pu - return (dev->sys_conf.mem_force_pd) || !(dev->sys_conf.mem_force_pu); + return dev->sys_conf.mem_force_pd; } __attribute__((always_inline)) diff --git a/components/hal/esp32c5/include/hal/rmt_ll.h b/components/hal/esp32c5/include/hal/rmt_ll.h index b4b0e32f8a02..5e488cf52aac 100644 --- a/components/hal/esp32c5/include/hal/rmt_ll.h +++ b/components/hal/esp32c5/include/hal/rmt_ll.h @@ -79,15 +79,36 @@ static inline void rmt_ll_enable_periph_clock(rmt_dev_t *dev, bool enable) } /** - * @brief Power down memory + * @brief Force power on the RMT memory block, regardless of the outside PMU logic * * @param dev Peripheral instance address - * @param enable True to power down, False to power up */ -static inline void rmt_ll_power_down_mem(rmt_dev_t *dev, bool enable) +static inline void rmt_ll_mem_force_power_on(rmt_dev_t *dev) { - dev->sys_conf.mem_force_pu = !enable; - dev->sys_conf.mem_force_pd = enable; + PCR.rmt_pd_ctrl.rmt_mem_force_pu = 1; + PCR.rmt_pd_ctrl.rmt_mem_force_pd = 0; +} + +/** + * @brief Force power off the RMT memory block, regardless of the outside PMU logic + * + * @param dev Peripheral instance address + */ +static inline void rmt_ll_mem_force_power_off(rmt_dev_t *dev) +{ + PCR.rmt_pd_ctrl.rmt_mem_force_pd = 1; + PCR.rmt_pd_ctrl.rmt_mem_force_pu = 0; +} + +/** + * @brief Power control the RMT memory block by the outside PMU logic + * + * @param dev Peripheral instance address + */ +static inline void rmt_ll_mem_power_by_pmu(rmt_dev_t *dev) +{ + PCR.rmt_pd_ctrl.rmt_mem_force_pd = 0; + PCR.rmt_pd_ctrl.rmt_mem_force_pu = 0; } /** @@ -112,7 +133,7 @@ static inline void rmt_ll_enable_mem_access_nonfifo(rmt_dev_t *dev, bool enable) * @param divider_numerator Numerator part of the divider */ static inline void rmt_ll_set_group_clock_src(rmt_dev_t *dev, uint32_t channel, rmt_clock_source_t src, - uint32_t divider_integral, uint32_t divider_denominator, uint32_t divider_numerator) + uint32_t divider_integral, uint32_t divider_denominator, uint32_t divider_numerator) { // Formula: rmt_sclk = module_clock_src / (1 + div_num + div_a / div_b) (void)channel; // the source clock is set for all channels @@ -818,12 +839,9 @@ static inline uint32_t rmt_ll_tx_get_idle_level(rmt_dev_t *dev, uint32_t channel return dev->chnconf0[channel].idle_out_lv_chn; } -static inline bool rmt_ll_is_mem_powered_down(rmt_dev_t *dev) +static inline bool rmt_ll_is_mem_force_powered_down(rmt_dev_t *dev) { - // the RTC domain can also power down RMT memory - // so it's probably not enough to detect whether it's powered down or not - // mem_force_pd has higher priority than mem_force_pu - return (dev->sys_conf.mem_force_pd) || !(dev->sys_conf.mem_force_pu); + return PCR.rmt_pd_ctrl.rmt_mem_force_pd; } __attribute__((always_inline)) diff --git a/components/hal/esp32c6/include/hal/rmt_ll.h b/components/hal/esp32c6/include/hal/rmt_ll.h index e097afdee16e..247d63e5fe80 100644 --- a/components/hal/esp32c6/include/hal/rmt_ll.h +++ b/components/hal/esp32c6/include/hal/rmt_ll.h @@ -82,15 +82,36 @@ static inline void rmt_ll_enable_periph_clock(rmt_dev_t *dev, bool enable) } /** - * @brief Power down memory + * @brief Force power on the RMT memory block, regardless of the outside PMU logic * * @param dev Peripheral instance address - * @param enable True to power down, False to power up */ -static inline void rmt_ll_power_down_mem(rmt_dev_t *dev, bool enable) +static inline void rmt_ll_mem_force_power_on(rmt_dev_t *dev) { - dev->sys_conf.mem_force_pu = !enable; - dev->sys_conf.mem_force_pd = enable; + dev->sys_conf.mem_force_pu = 1; + dev->sys_conf.mem_force_pd = 0; +} + +/** + * @brief Force power off the RMT memory block, regardless of the outside PMU logic + * + * @param dev Peripheral instance address + */ +static inline void rmt_ll_mem_force_power_off(rmt_dev_t *dev) +{ + dev->sys_conf.mem_force_pd = 1; + dev->sys_conf.mem_force_pu = 0; +} + +/** + * @brief Power control the RMT memory block by the outside PMU logic + * + * @param dev Peripheral instance address + */ +static inline void rmt_ll_mem_power_by_pmu(rmt_dev_t *dev) +{ + dev->sys_conf.mem_force_pd = 0; + dev->sys_conf.mem_force_pu = 0; } /** @@ -821,12 +842,9 @@ static inline uint32_t rmt_ll_tx_get_idle_level(rmt_dev_t *dev, uint32_t channel return dev->chnconf0[channel].idle_out_lv_chn; } -static inline bool rmt_ll_is_mem_powered_down(rmt_dev_t *dev) +static inline bool rmt_ll_is_mem_force_powered_down(rmt_dev_t *dev) { - // the RTC domain can also power down RMT memory - // so it's probably not enough to detect whether it's powered down or not - // mem_force_pd has higher priority than mem_force_pu - return (dev->sys_conf.mem_force_pd) || !(dev->sys_conf.mem_force_pu); + return dev->sys_conf.mem_force_pd; } __attribute__((always_inline)) diff --git a/components/hal/esp32h2/include/hal/rmt_ll.h b/components/hal/esp32h2/include/hal/rmt_ll.h index a99b41e58dd4..a3179addba59 100644 --- a/components/hal/esp32h2/include/hal/rmt_ll.h +++ b/components/hal/esp32h2/include/hal/rmt_ll.h @@ -82,15 +82,36 @@ static inline void rmt_ll_enable_periph_clock(rmt_dev_t *dev, bool enable) } /** - * @brief Power down memory + * @brief Force power on the RMT memory block, regardless of the outside PMU logic * * @param dev Peripheral instance address - * @param enable True to power down, False to power up */ -static inline void rmt_ll_power_down_mem(rmt_dev_t *dev, bool enable) +static inline void rmt_ll_mem_force_power_on(rmt_dev_t *dev) { - dev->sys_conf.mem_force_pu = !enable; - dev->sys_conf.mem_force_pd = enable; + dev->sys_conf.mem_force_pu = 1; + dev->sys_conf.mem_force_pd = 0; +} + +/** + * @brief Force power off the RMT memory block, regardless of the outside PMU logic + * + * @param dev Peripheral instance address + */ +static inline void rmt_ll_mem_force_power_off(rmt_dev_t *dev) +{ + dev->sys_conf.mem_force_pd = 1; + dev->sys_conf.mem_force_pu = 0; +} + +/** + * @brief Power control the RMT memory block by the outside PMU logic + * + * @param dev Peripheral instance address + */ +static inline void rmt_ll_mem_power_by_pmu(rmt_dev_t *dev) +{ + dev->sys_conf.mem_force_pd = 0; + dev->sys_conf.mem_force_pu = 0; } /** @@ -815,12 +836,9 @@ static inline uint32_t rmt_ll_tx_get_idle_level(rmt_dev_t *dev, uint32_t channel return dev->chnconf0[channel].idle_out_lv_chn; } -static inline bool rmt_ll_is_mem_powered_down(rmt_dev_t *dev) +static inline bool rmt_ll_is_mem_force_powered_down(rmt_dev_t *dev) { - // the RTC domain can also power down RMT memory - // so it's probably not enough to detect whether it's powered down or not - // mem_force_pd has higher priority than mem_force_pu - return (dev->sys_conf.mem_force_pd) || !(dev->sys_conf.mem_force_pu); + return dev->sys_conf.mem_force_pd; } __attribute__((always_inline)) diff --git a/components/hal/esp32p4/include/hal/rmt_ll.h b/components/hal/esp32p4/include/hal/rmt_ll.h index d7830865b806..affcc3eeacd9 100644 --- a/components/hal/esp32p4/include/hal/rmt_ll.h +++ b/components/hal/esp32p4/include/hal/rmt_ll.h @@ -87,7 +87,7 @@ static inline void rmt_ll_reset_register(int group_id) * @param divider_numerator Numerator part of the divider */ static inline void rmt_ll_set_group_clock_src(rmt_dev_t *dev, uint32_t channel, rmt_clock_source_t src, - uint32_t divider_integral, uint32_t divider_denominator, uint32_t divider_numerator) + uint32_t divider_integral, uint32_t divider_denominator, uint32_t divider_numerator) { (void)dev; // Formula: rmt_sclk = module_clock_src / (1 + div_num + div_a / div_b) @@ -145,15 +145,36 @@ static inline void rmt_ll_enable_periph_clock(rmt_dev_t *dev, bool enable) } /** - * @brief Power down memory + * @brief Force power on the RMT memory block, regardless of the outside PMU logic * * @param dev Peripheral instance address - * @param enable True to power down, False to power up */ -static inline void rmt_ll_power_down_mem(rmt_dev_t *dev, bool enable) +static inline void rmt_ll_mem_force_power_on(rmt_dev_t *dev) { - dev->sys_conf.mem_force_pu = !enable; - dev->sys_conf.mem_force_pd = enable; + dev->sys_conf.mem_force_pu = 1; + dev->sys_conf.mem_force_pd = 0; +} + +/** + * @brief Force power off the RMT memory block, regardless of the outside PMU logic + * + * @param dev Peripheral instance address + */ +static inline void rmt_ll_mem_force_power_off(rmt_dev_t *dev) +{ + dev->sys_conf.mem_force_pd = 1; + dev->sys_conf.mem_force_pu = 0; +} + +/** + * @brief Power control the RMT memory block by the outside PMU logic + * + * @param dev Peripheral instance address + */ +static inline void rmt_ll_mem_power_by_pmu(rmt_dev_t *dev) +{ + dev->sys_conf.mem_force_pd = 0; + dev->sys_conf.mem_force_pu = 0; } /** @@ -862,12 +883,9 @@ static inline uint32_t rmt_ll_tx_get_idle_level(rmt_dev_t *dev, uint32_t channel return dev->chnconf0[channel].idle_out_lv_chn; } -static inline bool rmt_ll_is_mem_powered_down(rmt_dev_t *dev) +static inline bool rmt_ll_is_mem_force_powered_down(rmt_dev_t *dev) { - // the RTC domain can also power down RMT memory - // so it's probably not enough to detect whether it's powered down or not - // mem_force_pd has higher priority than mem_force_pu - return (dev->sys_conf.mem_force_pd) || !(dev->sys_conf.mem_force_pu); + return dev->sys_conf.mem_force_pd; } __attribute__((always_inline)) diff --git a/components/hal/esp32s2/include/hal/rmt_ll.h b/components/hal/esp32s2/include/hal/rmt_ll.h index bfe78f5a0fa6..98eb39dfe054 100644 --- a/components/hal/esp32s2/include/hal/rmt_ll.h +++ b/components/hal/esp32s2/include/hal/rmt_ll.h @@ -90,15 +90,36 @@ static inline void rmt_ll_enable_periph_clock(rmt_dev_t *dev, bool enable) } /** - * @brief Power down memory + * @brief Force power on the RMT memory block, regardless of the outside PMU logic * * @param dev Peripheral instance address - * @param enable True to power down, False to power up */ -static inline void rmt_ll_power_down_mem(rmt_dev_t *dev, bool enable) +static inline void rmt_ll_mem_force_power_on(rmt_dev_t *dev) { - dev->apb_conf.mem_force_pu = !enable; - dev->apb_conf.mem_force_pd = enable; + dev->apb_conf.mem_force_pu = 1; + dev->apb_conf.mem_force_pd = 0; +} + +/** + * @brief Force power off the RMT memory block, regardless of the outside PMU logic + * + * @param dev Peripheral instance address + */ +static inline void rmt_ll_mem_force_power_off(rmt_dev_t *dev) +{ + dev->apb_conf.mem_force_pd = 1; + dev->apb_conf.mem_force_pu = 0; +} + +/** + * @brief Power control the RMT memory block by the outside PMU logic + * + * @param dev Peripheral instance address + */ +static inline void rmt_ll_mem_power_by_pmu(rmt_dev_t *dev) +{ + dev->apb_conf.mem_force_pd = 0; + dev->apb_conf.mem_force_pu = 0; } /** @@ -774,12 +795,9 @@ static inline uint32_t rmt_ll_tx_get_idle_level(rmt_dev_t *dev, uint32_t channel return dev->conf_ch[channel].conf1.idle_out_lv_chn; } -static inline bool rmt_ll_is_mem_powered_down(rmt_dev_t *dev) +static inline bool rmt_ll_is_mem_force_powered_down(rmt_dev_t *dev) { - // the RTC domain can also power down RMT memory - // so it's probably not enough to detect whether it's powered down or not - // mem_force_pd has higher priority than mem_force_pu - return (dev->apb_conf.mem_force_pd) || !(dev->apb_conf.mem_force_pu); + return dev->apb_conf.mem_force_pd; } __attribute__((always_inline)) diff --git a/components/hal/esp32s3/include/hal/rmt_ll.h b/components/hal/esp32s3/include/hal/rmt_ll.h index 13601630b474..e999add0260e 100644 --- a/components/hal/esp32s3/include/hal/rmt_ll.h +++ b/components/hal/esp32s3/include/hal/rmt_ll.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -87,15 +87,36 @@ static inline void rmt_ll_enable_periph_clock(rmt_dev_t *dev, bool enable) } /** - * @brief Power down memory + * @brief Force power on the RMT memory block, regardless of the outside PMU logic * * @param dev Peripheral instance address - * @param enable True to power down, False to power up */ -static inline void rmt_ll_power_down_mem(rmt_dev_t *dev, bool enable) +static inline void rmt_ll_mem_force_power_on(rmt_dev_t *dev) { - dev->sys_conf.mem_force_pu = !enable; - dev->sys_conf.mem_force_pd = enable; + dev->sys_conf.mem_force_pu = 1; + dev->sys_conf.mem_force_pd = 0; +} + +/** + * @brief Force power off the RMT memory block, regardless of the outside PMU logic + * + * @param dev Peripheral instance address + */ +static inline void rmt_ll_mem_force_power_off(rmt_dev_t *dev) +{ + dev->sys_conf.mem_force_pd = 1; + dev->sys_conf.mem_force_pu = 0; +} + +/** + * @brief Power control the RMT memory block by the outside PMU logic + * + * @param dev Peripheral instance address + */ +static inline void rmt_ll_mem_power_by_pmu(rmt_dev_t *dev) +{ + dev->sys_conf.mem_force_pd = 0; + dev->sys_conf.mem_force_pu = 0; } /** @@ -850,12 +871,9 @@ static inline uint32_t rmt_ll_tx_get_idle_level(rmt_dev_t *dev, uint32_t channel return dev->chnconf0[channel].idle_out_lv_chn; } -static inline bool rmt_ll_is_mem_powered_down(rmt_dev_t *dev) +static inline bool rmt_ll_is_mem_force_powered_down(rmt_dev_t *dev) { - // the RTC domain can also power down RMT memory - // so it's probably not enough to detect whether it's powered down or not - // mem_force_pd has higher priority than mem_force_pu - return (dev->sys_conf.mem_force_pd) || !(dev->sys_conf.mem_force_pu); + return dev->sys_conf.mem_force_pd; } __attribute__((always_inline)) diff --git a/components/hal/rmt_hal.c b/components/hal/rmt_hal.c index ea9565e7a602..7290d36b1f2f 100644 --- a/components/hal/rmt_hal.c +++ b/components/hal/rmt_hal.c @@ -10,7 +10,7 @@ void rmt_hal_init(rmt_hal_context_t *hal) { hal->regs = &RMT; - rmt_ll_power_down_mem(hal->regs, false); // turn on RMTMEM power domain + rmt_ll_mem_power_by_pmu(hal->regs); rmt_ll_enable_mem_access_nonfifo(hal->regs, true); // APB access the RMTMEM in nonfifo mode rmt_ll_enable_interrupt(hal->regs, UINT32_MAX, false); // disable all interrupt events rmt_ll_clear_interrupt_status(hal->regs, UINT32_MAX); // clear all pending events @@ -23,7 +23,7 @@ void rmt_hal_deinit(rmt_hal_context_t *hal) { rmt_ll_enable_interrupt(hal->regs, UINT32_MAX, false); // disable all interrupt events rmt_ll_clear_interrupt_status(hal->regs, UINT32_MAX); // clear all pending events - rmt_ll_power_down_mem(hal->regs, true); // turn off RMTMEM power domain + rmt_ll_mem_force_power_off(hal->regs); // power off RMTMEM power domain forcefully hal->regs = NULL; } diff --git a/components/soc/esp32c5/include/soc/clk_tree_defs.h b/components/soc/esp32c5/include/soc/clk_tree_defs.h index 05cb03e456fc..6bb18599b690 100644 --- a/components/soc/esp32c5/include/soc/clk_tree_defs.h +++ b/components/soc/esp32c5/include/soc/clk_tree_defs.h @@ -168,11 +168,7 @@ typedef enum { // TODO: [ESP32C5] IDF-8676 (inherit from C6) * } * @endcode */ -#if SOC_CLK_TREE_SUPPORTED #define SOC_GPTIMER_CLKS {SOC_MOD_CLK_PLL_F80M, SOC_MOD_CLK_RC_FAST, SOC_MOD_CLK_XTAL} -#else -#define SOC_GPTIMER_CLKS {SOC_MOD_CLK_XTAL} -#endif /** * @brief Type of GPTimer clock source @@ -181,11 +177,7 @@ typedef enum { GPTIMER_CLK_SRC_PLL_F80M = SOC_MOD_CLK_PLL_F80M, /*!< Select PLL_F80M as the source clock */ GPTIMER_CLK_SRC_RC_FAST = SOC_MOD_CLK_RC_FAST, /*!< Select RC_FAST as the source clock */ GPTIMER_CLK_SRC_XTAL = SOC_MOD_CLK_XTAL, /*!< Select XTAL as the source clock */ -#if SOC_CLK_TREE_SUPPORTED GPTIMER_CLK_SRC_DEFAULT = SOC_MOD_CLK_PLL_F80M, /*!< Select PLL_F80M as the default choice */ -#else - GPTIMER_CLK_SRC_DEFAULT = SOC_MOD_CLK_XTAL, /*!< Select XTAL as the default choice */ -#endif // SOC_CLK_TREE_SUPPORTED } soc_periph_gptimer_clk_src_t; /** @@ -194,11 +186,7 @@ typedef enum { typedef enum { TIMER_SRC_CLK_PLL_F80M = SOC_MOD_CLK_PLL_F80M, /*!< Timer group clock source is PLL_F80M */ TIMER_SRC_CLK_XTAL = SOC_MOD_CLK_XTAL, /*!< Timer group clock source is XTAL */ -#if SOC_CLK_TREE_SUPPORTED TIMER_SRC_CLK_DEFAULT = SOC_MOD_CLK_PLL_F80M, /*!< Timer group clock source default choice is PLL_F80M */ -#else - TIMER_SRC_CLK_DEFAULT = SOC_MOD_CLK_XTAL, /*!< Timer group clock source default choice is XTAL */ -#endif // SOC_CLK_TREE_SUPPORTED } soc_periph_tg_clk_src_legacy_t; //////////////////////////////////////////////////RMT/////////////////////////////////////////////////////////////////// @@ -257,11 +245,7 @@ typedef enum { UART_SCLK_PLL_F80M = SOC_MOD_CLK_PLL_F80M, /*!< UART source clock is PLL_F80M */ UART_SCLK_RTC = SOC_MOD_CLK_RC_FAST, /*!< UART source clock is RC_FAST */ UART_SCLK_XTAL = SOC_MOD_CLK_XTAL, /*!< UART source clock is XTAL */ -#if SOC_CLK_TREE_SUPPORTED UART_SCLK_DEFAULT = SOC_MOD_CLK_PLL_F80M, /*!< UART source clock default choice is PLL_F80M */ -#else - UART_SCLK_DEFAULT = SOC_MOD_CLK_XTAL, /*!< UART source clock default choice is XTAL for FPGA environment*/ -#endif } soc_periph_uart_clk_src_legacy_t; /** @@ -293,11 +277,7 @@ typedef enum { typedef enum { MCPWM_TIMER_CLK_SRC_PLL160M = SOC_MOD_CLK_PLL_F160M, /*!< Select PLL_F160M as the source clock */ MCPWM_TIMER_CLK_SRC_XTAL = SOC_MOD_CLK_XTAL, /*!< Select XTAL as the source clock */ -#if SOC_CLK_TREE_SUPPORTED MCPWM_TIMER_CLK_SRC_DEFAULT = SOC_MOD_CLK_PLL_F160M, /*!< Select PLL_F160M as the default clock choice */ -#else - MCPWM_TIMER_CLK_SRC_DEFAULT = SOC_MOD_CLK_XTAL, /*!< Select XTAL as the default clock choice */ -#endif } soc_periph_mcpwm_timer_clk_src_t; /** @@ -311,11 +291,7 @@ typedef enum { typedef enum { MCPWM_CAPTURE_CLK_SRC_PLL160M = SOC_MOD_CLK_PLL_F160M, /*!< Select PLL_F160M as the source clock */ MCPWM_CAPTURE_CLK_SRC_XTAL = SOC_MOD_CLK_XTAL, /*!< Select XTAL as the source clock */ -#if SOC_CLK_TREE_SUPPORTED MCPWM_CAPTURE_CLK_SRC_DEFAULT = SOC_MOD_CLK_PLL_F160M, /*!< Select PLL_F160M as the default clock choice */ -#else - MCPWM_CAPTURE_CLK_SRC_DEFAULT = SOC_MOD_CLK_XTAL, /*!< Select XTAL as the default clock choice */ -#endif } soc_periph_mcpwm_capture_clk_src_t; /** @@ -329,11 +305,7 @@ typedef enum { typedef enum { MCPWM_CARRIER_CLK_SRC_PLL160M = SOC_MOD_CLK_PLL_F160M, /*!< Select PLL_F160M as the source clock */ MCPWM_CARRIER_CLK_SRC_XTAL = SOC_MOD_CLK_XTAL, /*!< Select XTAL as the source clock */ -#if SOC_CLK_TREE_SUPPORTED MCPWM_CARRIER_CLK_SRC_DEFAULT = SOC_MOD_CLK_PLL_F160M, /*!< Select PLL_F160M as the default clock choice */ -#else - MCPWM_CARRIER_CLK_SRC_DEFAULT = SOC_MOD_CLK_XTAL, /*!< Select XTAL as the default clock choice */ -#endif } soc_periph_mcpwm_carrier_clk_src_t; ///////////////////////////////////////////////////// I2S ////////////////////////////////////////////////////////////// @@ -400,11 +372,7 @@ typedef enum { SPI_CLK_SRC_XTAL = SOC_MOD_CLK_XTAL, /*!< Select XTAL as SPI source clock */ SPI_CLK_SRC_PLL_F160M = SOC_MOD_CLK_PLL_F160M, /*!< Select PLL_160M as SPI source clock */ SPI_CLK_SRC_RC_FAST = SOC_MOD_CLK_RC_FAST, /*!< Select RC_FAST as SPI source clock */ -#if SOC_CLK_TREE_SUPPORTED SPI_CLK_SRC_DEFAULT = SOC_MOD_CLK_PLL_F160M, /*!< Select PLL_80M as SPI source clock */ -#else - SPI_CLK_SRC_DEFAULT = SOC_MOD_CLK_XTAL, /*!< Select PLL_80M as SPI source clock */ -#endif } soc_periph_spi_clk_src_t; //////////////////////////////////////////////////SDM////////////////////////////////////////////////////////////// @@ -523,11 +491,7 @@ typedef enum { PARLIO_CLK_SRC_RC_FAST = SOC_MOD_CLK_RC_FAST, /*!< Select RC_FAST as the source clock */ PARLIO_CLK_SRC_PLL_F240M = SOC_MOD_CLK_PLL_F240M, /*!< Select PLL_F240M as the source clock */ PARLIO_CLK_SRC_EXTERNAL = -1, /*!< Select EXTERNAL clock as the source clock */ -#if SOC_CLK_TREE_SUPPORTED // TODO: [ESP32C5] IDF-8642 remove when clock tree is supported PARLIO_CLK_SRC_DEFAULT = SOC_MOD_CLK_PLL_F240M, /*!< Select PLL_F240M as the default clock choice */ -#else - PARLIO_CLK_SRC_DEFAULT = SOC_MOD_CLK_XTAL, /*!< Select XTAL as the default clock choice */ -#endif } soc_periph_parlio_clk_src_t; //////////////////////////////////////////////////MSPI/////////////////////////////////////////////////////////////////// diff --git a/components/soc/esp32c5/include/soc/rmt_struct.h b/components/soc/esp32c5/include/soc/rmt_struct.h index 124bc72bff52..af0acf14329e 100644 --- a/components/soc/esp32c5/include/soc/rmt_struct.h +++ b/components/soc/esp32c5/include/soc/rmt_struct.h @@ -827,7 +827,7 @@ typedef struct rmt_dev_t { volatile struct { rmt_chmconf0_reg_t conf0; rmt_chmconf1_reg_t conf1; - } chmconf[2];; + } chmconf[2]; volatile rmt_chnstatus_reg_t chnstatus[2]; volatile rmt_chmstatus_reg_t chmstatus[2]; volatile rmt_int_raw_reg_t int_raw; diff --git a/examples/get-started/blink/sdkconfig.defaults.esp32c5 b/examples/get-started/blink/sdkconfig.defaults.esp32c5 index 053efed5b7b6..faee357ade7e 100644 --- a/examples/get-started/blink/sdkconfig.defaults.esp32c5 +++ b/examples/get-started/blink/sdkconfig.defaults.esp32c5 @@ -1,2 +1,2 @@ -CONFIG_BLINK_GPIO=6 +CONFIG_BLINK_GPIO=27 CONFIG_BLINK_LED_STRIP=y diff --git a/examples/peripherals/.build-test-rules.yml b/examples/peripherals/.build-test-rules.yml index 6949eafd2062..1b2c076edb19 100644 --- a/examples/peripherals/.build-test-rules.yml +++ b/examples/peripherals/.build-test-rules.yml @@ -299,12 +299,14 @@ examples/peripherals/rmt/ir_nec_transceiver: examples/peripherals/rmt/musical_buzzer: disable: + - if: SOC_RMT_SUPPORTED != 1 - if: SOC_RMT_SUPPORT_TX_LOOP_COUNT != 1 depends_components: - esp_driver_rmt examples/peripherals/rmt/stepper_motor: disable: + - if: SOC_RMT_SUPPORTED != 1 - if: SOC_RMT_SUPPORT_TX_LOOP_AUTO_STOP != 1 depends_components: - esp_driver_rmt From 03e936041d6e05aa1dc28aab5f72c4a3abced625 Mon Sep 17 00:00:00 2001 From: Chen Jichang Date: Tue, 25 Jun 2024 20:44:17 +0800 Subject: [PATCH 45/73] refactor(pcnt): refactor the default isr --- components/esp_driver_pcnt/src/pulse_cnt.c | 68 +++++++++++++------ .../test_apps/pulse_cnt/main/test_pulse_cnt.c | 15 ++-- docs/en/api-reference/peripherals/pcnt.rst | 28 +++----- docs/zh_CN/api-reference/peripherals/pcnt.rst | 26 +++---- 4 files changed, 77 insertions(+), 60 deletions(-) diff --git a/components/esp_driver_pcnt/src/pulse_cnt.c b/components/esp_driver_pcnt/src/pulse_cnt.c index 2d4b22231bea..e25dafc00bf7 100644 --- a/components/esp_driver_pcnt/src/pulse_cnt.c +++ b/components/esp_driver_pcnt/src/pulse_cnt.c @@ -893,35 +893,69 @@ IRAM_ATTR static void pcnt_default_isr(void *args) if (intr_status & PCNT_LL_UNIT_WATCH_EVENT(unit_id)) { pcnt_ll_clear_intr_status(group->hal.dev, PCNT_LL_UNIT_WATCH_EVENT(unit_id)); - // points watcher event + // watcher event uint32_t event_status = pcnt_ll_get_event_status(group->hal.dev, unit_id); + + // use flags to avoid multiple callbacks in one point + bool is_limit_event __attribute__((unused)) = false; + bool is_step_event = false; + // iter on each event_id while (event_status) { - int event_id = __builtin_ffs(event_status) - 1; - event_status &= (event_status - 1); // clear the right most bit - - portENTER_CRITICAL_ISR(&unit->spinlock); - if (unit->flags.accum_count) { - if (event_id == PCNT_LL_WATCH_EVENT_LOW_LIMIT) { + int watch_value = pcnt_ll_get_count(group->hal.dev, unit_id); + if (event_status & BIT(PCNT_LL_WATCH_EVENT_LOW_LIMIT)) { + event_status &= ~(BIT(PCNT_LL_WATCH_EVENT_LOW_LIMIT)); + is_limit_event = true; + if (unit->flags.accum_count) { + portENTER_CRITICAL_ISR(&unit->spinlock); unit->accum_value += unit->low_limit; - } else if (event_id == PCNT_LL_WATCH_EVENT_HIGH_LIMIT) { + portEXIT_CRITICAL_ISR(&unit->spinlock); + } + watch_value = unit->low_limit; + } else if (event_status & BIT(PCNT_LL_WATCH_EVENT_HIGH_LIMIT)) { + event_status &= ~(BIT(PCNT_LL_WATCH_EVENT_HIGH_LIMIT)); + is_limit_event = true; + if (unit->flags.accum_count) { + portENTER_CRITICAL_ISR(&unit->spinlock); unit->accum_value += unit->high_limit; + portEXIT_CRITICAL_ISR(&unit->spinlock); } + watch_value = unit->high_limit; + } #if SOC_PCNT_SUPPORT_STEP_NOTIFY - // zero cross event priority is higher than step limit event, ensure to accumulate the value when the zero cross is caused by step limit - if ((event_id == PCNT_LL_WATCH_EVENT_ZERO_CROSS) && (event_status & 1 << PCNT_LL_STEP_EVENT_REACH_LIMIT)) { - unit->accum_value += unit->step_limit; - } else if (event_id == PCNT_LL_STEP_EVENT_REACH_LIMIT) { + else if (event_status & BIT(PCNT_LL_STEP_EVENT_REACH_LIMIT)) { + event_status &= ~(BIT(PCNT_LL_STEP_EVENT_REACH_LIMIT)); + if (is_limit_event) { + continue; + } else if (unit->flags.accum_count) { + portENTER_CRITICAL_ISR(&unit->spinlock); unit->accum_value += unit->step_limit; + portEXIT_CRITICAL_ISR(&unit->spinlock); + } + watch_value = unit->step_limit; + } else if (event_status & BIT(PCNT_LL_STEP_EVENT_REACH_INTERVAL)) { + event_status &= ~(BIT(PCNT_LL_STEP_EVENT_REACH_INTERVAL)); + is_step_event = true; + } +#endif //SOC_PCNT_SUPPORT_STEP_NOTIFY + else if (event_status & BIT(PCNT_LL_WATCH_EVENT_ZERO_CROSS)) { + event_status &= ~(BIT(PCNT_LL_WATCH_EVENT_ZERO_CROSS)); + } else if (event_status & BIT(PCNT_LL_WATCH_EVENT_THRES0)) { + event_status &= ~(BIT(PCNT_LL_WATCH_EVENT_THRES0)); + if (is_step_event) { + continue; + } + } else if (event_status & BIT(PCNT_LL_WATCH_EVENT_THRES1)) { + event_status &= ~(BIT(PCNT_LL_WATCH_EVENT_THRES1)); + if (is_step_event) { + continue; } -#endif } - portEXIT_CRITICAL_ISR(&unit->spinlock); // invoked user registered callback if (on_reach) { pcnt_watch_event_data_t edata = { - .watch_point_value = event_id < PCNT_LL_WATCH_EVENT_MAX ? unit->watchers[event_id].watch_point_value : pcnt_ll_get_count(group->hal.dev, unit_id), + .watch_point_value = watch_value, .zero_cross_mode = pcnt_ll_get_zero_cross_mode(group->hal.dev, unit_id), }; if (on_reach(unit, &edata, unit->user_data)) { @@ -929,10 +963,6 @@ IRAM_ATTR static void pcnt_default_isr(void *args) need_yield = true; } } -#if SOC_PCNT_SUPPORT_STEP_NOTIFY - // The priority of step and step limit event is lowest. Clear the step and step limit event to ensure that in a particular point, event can only be triggered once - event_status &= ~(1 << PCNT_LL_STEP_EVENT_REACH_INTERVAL | 1 << PCNT_LL_STEP_EVENT_REACH_LIMIT); -#endif } } if (need_yield) { diff --git a/components/esp_driver_pcnt/test_apps/pulse_cnt/main/test_pulse_cnt.c b/components/esp_driver_pcnt/test_apps/pulse_cnt/main/test_pulse_cnt.c index 4fcdbeaafa9e..e60e15db02b7 100644 --- a/components/esp_driver_pcnt/test_apps/pulse_cnt/main/test_pulse_cnt.c +++ b/components/esp_driver_pcnt/test_apps/pulse_cnt/main/test_pulse_cnt.c @@ -629,7 +629,7 @@ TEST_CASE("pcnt_step_notify_event", "[pcnt]") TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, pcnt_unit_add_watch_step(unit, 20)); TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, pcnt_unit_add_watch_step(unit, -120)); TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, pcnt_unit_add_watch_step(unit, -30)); - TEST_ESP_OK(pcnt_unit_add_watch_step(unit, -50)); + TEST_ESP_OK(pcnt_unit_add_watch_step(unit, -25)); TEST_ASSERT_EQUAL(ESP_ERR_INVALID_STATE, pcnt_unit_add_watch_step(unit, -100)); TEST_ESP_OK(pcnt_unit_add_watch_point(unit, -100)); TEST_ESP_OK(pcnt_unit_add_watch_point(unit, 0)); @@ -654,11 +654,14 @@ TEST_CASE("pcnt_step_notify_event", "[pcnt]") printf("%d:%d\r\n", i, user_data.triggered_watch_values[i]); } TEST_ASSERT_EQUAL(-150, count_value); - TEST_ASSERT_EQUAL(4, user_data.index); - TEST_ASSERT_EQUAL(-50, user_data.triggered_watch_values[0]); - TEST_ASSERT_EQUAL(-100, user_data.triggered_watch_values[1]); - TEST_ASSERT_EQUAL(-0, user_data.triggered_watch_values[2]); - TEST_ASSERT_EQUAL(-50, user_data.triggered_watch_values[3]); + TEST_ASSERT_EQUAL(7, user_data.index); + TEST_ASSERT_EQUAL(-25, user_data.triggered_watch_values[0]); + TEST_ASSERT_EQUAL(-50, user_data.triggered_watch_values[1]); + TEST_ASSERT_EQUAL(-75, user_data.triggered_watch_values[2]); + TEST_ASSERT_EQUAL(-100, user_data.triggered_watch_values[3]); + TEST_ASSERT_EQUAL(-0, user_data.triggered_watch_values[4]); + TEST_ASSERT_EQUAL(-25, user_data.triggered_watch_values[5]); + TEST_ASSERT_EQUAL(-50, user_data.triggered_watch_values[6]); printf("add a new step interval\r\n"); TEST_ESP_OK(pcnt_unit_remove_watch_step(unit)); diff --git a/docs/en/api-reference/peripherals/pcnt.rst b/docs/en/api-reference/peripherals/pcnt.rst index a91693eb3315..99e44fe7baca 100644 --- a/docs/en/api-reference/peripherals/pcnt.rst +++ b/docs/en/api-reference/peripherals/pcnt.rst @@ -153,7 +153,7 @@ It is recommended to remove the unused watch point by :cpp:func:`pcnt_unit_remov Watch Step ^^^^^^^^^^^ - PCNT unit can be configured to watch a specific value increment(can be positive or negative) that you are interested in. The function of watching value increment is also called **Watch Step**. To install watch step requires enabling :cpp:member:`pcnt_unit_config_t::en_step_notify_up` or :cpp:member:`pcnt_unit_config_t::en_step_notify_down`. The step interval itself can not exceed the range set in :cpp:type:`pcnt_unit_config_t` by :cpp:member:`pcnt_unit_config_t::low_limit` and :cpp:member:`pcnt_unit_config_t::high_limit`.When the counter increment reaches step interval, a watch event will be triggered and notify you by interrupt if any watch event callback has ever registered in :cpp:func:`pcnt_unit_register_event_callbacks`. See :ref:`pcnt-register-event-callbacks` for how to register event callbacks. + PCNT unit can be configured to watch a specific value increment (can be positive or negative) that you are interested in. The function of watching value increment is also called **Watch Step**. To install watch step requires enabling :cpp:member:`pcnt_unit_config_t::en_step_notify_up` or :cpp:member:`pcnt_unit_config_t::en_step_notify_down`. The step interval itself can not exceed the range set in :cpp:type:`pcnt_unit_config_t` by :cpp:member:`pcnt_unit_config_t::low_limit` and :cpp:member:`pcnt_unit_config_t::high_limit`.When the counter increment reaches step interval, a watch event will be triggered and notify you by interrupt if any watch event callback has ever registered in :cpp:func:`pcnt_unit_register_event_callbacks`. See :ref:`pcnt-register-event-callbacks` for how to register event callbacks. The watch step can be added and removed by :cpp:func:`pcnt_unit_add_watch_step` and :cpp:func:`pcnt_unit_remove_watch_step`. You can not add multiple watch step, otherwise it will return error :c:macro:`ESP_ERR_INVALID_STATE`。 @@ -161,7 +161,7 @@ It is recommended to remove the unused watch point by :cpp:func:`pcnt_unit_remov .. note:: - When a watch step and a watch point are triggered at the same time, only one interrupt event will be generated. + When a watch step and a watch point are triggered at the same time (i.e. at the same absolute point), the callback function only gets called by once. The step interval must be a divisor of :cpp:member:`pcnt_unit_config_t::low_limit` or :cpp:member:`pcnt_unit_config_t::high_limit`. .. code:: c @@ -186,18 +186,10 @@ When PCNT unit reaches any enabled watch point, specific event will be generated You can save their own context to :cpp:func:`pcnt_unit_register_event_callbacks` as well, via the parameter ``user_ctx``. This user data will be directly passed to the callback functions. -.. only:: SOC_PCNT_SUPPORT_STEP_NOTIFY - - In the callback function, the driver will fill in the event data of specific event. For example, the watch point event or watch step event data is declared as :cpp:type:`pcnt_watch_event_data_t`: +In the callback function, the driver will fill in the event data of specific event. For example, the watch point event or watch step event data is declared as :cpp:type:`pcnt_watch_event_data_t`: -.. only:: not SOC_PCNT_SUPPORT_STEP_NOTIFY - - In the callback function, the driver will fill in the event data of specific event. For example, the watch point event data is declared as :cpp:type:`pcnt_watch_event_data_t`: - -.. list:: - :SOC_PCNT_SUPPORT_STEP_NOTIFY: - :cpp:member:`pcnt_watch_event_data_t::watch_point_value` saves the watch point value or watch step value that triggers the event. - :not SOC_PCNT_SUPPORT_STEP_NOTIFY: - :cpp:member:`pcnt_watch_event_data_t::watch_point_value` saves the watch point value that triggers the event. - - :cpp:member:`pcnt_watch_event_data_t::zero_cross_mode` saves how the PCNT unit crosses the zero point in the latest time. The possible zero cross modes are listed in the :cpp:type:`pcnt_unit_zero_cross_mode_t`. Usually different zero cross mode means different **counting direction** and **counting step size**. +- :cpp:member:`pcnt_watch_event_data_t::watch_point_value` saves the count value when the event triggered. +- :cpp:member:`pcnt_watch_event_data_t::zero_cross_mode` saves how the PCNT unit crosses the zero point in the latest time. The possible zero cross modes are listed in the :cpp:type:`pcnt_unit_zero_cross_mode_t`. Usually different zero cross mode means different **counting direction** and **counting step size**. Registering callback function results in lazy installation of interrupt service, thus this function should only be called before the unit is enabled by :cpp:func:`pcnt_unit_enable`. Otherwise, it can return :c:macro:`ESP_ERR_INVALID_STATE` error. @@ -320,16 +312,16 @@ Compensate Overflow Loss The internal hardware counter will be cleared to zero automatically when it reaches high or low limit. If you want to compensate for that count loss and extend the counter's bit-width, you can: +.. list:: + 1. Enable :cpp:member:`pcnt_unit_config_t::accum_count` when installing the PCNT unit. - 2. Add the high/low limit as the :ref:`pcnt-watch-points`. + :SOC_PCNT_SUPPORT_STEP_NOTIFY: 2. Add the high/low limit as the :ref:`pcnt-watch-points` or add watch step as the :ref:`pcnt-step-notify`. + :not SOC_PCNT_SUPPORT_STEP_NOTIFY: 2. Add the high/low limit as the :ref:`pcnt-watch-points`. 3. Now, the returned count value from the :cpp:func:`pcnt_unit_get_count` function not only reflects the hardware's count value, but also accumulates the high/low overflow loss to it. .. note:: - .. list:: - - - :cpp:func:`pcnt_unit_clear_count` resets the accumulated count value as well. - :SOC_PCNT_SUPPORT_STEP_NOTIFY: - setting the watch step will also enable the accumulator. + :cpp:func:`pcnt_unit_clear_count` resets the accumulated count value as well. .. _pcnt-power-management: diff --git a/docs/zh_CN/api-reference/peripherals/pcnt.rst b/docs/zh_CN/api-reference/peripherals/pcnt.rst index 4876b37bd05c..175010e40473 100644 --- a/docs/zh_CN/api-reference/peripherals/pcnt.rst +++ b/docs/zh_CN/api-reference/peripherals/pcnt.rst @@ -161,7 +161,7 @@ PCNT 单元可被设置为观察几个特定的数值,这些被观察的数值 .. note:: - 当观察步进和观察点同时被触发时,只会产生一次中断事件。 + 当观察步进和观察点同时被触发时,回调函数只会被调用一次。 步进间隔必须是 :cpp:member:`pcnt_unit_config_t::low_limit` 或 :cpp:member:`pcnt_unit_config_t::high_limit` 的因数。 .. code:: c @@ -186,18 +186,10 @@ PCNT 单元可被设置为观察几个特定的数值,这些被观察的数值 可通过 ``user_ctx`` 将函数上下文保存到 :cpp:func:`pcnt_unit_register_event_callbacks` 中,这些数据会直接传递给回调函数。 -.. only:: SOC_PCNT_SUPPORT_STEP_NOTIFY - - 驱动程序会将特定事件的数据写入回调函数中,例如,观察点事件或观察步进事件数据被声明为 :cpp:type:`pcnt_watch_event_data_t`: +驱动程序会将特定事件的数据写入回调函数中,例如,观察点事件或观察步进事件数据被声明为 :cpp:type:`pcnt_watch_event_data_t`: -.. only:: not SOC_PCNT_SUPPORT_STEP_NOTIFY - - 驱动程序会将特定事件的数据写入回调函数中,例如,观察点事件数据被声明为 :cpp:type:`pcnt_watch_event_data_t`: - -.. list:: - :SOC_PCNT_SUPPORT_STEP_NOTIFY: - :cpp:member:`pcnt_watch_event_data_t::watch_point_value` 用于保存触发该事件的观察点或观察步进的数值。 - :not SOC_PCNT_SUPPORT_STEP_NOTIFY: - :cpp:member:`pcnt_watch_event_data_t::watch_point_value` 用于保存触发该事件的观察点数值。 - - :cpp:member:`pcnt_watch_event_data_t::zero_cross_mode` 用于保存上一次 PCNT 单元的过零模式,:cpp:type:`pcnt_unit_zero_cross_mode_t` 中列出了所有可能的过零模式。通常,不同的过零模式意味着不同的 **计数方向** 和 **计数步长**。 +- :cpp:member:`pcnt_watch_event_data_t::watch_point_value` 用于保存触发事件时计数器的数值。 +- :cpp:member:`pcnt_watch_event_data_t::zero_cross_mode` 用于保存上一次 PCNT 单元的过零模式,:cpp:type:`pcnt_unit_zero_cross_mode_t` 中列出了所有可能的过零模式。通常,不同的过零模式意味着不同的 **计数方向** 和 **计数步长**。 注册回调函数会导致中断服务延迟安装,因此回调函数只能在 PCNT 单元被 :cpp:func:`pcnt_unit_enable` 使能之前调用。否则,回调函数会返回错误 :c:macro:`ESP_ERR_INVALID_STATE`。 @@ -320,16 +312,16 @@ PCNT 单元的滤波器可滤除信号中的短时毛刺,:cpp:type:`pcnt_glitc PCNT 内部的硬件计数器会在计数达到高/低门限的时候自动清零。如果你想补偿该计数值的溢出损失,以期进一步拓宽计数器的实际位宽,你可以: +.. list:: + 1. 在安装 PCNT 计数单元的时候使能 :cpp:member:`pcnt_unit_config_t::accum_count` 选项。 - 2. 将高/低计数门限设置为 :ref:`pcnt-watch-points`. + :SOC_PCNT_SUPPORT_STEP_NOTIFY: 2. 将高/低计数门限设置为 :ref:`pcnt-watch-points` 或添加观察步进 :ref:`pcnt-step-notify` + :not SOC_PCNT_SUPPORT_STEP_NOTIFY: 2. 将高/低计数门限设置为 :ref:`pcnt-watch-points`。 3. 现在,:cpp:func:`pcnt_unit_get_count` 函数返回的计数值就会包含硬件计数器当前的计数值,累加上计数器溢出造成的损失。 .. note:: - .. list:: - - - :cpp:func:`pcnt_unit_clear_count` 会复位该软件累加器。 - :SOC_PCNT_SUPPORT_STEP_NOTIFY: - 设置观察步进后,同时也会启用软件累加器。 + :cpp:func:`pcnt_unit_clear_count` 会复位该软件累加器。 .. _pcnt-power-management: From fd18bb608bbcdb9290148d37f3b61c5995fb616d Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Thu, 27 Jun 2024 17:35:35 +0800 Subject: [PATCH 46/73] test(misc): enable misc tests that have been missed during bringup --- components/esp_hw_support/test_apps/.build-test-rules.yml | 4 ---- .../esp_hw_support_unity_tests/pytest_esp_hw_support.py | 2 -- components/esp_system/test_apps/.build-test-rules.yml | 4 +--- .../esp_system/test_apps/esp_system_unity_tests/README.md | 4 ++-- components/esp_timer/test_apps/.build-test-rules.yml | 7 ------- components/esp_timer/test_apps/README.md | 4 ++-- components/freertos/test_apps/.build-test-rules.yml | 4 ++-- components/freertos/test_apps/freertos/README.md | 4 ++-- components/heap/test_apps/.build-test-rules.yml | 3 --- components/heap/test_apps/heap_tests/README.md | 4 ++-- 10 files changed, 11 insertions(+), 29 deletions(-) delete mode 100644 components/esp_timer/test_apps/.build-test-rules.yml diff --git a/components/esp_hw_support/test_apps/.build-test-rules.yml b/components/esp_hw_support/test_apps/.build-test-rules.yml index a395b6061925..b7e85dae37c8 100644 --- a/components/esp_hw_support/test_apps/.build-test-rules.yml +++ b/components/esp_hw_support/test_apps/.build-test-rules.yml @@ -17,10 +17,6 @@ components/esp_hw_support/test_apps/dma2d: components/esp_hw_support/test_apps/esp_hw_support_unity_tests: disable: - if: SOC_GPSPI_SUPPORTED != 1 - disable_test: - - if: IDF_TARGET == "esp32p4" - temporary: true - reason: test not pass, should be re-enable # TODO: IDF-8972 components/esp_hw_support/test_apps/etm: disable: diff --git a/components/esp_hw_support/test_apps/esp_hw_support_unity_tests/pytest_esp_hw_support.py b/components/esp_hw_support/test_apps/esp_hw_support_unity_tests/pytest_esp_hw_support.py index a96369107b01..303f5bc685e4 100644 --- a/components/esp_hw_support/test_apps/esp_hw_support_unity_tests/pytest_esp_hw_support.py +++ b/components/esp_hw_support/test_apps/esp_hw_support_unity_tests/pytest_esp_hw_support.py @@ -1,11 +1,9 @@ # SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded import Dut -@pytest.mark.temp_skip_ci(targets=['esp32p4'], reason='esp32p4 support TBD') # TODO: IDF-8972 @pytest.mark.generic @pytest.mark.parametrize( 'config', diff --git a/components/esp_system/test_apps/.build-test-rules.yml b/components/esp_system/test_apps/.build-test-rules.yml index d35ca3820c77..e59aab60e35a 100644 --- a/components/esp_system/test_apps/.build-test-rules.yml +++ b/components/esp_system/test_apps/.build-test-rules.yml @@ -6,9 +6,7 @@ components/esp_system/test_apps/console: components/esp_system/test_apps/esp_system_unity_tests: disable: - - if: IDF_TARGET == "esp32c5" or (CONFIG_NAME == "psram" and SOC_SPIRAM_SUPPORTED != 1) - temporary: true - reason: C5 not support yet # TODO: [ESP32C5] IDF-8690 + - if: (CONFIG_NAME == "psram" and SOC_SPIRAM_SUPPORTED != 1) components/esp_system/test_apps/linux_apis: enable: diff --git a/components/esp_system/test_apps/esp_system_unity_tests/README.md b/components/esp_system/test_apps/esp_system_unity_tests/README.md index bf47d80ec649..3a502b1f86f4 100644 --- a/components/esp_system/test_apps/esp_system_unity_tests/README.md +++ b/components/esp_system/test_apps/esp_system_unity_tests/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | diff --git a/components/esp_timer/test_apps/.build-test-rules.yml b/components/esp_timer/test_apps/.build-test-rules.yml deleted file mode 100644 index 748bc781b276..000000000000 --- a/components/esp_timer/test_apps/.build-test-rules.yml +++ /dev/null @@ -1,7 +0,0 @@ -# Documentation: .gitlab/ci/README.md#manifest-file-to-control-the-buildtest-apps - -components/esp_timer/test_apps: - disable: - - if: IDF_TARGET == "esp32c5" - temporary: true - reason: C5 not support yet # TODO: [ESP32C5] IDF-8705 diff --git a/components/esp_timer/test_apps/README.md b/components/esp_timer/test_apps/README.md index c75201fb88f7..351f5fdebc72 100644 --- a/components/esp_timer/test_apps/README.md +++ b/components/esp_timer/test_apps/README.md @@ -1,3 +1,3 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | diff --git a/components/freertos/test_apps/.build-test-rules.yml b/components/freertos/test_apps/.build-test-rules.yml index 83c48f535d09..d7bce90918e0 100644 --- a/components/freertos/test_apps/.build-test-rules.yml +++ b/components/freertos/test_apps/.build-test-rules.yml @@ -2,9 +2,9 @@ components/freertos/test_apps/freertos: disable: - - if: IDF_TARGET == "esp32c5" or (CONFIG_NAME == "smp" and IDF_TARGET == "esp32p4") + - if: (CONFIG_NAME == "smp" and IDF_TARGET == "esp32p4") temporary: true - reason: target(s) not supported yet # TODO: [ESP32C5] IDF-8672 + reason: target(s) not supported yet components/freertos/test_apps/orig_inc_path: enable: diff --git a/components/freertos/test_apps/freertos/README.md b/components/freertos/test_apps/freertos/README.md index bf47d80ec649..3a502b1f86f4 100644 --- a/components/freertos/test_apps/freertos/README.md +++ b/components/freertos/test_apps/freertos/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | diff --git a/components/heap/test_apps/.build-test-rules.yml b/components/heap/test_apps/.build-test-rules.yml index a55adfc17640..1e3b8ecd8cf2 100644 --- a/components/heap/test_apps/.build-test-rules.yml +++ b/components/heap/test_apps/.build-test-rules.yml @@ -3,9 +3,6 @@ components/heap/test_apps/heap_tests: disable: - if: IDF_TARGET == "linux" - - if: IDF_TARGET == "esp32c5" - temporary: true - reason: not support yet # TODO: [ESP32C5] IDF-9641 - if: CONFIG_NAME == "psram" and SOC_SPIRAM_SUPPORTED != 1 - if: CONFIG_NAME == "psram_all_ext" and SOC_SPIRAM_SUPPORTED != 1 # These 3 configs are build only for non-nightly, buildig for a single target is sufficient diff --git a/components/heap/test_apps/heap_tests/README.md b/components/heap/test_apps/heap_tests/README.md index 5b39ff96532d..b8fe0d892df8 100644 --- a/components/heap/test_apps/heap_tests/README.md +++ b/components/heap/test_apps/heap_tests/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | \ No newline at end of file +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | \ No newline at end of file From 5b0cf8824af509081c9eccf87dc49c6ddc5b7f2a Mon Sep 17 00:00:00 2001 From: Jakub Kocka Date: Fri, 28 Jun 2024 08:01:30 +0200 Subject: [PATCH 47/73] fix(export): Operator syntax fix for all versions of PowerShell --- export.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/export.ps1 b/export.ps1 index fec71aeca722..d519b2296d91 100644 --- a/export.ps1 +++ b/export.ps1 @@ -38,7 +38,7 @@ foreach ($pair in $envars_array) { $var_val = $pair[1].Trim() # trim spaces on the ends of the val if ($var_name -eq "PATH") { # trim "%PATH%" or "`$PATH" - if ($IsWindows || $Windows) { + if ($IsWindows -or $Windows) { $var_val = $var_val.Trim($S + "%PATH%") } else { $var_val = $var_val.Trim($S + "`$PATH") From 1eaa8288a2fc0598809d58ca188f56bc4fe406af Mon Sep 17 00:00:00 2001 From: "nilesh.kale" Date: Thu, 27 Jun 2024 10:41:38 +0530 Subject: [PATCH 48/73] feat: enable DPA protection for c5 This commit enabled DPA protection for ESP32C5. This reflect updating documentation for C5. --- components/soc/esp32c5/include/soc/Kconfig.soc_caps.in | 4 ++++ components/soc/esp32c5/include/soc/soc_caps.h | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in index 62b05f280d05..57fb90b004ca 100644 --- a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in @@ -839,6 +839,10 @@ config SOC_FLASH_ENCRYPTION_XTS_AES_128 bool default y +config SOC_CRYPTO_DPA_PROTECTION_SUPPORTED + bool + default y + config SOC_UART_NUM int default 3 diff --git a/components/soc/esp32c5/include/soc/soc_caps.h b/components/soc/esp32c5/include/soc/soc_caps.h index 9ae9117a5cc0..5382b59e2cc7 100644 --- a/components/soc/esp32c5/include/soc/soc_caps.h +++ b/components/soc/esp32c5/include/soc/soc_caps.h @@ -482,7 +482,7 @@ #define SOC_FLASH_ENCRYPTION_XTS_AES_128 1 /*------------------------ Anti DPA (Security) CAPS --------------------------*/ -// #define SOC_CRYPTO_DPA_PROTECTION_SUPPORTED 1 +#define SOC_CRYPTO_DPA_PROTECTION_SUPPORTED 1 /*-------------------------- UART CAPS ---------------------------------------*/ // ESP32-C5 has 3 UARTs (2 HP UART, and 1 LP UART) From 513c202db9a7ef0d5eaf70475d4f5ed4ae17876d Mon Sep 17 00:00:00 2001 From: Mahavir Jain Date: Fri, 28 Jun 2024 15:56:05 +0530 Subject: [PATCH 49/73] fix(hal): remove AES LL layer for ESP32-C2 (not supported) --- components/hal/esp32c2/include/hal/aes_ll.h | 191 -------------------- 1 file changed, 191 deletions(-) delete mode 100644 components/hal/esp32c2/include/hal/aes_ll.h diff --git a/components/hal/esp32c2/include/hal/aes_ll.h b/components/hal/esp32c2/include/hal/aes_ll.h deleted file mode 100644 index 2a38421e1b40..000000000000 --- a/components/hal/esp32c2/include/hal/aes_ll.h +++ /dev/null @@ -1,191 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - - -/*************************************************************** - * - * This file needs to be removed. Left here just for passing build - * TODO // TODO: IDF-3844 - ***************************************************************/ -#pragma once - -#include -#include "soc/hwcrypto_reg.h" -#include "hal/aes_types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief State of AES accelerator, busy, idle or done - * - */ -typedef enum { - ESP_AES_STATE_IDLE = 0, /* AES accelerator is idle */ - ESP_AES_STATE_BUSY, /* Transform in progress */ - ESP_AES_STATE_DONE, /* Transform completed */ -} esp_aes_state_t; - - -/** - * @brief Write the encryption/decryption key to hardware - * - * @param key Key to be written to the AES hardware - * @param key_word_len Number of words in the key - * - * @return volatile number of bytes written to hardware, used for fault injection check - */ -static inline uint8_t aes_ll_write_key(const uint8_t *key, size_t key_word_len) -{ - abort(); // TODO: IDF-3844 -} - -/** - * @brief Sets the mode - * - * @param mode ESP_AES_ENCRYPT = 1, or ESP_AES_DECRYPT = 0 - * @param key_bytes Number of bytes in the key - */ -static inline void aes_ll_set_mode(int mode, uint8_t key_bytes) -{ - abort(); // TODO: IDF-3844 -} - -/** - * @brief Writes message block to AES hardware - * - * @param input Block to be written - */ -static inline void aes_ll_write_block(const void *input) -{ - abort(); // TODO: IDF-3844 -} - -/** - * @brief Read the AES block - * - * @param output the output of the transform, length = AES_BLOCK_BYTES - */ -static inline void aes_ll_read_block(void *output) -{ - abort(); // TODO: IDF-3844 -} - -/** - * @brief Starts block transform - * - */ -static inline void aes_ll_start_transform(void) -{ - abort(); // TODO: IDF-3844 -} - - -/** - * @brief Read state of AES accelerator - * - * @return esp_aes_state_t - */ -static inline esp_aes_state_t aes_ll_get_state(void) -{ - abort(); // TODO: IDF-3844 -} - - -/** - * @brief Set mode of operation - * - * @note Only used for DMA transforms - * - * @param mode - */ -static inline void aes_ll_set_block_mode(esp_aes_mode_t mode) -{ - abort(); // TODO: IDF-3844 -} - -/** - * @brief Set AES-CTR counter to INC32 - * - * @note Only affects AES-CTR mode - * - */ -static inline void aes_ll_set_inc(void) -{ - abort(); // TODO: IDF-3844 -} - -/** - * @brief Release the DMA - * - */ -static inline void aes_ll_dma_exit(void) -{ - abort(); // TODO: IDF-3844 -} - -/** - * @brief Sets the number of blocks to be transformed - * - * @note Only used for DMA transforms - * - * @param num_blocks Number of blocks to transform - */ -static inline void aes_ll_set_num_blocks(size_t num_blocks) -{ - abort(); // TODO: IDF-3844 -} - -/* - * Write IV to hardware iv registers - */ -static inline void aes_ll_set_iv(const uint8_t *iv) -{ - abort(); // TODO: IDF-3844 -} - -/* - * Read IV from hardware iv registers - */ -static inline void aes_ll_read_iv(uint8_t *iv) -{ - abort(); // TODO: IDF-3844 -} - -/** - * @brief Enable or disable DMA mode - * - * @param enable true to enable, false to disable. - */ -static inline void aes_ll_dma_enable(bool enable) -{ - abort(); // TODO: IDF-3844 -} - -/** - * @brief Enable or disable transform completed interrupt - * - * @param enable true to enable, false to disable. - */ -static inline void aes_ll_interrupt_enable(bool enable) -{ - abort(); // TODO: IDF-3844 -} - -/** - * @brief Clears the interrupt - * - */ -static inline void aes_ll_interrupt_clear(void) -{ - abort(); // TODO: IDF-3844 -} - - -#ifdef __cplusplus -} -#endif From 3002c08956e40fd130d22c5150089a2dda91235a Mon Sep 17 00:00:00 2001 From: Mahavir Jain Date: Fri, 28 Jun 2024 15:56:38 +0530 Subject: [PATCH 50/73] docs: add C6 flash encryption logs --- docs/zh_CN/security/esp32c6_log.inc | 132 +++++++++++++++++++++++++++- docs/zh_CN/security/esp32h2_log.inc | 129 ++++++++++++++++++++++++++- 2 files changed, 257 insertions(+), 4 deletions(-) diff --git a/docs/zh_CN/security/esp32c6_log.inc b/docs/zh_CN/security/esp32c6_log.inc index 53eb89084ea6..32a13c25c8d7 100644 --- a/docs/zh_CN/security/esp32c6_log.inc +++ b/docs/zh_CN/security/esp32c6_log.inc @@ -1,13 +1,141 @@ .. first_boot_enc -TO BE UPDATED TODO IDF-5932 +.. code-block:: none + + rst:0x1 (POWERON),boot:0xc (SPI_FAST_FLASH_BOOT) + SPIWP:0xee + mode:DIO, clock div:2 + load:0x4086c410,len:0xd5c + load:0x4086e610,len:0x4584 + load:0x40875888,len:0x2bac + entry 0x4086c410 + I (25) boot: ESP-IDF v5.1-dev-4270-g4bff4ed6e5-dirty 2nd stage bootloader + I (25) boot: compile time Mar 27 2023 16:48:49 + I (27) boot: chip revision: v0.0 + I (30) boot.esp32c6: SPI Speed : 40MHz + I (35) boot.esp32c6: SPI Mode : DIO + I (40) boot.esp32c6: SPI Flash Size : 2MB + I (44) boot: Enabling RNG early entropy source... + W (50) bootloader_random: bootloader_random_enable() has not been implemented yet + I (58) boot: Partition Table: + I (62) boot: ## Label Usage Type ST Offset Length + I (69) boot: 0 nvs WiFi data 01 02 0000a000 00006000 + I (76) boot: 1 storage Unknown data 01 ff 00010000 00001000 + I (84) boot: 2 factory factory app 00 00 00020000 00100000 + I (91) boot: 3 nvs_key NVS keys 01 04 00120000 00001000 + I (99) boot: 4 custom_nvs WiFi data 01 02 00121000 00006000 + I (106) boot: End of partition table + I (110) esp_image: segment 0: paddr=00020020 vaddr=42018020 size=090e8h ( 37096) map + I (126) esp_image: segment 1: paddr=00029110 vaddr=40800000 size=06f08h ( 28424) load + I (134) esp_image: segment 2: paddr=00030020 vaddr=42000020 size=12fd8h ( 77784) map + I (151) esp_image: segment 3: paddr=00043000 vaddr=40806f08 size=03c00h ( 15360) load + I (158) boot: Loaded app from partition at offset 0x20000 + I (158) boot: Checking flash encryption... + I (160) efuse: Batch mode of writing fields is enabled + I (165) flash_encrypt: Generating new flash encryption key... + I (174) efuse: Writing EFUSE_BLK_KEY0 with purpose 4 + W (178) flash_encrypt: Not disabling UART bootloader encryption + I (184) flash_encrypt: Disable UART bootloader cache... + I (190) flash_encrypt: Disable JTAG... + I (197) efuse: BURN BLOCK4 + I (204) efuse: BURN BLOCK4 - OK (write block == read block) + I (206) efuse: BURN BLOCK0 + I (212) efuse: BURN BLOCK0 - OK (all write block bits are set) + I (216) efuse: Batch mode. Prepared fields are committed + I (222) esp_image: segment 0: paddr=00000020 vaddr=4086c410 size=00d5ch ( 3420) + I (231) esp_image: segment 1: paddr=00000d84 vaddr=4086e610 size=04584h ( 17796) + I (240) esp_image: segment 2: paddr=00005310 vaddr=40875888 size=02bach ( 11180) + I (632) flash_encrypt: bootloader encrypted successfully + I (679) flash_encrypt: partition table encrypted and loaded successfully + I (680) flash_encrypt: Encrypting partition 1 at offset 0x10000 (length 0x1000)... + I (732) flash_encrypt: Done encrypting + I (732) esp_image: segment 0: paddr=00020020 vaddr=42018020 size=090e8h ( 37096) map + I (741) esp_image: segment 1: paddr=00029110 vaddr=40800000 size=06f08h ( 28424) + I (747) esp_image: segment 2: paddr=00030020 vaddr=42000020 size=12fd8h ( 77784) map + I (765) esp_image: segment 3: paddr=00043000 vaddr=40806f08 size=03c00h ( 15360) + I (769) flash_encrypt: Encrypting partition 2 at offset 0x20000 (length 0x100000)... + I (13025) flash_encrypt: Done encrypting + I (13025) flash_encrypt: Encrypting partition 3 at offset 0x120000 (length 0x1000)... + I (13074) flash_encrypt: Done encrypting + I (13075) efuse: BURN BLOCK0 + I (13077) efuse: BURN BLOCK0 - OK (all write block bits are set) + I (13078) flash_encrypt: Flash encryption completed + I (13083) boot: Resetting with flash encryption enabled... + ------ .. already_en_enc +.. code-block:: none + + rst:0x3 (LP_SW_HPSYS),boot:0xc (SPI_FAST_FLASH_BOOT) + Saved PC:0x4001974a + SPIWP:0xee + mode:DIO, clock div:2 + load:0x4086c410,len:0xd5c + load:0x4086e610,len:0x4584 + load:0x40875888,len:0x2bac + entry 0x4086c410 + I (24) boot: ESP-IDF v5.1-dev-4270-g4bff4ed6e5-dirty 2nd stage bootloader + I (24) boot: compile time Mar 27 2023 16:48:49 + I (25) boot: chip revision: v0.0 + I (29) boot.esp32c6: SPI Speed : 40MHz + I (34) boot.esp32c6: SPI Mode : DIO + I (39) boot.esp32c6: SPI Flash Size : 2MB + I (43) boot: Enabling RNG early entropy source... + W (49) bootloader_random: bootloader_random_enable() has not been implemented yet + I (57) boot: Partition Table: + I (60) boot: ## Label Usage Type ST Offset Length + I (68) boot: 0 nvs WiFi data 01 02 0000a000 00006000 + I (75) boot: 1 storage Unknown data 01 ff 00010000 00001000 + I (83) boot: 2 factory factory app 00 00 00020000 00100000 + I (90) boot: 3 nvs_key NVS keys 01 04 00120000 00001000 + I (98) boot: 4 custom_nvs WiFi data 01 02 00121000 00006000 + I (105) boot: End of partition table + I (109) esp_image: segment 0: paddr=00020020 vaddr=42018020 size=090e8h ( 37096) map + I (126) esp_image: segment 1: paddr=00029110 vaddr=40800000 size=06f08h ( 28424) load + I (134) esp_image: segment 2: paddr=00030020 vaddr=42000020 size=12fd8h ( 77784) map + I (152) esp_image: segment 3: paddr=00043000 vaddr=40806f08 size=03c00h ( 15360) load + I (159) boot: Loaded app from partition at offset 0x20000 + I (159) boot: Checking flash encryption... + I (160) flash_encrypt: flash encryption is enabled (1 plaintext flashes left) + I (168) boot: Disabling RNG early entropy source... + W (173) bootloader_random: bootloader_random_enable() has not been implemented yet + I (193) cpu_start: Pro cpu up. + W (202) clk: esp_perip_clk_init() has not been implemented yet + I (208) cpu_start: Pro cpu start user code + I (209) cpu_start: cpu freq: 160000000 Hz + I (209) cpu_start: Application information: + I (211) cpu_start: Project name: flash_encryption + I (217) cpu_start: App version: v5.1-dev-4270-g4bff4ed6e5-dirty + I (224) cpu_start: Compile time: Mar 27 2023 16:49:00 + I (230) cpu_start: ELF file SHA256: df1dd35054510e16... + I (236) cpu_start: ESP-IDF: v5.1-dev-4270-g4bff4ed6e5-dirty + I (243) cpu_start: Min chip rev: v0.0 + I (248) cpu_start: Max chip rev: v0.99 + I (253) cpu_start: Chip rev: v0.0 + I (258) heap_init: Initializing. RAM available for dynamic allocation: + I (265) heap_init: At 4080B9E0 len 00070C30 (451 KiB): D/IRAM + I (271) heap_init: At 4087C610 len 00002F54 (11 KiB): STACK/DIRAM + I (278) heap_init: At 50000010 len 00003FF0 (15 KiB): RTCRAM + I (285) spi_flash: detected chip: generic + I (289) spi_flash: flash io: dio + W (293) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header. + W (306) flash_encrypt: Flash encryption mode is DEVELOPMENT (not secure) + I (314) sleep: Configure to isolate all GPIO pins in sleep state + I (320) sleep: Enable automatic switching of GPIO sleep configuration + I (327) coexist: coex firmware version: 5315623 + I (333) coexist: coexist rom version 5b8dcfa + I (338) app_start: Starting scheduler on CPU0 + I (342) main_task: Started on CPU0 + I (342) main_task: Calling app_main() + + Example to check Flash Encryption status + This is esp32c6 chip with 1 CPU core(s), WiFi/BLE, silicon revision v0.0, 2MB external flash + FLASH_CRYPT_CNT eFuse value is 1 + Flash encryption feature is enabled in DEVELOPMENT mode -TO BE UPDATED TODO IDF-5932 ------ diff --git a/docs/zh_CN/security/esp32h2_log.inc b/docs/zh_CN/security/esp32h2_log.inc index d05109d0d990..bb93f6ffc54c 100644 --- a/docs/zh_CN/security/esp32h2_log.inc +++ b/docs/zh_CN/security/esp32h2_log.inc @@ -1,13 +1,138 @@ .. first_boot_enc -TO BE UPDATED +.. code-block:: none + + rst:0x1 (POWERON),boot:0xc (SPI_FAST_FLASH_BOOT) + SPIWP:0xee + mode:DIO, clock div:1 + load:0x4083cfd0,len:0xc0c + load:0x4083efd0,len:0x45c0 + load:0x40846248,len:0x2b48 + entry 0x4083cfd0 + I (25) boot: ESP-IDF v5.1-dev-4270-g4bff4ed6e5 2nd stage bootloader + I (25) boot: compile time Mar 27 2023 16:40:47 + I (26) boot: chip revision: v0.0 + I (29) boot.esp32h2: SPI Speed : 64MHz + I (34) boot.esp32h2: SPI Mode : DIO + I (39) boot.esp32h2: SPI Flash Size : 2MB + I (44) boot: Enabling RNG early entropy source... + W (49) bootloader_random: bootloader_random_enable() has not been implemented yet + I (57) boot: Partition Table: + I (61) boot: ## Label Usage Type ST Offset Length + I (68) boot: 0 nvs WiFi data 01 02 0000a000 00006000 + I (76) boot: 1 storage Unknown data 01 ff 00010000 00001000 + I (83) boot: 2 factory factory app 00 00 00020000 00100000 + I (90) boot: 3 nvs_key NVS keys 01 04 00120000 00001000 + I (98) boot: 4 custom_nvs WiFi data 01 02 00121000 00006000 + I (106) boot: End of partition table + I (110) esp_image: segment 0: paddr=00020020 vaddr=42020020 size=096e0h ( 38624) map + I (128) esp_image: segment 1: paddr=00029708 vaddr=40800000 size=06910h ( 26896) load + I (135) esp_image: segment 2: paddr=00030020 vaddr=42000020 size=1b708h (112392) map + I (163) esp_image: segment 3: paddr=0004b730 vaddr=40806910 size=02a08h ( 10760) load + I (167) esp_image: segment 4: paddr=0004e140 vaddr=40809320 size=00e5ch ( 3676) load + I (172) boot: Loaded app from partition at offset 0x20000 + I (175) boot: Checking flash encryption... + I (180) efuse: Batch mode of writing fields is enabled + I (186) flash_encrypt: Generating new flash encryption key... + I (194) efuse: Writing EFUSE_BLK_KEY0 with purpose 4 + W (198) flash_encrypt: Not disabling UART bootloader encryption + I (204) flash_encrypt: Disable JTAG... + I (212) efuse: BURN BLOCK4 + I (219) efuse: BURN BLOCK4 - OK (write block == read block) + I (221) efuse: BURN BLOCK0 + I (227) efuse: BURN BLOCK0 - OK (write block == read block) + I (231) efuse: Batch mode. Prepared fields are committed + I (236) esp_image: segment 0: paddr=00000020 vaddr=4083cfd0 size=00c0ch ( 3084) + I (245) esp_image: segment 1: paddr=00000c34 vaddr=4083efd0 size=045c0h ( 17856) + I (255) esp_image: segment 2: paddr=000051fc vaddr=40846248 size=02b48h ( 11080) + I (381) flash_encrypt: bootloader encrypted successfully + I (396) flash_encrypt: partition table encrypted and loaded successfully + I (397) flash_encrypt: Encrypting partition 1 at offset 0x10000 (length 0x1000)... + I (411) flash_encrypt: Done encrypting + I (412) esp_image: segment 0: paddr=00020020 vaddr=42020020 size=096e0h ( 38624) map + I (423) esp_image: segment 1: paddr=00029708 vaddr=40800000 size=06910h ( 26896) + I (430) esp_image: segment 2: paddr=00030020 vaddr=42000020 size=1b708h (112392) map + I (458) esp_image: segment 3: paddr=0004b730 vaddr=40806910 size=02a08h ( 10760) + I (461) esp_image: segment 4: paddr=0004e140 vaddr=40809320 size=00e5ch ( 3676) + I (464) flash_encrypt: Encrypting partition 2 at offset 0x20000 (length 0x100000)... + I (3600) flash_encrypt: Done encrypting + I (3600) flash_encrypt: Encrypting partition 3 at offset 0x120000 (length 0x1000)... + I (3612) flash_encrypt: Done encrypting + I (3613) efuse: BURN BLOCK0 + I (3616) efuse: BURN BLOCK0 - OK (all write block bits are set) + I (3617) flash_encrypt: Flash encryption completed + I (3622) boot: Resetting with flash encryption enabled... + ------ .. already_en_enc +.. code-block:: none + + rst:0x3 (LP_SW_HPSYS),boot:0xc (SPI_FAST_FLASH_BOOT) + Saved PC:0x400031a6 + SPIWP:0xee + mode:DIO, clock div:1 + load:0x4083cfd0,len:0xc0c + load:0x4083efd0,len:0x45c0 + load:0x40846248,len:0x2b48 + entry 0x4083cfd0 + I (27) boot: ESP-IDF v5.1-dev-4270-g4bff4ed6e5 2nd stage bootloader + I (28) boot: compile time Mar 27 2023 16:40:47 + I (28) boot: chip revision: v0.0 + I (32) boot.esp32h2: SPI Speed : 64MHz + I (37) boot.esp32h2: SPI Mode : DIO + I (41) boot.esp32h2: SPI Flash Size : 2MB + I (46) boot: Enabling RNG early entropy source... + W (51) bootloader_random: bootloader_random_enable() has not been implemented yet + I (60) boot: Partition Table: + I (63) boot: ## Label Usage Type ST Offset Length + I (71) boot: 0 nvs WiFi data 01 02 0000a000 00006000 + I (78) boot: 1 storage Unknown data 01 ff 00010000 00001000 + I (86) boot: 2 factory factory app 00 00 00020000 00100000 + I (93) boot: 3 nvs_key NVS keys 01 04 00120000 00001000 + I (100) boot: 4 custom_nvs WiFi data 01 02 00121000 00006000 + I (108) boot: End of partition table + I (112) esp_image: segment 0: paddr=00020020 vaddr=42020020 size=096e0h ( 38624) map + I (131) esp_image: segment 1: paddr=00029708 vaddr=40800000 size=06910h ( 26896) load + I (140) esp_image: segment 2: paddr=00030020 vaddr=42000020 size=1b708h (112392) map + I (171) esp_image: segment 3: paddr=0004b730 vaddr=40806910 size=02a08h ( 10760) load + I (175) esp_image: segment 4: paddr=0004e140 vaddr=40809320 size=00e5ch ( 3676) load + I (180) boot: Loaded app from partition at offset 0x20000 + I (183) boot: Checking flash encryption... + I (188) flash_encrypt: flash encryption is enabled (1 plaintext flashes left) + I (195) boot: Disabling RNG early entropy source... + W (201) bootloader_random: bootloader_random_disable() has not been implemented yet + I (221) cpu_start: Pro cpu up. + W (229) clk: esp_perip_clk_init() has not been implemented yet + I (236) cpu_start: Pro cpu start user code + I (236) cpu_start: cpu freq: 96000000 Hz + I (237) cpu_start: Application information: + I (239) cpu_start: Project name: flash_encryption + I (245) cpu_start: App version: v5.1-dev-4270-g4bff4ed6e5 + I (251) cpu_start: Compile time: Mar 27 2023 16:40:56 + I (257) cpu_start: ELF file SHA256: 42c8d825941d8050... + I (263) cpu_start: ESP-IDF: v5.1-dev-4270-g4bff4ed6e5 + I (270) cpu_start: Min chip rev: v0.0 + I (274) cpu_start: Max chip rev: v0.99 + I (279) cpu_start: Chip rev: v0.0 + I (284) heap_init: Initializing. RAM available for dynamic allocation: + I (291) heap_init: At 4080B010 len 00042370 (264 KiB): D/IRAM + I (298) heap_init: At 4084D380 len 00002B60 (10 KiB): STACK/DIRAM + I (305) spi_flash: detected chip: generic + I (309) spi_flash: flash io: dio + W (313) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header. + W (326) flash_encrypt: Flash encryption mode is DEVELOPMENT (not secure) + I (334) app_start: Starting scheduler on CPU0 + I (339) main_task: Started on CPU0 + I (339) main_task: Calling app_main() + + Example to check Flash Encryption status + This is esp32h2 chip with 1 CPU core(s), WiFi/BLE, silicon revision v0.0, 2MB external flash + FLASH_CRYPT_CNT eFuse value is 1 + Flash encryption feature is enabled in DEVELOPMENT mode -TO BE UPDATED ------ From 832c3f265a8cdcdad000abeeb4856468c03ee085 Mon Sep 17 00:00:00 2001 From: Jan Beran Date: Fri, 28 Jun 2024 10:06:38 +0200 Subject: [PATCH 51/73] fix: Generate secure keys in project dir instead of build dir --- tools/idf_py_actions/serial_ext.py | 4 ++-- tools/test_idf_py/test_idf_py.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tools/idf_py_actions/serial_ext.py b/tools/idf_py_actions/serial_ext.py index 464ae6a3bbd3..983731560f38 100644 --- a/tools/idf_py_actions/serial_ext.py +++ b/tools/idf_py_actions/serial_ext.py @@ -387,7 +387,7 @@ def secure_generate_flash_encryption_key(action: str, ctx: click.core.Context, a generate_flash_encryption_key_args += ['--keylen', keylen] if extra_args['keyfile']: generate_flash_encryption_key_args += [extra_args['keyfile']] - RunTool('espsecure', generate_flash_encryption_key_args, args.build_dir)() + RunTool('espsecure', generate_flash_encryption_key_args, args.project_dir)() def secure_generate_signing_key(action: str, ctx: click.core.Context, args: PropertyDict, version: str, scheme: str, **extra_args: str) -> None: ensure_build_directory(args, ctx.info_name) @@ -406,7 +406,7 @@ def secure_generate_signing_key(action: str, ctx: click.core.Context, args: Prop generate_signing_key_args += ['--scheme', scheme] if extra_args['keyfile']: generate_signing_key_args += [extra_args['keyfile']] - RunTool('espsecure', generate_signing_key_args, args.build_dir)() + RunTool('espsecure', generate_signing_key_args, args.project_dir)() def secure_sign_data(action: str, ctx: click.core.Context, diff --git a/tools/test_idf_py/test_idf_py.py b/tools/test_idf_py/test_idf_py.py index e10465174807..7d99776056e1 100755 --- a/tools/test_idf_py/test_idf_py.py +++ b/tools/test_idf_py/test_idf_py.py @@ -467,7 +467,7 @@ def secure_encrypt_flash_data(self): 'secure-encrypt-flash-data', '--aes-xts', '--keyfile', - f'{self.flash_encryption_key}', + f'../{self.flash_encryption_key}', '--address', '0x1000', '--output', @@ -484,7 +484,7 @@ def test_secure_decrypt_flash_data(self): 'secure-decrypt-flash-data', '--aes-xts', '--keyfile', - f'{self.flash_encryption_key}', + f'../{self.flash_encryption_key}', '--address', '0x1000', '--output', @@ -515,7 +515,7 @@ def secure_sign_data(self): '--version', '2', '--keyfile', - self.signing_key, + f'../{self.signing_key}', '--output', 'bootloader-signed.bin', 'bootloader/bootloader.bin'] From 3cfc7b1ec98319bc3134943a4e8542b84e2b19be Mon Sep 17 00:00:00 2001 From: Rahul Tank Date: Fri, 28 Jun 2024 18:35:12 +0530 Subject: [PATCH 52/73] fix(nimble): Added debug print to check for skipped adv report --- components/bt/host/nimble/esp-hci/src/esp_nimble_hci.c | 1 + 1 file changed, 1 insertion(+) diff --git a/components/bt/host/nimble/esp-hci/src/esp_nimble_hci.c b/components/bt/host/nimble/esp-hci/src/esp_nimble_hci.c index 605b831211cd..4fa8a1090b8a 100644 --- a/components/bt/host/nimble/esp-hci/src/esp_nimble_hci.c +++ b/components/bt/host/nimble/esp-hci/src/esp_nimble_hci.c @@ -217,6 +217,7 @@ static int host_rcv_pkt(uint8_t *data, uint16_t len) evbuf = ble_transport_alloc_evt(1); /* Skip advertising report if we're out of memory */ if (!evbuf) { + ESP_LOGI(TAG, "Skipping advertising report due to low memory"); return 0; } } else { From e5fcc2d315e6e2c09b1a269013271b1a415189e9 Mon Sep 17 00:00:00 2001 From: Aditya Patwardhan Date: Sat, 8 Jun 2024 18:41:52 +0530 Subject: [PATCH 53/73] fix(hal): Fixed crypto test app Previously the crypto test app was not verifying that the no of failures is 0. Added the check to verify that --- components/hal/test_apps/crypto/pytest_crypto.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/components/hal/test_apps/crypto/pytest_crypto.py b/components/hal/test_apps/crypto/pytest_crypto.py index d988e8eb6d55..462587ecdbe9 100644 --- a/components/hal/test_apps/crypto/pytest_crypto.py +++ b/components/hal/test_apps/crypto/pytest_crypto.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 import os @@ -13,6 +13,11 @@ def test_crypto(dut: Dut) -> None: # as tests for efuses burning security peripherals would be run timeout = 600 if os.environ.get('IDF_ENV_FPGA') else 60 + test_numbers = dut.expect(r'(\d+) Tests (\d+) Failures (\d+) Ignored', timeout=timeout) + failures = test_numbers.group(2).decode() + ignored = test_numbers.group(3).decode() + assert failures == '0', f'No of failures must be 0 (is {failures})' + assert ignored == '0', f'No of Ignored test must be 0 (is {ignored})' dut.expect('Tests finished', timeout=timeout) From 79b21fb624982c31f26674ba6a13a11aa6aff656 Mon Sep 17 00:00:00 2001 From: Aditya Patwardhan Date: Wed, 13 Mar 2024 13:10:47 +0530 Subject: [PATCH 54/73] feat(hal): Add crypto tests for key manager Added test to verify exporting of ECDSA public key Added test to verify XTS_AES in random mode Added pytest test case for testing ECDH0 mode for XTS_128 and XTS_256 key Add test for ECDSA key in ECDH0 mode Update the key manager hal based tests Update key manager tests to add ECDH0 workflow --- .../hal/test_apps/crypto/main/CMakeLists.txt | 8 +- .../hal/test_apps/crypto/main/app_main.c | 4 + .../test_apps/crypto/main/ecdsa/test_ecdsa.c | 47 +-- .../key_manager/gen_key_manager_test_cases.py | 257 ++++++++++++ .../main/key_manager/key_manager_test_cases.h | 87 ++++ .../main/key_manager/test_key_manager.c | 374 ++++++++++++++++++ .../hal/test_apps/crypto/pytest_crypto.py | 138 ++++++- 7 files changed, 890 insertions(+), 25 deletions(-) create mode 100644 components/hal/test_apps/crypto/main/key_manager/gen_key_manager_test_cases.py create mode 100644 components/hal/test_apps/crypto/main/key_manager/key_manager_test_cases.h create mode 100644 components/hal/test_apps/crypto/main/key_manager/test_key_manager.c diff --git a/components/hal/test_apps/crypto/main/CMakeLists.txt b/components/hal/test_apps/crypto/main/CMakeLists.txt index 3f7585a3aaf0..c9644c852e9d 100644 --- a/components/hal/test_apps/crypto/main/CMakeLists.txt +++ b/components/hal/test_apps/crypto/main/CMakeLists.txt @@ -21,6 +21,12 @@ if(CONFIG_SOC_ECDSA_SUPPORTED) list(APPEND srcs "ecdsa/test_ecdsa.c") endif() +if(CONFIG_SOC_KEY_MANAGER_SUPPORTED) + list(APPEND srcs "key_manager/test_key_manager.c" + "$ENV{IDF_PATH}/components/esp_hw_support/esp_key_mgr.c") + list(APPEND priv_include_dirs "$ENV{IDF_PATH}/components/esp_hw_support/include") +endif() + if(CONFIG_SOC_AES_SUPPORTED) list(APPEND srcs "aes/test_aes.c" "$ENV{IDF_PATH}/components/mbedtls/port/aes/esp_aes_common.c" @@ -68,7 +74,7 @@ if(CONFIG_SOC_SHA_SUPPORTED) endif() idf_component_register(SRCS ${srcs} - PRIV_REQUIRES efuse mbedtls esp_mm bootloader_support + PRIV_REQUIRES efuse mbedtls esp_mm bootloader_support spi_flash REQUIRES test_utils unity WHOLE_ARCHIVE PRIV_INCLUDE_DIRS "${priv_include_dirs}" diff --git a/components/hal/test_apps/crypto/main/app_main.c b/components/hal/test_apps/crypto/main/app_main.c index 6708b7a76858..460445a343a5 100644 --- a/components/hal/test_apps/crypto/main/app_main.c +++ b/components/hal/test_apps/crypto/main/app_main.c @@ -30,6 +30,10 @@ static void run_all_tests(void) #endif /* !CONFIG_SOC_SHA_SUPPORT_PARALLEL_ENG*/ #endif +#if CONFIG_SOC_KEY_MANAGER_SUPPORTED + RUN_TEST_GROUP(key_manager); +#endif + #if CONFIG_IDF_ENV_FPGA #if CONFIG_SOC_HMAC_SUPPORTED && CONFIG_CRYPTO_TEST_APP_ENABLE_HMAC_TESTS diff --git a/components/hal/test_apps/crypto/main/ecdsa/test_ecdsa.c b/components/hal/test_apps/crypto/main/ecdsa/test_ecdsa.c index 2a7e1d4239bf..343304bd77a6 100644 --- a/components/hal/test_apps/crypto/main/ecdsa/test_ecdsa.c +++ b/components/hal/test_apps/crypto/main/ecdsa/test_ecdsa.c @@ -72,7 +72,7 @@ static void ecc_be_to_le(const uint8_t* be_point, uint8_t *le_point, uint8_t len } } -static int test_ecdsa_verify(bool is_p256, uint8_t* sha, uint8_t* r_le, uint8_t* s_le, uint8_t *pub_x, uint8_t *pub_y) +int test_ecdsa_verify(bool is_p256, uint8_t* sha, uint8_t* r_le, uint8_t* s_le, uint8_t *pub_x, uint8_t *pub_y) { uint16_t len; uint8_t sha_le[32]; @@ -139,7 +139,7 @@ static void test_ecdsa_corrupt_data(bool is_p256, uint8_t* sha, uint8_t* r_le, u } -static void test_ecdsa_sign(bool is_p256, uint8_t* sha, uint8_t* r_le, uint8_t* s_le, bool use_km_key, ecdsa_sign_type_t k_type) +void test_ecdsa_sign(bool is_p256, uint8_t* sha, uint8_t* r_le, uint8_t* s_le, bool use_km_key, ecdsa_sign_type_t k_type) { uint8_t sha_le[32] = {0}; uint8_t zeroes[32] = {0}; @@ -201,7 +201,7 @@ static void test_ecdsa_sign(bool is_p256, uint8_t* sha, uint8_t* r_le, uint8_t* ecdsa_disable(); } -static void test_ecdsa_sign_and_verify(bool is_p256, uint8_t* sha, uint8_t* pub_x, uint8_t* pub_y, bool use_km_key, ecdsa_sign_type_t k_type) +void test_ecdsa_sign_and_verify(bool is_p256, uint8_t* sha, uint8_t* pub_x, uint8_t* pub_y, bool use_km_key, ecdsa_sign_type_t k_type) { uint8_t r_le[32] = {0}; uint8_t s_le[32] = {0}; @@ -211,13 +211,10 @@ static void test_ecdsa_sign_and_verify(bool is_p256, uint8_t* sha, uint8_t* pub_ } #ifdef SOC_ECDSA_SUPPORT_EXPORT_PUBKEY -static void test_ecdsa_export_pubkey(bool is_p256, bool use_km_key) +void test_ecdsa_export_pubkey_inner(bool is_p256, uint8_t *exported_pub_x, uint8_t *exported_pub_y, bool use_km_key, uint16_t *len) { - uint8_t pub_x[32] = {0}; - uint8_t pub_y[32] = {0}; - uint8_t zeroes[32] = {0}; - uint16_t len; + uint8_t zeroes[32] = {0}; ecdsa_hal_config_t conf = { .mode = ECDSA_MODE_EXPORT_PUBKEY, .use_km_key = use_km_key, @@ -228,13 +225,13 @@ static void test_ecdsa_export_pubkey(bool is_p256, bool use_km_key) if (use_km_key == 0) { conf.efuse_key_blk = EFUSE_BLK_KEY0 + ECDSA_KEY_BLOCK_2; } - len = 32; + *len = 32; } else { conf.curve = ECDSA_CURVE_SECP192R1; if (use_km_key == 0) { conf.efuse_key_blk = EFUSE_BLK_KEY0 + ECDSA_KEY_BLOCK_1; } - len = 24; + *len = 24; } ecdsa_enable_and_reset(); @@ -242,24 +239,28 @@ static void test_ecdsa_export_pubkey(bool is_p256, bool use_km_key) bool process_again = false; do { - ecdsa_hal_export_pubkey(&conf, pub_x, pub_y, len); + ecdsa_hal_export_pubkey(&conf, exported_pub_x, exported_pub_y, *len); process_again = !ecdsa_hal_get_operation_result() - || !memcmp(pub_x, zeroes, len) - || !memcmp(pub_y, zeroes, len); + || !memcmp(exported_pub_x, zeroes, *len) + || !memcmp(exported_pub_y, zeroes, *len); } while (process_again); - if (is_p256) { - TEST_ASSERT_EQUAL_HEX8_ARRAY(ecdsa256_pub_x, pub_x, len); - TEST_ASSERT_EQUAL_HEX8_ARRAY(ecdsa256_pub_y, pub_y, len); - } else { - TEST_ASSERT_EQUAL_HEX8_ARRAY(ecdsa192_pub_x, pub_x, len); - TEST_ASSERT_EQUAL_HEX8_ARRAY(ecdsa192_pub_y, pub_y, len); - } - ecdsa_disable(); } + +void test_ecdsa_export_pubkey(bool is_p256, uint8_t *ecdsa_pub_x, uint8_t *ecdsa_pub_y, bool use_km_key) +{ + uint8_t pub_x[32] = {0}; + uint8_t pub_y[32] = {0}; + uint16_t len; + test_ecdsa_export_pubkey_inner(is_p256, pub_x, pub_y, use_km_key, &len); + + TEST_ASSERT_EQUAL_HEX8_ARRAY(ecdsa_pub_x, pub_x, len); + TEST_ASSERT_EQUAL_HEX8_ARRAY(ecdsa_pub_y, pub_y, len); + +} #endif /* SOC_ECDSA_SUPPORT_EXPORT_PUBKEY */ @@ -322,12 +323,12 @@ TEST(ecdsa, ecdsa_SECP256R1_det_sign_and_verify) #ifdef SOC_ECDSA_SUPPORT_EXPORT_PUBKEY TEST(ecdsa, ecdsa_SECP192R1_export_pubkey) { - test_ecdsa_export_pubkey(0, 0); + test_ecdsa_export_pubkey(0, ecdsa192_pub_x, ecdsa192_pub_y, 0); } TEST(ecdsa, ecdsa_SECP256R1_export_pubkey) { - test_ecdsa_export_pubkey(1, 0); + test_ecdsa_export_pubkey(1, ecdsa256_pub_x, ecdsa256_pub_y, 0); } #endif /* SOC_ECDSA_SUPPORT_EXPORT_PUBKEY */ diff --git a/components/hal/test_apps/crypto/main/key_manager/gen_key_manager_test_cases.py b/components/hal/test_apps/crypto/main/key_manager/gen_key_manager_test_cases.py new file mode 100644 index 000000000000..fb2419e716b7 --- /dev/null +++ b/components/hal/test_apps/crypto/main/key_manager/gen_key_manager_test_cases.py @@ -0,0 +1,257 @@ +# SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: Unlicense OR CC0-1.0 +import os +import struct +from typing import Any + +from cryptography.hazmat.backends import default_backend +from cryptography.hazmat.primitives import serialization +from cryptography.hazmat.primitives.asymmetric import ec +from cryptography.hazmat.primitives.ciphers import algorithms +from cryptography.hazmat.primitives.ciphers import Cipher +from cryptography.hazmat.primitives.ciphers import modes +from ecdsa.curves import NIST256p + +# Constants +TEST_COUNT = 5 + + +# Helper functions +def generate_random_key(size: int = 32) -> bytes: + return os.urandom(size) + + +def save_key_to_file(key: bytes, filename: str) -> None: + with open(filename, 'wb') as file: + file.write(key) + + +def key_from_file_or_generate(filename: str, size: int = 32) -> bytes: + if not os.path.exists(filename): + key = generate_random_key(size) + save_key_to_file(key, filename) + + with open(filename, 'rb') as file: + return file.read() + + +def key_to_c_format(key: bytes) -> str: + return ', '.join([f'0x{byte:02x}' for byte in key]) + + +def calculate_aes_cipher(data: bytes, key: bytes) -> Any: + cipher = Cipher(algorithms.AES(key), modes.ECB(), backend=default_backend()) + encryptor = cipher.encryptor() + return encryptor.update(data) + encryptor.finalize() + + +def _flash_encryption_operation_aes_xts(input_data: bytes, flash_address: int, key: bytes, do_decrypt: bool = False) -> bytes: + backend = default_backend() + + indata = input_data + + pad_left = flash_address % 0x80 + indata = (b'\x00' * pad_left) + indata + + pad_right = (0x80 - (len(indata) % 0x80)) % 0x80 + indata += (b'\x00' * pad_right) + + inblocks = [indata[i:i + 0x80] for i in range(0, len(indata), 0x80)] + + output = b'' + for inblock in inblocks: + tweak = struct.pack(' list: + xts_test_data = [] + plaintext_data = bytes(range(1, 129)) + data_size = 16 + flash_address = base_flash_address + for i in range(TEST_COUNT): + data_size = (data_size * 2) % 256 + if (data_size < 16): + data_size = 16 + input_data = plaintext_data[:data_size] + flash_address = base_flash_address + (i * 0x100) + + ciphertext = _flash_encryption_operation_aes_xts(input_data, flash_address, key) + xts_test_data.append((data_size, flash_address, ciphertext[:data_size])) + return xts_test_data + + +def generate_ecdsa_256_key_and_pub_key(filename: str) -> tuple: + with open(filename, 'rb') as f: + private_number = int.from_bytes(f.read(), byteorder='big') + + private_key = ec.derive_private_key(private_number, ec.SECP256R1()) + pem = private_key.private_bytes( + encoding=serialization.Encoding.PEM, + format=serialization.PrivateFormat.TraditionalOpenSSL, + encryption_algorithm=serialization.NoEncryption() + ) + + with open('ecdsa_256_key.pem', 'wb') as pem_file: + pem_file.write(pem) + + public_key = private_key.public_key() + pub_numbers = public_key.public_numbers() + pubx = pub_numbers.x.to_bytes(32, byteorder='little') + puby = pub_numbers.y.to_bytes(32, byteorder='little') + + return pubx, puby + + +def perform_ecc_point_multiplication(k1_int: int) -> Any: + generator = NIST256p.generator.to_affine() + k1_G = k1_int * generator + return k1_G + + +def generate_k1_G(key_file_path: str) -> tuple: + k1_G = [] + if os.path.exists(key_file_path): + with open(key_file_path, 'rb') as key_file: + k1_bytes = key_file.read() + + k1_int = int.from_bytes(k1_bytes, byteorder='big') + k1_G_point = perform_ecc_point_multiplication(k1_int) + k1_G = k1_G_point.to_bytes()[:64] + + k1_G = k1_G[::-1] + k1_G_x = k1_G[:32] + k1_G_y = k1_G[32:] + k1_G = k1_G_y + k1_G_x + + return k1_G, k1_G + + +def write_to_c_header(init_key: bytes, k1: bytes, k2_info: bytes, k1_encrypted_32: list, + test_data_xts_aes_128: list, k1_encrypted_64: list, + xts_test_data_xts_aes_256: list, pubx: bytes, + puby: bytes, k1_G_0: bytes, k1_G_1: bytes) -> None: + with open('key_manager_test_cases.h', 'w') as file: + header_content = """#include + +#define TEST_COUNT 5 + +typedef struct test_xts_data { + uint16_t data_size; + uint32_t data_offset; + uint8_t ciphertext[128]; +} test_xts_data_t; + +typedef struct test_ecdsa_data { + uint8_t pubx[32]; + uint8_t puby[32]; +} test_ecdsa_data_t; + +typedef struct test_data { + uint8_t init_key[32]; + uint8_t k2_info[64]; + uint8_t k1_encrypted[2][32]; // For both 256-bit and 512-bit keys + uint8_t plaintext_data[128]; + test_xts_data_t xts_test_data[TEST_COUNT]; + test_ecdsa_data_t ecdsa_test_data; +} test_data_aes_mode_t; + +typedef struct test_data_ecdh0 { + uint8_t plaintext_data[128]; + uint8_t k1[2][32]; + uint8_t k1_G[2][64]; +} test_data_ecdh0_mode_t; + +// For 32-byte k1 key +test_data_aes_mode_t test_data_xts_aes_128 = { + .init_key = { %s }, + .k2_info = { %s }, + .k1_encrypted = { { %s }, { } }, + .plaintext_data = { %s }, + .xts_test_data = { +""" % (key_to_c_format(init_key), key_to_c_format(k2_info), key_to_c_format(k1_encrypted_32[0]), key_to_c_format(bytes(range(1, 129)))) + + for data_size, flash_address, ciphertext in test_data_xts_aes_128: + header_content += f'\t\t{{.data_size = {data_size}, .data_offset = 0x{flash_address:x}, .ciphertext = {{{key_to_c_format(ciphertext)}}}}},\n' + header_content += '\t}\n};\n\n' + + # For 64-byte k1 key + header_content += '// For 64-byte k1 key\n' + header_content += 'test_data_aes_mode_t test_data_xts_aes_256 = {\n' + header_content += f'\t.init_key = {{{key_to_c_format(init_key)}}},\n' + header_content += f'\t.k2_info = {{{key_to_c_format(k2_info)}}},\n' + header_content += f'\t.k1_encrypted = {{{{{key_to_c_format(k1_encrypted_64[0])}}}, {{{key_to_c_format(k1_encrypted_64[1])}}}}},\n' + header_content += f'\t.plaintext_data = {{{key_to_c_format(bytes(range(1, 129)))}}},\n' + header_content += ' .xts_test_data = {\n' + + for data_size, flash_address, ciphertext in xts_test_data_xts_aes_256: + header_content += f' {{.data_size = {data_size}, .data_offset = 0x{flash_address:x}, .ciphertext = {{{key_to_c_format(ciphertext)}}}}},\n' + header_content += ' }\n};\n' + header_content += ''' +test_data_aes_mode_t test_data_ecdsa = { + .init_key = { %s }, + .k2_info = { %s }, + .k1_encrypted = { { %s }, { } }, + .ecdsa_test_data = { + .pubx = { %s }, + .puby = { %s } + } +};\n +''' % (key_to_c_format(init_key), key_to_c_format(k2_info), key_to_c_format(k1_encrypted_32[0]), key_to_c_format(pubx),key_to_c_format(puby)) + header_content += ''' +test_data_ecdh0_mode_t test_data_ecdh0 = { + .plaintext_data = { %s }, + .k1 = { + { %s }, + { %s }, + }, + .k1_G = { + { %s }, + { %s }, + } +};\n + +''' % (key_to_c_format(bytes(range(1, 129))), key_to_c_format(k1), key_to_c_format(k1), key_to_c_format(k1_G_0), key_to_c_format(k1_G_1)) + + file.write(header_content) + + +# Main script logic follows as per your provided structure +init_key = key_from_file_or_generate('init_key.bin', 32) +k2 = key_from_file_or_generate('k2.bin', 32) +rand_num = key_from_file_or_generate('rand_num.bin', 32) + +temp_result_inner = calculate_aes_cipher(k2, rand_num) +temp_result_outer = calculate_aes_cipher(temp_result_inner + rand_num, init_key) +k2_info = temp_result_outer + +k1_32 = key_from_file_or_generate('k1.bin', 32) +k1_64 = key_from_file_or_generate('k1_64.bin', 64) + +k1_32_reversed = k1_32[::-1] + +k1_64_reversed = k1_64[::-1] + +k1_64_1 = k1_64[:32] +k1_64_1_reversed = k1_64_1[::-1] +k1_64_2 = k1_64[32:] +k1_64_2_reversed = k1_64_2[::-1] + +k1_encrypted_32 = [calculate_aes_cipher(k1_32_reversed, k2)] +k1_encrypted_64 = [calculate_aes_cipher(k1_64_1_reversed, k2), calculate_aes_cipher(k1_64_2_reversed, k2)] + +test_data_xts_aes_128 = generate_xts_test_data(k1_32) +xts_test_data_xts_aes_256 = generate_xts_test_data(k1_64) + +pubx, puby = generate_ecdsa_256_key_and_pub_key('k1.bin') + +k1_G_0, k1_G_1 = generate_k1_G('k1.bin') + +write_to_c_header(init_key, k1_32, k2_info, k1_encrypted_32, test_data_xts_aes_128, k1_encrypted_64, xts_test_data_xts_aes_256, pubx, puby, k1_G_0, k1_G_1) diff --git a/components/hal/test_apps/crypto/main/key_manager/key_manager_test_cases.h b/components/hal/test_apps/crypto/main/key_manager/key_manager_test_cases.h new file mode 100644 index 000000000000..6a7a2abf7a71 --- /dev/null +++ b/components/hal/test_apps/crypto/main/key_manager/key_manager_test_cases.h @@ -0,0 +1,87 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Unlicense OR CC0-1.0 + */ +#include + +#define TEST_COUNT 5 + +typedef struct test_xts_data { + uint16_t data_size; + uint32_t data_offset; + uint8_t ciphertext[128]; +} test_xts_data_t; + +typedef struct test_ecdsa_data { + uint8_t pubx[32]; + uint8_t puby[32]; +} test_ecdsa_data_t; + +typedef struct test_data { + uint8_t init_key[32]; + uint8_t k2_info[64]; + uint8_t k1_encrypted[2][32]; // For both 256-bit and 512-bit keys + uint8_t plaintext_data[128]; + test_xts_data_t xts_test_data[TEST_COUNT]; + test_ecdsa_data_t ecdsa_test_data; +} test_data_aes_mode_t; + +typedef struct test_data_ecdh0 { + uint8_t plaintext_data[128]; + uint8_t k1[2][32]; + uint8_t k1_G[2][64]; +} test_data_ecdh0_mode_t; + +// For 32-byte k1 key +test_data_aes_mode_t test_data_xts_aes_128 = { + .init_key = { 0x4d, 0x21, 0x64, 0x21, 0x8f, 0xa2, 0xe3, 0xa0, 0xab, 0x74, 0xb5, 0xab, 0x17, 0x9a, 0x5d, 0x08, 0x58, 0xf4, 0x22, 0x03, 0xbd, 0x52, 0xe7, 0x88, 0x3c, 0x22, 0x0f, 0x95, 0x89, 0x70, 0xe1, 0x93 }, + .k2_info = { 0xd8, 0xcd, 0x04, 0x45, 0xb4, 0x45, 0xc4, 0x15, 0xf6, 0x40, 0x1c, 0x7d, 0x90, 0x1b, 0x99, 0xa4, 0x79, 0x6b, 0xfb, 0x5b, 0x2a, 0x40, 0x60, 0xe1, 0xc1, 0xe1, 0x48, 0xcd, 0x46, 0x6b, 0x9b, 0x48, 0xda, 0x7a, 0x70, 0x0a, 0x78, 0x0b, 0x9d, 0xf9, 0x0e, 0xed, 0x91, 0xfc, 0xa5, 0xc2, 0x96, 0x05, 0x91, 0x76, 0xdb, 0x68, 0x84, 0x5d, 0x5e, 0x5b, 0xa6, 0xe9, 0x6b, 0x3b, 0x12, 0x50, 0x05, 0xc3 }, + .k1_encrypted = { { 0xeb, 0x83, 0x24, 0x7d, 0xf8, 0x40, 0xc9, 0x88, 0x5f, 0x5e, 0x58, 0x57, 0x25, 0xa9, 0x23, 0x4a, 0xa4, 0xc4, 0x12, 0x17, 0xf3, 0x9e, 0x1f, 0xa0, 0xa0, 0xfa, 0xd5, 0xbf, 0xb6, 0x6c, 0xb5, 0x48 }, { } }, + .plaintext_data = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80 }, + .xts_test_data = { + {.data_size = 32, .data_offset = 0x120000, .ciphertext = {0xe7, 0xf3, 0xb4, 0x51, 0xc6, 0x62, 0x8e, 0x25, 0x10, 0x12, 0xc2, 0x09, 0x82, 0x7b, 0x3e, 0x9a, 0x78, 0xe2, 0x00, 0x9a, 0x96, 0x02, 0x50, 0xeb, 0xff, 0xf1, 0xf8, 0x0d, 0xf6, 0xa6, 0xb8, 0xa1}}, + {.data_size = 64, .data_offset = 0x120100, .ciphertext = {0x3b, 0x54, 0xa8, 0x58, 0xe2, 0x63, 0x7a, 0xb0, 0x7c, 0xc7, 0x37, 0xd8, 0x1e, 0x89, 0x1e, 0x25, 0x39, 0x3d, 0x0d, 0x18, 0x14, 0xb3, 0x2e, 0x18, 0x15, 0xf6, 0xbd, 0xf8, 0xb6, 0x5f, 0x6b, 0x89, 0x1a, 0x0a, 0x53, 0x36, 0xf1, 0x5b, 0x1b, 0x18, 0xd3, 0xf4, 0x7b, 0xd5, 0xcd, 0x4f, 0x48, 0x7b, 0x11, 0xcf, 0xad, 0x6b, 0x79, 0x36, 0x1b, 0xda, 0x5a, 0xd3, 0x18, 0x44, 0xa0, 0xf3, 0xf2, 0xad}}, + {.data_size = 128, .data_offset = 0x120200, .ciphertext = {0x6b, 0x42, 0x10, 0x9f, 0x67, 0x72, 0x31, 0xc7, 0x8f, 0x63, 0xde, 0xc1, 0xf9, 0x84, 0x37, 0x74, 0xe5, 0x5a, 0xe4, 0x31, 0x1a, 0x2e, 0x45, 0x6b, 0xb5, 0xd4, 0xd0, 0x41, 0xe1, 0x2c, 0x0a, 0x43, 0xd9, 0x4c, 0xd5, 0x1c, 0x34, 0xc9, 0x29, 0x39, 0xc8, 0x09, 0xc3, 0xcd, 0x99, 0xaf, 0x3a, 0xe6, 0x4d, 0xae, 0xce, 0xfd, 0x0a, 0xd4, 0x8f, 0x81, 0x4c, 0x25, 0xc5, 0x5e, 0x3d, 0x82, 0x3d, 0x58, 0x55, 0xe5, 0xa4, 0xe4, 0x13, 0x2b, 0xa0, 0x04, 0x3a, 0x7a, 0x65, 0xfa, 0x7a, 0xfb, 0x28, 0x36, 0x1e, 0xfa, 0x71, 0x50, 0x80, 0xa5, 0x0c, 0xa6, 0x4e, 0x45, 0xf9, 0xd9, 0x05, 0xc1, 0x63, 0xa1, 0xf2, 0x7f, 0x54, 0x62, 0xf1, 0x5a, 0xe2, 0x5a, 0x5c, 0x06, 0x16, 0x71, 0xa9, 0x5f, 0xab, 0x7d, 0xc9, 0x85, 0x68, 0xc5, 0x3a, 0xfe, 0xc1, 0xe0, 0xc9, 0xc3, 0xd4, 0x33, 0x10, 0x89, 0x5e, 0x43}}, + {.data_size = 16, .data_offset = 0x120300, .ciphertext = {0xbe, 0xd7, 0x01, 0x8a, 0x60, 0xab, 0x0c, 0xb7, 0xb6, 0x14, 0x9e, 0x64, 0xbc, 0xca, 0xda, 0xaa}}, + {.data_size = 32, .data_offset = 0x120400, .ciphertext = {0xda, 0x84, 0x17, 0x3d, 0x4c, 0x85, 0x07, 0xe2, 0x56, 0x98, 0x69, 0x33, 0x1b, 0x9a, 0x01, 0x9e, 0x6c, 0x81, 0xd8, 0x90, 0x9e, 0x59, 0x92, 0x12, 0x6d, 0xba, 0x58, 0x09, 0x90, 0xe6, 0x50, 0x33}}, + } +}; + +// For 64-byte k1 key +test_data_aes_mode_t test_data_xts_aes_256 = { + .init_key = {0x4d, 0x21, 0x64, 0x21, 0x8f, 0xa2, 0xe3, 0xa0, 0xab, 0x74, 0xb5, 0xab, 0x17, 0x9a, 0x5d, 0x08, 0x58, 0xf4, 0x22, 0x03, 0xbd, 0x52, 0xe7, 0x88, 0x3c, 0x22, 0x0f, 0x95, 0x89, 0x70, 0xe1, 0x93}, + .k2_info = {0xd8, 0xcd, 0x04, 0x45, 0xb4, 0x45, 0xc4, 0x15, 0xf6, 0x40, 0x1c, 0x7d, 0x90, 0x1b, 0x99, 0xa4, 0x79, 0x6b, 0xfb, 0x5b, 0x2a, 0x40, 0x60, 0xe1, 0xc1, 0xe1, 0x48, 0xcd, 0x46, 0x6b, 0x9b, 0x48, 0xda, 0x7a, 0x70, 0x0a, 0x78, 0x0b, 0x9d, 0xf9, 0x0e, 0xed, 0x91, 0xfc, 0xa5, 0xc2, 0x96, 0x05, 0x91, 0x76, 0xdb, 0x68, 0x84, 0x5d, 0x5e, 0x5b, 0xa6, 0xe9, 0x6b, 0x3b, 0x12, 0x50, 0x05, 0xc3}, + .k1_encrypted = {{0xeb, 0x83, 0x24, 0x7d, 0xf8, 0x40, 0xc9, 0x88, 0x5f, 0x5e, 0x58, 0x57, 0x25, 0xa9, 0x23, 0x4a, 0xa4, 0xc4, 0x12, 0x17, 0xf3, 0x9e, 0x1f, 0xa0, 0xa0, 0xfa, 0xd5, 0xbf, 0xb6, 0x6c, 0xb5, 0x48}, {0x65, 0x9e, 0x12, 0x7f, 0xc0, 0x4a, 0xb6, 0x04, 0xa1, 0xd0, 0x38, 0x04, 0x6c, 0x8e, 0x1f, 0xc7, 0x03, 0x24, 0x3e, 0x75, 0x3c, 0x9d, 0x7a, 0xc2, 0xef, 0xd6, 0xf2, 0x60, 0x46, 0xfc, 0x07, 0x3f}}, + .plaintext_data = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80}, + .xts_test_data = { + {.data_size = 32, .data_offset = 0x120000, .ciphertext = {0x9b, 0xd8, 0x2b, 0xc6, 0xae, 0xcc, 0x9d, 0x0c, 0x38, 0x30, 0x85, 0x6a, 0x2b, 0x22, 0x2e, 0x34, 0x9f, 0xa2, 0xcd, 0xe8, 0xec, 0xe3, 0xc4, 0x21, 0xfe, 0xbb, 0x4a, 0x55, 0xf2, 0x4a, 0xe2, 0x14}}, + {.data_size = 64, .data_offset = 0x120100, .ciphertext = {0x1e, 0x36, 0x3f, 0xf6, 0xd6, 0x52, 0x34, 0xce, 0xc3, 0x58, 0x15, 0xa1, 0x15, 0x6f, 0x3d, 0x66, 0xa7, 0x90, 0x14, 0x71, 0xbb, 0x6d, 0x7e, 0x93, 0xf2, 0x4d, 0x5d, 0x74, 0xb2, 0xd7, 0x77, 0x32, 0x2e, 0x31, 0x16, 0x28, 0xd2, 0x10, 0x65, 0x81, 0x49, 0xc0, 0x56, 0xf0, 0x6d, 0x71, 0x5b, 0xc2, 0xf2, 0x01, 0x04, 0xbf, 0x97, 0x77, 0xe6, 0x57, 0xe5, 0xb5, 0xad, 0x73, 0xc0, 0x76, 0x91, 0xb6}}, + {.data_size = 128, .data_offset = 0x120200, .ciphertext = {0xcf, 0x7d, 0xdd, 0x69, 0x69, 0xf4, 0x3b, 0xcd, 0x65, 0x5d, 0xcf, 0xfc, 0xff, 0xd3, 0x45, 0x1c, 0x51, 0xab, 0x2e, 0x26, 0x5c, 0xdc, 0x5b, 0x5a, 0x6e, 0xbb, 0x18, 0x36, 0x55, 0xbe, 0xe7, 0x30, 0x7a, 0x07, 0x48, 0xd8, 0x1a, 0x34, 0xdc, 0xa6, 0x1e, 0xd6, 0x67, 0xa8, 0x90, 0xc3, 0xac, 0x26, 0x7a, 0x52, 0x67, 0x82, 0x71, 0xc9, 0x80, 0x8d, 0xed, 0x20, 0x83, 0x34, 0x10, 0x8e, 0xe5, 0x84, 0x81, 0xa5, 0xe2, 0x42, 0xf0, 0x53, 0xef, 0x93, 0x00, 0xfe, 0xbd, 0x74, 0x14, 0xac, 0x92, 0x37, 0x00, 0x45, 0xd5, 0x71, 0x29, 0xaf, 0x8b, 0x83, 0xe2, 0x20, 0x2e, 0xd0, 0xf6, 0xaa, 0x45, 0x9a, 0x6f, 0x59, 0xb9, 0x8d, 0xef, 0xcd, 0xb6, 0xf6, 0x25, 0x99, 0xd2, 0x32, 0x2e, 0x90, 0x8a, 0x3a, 0x5d, 0xd8, 0x3f, 0xbf, 0x84, 0x80, 0x89, 0xaa, 0x9c, 0xa8, 0x57, 0xc9, 0x1c, 0xc4, 0xaa, 0x64}}, + {.data_size = 16, .data_offset = 0x120300, .ciphertext = {0x1b, 0x7a, 0xf1, 0x35, 0x33, 0x22, 0x64, 0x74, 0x06, 0x6a, 0xc1, 0x0c, 0x39, 0xee, 0x1f, 0x9f}}, + {.data_size = 32, .data_offset = 0x120400, .ciphertext = {0x94, 0xd9, 0x01, 0x0f, 0xec, 0xcc, 0xb5, 0x22, 0x50, 0x8b, 0x8a, 0x3d, 0x01, 0x18, 0x29, 0xda, 0x53, 0x9b, 0xcf, 0x64, 0xac, 0x4f, 0x7b, 0x97, 0xf3, 0xff, 0xfd, 0x33, 0x96, 0x8a, 0xde, 0x27}}, + } +}; + +test_data_aes_mode_t test_data_ecdsa = { + .init_key = { 0x4d, 0x21, 0x64, 0x21, 0x8f, 0xa2, 0xe3, 0xa0, 0xab, 0x74, 0xb5, 0xab, 0x17, 0x9a, 0x5d, 0x08, 0x58, 0xf4, 0x22, 0x03, 0xbd, 0x52, 0xe7, 0x88, 0x3c, 0x22, 0x0f, 0x95, 0x89, 0x70, 0xe1, 0x93 }, + .k2_info = { 0xd8, 0xcd, 0x04, 0x45, 0xb4, 0x45, 0xc4, 0x15, 0xf6, 0x40, 0x1c, 0x7d, 0x90, 0x1b, 0x99, 0xa4, 0x79, 0x6b, 0xfb, 0x5b, 0x2a, 0x40, 0x60, 0xe1, 0xc1, 0xe1, 0x48, 0xcd, 0x46, 0x6b, 0x9b, 0x48, 0xda, 0x7a, 0x70, 0x0a, 0x78, 0x0b, 0x9d, 0xf9, 0x0e, 0xed, 0x91, 0xfc, 0xa5, 0xc2, 0x96, 0x05, 0x91, 0x76, 0xdb, 0x68, 0x84, 0x5d, 0x5e, 0x5b, 0xa6, 0xe9, 0x6b, 0x3b, 0x12, 0x50, 0x05, 0xc3 }, + .k1_encrypted = { { 0xeb, 0x83, 0x24, 0x7d, 0xf8, 0x40, 0xc9, 0x88, 0x5f, 0x5e, 0x58, 0x57, 0x25, 0xa9, 0x23, 0x4a, 0xa4, 0xc4, 0x12, 0x17, 0xf3, 0x9e, 0x1f, 0xa0, 0xa0, 0xfa, 0xd5, 0xbf, 0xb6, 0x6c, 0xb5, 0x48 }, { } }, + .ecdsa_test_data = { + .pubx = { 0x8f, 0xc2, 0x37, 0x2e, 0x36, 0x77, 0x8f, 0xc7, 0x59, 0x18, 0xec, 0x39, 0x23, 0x16, 0x6b, 0x0b, 0x4f, 0xf8, 0x19, 0xa8, 0x9f, 0xd9, 0xf7, 0x59, 0x4d, 0x8a, 0x2d, 0x16, 0xd5, 0x84, 0xe1, 0x21 }, + .puby = { 0xf1, 0x8b, 0x1e, 0x2d, 0x7e, 0xc4, 0x8b, 0xf8, 0xe3, 0xc9, 0xb1, 0x54, 0xa4, 0x65, 0xed, 0x7d, 0xbc, 0x56, 0x1a, 0x66, 0xcd, 0x43, 0x10, 0x2e, 0x46, 0x2a, 0x3f, 0xfe, 0xdb, 0x9a, 0x28, 0xf9 } + } +}; + + +test_data_ecdh0_mode_t test_data_ecdh0 = { + .plaintext_data = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80 }, + .k1 = { + { 0x20, 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01 }, + { 0x20, 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01 }, + }, + .k1_G = { + { 0x8f, 0xc2, 0x37, 0x2e, 0x36, 0x77, 0x8f, 0xc7, 0x59, 0x18, 0xec, 0x39, 0x23, 0x16, 0x6b, 0x0b, 0x4f, 0xf8, 0x19, 0xa8, 0x9f, 0xd9, 0xf7, 0x59, 0x4d, 0x8a, 0x2d, 0x16, 0xd5, 0x84, 0xe1, 0x21, 0xf1, 0x8b, 0x1e, 0x2d, 0x7e, 0xc4, 0x8b, 0xf8, 0xe3, 0xc9, 0xb1, 0x54, 0xa4, 0x65, 0xed, 0x7d, 0xbc, 0x56, 0x1a, 0x66, 0xcd, 0x43, 0x10, 0x2e, 0x46, 0x2a, 0x3f, 0xfe, 0xdb, 0x9a, 0x28, 0xf9 }, + { 0x8f, 0xc2, 0x37, 0x2e, 0x36, 0x77, 0x8f, 0xc7, 0x59, 0x18, 0xec, 0x39, 0x23, 0x16, 0x6b, 0x0b, 0x4f, 0xf8, 0x19, 0xa8, 0x9f, 0xd9, 0xf7, 0x59, 0x4d, 0x8a, 0x2d, 0x16, 0xd5, 0x84, 0xe1, 0x21, 0xf1, 0x8b, 0x1e, 0x2d, 0x7e, 0xc4, 0x8b, 0xf8, 0xe3, 0xc9, 0xb1, 0x54, 0xa4, 0x65, 0xed, 0x7d, 0xbc, 0x56, 0x1a, 0x66, 0xcd, 0x43, 0x10, 0x2e, 0x46, 0x2a, 0x3f, 0xfe, 0xdb, 0x9a, 0x28, 0xf9 }, + } +}; diff --git a/components/hal/test_apps/crypto/main/key_manager/test_key_manager.c b/components/hal/test_apps/crypto/main/key_manager/test_key_manager.c new file mode 100644 index 000000000000..ca424eb13213 --- /dev/null +++ b/components/hal/test_apps/crypto/main/key_manager/test_key_manager.c @@ -0,0 +1,374 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Unlicense OR CC0-1.0 + */ +#include +#include +#include + +#include "esp_efuse_chip.h" +#include "esp_heap_caps.h" +#include "esp_rom_crc.h" +#include "hal/key_mgr_hal.h" +#include "hal/key_mgr_ll.h" +#include "hal/key_mgr_types.h" +#include "hal/huk_types.h" +#include "hal/huk_hal.h" +#include "esp_key_mgr.h" +#include "memory_checks.h" +#include "unity_fixture.h" +#include "hal_crypto_common.h" +#include "rom/key_mgr.h" +#include "esp_partition.h" +#include "esp_flash.h" +#include "key_manager_test_cases.h" +#include "esp_log.h" + +// For ECDSA tests +#include "hal/ecdsa_hal.h" + +const esp_partition_t *get_test_storage_partition(void) +{ + /* This finds "storage" partition defined partition table */ + const esp_partition_t *result = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, + ESP_PARTITION_SUBTYPE_ANY, "storage"); + if (!result) { + /* means partition table set wrong */ + printf("ERROR in obtaining storage partition"); + return NULL; + } + return result; +} + +static void print_data_in_hex(const uint8_t *data, int size, const char *info_str) +{ + printf("%s: 0x", info_str); + for(int i = 0 ; i < size; i++) { + printf("%02x", data[i]); + } + printf("\n"); +} + +static void test_xts_aes_key_aes_mode(test_data_aes_mode_t *test_data) +{ + const esp_partition_t *partition = get_test_storage_partition(); + ESP_ERROR_CHECK(esp_partition_erase_range(partition, 0, partition->size)); + + for (int i = 0; i < TEST_COUNT; i++) { + uint32_t address = test_data->xts_test_data[i].data_offset; + uint32_t data_size = test_data->xts_test_data[i].data_size; + ESP_ERROR_CHECK(esp_flash_write_encrypted(NULL, address, test_data->plaintext_data, data_size)); + static uint8_t read_data[128]; + ESP_ERROR_CHECK(esp_flash_read(NULL, read_data, address, data_size)); + TEST_ASSERT_EQUAL_HEX8_ARRAY(test_data->xts_test_data[i].ciphertext, read_data, data_size); + } +} + +static void test_xts_aes_key_ecdh0_mode(test_data_ecdh0_mode_t *test_data) +{ + const esp_partition_t *partition = get_test_storage_partition(); + ESP_ERROR_CHECK(esp_partition_erase_range(partition, 0, partition->size)); + + uint32_t address = partition->address; + uint32_t data_size = 32; + + print_data_in_hex(test_data->plaintext_data, data_size, "Plaintext data"); + + ESP_ERROR_CHECK(esp_flash_write_encrypted(NULL, address, test_data->plaintext_data, data_size)); + static uint8_t read_data[128]; + ESP_ERROR_CHECK(esp_flash_read(NULL, read_data, address, data_size)); + print_data_in_hex(read_data, data_size, "Encrypted data"); +} + +static void key_mgr_test_xts_aes_128(void) +{ + static esp_key_mgr_aes_key_config_t key_config; + memcpy(key_config.k2_info, (uint8_t*) test_data_xts_aes_128.k2_info, KEY_MGR_K2_INFO_SIZE); + memcpy(key_config.k1_encrypted, (uint8_t*) test_data_xts_aes_128.k1_encrypted, KEY_MGR_K1_ENCRYPTED_SIZE); + memcpy(key_config.sw_init_key, (uint8_t*) test_data_xts_aes_128.init_key, KEY_MGR_SW_INIT_KEY_SIZE); + key_config.use_pre_generated_sw_init_key = 1; + key_config.key_type = ESP_KEY_MGR_XTS_AES_128_KEY; + + static esp_key_mgr_key_recovery_info_t key_recovery_info; + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deploy_key_in_aes_mode(&key_config, &key_recovery_info)); + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_activate_key(&key_recovery_info)); + test_xts_aes_key_aes_mode(&test_data_xts_aes_128); + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deactivate_key(key_recovery_info.key_type)); + +} + +static void key_mgr_test_xts_aes_256_aes_mode(void) +{ + static esp_key_mgr_aes_key_config_t key_config; + memcpy(key_config.k2_info, (uint8_t*) test_data_xts_aes_256.k2_info, KEY_MGR_K2_INFO_SIZE); + memcpy(key_config.k1_encrypted[0], (uint8_t*) test_data_xts_aes_256.k1_encrypted[0], KEY_MGR_K1_ENCRYPTED_SIZE); + memcpy(key_config.k1_encrypted[1], (uint8_t*) test_data_xts_aes_256.k1_encrypted[1], KEY_MGR_K1_ENCRYPTED_SIZE); + memcpy(key_config.sw_init_key, (uint8_t*) test_data_xts_aes_256.init_key, KEY_MGR_SW_INIT_KEY_SIZE); + key_config.use_pre_generated_sw_init_key = 1; + key_config.key_type = ESP_KEY_MGR_XTS_AES_256_KEY; + + static esp_key_mgr_key_recovery_info_t key_recovery_info; + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deploy_key_in_aes_mode(&key_config, &key_recovery_info)); + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_activate_key(&key_recovery_info)); + test_xts_aes_key_aes_mode(&test_data_xts_aes_256); + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deactivate_key(key_recovery_info.key_type)); +} + +#ifdef SOC_ECDSA_SUPPORT_EXPORT_PUBKEY +extern void test_ecdsa_export_pubkey(bool is_p256, uint8_t *ecdsa_pub_x, uint8_t *ecdsa_pub_y, bool use_km_key); +extern void test_ecdsa_export_pubkey_inner(bool is_p256, uint8_t *exported_pub_x, uint8_t *exported_pub_y, bool use_km_key, uint16_t *len); +#endif + +extern void test_ecdsa_sign_and_verify(bool is_p256, uint8_t* sha, uint8_t* pub_x, uint8_t* pub_y, bool use_km_key, ecdsa_sign_type_t k_type); + +/* +const uint8_t message[32] = { 0xDF, 0xDE, 0xD7, 0x4A, 0x47, 0xB1, 0x4F, 0x73, 0x00, 0x21, 0x62, 0xC7, 0x66, 0x6D, 0xA3, 0x95, 0x66, 0x19, 0x62, 0x7F, 0x71, 0x7B, 0x3C, 0x66, 0x82, 0xD3, 0x9F, 0x71, 0xAC, 0x9C, 0xC3, 0x39 }; +*/ + +/* sha256 digest of the above message */ +uint8_t sha256_digest[32] = { 0x47, 0xA6, 0xEF, 0xBE, 0x39, 0x5E, 0xE4, 0xAE, 0x2B, 0xEC, 0x83, 0xB1, 0xED, 0xAF, 0xC6, 0x78, 0x57, 0x7A, 0x16, 0x8C, 0x22, 0x16, 0x13, 0xE2, 0xAC, 0xA8, 0x50, 0xD5, 0x67, 0x95, 0x9F, 0x71 }; + +void test_ecdsa_key_aes_mode(test_data_aes_mode_t *ecdsa_test_data, ecdsa_sign_type_t k_type) +{ + test_ecdsa_sign_and_verify(1, sha256_digest, ecdsa_test_data->ecdsa_test_data.pubx, ecdsa_test_data->ecdsa_test_data.puby, 1, k_type); +#ifdef SOC_ECDSA_SUPPORT_EXPORT_PUBKEY + test_ecdsa_export_pubkey(1, ecdsa_test_data->ecdsa_test_data.pubx, ecdsa_test_data->ecdsa_test_data.puby, 1); +#endif +} + + +extern void test_ecdsa_sign(bool is_p256, uint8_t* sha, uint8_t* r_le, uint8_t* s_le, bool use_km_key, ecdsa_sign_type_t k_type); + +extern int test_ecdsa_verify(bool is_p256, uint8_t* sha, uint8_t* r_le, uint8_t* s_le, uint8_t *pub_x, uint8_t *pub_y); + +void key_mgr_test_ecdsa_key(bool is_p256, ecdsa_sign_type_t k_type) +{ + uint8_t pub_x[32] = {}; + uint8_t pub_y[32] = {}; + uint8_t r_le[32] = {0}; + uint8_t s_le[32] = {0}; + + test_ecdsa_sign(is_p256, sha256_digest, r_le, s_le, 1, k_type); + + print_data_in_hex(sha256_digest, sizeof(sha256_digest), "ECDSA message sha256 digest"); + print_data_in_hex(r_le, sizeof(r_le), "ECDSA signature r_le"); + print_data_in_hex(s_le, sizeof(s_le), "ECDSA signature s_le"); + + // Export the pubkey from ECDSA peripheral + uint16_t pubkey_len = 0; + test_ecdsa_export_pubkey_inner(is_p256, pub_x, pub_y, 1, &pubkey_len); + + print_data_in_hex(pub_x, pubkey_len, "ECDSA key pubx"); + print_data_in_hex(pub_y, pubkey_len, "ECDSA key puby"); + TEST_ASSERT_EQUAL(0, test_ecdsa_verify(is_p256, sha256_digest, r_le, s_le, pub_x, pub_y)); + +} + +static void key_mgr_test_ecdsa_p256_aes_mode(void) +{ + static esp_key_mgr_aes_key_config_t key_config; + memcpy(key_config.k2_info, (uint8_t*) test_data_ecdsa.k2_info, KEY_MGR_K2_INFO_SIZE); + memcpy(key_config.k1_encrypted, (uint8_t*) test_data_ecdsa.k1_encrypted, KEY_MGR_K1_ENCRYPTED_SIZE); + memcpy(key_config.sw_init_key, (uint8_t*) test_data_ecdsa.init_key, KEY_MGR_SW_INIT_KEY_SIZE); + key_config.use_pre_generated_sw_init_key = 1; + key_config.key_type = ESP_KEY_MGR_ECDSA_KEY; + + static esp_key_mgr_key_recovery_info_t key_recovery_info; + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deploy_key_in_aes_mode(&key_config, &key_recovery_info)); + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_activate_key(&key_recovery_info)); +#ifdef SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE + test_ecdsa_key_aes_mode(&test_data_ecdsa, ECDSA_K_TYPE_DETERMINISITIC); +#endif + test_ecdsa_key_aes_mode(&test_data_ecdsa, ECDSA_K_TYPE_TRNG); + + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deactivate_key(key_recovery_info.key_type)); +} + +static void key_mgr_test_xts_aes_128_ecdh0_mode(void) +{ + printf("\nKey Manager ECDH0 deployment: XTS_AES_128 key\n"); + static esp_key_mgr_ecdh0_key_config_t key_config; + memcpy(key_config.k1_G[0], (uint8_t*) test_data_ecdh0.k1_G[0], KEY_MGR_ECDH0_INFO_SIZE); + key_config.key_type = ESP_KEY_MGR_XTS_AES_128_KEY; + + static esp_key_mgr_key_recovery_info_t key_recovery_info; + static esp_key_mgr_ecdh0_info_t ecdh0_info; + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deploy_key_in_ecdh0_mode(&key_config, &key_recovery_info, &ecdh0_info)); + + print_data_in_hex(ecdh0_info.k2_G[0], KEY_MGR_ECDH0_INFO_SIZE, "K2_G"); + + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_activate_key(&key_recovery_info)); + test_xts_aes_key_ecdh0_mode(&test_data_ecdh0); + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deactivate_key(key_recovery_info.key_type)); +} + +static void key_mgr_test_xts_aes_256_ecdh0_mode(void) +{ + printf("\nKey Manager ECDH0 deployment: XTS_AES_256 key\n"); + static esp_key_mgr_ecdh0_key_config_t key_config; + memcpy(key_config.k1_G[0], (uint8_t*) test_data_ecdh0.k1_G[0], KEY_MGR_ECDH0_INFO_SIZE); + memcpy(key_config.k1_G[1], (uint8_t*) test_data_ecdh0.k1_G[1], KEY_MGR_ECDH0_INFO_SIZE); + key_config.key_type = ESP_KEY_MGR_XTS_AES_256_KEY; + + static esp_key_mgr_key_recovery_info_t key_recovery_info; + static esp_key_mgr_ecdh0_info_t ecdh0_info; + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deploy_key_in_ecdh0_mode(&key_config, &key_recovery_info, &ecdh0_info)); + + print_data_in_hex(ecdh0_info.k2_G[0], KEY_MGR_ECDH0_INFO_SIZE, "K2_G_0"); + print_data_in_hex(ecdh0_info.k2_G[1], KEY_MGR_ECDH0_INFO_SIZE, "K2_G_1"); + + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_activate_key(&key_recovery_info)); + test_xts_aes_key_ecdh0_mode(&test_data_ecdh0); + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deactivate_key(key_recovery_info.key_type)); +} + +static void key_mgr_test_ecdsa_ecdh0_mode(void) +{ + printf("\nKey Manager ECDH0 deployment: ECDSA_256 key\n"); + static esp_key_mgr_ecdh0_key_config_t key_config; + memcpy(key_config.k1_G[0], (uint8_t*) test_data_ecdh0.k1_G[0], KEY_MGR_ECDH0_INFO_SIZE); + key_config.key_type = ESP_KEY_MGR_ECDSA_KEY; + + static esp_key_mgr_key_recovery_info_t key_recovery_info; + static esp_key_mgr_ecdh0_info_t ecdh0_info; + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deploy_key_in_ecdh0_mode(&key_config, &key_recovery_info, &ecdh0_info)); + + print_data_in_hex(ecdh0_info.k2_G[0], KEY_MGR_ECDH0_INFO_SIZE, "K2_G"); + + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_activate_key(&key_recovery_info)); +#ifdef SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE + key_mgr_test_ecdsa_key(1, ECDSA_K_TYPE_DETERMINISITIC); +#endif + key_mgr_test_ecdsa_key(1, ECDSA_K_TYPE_TRNG); + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deactivate_key(key_recovery_info.key_type)); +} + +static void key_mgr_test_ecdsa_random_mode(void) +{ + printf("\nKey Manager Random deployment: ECDSA_256 key\n"); + static esp_key_mgr_random_key_config_t key_config; + key_config.key_type = ESP_KEY_MGR_ECDSA_KEY; + + static esp_key_mgr_key_recovery_info_t key_recovery_info; + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deploy_key_in_random_mode(&key_config, &key_recovery_info)); + + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_activate_key(&key_recovery_info)); + +#ifdef SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE + key_mgr_test_ecdsa_key(1, ECDSA_K_TYPE_DETERMINISITIC); +#endif + key_mgr_test_ecdsa_key(1, ECDSA_K_TYPE_TRNG); + + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deactivate_key(key_recovery_info.key_type)); +} + +#if CONFIG_IDF_ENV_FPGA + +static void test_xts_aes_key_random_mode(void) +{ + const esp_partition_t *partition = get_test_storage_partition(); + ESP_ERROR_CHECK(esp_partition_erase_range(partition, 0, partition->size)); + uint8_t plaintext_data[1024] = {[0 ... 1023] = 0xBE}; + const int write_size = 16; + for (int i = 0; i < sizeof(plaintext_data) / write_size; i++) { + printf("\n i = %d\n", i); + ESP_ERROR_CHECK(esp_flash_write_encrypted(NULL, partition->address + (i * write_size), plaintext_data, write_size)); + static uint8_t read_data[128]; + ESP_ERROR_CHECK(esp_partition_read(partition, write_size * i, read_data, write_size)); + TEST_ASSERT_EQUAL_HEX8_ARRAY(plaintext_data + (i * write_size), read_data, write_size); + } +} + + +static void key_mgr_test_xts_aes_128_random_mode(void) +{ + static esp_key_mgr_random_key_config_t key_config; + key_config.key_type = ESP_KEY_MGR_XTS_AES_128_KEY; + + static esp_key_mgr_key_recovery_info_t key_recovery_info; + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deploy_key_in_random_mode(&key_config, &key_recovery_info)); + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_activate_key(&key_recovery_info)); + test_xts_aes_key_random_mode(); + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deactivate_key(key_recovery_info.key_type)); + +} + +static void key_mgr_test_xts_aes_256_random_mode(void) +{ + static esp_key_mgr_random_key_config_t key_config; + key_config.key_type = ESP_KEY_MGR_XTS_AES_256_KEY; + static esp_key_mgr_key_recovery_info_t key_recovery_info; + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deploy_key_in_random_mode(&key_config, &key_recovery_info)); + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_activate_key(&key_recovery_info)); + test_xts_aes_key_random_mode(); + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deactivate_key(key_recovery_info.key_type)); +} +#endif + +TEST_GROUP(key_manager); + +TEST_SETUP(key_manager) +{ + test_utils_record_free_mem(); + TEST_ESP_OK(test_utils_set_leak_level(700, ESP_LEAK_TYPE_CRITICAL, ESP_COMP_LEAK_GENERAL)); +} + +TEST_TEAR_DOWN(key_manager) +{ + test_utils_finish_and_evaluate_leaks(test_utils_get_leak_level(ESP_LEAK_TYPE_WARNING, ESP_COMP_LEAK_ALL), + test_utils_get_leak_level(ESP_LEAK_TYPE_CRITICAL, ESP_COMP_LEAK_ALL)); +} + +TEST(key_manager, xts_aes_128_key_aes_deployment) +{ + key_mgr_test_xts_aes_128(); +} + +TEST(key_manager, xts_aes_256_key_aes_deployment) +{ + key_mgr_test_xts_aes_256_aes_mode(); +} + +TEST(key_manager, ecdsa_key_aes_deployment) +{ + key_mgr_test_ecdsa_p256_aes_mode(); +} + +TEST(key_manager, xts_key_ecdh0_deployment) +{ + key_mgr_test_xts_aes_128_ecdh0_mode(); + key_mgr_test_xts_aes_256_ecdh0_mode(); +} + +TEST(key_manager, ecdsa_key_ecdh0_deployment) +{ + key_mgr_test_ecdsa_ecdh0_mode(); +} + +TEST(key_manager, ecdsa_key_random_deployment) +{ + key_mgr_test_ecdsa_random_mode(); +} + +#if CONFIG_IDF_ENV_FPGA +TEST(key_manager, xts_key_random_deployment) +{ + key_mgr_test_xts_aes_128_random_mode(); + key_mgr_test_xts_aes_256_random_mode(); +} +#endif + +TEST_GROUP_RUNNER(key_manager) +{ + RUN_TEST_CASE(key_manager, xts_aes_128_key_aes_deployment); + RUN_TEST_CASE(key_manager, xts_aes_256_key_aes_deployment); + RUN_TEST_CASE(key_manager, ecdsa_key_aes_deployment); + RUN_TEST_CASE(key_manager, xts_key_ecdh0_deployment); + RUN_TEST_CASE(key_manager, ecdsa_key_ecdh0_deployment); + RUN_TEST_CASE(key_manager, ecdsa_key_random_deployment); +#if CONFIG_IDF_ENV_FPGA + RUN_TEST_CASE(key_manager, xts_key_random_deployment); +#endif + +} diff --git a/components/hal/test_apps/crypto/pytest_crypto.py b/components/hal/test_apps/crypto/pytest_crypto.py index 462587ecdbe9..64fe21473b4a 100644 --- a/components/hal/test_apps/crypto/pytest_crypto.py +++ b/components/hal/test_apps/crypto/pytest_crypto.py @@ -1,17 +1,153 @@ -# SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 +import binascii import os +import subprocess +from typing import Any import pytest +from cryptography import exceptions +from cryptography.hazmat.backends import default_backend +from cryptography.hazmat.primitives import hashes +from cryptography.hazmat.primitives.asymmetric import ec +from cryptography.hazmat.primitives.asymmetric import utils +from cryptography.hazmat.primitives.asymmetric.ec import SECP256R1 +from cryptography.hazmat.primitives.serialization import load_pem_private_key +from ecdsa import NIST256p +from ecdsa.ellipticcurve import Point from pytest_embedded import Dut +def load_ecdsa_key(filename: str) -> SECP256R1: + with open(filename, 'rb') as key_file: + return load_pem_private_key(key_file.read(), password=None, backend=default_backend()) + + +def test_xts_aes_encryption(negotiated_key: bytes, plaintext_data: bytes, encrypted_data: bytes) -> None: + with open('test/negotiated_key.bin', 'wb+') as key_file: + key_file.write(negotiated_key) + + with open('test/plaintext.bin', 'wb+') as plaintext_file: + plaintext_file.write(plaintext_data) + + command = [ + 'espsecure.py', + 'encrypt_flash_data', + '--aes_xts', + '--keyfile', 'test/negotiated_key.bin', + '--address', '0x120000', + '--output', 'test/enc-data.bin', + 'test/plaintext.bin' + ] + result = subprocess.run(command, capture_output=True, text=True) + assert result.returncode == 0, f'Command failed with error: {result.stderr}' + + with open('test/enc-data.bin', 'rb') as enc_file: + calculated_enc_data = enc_file.read() + + assert calculated_enc_data == encrypted_data, 'Calculated data does not match encrypted data obtained from firmware' + + +def calculate_key_manager_ecdh0_negotiated_key(k2_G_hex: str, k1_ecdsa_key: str) -> Any: + k2_G_bytes_le = binascii.unhexlify(k2_G_hex) + + k2_G_bytes_x_be = bytes(reversed(k2_G_bytes_le[:32])) + k2_G_bytes_y_be = bytes(reversed(k2_G_bytes_le[32:])) + + k2_G_bytes_be = k2_G_bytes_x_be + k2_G_bytes_y_be + + curve = NIST256p.curve + k2_G = Point.from_bytes(curve, k2_G_bytes_be) + + # Load the ECDSA private key (k1) + k1_key = load_ecdsa_key(k1_ecdsa_key) + k1_int = k1_key.private_numbers().private_value + + # Convert the integer to bytes in big endian format + k1_bytes_big_endian = k1_int.to_bytes((k1_int.bit_length() + 7) // 8, byteorder='big') + + # Reverse the bytes to get little endian format + k1_bytes_little_endian = k1_bytes_big_endian[::-1] + + k1_int = int.from_bytes(k1_bytes_little_endian, byteorder='little') + + # Calculate k1*k2*G + k1_k2_G = k1_int * k2_G + + # Extract the x-coordinate of the result and save it as the shared secret + negotiated_key = k1_k2_G.to_bytes()[:32] + return negotiated_key + + +def test_ecdsa_key(negotiated_key: bytes, digest: bytes, signature_r_le: bytes, signature_s_le: bytes, pubx: bytes, puby: bytes) -> None: + r = int.from_bytes(signature_r_le, 'little') + s = int.from_bytes(signature_s_le, 'little') + signature = utils.encode_dss_signature(r, s) + pubx_int = int.from_bytes(pubx, 'little') + puby_int = int.from_bytes(puby, 'little') + private_number = int.from_bytes(negotiated_key, byteorder='big') + ecdsa_private_key = ec.derive_private_key(private_number, ec.SECP256R1()) + # Get the public key + public_key = ecdsa_private_key.public_key() + # Extract the pubx and puby values + calc_pubx, calc_puby = public_key.public_numbers().x, public_key.public_numbers().y + + assert calc_pubx == pubx_int, 'Public key calculated should match with public key obtained' + assert calc_puby == puby_int, 'Public key calculated should match with public key obtained' + + try: + public_key.verify(signature, digest, ec.ECDSA(utils.Prehashed(hashes.SHA256()))) + print('Valid signature') + except exceptions.InvalidSignature: + print('Invalid signature') + raise + + @pytest.mark.supported_targets @pytest.mark.generic def test_crypto(dut: Dut) -> None: # if the env variable IDF_FPGA_ENV is set, we would need a longer timeout # as tests for efuses burning security peripherals would be run timeout = 600 if os.environ.get('IDF_ENV_FPGA') else 60 + # only expect key manager result if it is supported for the SoC + if dut.app.sdkconfig.get('SOC_KEY_MANAGER_SUPPORTED'): + print('Key Manager is supported') + + # Test for ECDH0 deployment XTS-AES-128 key + dut.expect('Key Manager ECDH0 deployment: XTS_AES_128 key', timeout=timeout) + k2_G = dut.expect(r'K2_G: 0x([0-9a-fA-F]+)', timeout=timeout)[1].decode() + plaintext_data = dut.expect(r'Plaintext data: 0x([0-9a-fA-F]+)', timeout=timeout)[1] + plaintext_data = binascii.unhexlify(plaintext_data) + encrypted_data = dut.expect(r'Encrypted data: 0x([0-9a-fA-F]+)', timeout=timeout)[1].decode() + encrypted_data = binascii.unhexlify(encrypted_data) + negotiated_key = calculate_key_manager_ecdh0_negotiated_key(k2_G, 'main/key_manager/k1_ecdsa.pem') + test_xts_aes_encryption(negotiated_key, plaintext_data, encrypted_data) + + # Test for ECDH0 deployment XTS-AES-256 key + dut.expect('Key Manager ECDH0 deployment: XTS_AES_256 key', timeout=timeout) + k2_G_0 = dut.expect(r'K2_G_0: 0x([0-9a-fA-F]+)', timeout=timeout)[1].decode() + k2_G_1 = dut.expect(r'K2_G_1: 0x([0-9a-fA-F]+)', timeout=timeout)[1].decode() + encrypted_data = dut.expect(r'Encrypted data: 0x([0-9a-fA-F]+)', timeout=timeout)[1].decode() + encrypted_data = binascii.unhexlify(encrypted_data) + negotiated_key_0 = calculate_key_manager_ecdh0_negotiated_key(k2_G_0, 'main/key_manager/k1_ecdsa.pem') + negotiated_key_1 = calculate_key_manager_ecdh0_negotiated_key(k2_G_1, 'main/key_manager/k1_ecdsa.pem') + negotiated_key = negotiated_key_0 + negotiated_key_1 + test_xts_aes_encryption(negotiated_key, plaintext_data, encrypted_data) + # Test for ECDH0 deployment ECDSA-256 key + dut.expect('Key Manager ECDH0 deployment: ECDSA_256 key', timeout=timeout) + k2_G = dut.expect(r'K2_G: 0x([0-9a-fA-F]+)', timeout=timeout)[1].decode() + digest = dut.expect(r'ECDSA message sha256 digest: 0x([0-9a-fA-F]+)', timeout=timeout)[1].decode() + digest = binascii.unhexlify(digest) + signature_r_le = dut.expect(r'ECDSA signature r_le: 0x([0-9a-fA-F]+)', timeout=timeout)[1].decode() + signature_r_le = binascii.unhexlify(signature_r_le) + signature_s_le = dut.expect(r'ECDSA signature s_le: 0x([0-9a-fA-F]+)', timeout=timeout)[1].decode() + signature_s_le = binascii.unhexlify(signature_s_le) + pub_x = dut.expect(r'ECDSA key pubx: 0x([0-9a-fA-F]+)', timeout=timeout)[1].decode() + pub_x = binascii.unhexlify(pub_x) + pub_y = dut.expect(r'ECDSA key puby: 0x([0-9a-fA-F]+)', timeout=timeout)[1].decode() + pub_y = binascii.unhexlify(pub_y) + negotiated_key = calculate_key_manager_ecdh0_negotiated_key(k2_G, 'main/key_manager/k1_ecdsa.pem') + test_ecdsa_key(negotiated_key, digest, signature_r_le, signature_s_le, pub_x, pub_y) test_numbers = dut.expect(r'(\d+) Tests (\d+) Failures (\d+) Ignored', timeout=timeout) failures = test_numbers.group(2).decode() From 0d35631ec1aca997f1d342f928371911840e1dd8 Mon Sep 17 00:00:00 2001 From: gaoxu Date: Mon, 24 Jun 2024 12:25:42 +0800 Subject: [PATCH 55/73] feat(rtcio): support RTCIO on ESP32C5 --- .../test_apps/gpio/main/test_rtcio.c | 2 +- .../test_apps/gpio/main/test_rtcio.h | 2 +- components/esp_driver_uart/src/uart.c | 9 +- .../esp_hw_support/port/esp32c5/io_mux.c | 36 +++ .../hal/esp32c5/include/hal/rtc_io_ll.h | 233 ++++++++---------- .../esp32c5/include/soc/Kconfig.soc_caps.in | 22 +- .../soc/esp32c5/include/soc/rtc_io_channel.h | 31 +++ components/soc/esp32c5/include/soc/soc_caps.h | 18 +- .../soc/esp32c5/include/soc/uart_pins.h | 8 +- components/soc/esp32c5/rtc_io_periph.c | 39 +++ examples/system/ulp/lp_core/gpio/README.md | 4 +- 11 files changed, 247 insertions(+), 157 deletions(-) create mode 100644 components/soc/esp32c5/include/soc/rtc_io_channel.h create mode 100644 components/soc/esp32c5/rtc_io_periph.c diff --git a/components/esp_driver_gpio/test_apps/gpio/main/test_rtcio.c b/components/esp_driver_gpio/test_apps/gpio/main/test_rtcio.c index 44d93165a9d3..fa6af2246279 100644 --- a/components/esp_driver_gpio/test_apps/gpio/main/test_rtcio.c +++ b/components/esp_driver_gpio/test_apps/gpio/main/test_rtcio.c @@ -238,7 +238,7 @@ TEST_CASE("RTCIO_output_hold_test", "[rtcio]") #if SOC_DEEP_SLEEP_SUPPORTED // It is not necessary to test every rtcio pin, it will take too much ci testing time for deep sleep // Only tests on s_test_map[TEST_RTCIO_DEEP_SLEEP_PIN_INDEX] pin -// (ESP32: IO25, ESP32S2, S3: IO6, C6: IO5, H2: IO12) these pads' default configuration is low level +// (ESP32: IO25, ESP32S2, S3: IO6, C6: IO5, H2: IO12, P4: IO5, C5: IO5) these pads' default configuration is low level #define TEST_RTCIO_DEEP_SLEEP_PIN_INDEX 5 static void rtcio_deep_sleep_hold_test_first_stage(void) diff --git a/components/esp_driver_gpio/test_apps/gpio/main/test_rtcio.h b/components/esp_driver_gpio/test_apps/gpio/main/test_rtcio.h index e2eb1f00d345..a33d64f0fbd3 100644 --- a/components/esp_driver_gpio/test_apps/gpio/main/test_rtcio.h +++ b/components/esp_driver_gpio/test_apps/gpio/main/test_rtcio.h @@ -93,7 +93,7 @@ const int s_test_map[TEST_GPIO_PIN_COUNT] = { GPIO_NUM_20, //GPIO20 GPIO_NUM_21, //GPIO21 }; -#elif CONFIG_IDF_TARGET_ESP32C6 +#elif CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32C5 // Has no input-only rtcio pins, all pins support pull-up/down #define RTCIO_SUPPORT_PU_PD(num) 1 #define TEST_GPIO_PIN_COUNT 8 diff --git a/components/esp_driver_uart/src/uart.c b/components/esp_driver_uart/src/uart.c index 999939899467..1cfcb6d34334 100644 --- a/components/esp_driver_uart/src/uart.c +++ b/components/esp_driver_uart/src/uart.c @@ -23,14 +23,17 @@ #include "soc/uart_periph.h" #include "driver/uart.h" #include "driver/gpio.h" -#include "driver/rtc_io.h" #include "driver/uart_select.h" -#include "driver/lp_io.h" #include "esp_private/gpio.h" #include "esp_private/uart_share_hw_ctrl.h" #include "esp_clk_tree.h" #include "sdkconfig.h" #include "esp_rom_gpio.h" +#if (SOC_UART_LP_NUM >= 1) +#include "driver/rtc_io.h" +#include "hal/rtc_io_ll.h" +#include "driver/lp_io.h" +#endif #include "clk_ctrl_os.h" #include "esp_pm.h" #include "esp_private/sleep_retention.h" @@ -744,7 +747,7 @@ esp_err_t uart_set_pin(uart_port_t uart_num, int tx_io_num, int rx_io_num, int r else { rtc_gpio_set_direction(tx_io_num, RTC_GPIO_MODE_OUTPUT_ONLY); rtc_gpio_init(tx_io_num); - rtc_gpio_iomux_func_sel(tx_io_num, 1); + rtc_gpio_iomux_func_sel(tx_io_num, RTCIO_LL_PIN_FUNC); lp_gpio_connect_out_signal(tx_io_num, UART_PERIPH_SIGNAL(uart_num, SOC_UART_TX_PIN_IDX), 0, 0); } diff --git a/components/esp_hw_support/port/esp32c5/io_mux.c b/components/esp_hw_support/port/esp32c5/io_mux.c index 6e9cd8430329..e8fb906555ac 100644 --- a/components/esp_hw_support/port/esp32c5/io_mux.c +++ b/components/esp_hw_support/port/esp32c5/io_mux.c @@ -6,11 +6,23 @@ #include "freertos/FreeRTOS.h" #include "esp_private/io_mux.h" +#include "esp_private/periph_ctrl.h" #include "hal/gpio_ll.h" +#include "hal/rtc_io_ll.h" + +#define RTCIO_RCC_ATOMIC() PERIPH_RCC_ATOMIC() static portMUX_TYPE s_io_mux_spinlock = portMUX_INITIALIZER_UNLOCKED; static soc_module_clk_t s_io_mux_clk_src = 0; // by default, the clock source is not set explicitly by any consumer (e.g. SDM, Filter) +#if CONFIG_ULP_COPROC_ENABLED +RTC_DATA_ATTR +#endif +static rtc_io_status_t s_rtc_io_status = { + .rtc_io_enabled_cnt = { 0 }, + .rtc_io_using_mask = 0 +}; + esp_err_t io_mux_set_clock_source(soc_module_clk_t clk_src) { bool clk_conflict = false; @@ -31,3 +43,27 @@ esp_err_t io_mux_set_clock_source(soc_module_clk_t clk_src) return ESP_OK; } + +void io_mux_enable_lp_io_clock(gpio_num_t gpio_num, bool enable) +{ + portENTER_CRITICAL(&s_io_mux_spinlock); + if (enable) { + if (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] == 0) { + s_rtc_io_status.rtc_io_using_mask |= (1ULL << gpio_num); + } + s_rtc_io_status.rtc_io_enabled_cnt[gpio_num]++; + } else if (!enable && (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] > 0)) { + s_rtc_io_status.rtc_io_enabled_cnt[gpio_num]--; + if (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] == 0) { + s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << gpio_num); + } + } + RTCIO_RCC_ATOMIC() { + if (s_rtc_io_status.rtc_io_using_mask == 0) { + rtcio_ll_enable_io_clock(false); + } else { + rtcio_ll_enable_io_clock(true); + } + } + portEXIT_CRITICAL(&s_io_mux_spinlock); +} diff --git a/components/hal/esp32c5/include/hal/rtc_io_ll.h b/components/hal/esp32c5/include/hal/rtc_io_ll.h index ef2eb7bcf634..7b3d10819cfc 100644 --- a/components/hal/esp32c5/include/hal/rtc_io_ll.h +++ b/components/hal/esp32c5/include/hal/rtc_io_ll.h @@ -16,8 +16,10 @@ #include #include "soc/soc_caps.h" #include "soc/pcr_struct.h" -// #include "soc/lp_io_struct.h" -// #include "soc/lp_aon_struct.h" +#include "soc/lp_iomux_struct.h" +#include "soc/lp_aon_struct.h" +#include "soc/lp_gpio_struct.h" +#include "soc/lpperi_struct.h" #include "soc/pmu_struct.h" #include "hal/misc.h" #include "hal/assert.h" @@ -26,7 +28,7 @@ extern "C" { #endif -#define RTCIO_LL_PIN_FUNC 0 +#define RTCIO_LL_PIN_FUNC 1 typedef enum { RTCIO_LL_FUNC_RTC = 0x0, /*!< The pin controlled by RTC module. */ @@ -39,11 +41,6 @@ typedef enum { RTCIO_LL_WAKEUP_HIGH_LEVEL = 0x5, /*!< GPIO interrupt type : input high level trigger */ } rtcio_ll_wake_type_t; -typedef enum { - RTCIO_LL_OUTPUT_NORMAL = 0, /*!< RTCIO output mode is normal. */ - RTCIO_LL_OUTPUT_OD = 0x1, /*!< RTCIO output mode is open-drain. */ -} rtcio_ll_out_mode_t; - typedef enum { RTCIO_INTR_DISABLE = 0, /*!< Disable GPIO interrupt */ RTCIO_INTR_POSEDGE = 1, /*!< GPIO interrupt type : rising edge */ @@ -53,6 +50,11 @@ typedef enum { RTCIO_INTR_HIGH_LEVEL = 5, /*!< GPIO interrupt type : input high level trigger */ } rtcio_ll_intr_type_t; +typedef enum { + RTCIO_LL_OUTPUT_NORMAL = 0, /*!< RTCIO output mode is normal. */ + RTCIO_LL_OUTPUT_OD = 0x1, /*!< RTCIO output mode is open-drain. */ +} rtcio_ll_out_mode_t; + /** * @brief Select a RTC IOMUX function for the RTC IO * @@ -61,11 +63,24 @@ typedef enum { */ static inline void rtcio_ll_iomux_func_sel(int rtcio_num, int func) { - // TODO: [ESP32C5] IDF-8719 - // LP_IO.gpio[rtcio_num].mcu_sel = func; - abort(); + LP_IO_MUX.gpion[rtcio_num].gpion_mcu_sel = func; } +/** + * @brief Enable/Disable LP_GPIO peripheral clock. + * + * @param enable true to enable the clock / false to disable the clock + */ +static inline void _rtcio_ll_enable_io_clock(bool enable) +{ + LPPERI.clk_en.lp_io_ck_en = enable; + while (LPPERI.clk_en.lp_io_ck_en != enable) { + ; + } +} + +#define rtcio_ll_enable_io_clock(...) (void)__DECLARE_RCC_ATOMIC_ENV; _rtcio_ll_enable_io_clock(__VA_ARGS__) + /** * @brief Select the rtcio function. * @@ -78,21 +93,19 @@ static inline void rtcio_ll_iomux_func_sel(int rtcio_num, int func) */ static inline void rtcio_ll_function_select(int rtcio_num, rtcio_ll_func_t func) { - // TODO: [ESP32C5] IDF-8719 - // if (func == RTCIO_LL_FUNC_RTC) { - // // 0: GPIO connected to digital GPIO module. 1: GPIO connected to analog RTC module. - // uint32_t sel_mask = HAL_FORCE_READ_U32_REG_FIELD(LP_AON.gpio_mux, gpio_mux_sel); - // sel_mask |= BIT(rtcio_num); - // HAL_FORCE_MODIFY_U32_REG_FIELD(LP_AON.gpio_mux, gpio_mux_sel, sel_mask); - // //0:RTC FUNCTION 1,2,3:Reserved - // rtcio_ll_iomux_func_sel(rtcio_num, RTCIO_LL_PIN_FUNC); - // } else if (func == RTCIO_LL_FUNC_DIGITAL) { - // // Clear the bit to use digital GPIO module - // uint32_t sel_mask = HAL_FORCE_READ_U32_REG_FIELD(LP_AON.gpio_mux, gpio_mux_sel); - // sel_mask &= ~BIT(rtcio_num); - // HAL_FORCE_MODIFY_U32_REG_FIELD(LP_AON.gpio_mux, gpio_mux_sel, sel_mask); - // } - abort(); + if (func == RTCIO_LL_FUNC_RTC) { + // 0: GPIO connected to digital GPIO module. 1: GPIO connected to analog RTC module. + uint32_t sel_mask = HAL_FORCE_READ_U32_REG_FIELD(LP_AON.gpio_mux, gpio_mux_sel); + sel_mask |= BIT(rtcio_num); + HAL_FORCE_MODIFY_U32_REG_FIELD(LP_AON.gpio_mux, gpio_mux_sel, sel_mask); + // LP_GPIO is FUNC 1 + rtcio_ll_iomux_func_sel(rtcio_num, RTCIO_LL_PIN_FUNC); + } else if (func == RTCIO_LL_FUNC_DIGITAL) { + // Clear the bit to use digital GPIO module + uint32_t sel_mask = HAL_FORCE_READ_U32_REG_FIELD(LP_AON.gpio_mux, gpio_mux_sel); + sel_mask &= ~BIT(rtcio_num); + HAL_FORCE_MODIFY_U32_REG_FIELD(LP_AON.gpio_mux, gpio_mux_sel, sel_mask); + } } /** @@ -102,9 +115,7 @@ static inline void rtcio_ll_function_select(int rtcio_num, rtcio_ll_func_t func) */ static inline void rtcio_ll_output_enable(int rtcio_num) { - // TODO: [ESP32C5] IDF-8719 - // HAL_FORCE_MODIFY_U32_REG_FIELD(LP_IO.out_enable_w1ts, enable_w1ts, BIT(rtcio_num)); - abort(); + HAL_FORCE_MODIFY_U32_REG_FIELD(LP_GPIO.enable_w1ts, enable_w1ts, BIT(rtcio_num)); } /** @@ -114,9 +125,7 @@ static inline void rtcio_ll_output_enable(int rtcio_num) */ static inline void rtcio_ll_output_disable(int rtcio_num) { - // TODO: [ESP32C5] IDF-8719 - // HAL_FORCE_MODIFY_U32_REG_FIELD(LP_IO.out_enable_w1tc, enable_w1tc, BIT(rtcio_num)); - abort(); + HAL_FORCE_MODIFY_U32_REG_FIELD(LP_GPIO.enable_w1tc, enable_w1tc, BIT(rtcio_num)); } /** @@ -127,13 +136,11 @@ static inline void rtcio_ll_output_disable(int rtcio_num) */ static inline void rtcio_ll_set_level(int rtcio_num, uint32_t level) { - // TODO: [ESP32C5] IDF-8719 - // if (level) { - // HAL_FORCE_MODIFY_U32_REG_FIELD(LP_IO.out_data_w1ts, out_data_w1ts, BIT(rtcio_num)); - // } else { - // HAL_FORCE_MODIFY_U32_REG_FIELD(LP_IO.out_data_w1tc, out_data_w1tc, BIT(rtcio_num)); - // } - abort(); + if (level) { + HAL_FORCE_MODIFY_U32_REG_FIELD(LP_GPIO.out_w1ts, out_w1ts, BIT(rtcio_num)); + } else { + HAL_FORCE_MODIFY_U32_REG_FIELD(LP_GPIO.out_w1tc, out_w1tc, BIT(rtcio_num)); + } } /** @@ -143,9 +150,7 @@ static inline void rtcio_ll_set_level(int rtcio_num, uint32_t level) */ static inline void rtcio_ll_input_enable(int rtcio_num) { - // TODO: [ESP32C5] IDF-8719 - // LP_IO.gpio[rtcio_num].fun_ie = 1; - abort(); + LP_IO_MUX.gpion[rtcio_num].gpion_fun_ie = 1; } /** @@ -155,9 +160,7 @@ static inline void rtcio_ll_input_enable(int rtcio_num) */ static inline void rtcio_ll_input_disable(int rtcio_num) { - // TODO: [ESP32C5] IDF-8719 - // LP_IO.gpio[rtcio_num].fun_ie = 0; - abort(); + LP_IO_MUX.gpion[rtcio_num].gpion_fun_ie = 0; } /** @@ -168,10 +171,7 @@ static inline void rtcio_ll_input_disable(int rtcio_num) */ static inline uint32_t rtcio_ll_get_level(int rtcio_num) { - // TODO: [ESP32C5] IDF-8719 - // return (uint32_t)(HAL_FORCE_READ_U32_REG_FIELD(LP_IO.in, in_data_next) >> rtcio_num) & 0x1; - abort(); - return (uint32_t)0; + return (uint32_t)(HAL_FORCE_READ_U32_REG_FIELD(LP_GPIO.in, in_data_next) >> rtcio_num) & 0x1; } /** @@ -182,9 +182,7 @@ static inline uint32_t rtcio_ll_get_level(int rtcio_num) */ static inline void rtcio_ll_set_drive_capability(int rtcio_num, uint32_t strength) { - // TODO: [ESP32C5] IDF-8719 - // LP_IO.gpio[rtcio_num].fun_drv = strength; - abort(); + LP_IO_MUX.gpion[rtcio_num].gpion_fun_drv = strength; } /** @@ -195,10 +193,7 @@ static inline void rtcio_ll_set_drive_capability(int rtcio_num, uint32_t strengt */ static inline uint32_t rtcio_ll_get_drive_capability(int rtcio_num) { - // TODO: [ESP32C5] IDF-8719 - // return LP_IO.gpio[rtcio_num].fun_drv; - abort(); - return (uint32_t)0; + return LP_IO_MUX.gpion[rtcio_num].gpion_fun_drv; } /** @@ -209,9 +204,7 @@ static inline uint32_t rtcio_ll_get_drive_capability(int rtcio_num) */ static inline void rtcio_ll_output_mode_set(int rtcio_num, rtcio_ll_out_mode_t mode) { - // TODO: [ESP32C5] IDF-8719 - // LP_IO.pin[rtcio_num].pad_driver = mode; - abort(); + LP_GPIO.pinn[rtcio_num].pinn_pad_driver = mode; } /** @@ -221,10 +214,8 @@ static inline void rtcio_ll_output_mode_set(int rtcio_num, rtcio_ll_out_mode_t m */ static inline void rtcio_ll_pullup_enable(int rtcio_num) { - // TODO: [ESP32C5] IDF-8719 - // /* Enable internal weak pull-up */ - // LP_IO.gpio[rtcio_num].fun_wpu = 1; - abort(); + /* Enable internal weak pull-up */ + LP_IO_MUX.gpion[rtcio_num].gpion_fun_wpu = 1; } /** @@ -234,10 +225,8 @@ static inline void rtcio_ll_pullup_enable(int rtcio_num) */ static inline void rtcio_ll_pullup_disable(int rtcio_num) { - // TODO: [ESP32C5] IDF-8719 - // /* Disable internal weak pull-up */ - // LP_IO.gpio[rtcio_num].fun_wpu = 0; - abort(); + /* Disable internal weak pull-up */ + LP_IO_MUX.gpion[rtcio_num].gpion_fun_wpu = 0; } /** @@ -247,10 +236,8 @@ static inline void rtcio_ll_pullup_disable(int rtcio_num) */ static inline void rtcio_ll_pulldown_enable(int rtcio_num) { - // TODO: [ESP32C5] IDF-8719 - // /* Enable internal weak pull-down */ - // LP_IO.gpio[rtcio_num].fun_wpd = 1; - abort(); + /* Enable internal weak pull-down */ + LP_IO_MUX.gpion[rtcio_num].gpion_fun_wpd = 1; } /** @@ -260,10 +247,8 @@ static inline void rtcio_ll_pulldown_enable(int rtcio_num) */ static inline void rtcio_ll_pulldown_disable(int rtcio_num) { - // TODO: [ESP32C5] IDF-8719 - // /* Enable internal weak pull-down */ - // LP_IO.gpio[rtcio_num].fun_wpd = 0; - abort(); + /* Enable internal weak pull-down */ + LP_IO_MUX.gpion[rtcio_num].gpion_fun_wpd = 0; } /** @@ -278,9 +263,7 @@ static inline void rtcio_ll_pulldown_disable(int rtcio_num) */ static inline void rtcio_ll_force_hold_enable(int rtcio_num) { - // TODO: [ESP32C5] IDF-8719 - // LP_AON.gpio_hold0.gpio_hold0 |= BIT(rtcio_num); - abort(); + LP_AON.gpio_hold0.gpio_hold0 |= BIT(rtcio_num); } /** @@ -291,9 +274,7 @@ static inline void rtcio_ll_force_hold_enable(int rtcio_num) */ static inline void rtcio_ll_force_hold_disable(int rtcio_num) { - // TODO: [ESP32C5] IDF-8719 - // LP_AON.gpio_hold0.gpio_hold0 &= ~BIT(rtcio_num); - abort(); + LP_AON.gpio_hold0.gpio_hold0 &= ~BIT(rtcio_num); } /** @@ -306,9 +287,7 @@ static inline void rtcio_ll_force_hold_disable(int rtcio_num) */ static inline void rtcio_ll_force_hold_all(void) { - // TODO: [ESP32C5] IDF-8719 - // PMU.imm.pad_hold_all.tie_high_lp_pad_hold_all = 1; - abort(); + PMU.imm.pad_hold_all.tie_high_lp_pad_hold_all = 1; } /** @@ -318,9 +297,7 @@ static inline void rtcio_ll_force_hold_all(void) */ static inline void rtcio_ll_force_unhold_all(void) { - // TODO: [ESP32C5] IDF-8719 - // PMU.imm.pad_hold_all.tie_low_lp_pad_hold_all = 1; - abort(); + PMU.imm.pad_hold_all.tie_low_lp_pad_hold_all = 1; } /** @@ -331,10 +308,8 @@ static inline void rtcio_ll_force_unhold_all(void) */ static inline void rtcio_ll_wakeup_enable(int rtcio_num, rtcio_ll_wake_type_t type) { - // TODO: [ESP32C5] IDF-8719 - // LP_IO.pin[rtcio_num].wakeup_enable = 1; - // LP_IO.pin[rtcio_num].int_type = type; - abort(); + LP_GPIO.pinn[rtcio_num].pinn_wakeup_enable = 1; + LP_GPIO.pinn[rtcio_num].pinn_int_type = type; } /** @@ -344,10 +319,26 @@ static inline void rtcio_ll_wakeup_enable(int rtcio_num, rtcio_ll_wake_type_t ty */ static inline void rtcio_ll_wakeup_disable(int rtcio_num) { - // TODO: [ESP32C5] IDF-8719 - // LP_IO.pin[rtcio_num].wakeup_enable = 0; - // LP_IO.pin[rtcio_num].int_type = RTCIO_LL_WAKEUP_DISABLE; - abort(); + LP_GPIO.pinn[rtcio_num].pinn_wakeup_enable = 0; + LP_GPIO.pinn[rtcio_num].pinn_int_type = RTCIO_LL_WAKEUP_DISABLE; +} + +/** + * Enable interrupt function and set interrupt type + * + * @param rtcio_num The index of rtcio. 0 ~ MAX(rtcio). + * @param type Interrupt type on high level or low level. + */ + +static inline void rtcio_ll_intr_enable(int rtcio_num, rtcio_ll_intr_type_t type) +{ + LP_GPIO.pinn[rtcio_num].pinn_int_type = type; + + /* Work around for HW issue, + need to also enable this clk, so that LP_GPIO.status.status_interrupt can get updated, + and trigger the interrupt on the LP Core + */ + LP_GPIO.clock_gate.clk_en = 1; } /** @@ -357,9 +348,7 @@ static inline void rtcio_ll_wakeup_disable(int rtcio_num) */ static inline void rtcio_ll_enable_output_in_sleep(int rtcio_num) { - // TODO: [ESP32C5] IDF-8719 - // LP_IO.gpio[rtcio_num].mcu_oe = 1; - abort(); + LP_IO_MUX.gpion[rtcio_num].gpion_mcu_oe = 1; } /** @@ -369,9 +358,7 @@ static inline void rtcio_ll_enable_output_in_sleep(int rtcio_num) */ static inline void rtcio_ll_disable_output_in_sleep(int rtcio_num) { - // TODO: [ESP32C5] IDF-8719 - // LP_IO.gpio[rtcio_num].mcu_oe = 0; - abort(); + LP_IO_MUX.gpion[rtcio_num].gpion_mcu_oe = 0; } /** @@ -381,9 +368,7 @@ static inline void rtcio_ll_disable_output_in_sleep(int rtcio_num) */ static inline void rtcio_ll_enable_input_in_sleep(int rtcio_num) { - // TODO: [ESP32C5] IDF-8719 - // LP_IO.gpio[rtcio_num].mcu_ie = 1; - abort(); + LP_IO_MUX.gpion[rtcio_num].gpion_mcu_ie = 1; } /** @@ -393,9 +378,7 @@ static inline void rtcio_ll_enable_input_in_sleep(int rtcio_num) */ static inline void rtcio_ll_disable_input_in_sleep(int rtcio_num) { - // TODO: [ESP32C5] IDF-8719 - // LP_IO.gpio[rtcio_num].mcu_ie = 0; - abort(); + LP_IO_MUX.gpion[rtcio_num].gpion_mcu_ie = 0; } /** @@ -405,9 +388,7 @@ static inline void rtcio_ll_disable_input_in_sleep(int rtcio_num) */ static inline void rtcio_ll_enable_sleep_setting(int rtcio_num) { - // TODO: [ESP32C5] IDF-8719 - // LP_IO.gpio[rtcio_num].slp_sel = 1; - abort(); + LP_IO_MUX.gpion[rtcio_num].gpion_slp_sel = 1; } /** @@ -417,9 +398,7 @@ static inline void rtcio_ll_enable_sleep_setting(int rtcio_num) */ static inline void rtcio_ll_disable_sleep_setting(int rtcio_num) { - // TODO: [ESP32C5] IDF-8719 - // LP_IO.gpio[rtcio_num].slp_sel = 0; - abort(); + LP_IO_MUX.gpion[rtcio_num].gpion_slp_sel = 0; } /** @@ -430,11 +409,8 @@ static inline void rtcio_ll_disable_sleep_setting(int rtcio_num) */ static inline bool rtcio_ll_wakeup_is_enabled(int rtcio_num) { - // TODO: [ESP32C5] IDF-8719 - // HAL_ASSERT(rtcio_num >= 0 && rtcio_num < SOC_RTCIO_PIN_COUNT && "io does not support deep sleep wake-up function"); - // return LP_IO.pin[rtcio_num].wakeup_enable; - abort(); - return (bool)0; + HAL_ASSERT(rtcio_num >= 0 && rtcio_num < SOC_RTCIO_PIN_COUNT && "io does not support deep sleep wake-up function"); + return LP_GPIO.pinn[rtcio_num].pinn_wakeup_enable; } /** @@ -444,10 +420,7 @@ static inline bool rtcio_ll_wakeup_is_enabled(int rtcio_num) */ static inline uint32_t rtcio_ll_get_interrupt_status(void) { - // TODO: [ESP32C5] IDF-8719 - // return (uint32_t)HAL_FORCE_READ_U32_REG_FIELD(LP_IO.status, status_interrupt); - abort(); - return (uint32_t)0; + return (uint32_t)HAL_FORCE_READ_U32_REG_FIELD(LP_GPIO.status, status_interrupt); } /** @@ -455,21 +428,7 @@ static inline uint32_t rtcio_ll_get_interrupt_status(void) */ static inline void rtcio_ll_clear_interrupt_status(void) { - // TODO: [ESP32C5] IDF-8719 - // HAL_FORCE_MODIFY_U32_REG_FIELD(LP_IO.status_w1tc, status_w1tc, 0xff); - abort(); -} - -/** - * Enable interrupt function and set interrupt type - * - * @param rtcio_num The index of rtcio. 0 ~ MAX(rtcio). - * @param type Interrupt type on high level or low level. - */ -static inline void rtcio_ll_intr_enable(int rtcio_num, rtcio_ll_intr_type_t type) -{ - // TODO: [ESP32C5] IDF-8719 - //LP_GPIO.pin[rtcio_num].int_type = type; + HAL_FORCE_MODIFY_U32_REG_FIELD(LP_GPIO.status_w1tc, status_w1tc, 0xff); } #ifdef __cplusplus diff --git a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in index 62b05f280d05..5bf8d557d51e 100644 --- a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in @@ -295,6 +295,14 @@ config SOC_GPIO_SUPPORT_RTC_INDEPENDENT bool default y +config SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP + bool + default y + +config SOC_LP_IO_CLOCK_IS_INDEPENDENT + bool + default y + config SOC_GPIO_IN_RANGE_MAX int default 28 @@ -325,7 +333,19 @@ config SOC_GPIO_CLOCKOUT_CHANNEL_NUM config SOC_RTCIO_PIN_COUNT int - default 0 + default 8 + +config SOC_RTCIO_INPUT_OUTPUT_SUPPORTED + bool + default y + +config SOC_RTCIO_HOLD_SUPPORTED + bool + default y + +config SOC_RTCIO_WAKE_SUPPORTED + bool + default y config SOC_I2C_NUM int diff --git a/components/soc/esp32c5/include/soc/rtc_io_channel.h b/components/soc/esp32c5/include/soc/rtc_io_channel.h new file mode 100644 index 000000000000..df2120f045b5 --- /dev/null +++ b/components/soc/esp32c5/include/soc/rtc_io_channel.h @@ -0,0 +1,31 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#define RTCIO_GPIO0_CHANNEL 0 //RTCIO_CHANNEL_0 +#define RTCIO_CHANNEL_0_GPIO_NUM 0 + +#define RTCIO_GPIO1_CHANNEL 1 //RTCIO_CHANNEL_1 +#define RTCIO_CHANNEL_1_GPIO_NUM 1 + +#define RTCIO_GPIO2_CHANNEL 2 //RTCIO_CHANNEL_2 +#define RTCIO_CHANNEL_2_GPIO_NUM 2 + +#define RTCIO_GPIO3_CHANNEL 3 //RTCIO_CHANNEL_3 +#define RTCIO_CHANNEL_3_GPIO_NUM 3 + +#define RTCIO_GPIO4_CHANNEL 4 //RTCIO_CHANNEL_4 +#define RTCIO_CHANNEL_4_GPIO_NUM 4 + +#define RTCIO_GPIO5_CHANNEL 5 //RTCIO_CHANNEL_5 +#define RTCIO_CHANNEL_5_GPIO_NUM 5 + +#define RTCIO_GPIO6_CHANNEL 6 //RTCIO_CHANNEL_6 +#define RTCIO_CHANNEL_6_GPIO_NUM 6 + +#define RTCIO_GPIO7_CHANNEL 7 //RTCIO_CHANNEL_7 +#define RTCIO_CHANNEL_7_GPIO_NUM 7 diff --git a/components/soc/esp32c5/include/soc/soc_caps.h b/components/soc/esp32c5/include/soc/soc_caps.h index 9ae9117a5cc0..0ead6332ca98 100644 --- a/components/soc/esp32c5/include/soc/soc_caps.h +++ b/components/soc/esp32c5/include/soc/soc_caps.h @@ -196,7 +196,9 @@ // On ESP32-C5, Digital IOs have their own registers to control pullup/down capability, independent of LP registers. #define SOC_GPIO_SUPPORT_RTC_INDEPENDENT (1) // GPIO0~7 on ESP32C5 can support chip deep sleep wakeup -// #define SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP (1) // TODO: [ESP32C5] IDF-8719 +#define SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP (1) +// LP IO peripherals have independent clock gating to manage +#define SOC_LP_IO_CLOCK_IS_INDEPENDENT (1) #define SOC_GPIO_VALID_GPIO_MASK ((1U< Date: Fri, 28 Jun 2024 18:01:37 +0200 Subject: [PATCH 56/73] refactor(linux): remove explicit watchpoint configs * These where necessary before to avoid enabling the watchpoint feature on Linux. Due to a recent change, these configurations became obsolete. --- .../console/test_apps/console/sdkconfig.ci.defaults.linux | 3 --- components/console/test_apps/console/sdkconfig.ci.sorted.linux | 3 --- components/console/test_apps/console/sdkconfig.defaults.linux | 1 - components/esp_event/test_apps/sdkconfig.defaults.linux | 1 - 4 files changed, 8 deletions(-) delete mode 100644 components/console/test_apps/console/sdkconfig.defaults.linux delete mode 100644 components/esp_event/test_apps/sdkconfig.defaults.linux diff --git a/components/console/test_apps/console/sdkconfig.ci.defaults.linux b/components/console/test_apps/console/sdkconfig.ci.defaults.linux index 640c6739d09c..9b39f10b99e6 100644 --- a/components/console/test_apps/console/sdkconfig.ci.defaults.linux +++ b/components/console/test_apps/console/sdkconfig.ci.defaults.linux @@ -1,4 +1 @@ CONFIG_IDF_TARGET="linux" - -# Not necessary on Linux -CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK=n diff --git a/components/console/test_apps/console/sdkconfig.ci.sorted.linux b/components/console/test_apps/console/sdkconfig.ci.sorted.linux index aa7094abbb60..c672cea1ca3d 100644 --- a/components/console/test_apps/console/sdkconfig.ci.sorted.linux +++ b/components/console/test_apps/console/sdkconfig.ci.sorted.linux @@ -1,7 +1,4 @@ CONFIG_IDF_TARGET="linux" -# Not necessary on Linux -CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK=n - # enable sorted commands in the help command CONFIG_CONSOLE_SORTED_HELP=y diff --git a/components/console/test_apps/console/sdkconfig.defaults.linux b/components/console/test_apps/console/sdkconfig.defaults.linux deleted file mode 100644 index e1ed9340db8b..000000000000 --- a/components/console/test_apps/console/sdkconfig.defaults.linux +++ /dev/null @@ -1 +0,0 @@ -CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK=n diff --git a/components/esp_event/test_apps/sdkconfig.defaults.linux b/components/esp_event/test_apps/sdkconfig.defaults.linux deleted file mode 100644 index e1ed9340db8b..000000000000 --- a/components/esp_event/test_apps/sdkconfig.defaults.linux +++ /dev/null @@ -1 +0,0 @@ -CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK=n From 342c9ef2bd501436bfa06e9e458ce85be4b5bd49 Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Mon, 1 Jul 2024 09:37:17 +0800 Subject: [PATCH 57/73] fix(heap): add heap related rom caps for C5 --- components/esp_rom/esp32c5/Kconfig.soc_caps.in | 8 ++++++++ components/esp_rom/esp32c5/esp_rom_caps.h | 2 ++ components/esp_rom/esp32c61/Kconfig.soc_caps.in | 4 ++++ components/esp_rom/esp32c61/esp_rom_caps.h | 1 + 4 files changed, 15 insertions(+) diff --git a/components/esp_rom/esp32c5/Kconfig.soc_caps.in b/components/esp_rom/esp32c5/Kconfig.soc_caps.in index 98c3d777162d..01399dcf91a9 100644 --- a/components/esp_rom/esp32c5/Kconfig.soc_caps.in +++ b/components/esp_rom/esp32c5/Kconfig.soc_caps.in @@ -47,6 +47,14 @@ config ESP_ROM_HAS_HEAP_TLSF bool default y +config ESP_ROM_TLSF_CHECK_PATCH + bool + default y + +config ESP_ROM_MULTI_HEAP_WALK_PATCH + bool + default y + config ESP_ROM_HAS_LAYOUT_TABLE bool default y diff --git a/components/esp_rom/esp32c5/esp_rom_caps.h b/components/esp_rom/esp32c5/esp_rom_caps.h index 40495fae97ae..a2692cf2b627 100644 --- a/components/esp_rom/esp32c5/esp_rom_caps.h +++ b/components/esp_rom/esp32c5/esp_rom_caps.h @@ -17,6 +17,8 @@ #define ESP_ROM_HAS_HAL_WDT (1) // ROM has the implementation of Watchdog HAL driver #define ESP_ROM_HAS_HAL_SYSTIMER (1) // ROM has the implementation of Systimer HAL driver #define ESP_ROM_HAS_HEAP_TLSF (1) // ROM has the implementation of the tlsf and multi-heap library +#define ESP_ROM_TLSF_CHECK_PATCH (1) // ROM does not contain the patch of tlsf_check_pool() +#define ESP_ROM_MULTI_HEAP_WALK_PATCH (1) // ROM does not contain the patch of multi_heap_walk() #define ESP_ROM_HAS_LAYOUT_TABLE (1) // ROM has the layout table #define ESP_ROM_HAS_SPI_FLASH (1) // ROM has the implementation of SPI Flash driver #define ESP_ROM_WITHOUT_REGI2C (1) // ROM has no regi2c APIs TODO: IDF-10110 need refactor diff --git a/components/esp_rom/esp32c61/Kconfig.soc_caps.in b/components/esp_rom/esp32c61/Kconfig.soc_caps.in index 67076708db0f..e5e00f60471d 100644 --- a/components/esp_rom/esp32c61/Kconfig.soc_caps.in +++ b/components/esp_rom/esp32c61/Kconfig.soc_caps.in @@ -51,6 +51,10 @@ config ESP_ROM_TLSF_CHECK_PATCH bool default y +config ESP_ROM_MULTI_HEAP_WALK_PATCH + bool + default y + config ESP_ROM_HAS_LAYOUT_TABLE bool default y diff --git a/components/esp_rom/esp32c61/esp_rom_caps.h b/components/esp_rom/esp32c61/esp_rom_caps.h index aea1da0391b4..ba643612709d 100644 --- a/components/esp_rom/esp32c61/esp_rom_caps.h +++ b/components/esp_rom/esp32c61/esp_rom_caps.h @@ -18,6 +18,7 @@ #define ESP_ROM_HAS_HAL_SYSTIMER (1) // ROM has the implementation of Systimer HAL driver #define ESP_ROM_HAS_HEAP_TLSF (1) // ROM has the implementation of the tlsf and multi-heap library #define ESP_ROM_TLSF_CHECK_PATCH (1) // ROM does not contain the patch of tlsf_check_pool() +#define ESP_ROM_MULTI_HEAP_WALK_PATCH (1) // ROM does not contain the patch of multi_heap_walk() #define ESP_ROM_HAS_LAYOUT_TABLE (1) // ROM has the layout table #define ESP_ROM_HAS_SPI_FLASH (1) // ROM has the implementation of SPI Flash driver // TODO: [ESP32C61] IDF-9276, still should be true, temp commented From 62ef4515c7183173b2a1eb3ce348205771af4978 Mon Sep 17 00:00:00 2001 From: Abhinav Kudnar Date: Thu, 20 Jun 2024 13:04:09 +0530 Subject: [PATCH 58/73] fix(nimble): Fix the sequence of pairing complete event --- components/bt/host/nimble/nimble | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/host/nimble/nimble b/components/bt/host/nimble/nimble index 4486eee18602..74f81e10d891 160000 --- a/components/bt/host/nimble/nimble +++ b/components/bt/host/nimble/nimble @@ -1 +1 @@ -Subproject commit 4486eee186023a51426401178bddce9a141eafdb +Subproject commit 74f81e10d8911e6206dfd75a2459dbebe5886d10 From df9680b827d6e3dd5e1a511d1ac492b5fff1fabd Mon Sep 17 00:00:00 2001 From: aditi Date: Mon, 1 Jul 2024 14:50:13 +0530 Subject: [PATCH 59/73] docs: Adds document for wifi PEAP phase 2 authentication security advisory. --- docs/en/security/vulnerabilities.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/en/security/vulnerabilities.rst b/docs/en/security/vulnerabilities.rst index 32a188891c24..a8629f945e98 100644 --- a/docs/en/security/vulnerabilities.rst +++ b/docs/en/security/vulnerabilities.rst @@ -43,6 +43,17 @@ Security Advisory Concerning the Bluetooth BLUFFS Vulnerability * Impact: Applicable for ESP-IDF * Resolution: Please see advisory for details + +CVE-2023-52160 +~~~~~~~~~~~~~~ + +Security Advisory for PEAP Phase-2 Authentication + +* Espressif Advisory: `AR2024-003`_ +* Impact: Applicable for ESP-IDF +* Resolution: Please see advisory for details + + CVE-2022 -------- @@ -160,5 +171,6 @@ Security Advisory Concerning Wi-Fi Authentication Bypass .. _`AR2023-005`: https://www.espressif.com/sites/default/files/advisory_downloads/AR2023-005%20Security%20Advisory%20Concerning%20Bypassing%20Secure%20Boot%20and%20Flash%20Encryption%20Using%20EMFI%20EN.pdf .. _`AR2023-008`: https://www.espressif.com/sites/default/files/advisory_downloads/AR2023-008%20Security%20Advisory%20for%20WLAN%20FragAttacks%20v1.1%20EN_0.pdf .. _`AR2023-010`: https://www.espressif.com/sites/default/files/advisory_downloads/AR2023-010%20Security%20Advisory%20Concerning%20the%20Bluetooth%20BLUFFS%20Vulnerability%20EN.pdf +.. _`AR2024-003`: https://www.espressif.com/sites/default/files/advisory_downloads/AR2024-003%20Security%20Advisory%20for%20PEAP%20Phase-2%20authentication%20EN.pdf .. _`GHSA-22x6-3756-pfp8` : https://github.com/espressif/esp-idf/security/advisories/GHSA-22x6-3756-pfp8 .. _`GHSA-7f7f-jj2q-28wm` : https://github.com/espressif/esp-idf/security/advisories/GHSA-7f7f-jj2q-28wm From ac508b577802ea10a7c468e10a5fe7c42ca22560 Mon Sep 17 00:00:00 2001 From: Sarvesh Bodakhe Date: Thu, 23 May 2024 14:49:35 +0530 Subject: [PATCH 60/73] fix(wifi): Fix issue of supplicant using wrong parameters to configure bss - Ensure that wpa_supplicant's state machine registers the requirement for rsnxe before deciding to add rsnxe to a assoc request. Co-authored-by: jgujarathi --- components/esp_wifi/lib | 2 +- .../wpa_supplicant/esp_supplicant/src/esp_wifi_driver.h | 1 - components/wpa_supplicant/esp_supplicant/src/esp_wpa_main.c | 1 - components/wpa_supplicant/src/rsn_supp/wpa.c | 5 +++++ 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/components/esp_wifi/lib b/components/esp_wifi/lib index eacd07f165fe..73ed5e75a6b8 160000 --- a/components/esp_wifi/lib +++ b/components/esp_wifi/lib @@ -1 +1 @@ -Subproject commit eacd07f165fee254b37ee5819208e1185549ec59 +Subproject commit 73ed5e75a6b8d456583c84428d3f3e3713c99944 diff --git a/components/wpa_supplicant/esp_supplicant/src/esp_wifi_driver.h b/components/wpa_supplicant/esp_supplicant/src/esp_wifi_driver.h index 44f8ca2cc331..248c18a62ca4 100644 --- a/components/wpa_supplicant/esp_supplicant/src/esp_wifi_driver.h +++ b/components/wpa_supplicant/esp_supplicant/src/esp_wifi_driver.h @@ -142,7 +142,6 @@ struct wpa_funcs { void (*wpa_config_done)(void); uint8_t *(*owe_build_dhie)(uint16_t group); int (*owe_process_assoc_resp)(const u8 *rsn_ie, size_t rsn_len, const uint8_t *dh_ie, size_t dh_len); - int (*wpa_sta_set_ap_rsnxe)(const u8 *rsnxe, size_t rsnxe_ie_len); }; struct wpa2_funcs { diff --git a/components/wpa_supplicant/esp_supplicant/src/esp_wpa_main.c b/components/wpa_supplicant/esp_supplicant/src/esp_wpa_main.c index 5d1281f6d8d6..8dd2596ed769 100644 --- a/components/wpa_supplicant/esp_supplicant/src/esp_wpa_main.c +++ b/components/wpa_supplicant/esp_supplicant/src/esp_wpa_main.c @@ -469,7 +469,6 @@ int esp_supplicant_init(void) wpa_cb->wpa_config_bss = NULL;//wpa_config_bss; wpa_cb->wpa_michael_mic_failure = wpa_michael_mic_failure; wpa_cb->wpa_config_done = wpa_config_done; - wpa_cb->wpa_sta_set_ap_rsnxe = wpa_sm_set_ap_rsnxe; esp_wifi_register_wpa3_ap_cb(wpa_cb); esp_wifi_register_wpa3_cb(wpa_cb); diff --git a/components/wpa_supplicant/src/rsn_supp/wpa.c b/components/wpa_supplicant/src/rsn_supp/wpa.c index df5448077d3e..4e4e18936388 100644 --- a/components/wpa_supplicant/src/rsn_supp/wpa.c +++ b/components/wpa_supplicant/src/rsn_supp/wpa.c @@ -2434,6 +2434,11 @@ int wpa_set_bss(char *macddr, char * bssid, u8 pairwise_cipher, u8 group_cipher, if (res < 0) return -1; sm->assoc_wpa_ie_len = res; + + const u8 *rsnxe; + rsnxe = esp_wifi_sta_get_rsnxe((u8*)bssid); + wpa_sm_set_ap_rsnxe(rsnxe, rsnxe ? (rsnxe[1] + 2) : 0); + res = wpa_gen_rsnxe(sm, assoc_rsnxe, assoc_rsnxe_len); if (res < 0) return -1; From 4259df3d56f74b4f5b02452a62117453c0cf219e Mon Sep 17 00:00:00 2001 From: kindaTall <36714983+kindaTall@users.noreply.github.com> Date: Mon, 1 Jul 2024 12:16:32 +0200 Subject: [PATCH 61/73] docs(security): fix typo for key purpose field in flash encryption guide --- docs/en/security/flash-encryption.rst | 2 +- docs/zh_CN/security/flash-encryption.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/security/flash-encryption.rst b/docs/en/security/flash-encryption.rst index 4e24a076bc0b..dcf28dd451ea 100644 --- a/docs/en/security/flash-encryption.rst +++ b/docs/en/security/flash-encryption.rst @@ -413,7 +413,7 @@ To use a host generated key, take the following steps: idf.py --port PORT efuse-burn-key BLOCK my_flash_encryption_key.bin KEYPURPOSE - where ``BLOCK`` is a free keyblock between ``BLOCK_KEY0`` and ``BLOCK_KEY5``. And ``KEYPURPOSE`` is either ``AES_256_KEY_1``, ``XTS_AES_256_KEY_2``, ``XTS_AES_128_KEY``. See `{IDF_TARGET_NAME} Technical Reference Manual <{IDF_TARGET_TRM_EN_URL}>`_ for a description of the key purposes. + where ``BLOCK`` is a free keyblock between ``BLOCK_KEY0`` and ``BLOCK_KEY5``. And ``KEYPURPOSE`` is either ``XTS_AES_256_KEY_1``, ``XTS_AES_256_KEY_2``, ``XTS_AES_128_KEY``. See `{IDF_TARGET_NAME} Technical Reference Manual <{IDF_TARGET_TRM_EN_URL}>`_ for a description of the key purposes. For AES-128 (256-bit key) - ``XTS_AES_128_KEY``: diff --git a/docs/zh_CN/security/flash-encryption.rst b/docs/zh_CN/security/flash-encryption.rst index d3be755e0898..0eb8b130f2b8 100644 --- a/docs/zh_CN/security/flash-encryption.rst +++ b/docs/zh_CN/security/flash-encryption.rst @@ -413,7 +413,7 @@ flash 加密设置 espefuse.py --port PORT burn_key BLOCK my_flash_encryption_key.bin KEYPURPOSE - 其中 ``BLOCK`` 是 ``BLOCK_KEY0`` 和 ``BLOCK_KEY5`` 之间的空闲密钥区。而 ``KEYPURPOSE`` 是 ``AES_256_KEY_1``、``XTS_AES_256_KEY_2`` 或 ``XTS_AES_128_KEY``。关于密钥用途,请参考 `{IDF_TARGET_NAME} 技术参考手册 <{IDF_TARGET_TRM_CN_URL}>`_。 + 其中 ``BLOCK`` 是 ``BLOCK_KEY0`` 和 ``BLOCK_KEY5`` 之间的空闲密钥区。而 ``KEYPURPOSE`` 是 ``XTS_AES_256_KEY_1``、``XTS_AES_256_KEY_2`` 或 ``XTS_AES_128_KEY``。关于密钥用途,请参考 `{IDF_TARGET_NAME} 技术参考手册 <{IDF_TARGET_TRM_CN_URL}>`_。 对于 AES-128(256 位密钥)- ``XTS_AES_128_KEY``: From d8c335611356eda3e3ee34fd99ae111e6f925628 Mon Sep 17 00:00:00 2001 From: Xiaoyu Liu Date: Tue, 2 Jul 2024 10:46:08 +0800 Subject: [PATCH 62/73] change(esp_rom): RM esp_rom header files from check_public_headers_exceptions.txt --- tools/ci/check_public_headers_exceptions.txt | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/tools/ci/check_public_headers_exceptions.txt b/tools/ci/check_public_headers_exceptions.txt index faa9bc92d86f..bb8139191222 100644 --- a/tools/ci/check_public_headers_exceptions.txt +++ b/tools/ci/check_public_headers_exceptions.txt @@ -84,23 +84,6 @@ components/esp_coex/include/private/esp_coexist_adapter.h components/esp_coex/include/esp_coex_i154.h ### To be fixed: headers that rely on implicit inclusion # -components/esp_rom/esp32/include/esp32/rom/rtc.h -components/esp_rom/esp32c3/include/esp32c3/rom/rtc.h -components/esp_rom/esp32s2/include/esp32s2/rom/rtc.h -components/esp_rom/esp32s3/include/esp32s3/rom/rtc.h -components/esp_rom/esp32c2/include/esp32c2/rom/rtc.h -components/esp_rom/esp32c5/include/esp32c5/rom/rtc.h -components/esp_rom/esp32c6/include/esp32c6/rom/rtc.h -components/esp_rom/esp32h2/include/esp32h2/rom/rtc.h -components/esp_rom/esp32p4/include/esp32p4/rom/rtc.h -components/esp_rom/esp32c61/include/esp32c61/rom/rtc.h -components/esp_rom/esp32/include/esp32/rom/sha.h -components/esp_rom/esp32/include/esp32/rom/secure_boot.h -components/esp_rom/esp32c3/include/esp32c3/rom/spi_flash.h -components/esp_rom/esp32s2/include/esp32s2/rom/spi_flash.h -components/esp_rom/esp32s2/include/esp32s2/rom/cache.h -components/esp_rom/esp32s2/include/esp32s2/rom/secure_boot.h -components/esp_rom/esp32s2/include/esp32s2/rom/opi_flash.h components/esp_ringbuf/include/freertos/ringbuf.h components/esp_netif/include/esp_netif_defaults.h components/esp_netif/include/esp_netif_net_stack.h @@ -123,8 +106,6 @@ components/spi_flash/include/esp_private/spi_flash_os.h ### To be fixed: files which don't compile for esp32s2 target: components/esp_psram/include/esp32/himem.h -components/esp_rom/esp32/include/esp32/rom/ets_sys.h -components/esp_rom/esp32/include/esp32/rom/uart.h ### To be fixed: files which don't compile for esp32s3 target: From 8d0990806c02baa1c9de2f72f5d7ca5df44b69e0 Mon Sep 17 00:00:00 2001 From: Chen Jichang Date: Mon, 1 Jul 2024 19:23:28 +0800 Subject: [PATCH 63/73] feat(spi_lcd): add spi cs timing parameters Some lcd hardware drivers need different CS setup time. Add pretrans and posttrans parameters to control the CS time. Closes https://github.com/espressif/esp-idf/issues/13071 --- components/esp_lcd/include/esp_lcd_io_spi.h | 2 ++ components/esp_lcd/spi/esp_lcd_panel_io_spi.c | 4 ++++ docs/en/api-reference/peripherals/lcd/spi_lcd.rst | 2 ++ docs/zh_CN/api-reference/peripherals/lcd/spi_lcd.rst | 2 ++ 4 files changed, 10 insertions(+) diff --git a/components/esp_lcd/include/esp_lcd_io_spi.h b/components/esp_lcd/include/esp_lcd_io_spi.h index 43e1f571295e..6781c6a428ad 100644 --- a/components/esp_lcd/include/esp_lcd_io_spi.h +++ b/components/esp_lcd/include/esp_lcd_io_spi.h @@ -29,6 +29,8 @@ typedef struct { void *user_ctx; /*!< User private data, passed directly to on_color_trans_done's user_ctx */ int lcd_cmd_bits; /*!< Bit-width of LCD command */ int lcd_param_bits; /*!< Bit-width of LCD parameter */ + uint8_t cs_ena_pretrans; /*!< Amount of SPI bit-cycles the cs should be activated before the transmission (0-16) */ + uint8_t cs_ena_posttrans; /*!< Amount of SPI bit-cycles the cs should stay active after the transmission (0-16) */ struct { unsigned int dc_high_on_cmd: 1; /*!< If enabled, DC level = 1 indicates command transfer */ unsigned int dc_low_on_data: 1; /*!< If enabled, DC level = 0 indicates color data transfer */ diff --git a/components/esp_lcd/spi/esp_lcd_panel_io_spi.c b/components/esp_lcd/spi/esp_lcd_panel_io_spi.c index c1b9bde53d21..9586c84ab37e 100644 --- a/components/esp_lcd/spi/esp_lcd_panel_io_spi.c +++ b/components/esp_lcd/spi/esp_lcd_panel_io_spi.c @@ -50,6 +50,8 @@ typedef struct { size_t num_trans_inflight; // Number of transactions that are undergoing (the descriptor not recycled yet) int lcd_cmd_bits; // Bit width of LCD command int lcd_param_bits; // Bit width of LCD parameter + uint8_t cs_ena_pretrans; // Amount of SPI bit-cycles the cs should be activated before the transmission (0-16) + uint8_t cs_ena_posttrans; // Amount of SPI bit-cycles the cs should stay active after the transmission (0-16) struct { unsigned int dc_cmd_level: 1; // Indicates the level of DC line when transferring command unsigned int dc_data_level: 1; // Indicates the level of DC line when transferring color data @@ -82,6 +84,8 @@ esp_err_t esp_lcd_new_panel_io_spi(esp_lcd_spi_bus_handle_t bus, const esp_lcd_p .queue_size = io_config->trans_queue_depth, .pre_cb = lcd_spi_pre_trans_cb, // pre-transaction callback, mainly control DC gpio level .post_cb = lcd_spi_post_trans_color_cb, // post-transaction, where we invoke user registered "on_color_trans_done()" + .cs_ena_pretrans = io_config->cs_ena_pretrans, + .cs_ena_posttrans = io_config->cs_ena_posttrans, }; ret = spi_bus_add_device((spi_host_device_t)bus, &devcfg, &spi_panel_io->spi_dev); ESP_GOTO_ON_ERROR(ret, err, TAG, "adding spi device to bus failed"); diff --git a/docs/en/api-reference/peripherals/lcd/spi_lcd.rst b/docs/en/api-reference/peripherals/lcd/spi_lcd.rst index f8fa859c5aa0..8f254ca9d9a5 100644 --- a/docs/en/api-reference/peripherals/lcd/spi_lcd.rst +++ b/docs/en/api-reference/peripherals/lcd/spi_lcd.rst @@ -25,6 +25,8 @@ SPI Interfaced LCD - :cpp:member:`esp_lcd_panel_io_spi_config_t::spi_mode` sets the SPI mode. The LCD driver uses this mode to communicate with the LCD. For the meaning of the SPI mode, please refer to the :doc:`SPI Master API doc `. - :cpp:member:`esp_lcd_panel_io_spi_config_t::lcd_cmd_bits` and :cpp:member:`esp_lcd_panel_io_spi_config_t::lcd_param_bits` set the bit width of the command and parameter that recognized by the LCD controller chip. This is chip specific, you should refer to your LCD spec in advance. - :cpp:member:`esp_lcd_panel_io_spi_config_t::trans_queue_depth` sets the depth of the SPI transaction queue. A bigger value means more transactions can be queued up, but it also consumes more memory. + - :cpp:member:`esp_lcd_panel_io_spi_config_t::cs_ena_pretrans` sets the amount of SPI bit-cycles which the cs should be activated before the transmission (0-16). + - :cpp:member:`esp_lcd_panel_io_spi_config_t::cs_ena_posttrans` sets the amount of SPI bit-cycles which the cs should stay active after the transmission (0-16). .. code-block:: c diff --git a/docs/zh_CN/api-reference/peripherals/lcd/spi_lcd.rst b/docs/zh_CN/api-reference/peripherals/lcd/spi_lcd.rst index 5a3a760f48a8..1460cd39fc12 100644 --- a/docs/zh_CN/api-reference/peripherals/lcd/spi_lcd.rst +++ b/docs/zh_CN/api-reference/peripherals/lcd/spi_lcd.rst @@ -25,6 +25,8 @@ SPI 接口的 LCD - :cpp:member:`esp_lcd_panel_io_spi_config_t::spi_mode` 设置 SPI 模式。LCD 驱动程序使用此模式与 LCD 通信。有关 SPI 模式的详细信息,请参阅 :doc:`SPI 主机 API 文档 `。 - :cpp:member:`esp_lcd_panel_io_spi_config_t::lcd_cmd_bits` 和 :cpp:member:`esp_lcd_panel_io_spi_config_t::lcd_param_bits` 分别设置 LCD 控制器芯片可识别的命令及参数的位宽。不同芯片对位宽要求不同,请提前参阅 LCD 规格书。 - :cpp:member:`esp_lcd_panel_io_spi_config_t::trans_queue_depth` 设置 SPI 传输队列的深度。该值越大,可以排队的传输越多,但消耗的内存也越多。 + - :cpp:member:`esp_lcd_panel_io_spi_config_t::cs_ena_pretrans` 设置 SPI 在传输之前应激活 CS 信号线的 SPI 位周期数 (0-16)。 + - :cpp:member:`esp_lcd_panel_io_spi_config_t::cs_ena_posttrans` 设置 SPI 在传输之后保持激活 CS 信号线的 SPI 位周期数 (0-16)。 .. code-block:: c From 31b248cefa2bd418281dd19f2fa6b685ddc73c5e Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Tue, 2 Jul 2024 16:26:19 +0800 Subject: [PATCH 64/73] Revert "change(esp_rom): RM esp_rom header files from check_public_headers_exceptions.txt" This reverts commit d8c335611356eda3e3ee34fd99ae111e6f925628. --- tools/ci/check_public_headers_exceptions.txt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tools/ci/check_public_headers_exceptions.txt b/tools/ci/check_public_headers_exceptions.txt index bb8139191222..faa9bc92d86f 100644 --- a/tools/ci/check_public_headers_exceptions.txt +++ b/tools/ci/check_public_headers_exceptions.txt @@ -84,6 +84,23 @@ components/esp_coex/include/private/esp_coexist_adapter.h components/esp_coex/include/esp_coex_i154.h ### To be fixed: headers that rely on implicit inclusion # +components/esp_rom/esp32/include/esp32/rom/rtc.h +components/esp_rom/esp32c3/include/esp32c3/rom/rtc.h +components/esp_rom/esp32s2/include/esp32s2/rom/rtc.h +components/esp_rom/esp32s3/include/esp32s3/rom/rtc.h +components/esp_rom/esp32c2/include/esp32c2/rom/rtc.h +components/esp_rom/esp32c5/include/esp32c5/rom/rtc.h +components/esp_rom/esp32c6/include/esp32c6/rom/rtc.h +components/esp_rom/esp32h2/include/esp32h2/rom/rtc.h +components/esp_rom/esp32p4/include/esp32p4/rom/rtc.h +components/esp_rom/esp32c61/include/esp32c61/rom/rtc.h +components/esp_rom/esp32/include/esp32/rom/sha.h +components/esp_rom/esp32/include/esp32/rom/secure_boot.h +components/esp_rom/esp32c3/include/esp32c3/rom/spi_flash.h +components/esp_rom/esp32s2/include/esp32s2/rom/spi_flash.h +components/esp_rom/esp32s2/include/esp32s2/rom/cache.h +components/esp_rom/esp32s2/include/esp32s2/rom/secure_boot.h +components/esp_rom/esp32s2/include/esp32s2/rom/opi_flash.h components/esp_ringbuf/include/freertos/ringbuf.h components/esp_netif/include/esp_netif_defaults.h components/esp_netif/include/esp_netif_net_stack.h @@ -106,6 +123,8 @@ components/spi_flash/include/esp_private/spi_flash_os.h ### To be fixed: files which don't compile for esp32s2 target: components/esp_psram/include/esp32/himem.h +components/esp_rom/esp32/include/esp32/rom/ets_sys.h +components/esp_rom/esp32/include/esp32/rom/uart.h ### To be fixed: files which don't compile for esp32s3 target: From cb22b8aaf778e273815575f1ac2e4916bd555c9e Mon Sep 17 00:00:00 2001 From: laokaiyao Date: Thu, 27 Jun 2024 20:19:49 +0800 Subject: [PATCH 65/73] ci(esp32c5): enable c5 target test --- .gitlab/ci/default-build-test-rules.yml | 1 - .../app_update/test_apps/.build-test-rules.yml | 2 +- .../app_update/test_apps/pytest_app_update_ut.py | 1 + .../test_apps/rtc_custom_section/pytest_rtc_mem.py | 2 +- components/driver/test_apps/.build-test-rules.yml | 10 +++++++++- .../legacy_i2s_driver/pytest_legacy_i2s.py | 1 + .../test_apps/legacy_i2c_driver/pytest_i2c_legacy.py | 2 +- .../legacy_mcpwm_driver/pytest_legacy_mcpwm.py | 2 +- .../legacy_pcnt_driver/pytest_legacy_pcnt.py | 2 +- .../legacy_rmt_driver/pytest_legacy_rmt_driver.py | 2 +- .../esp_driver_gpio/test_apps/.build-test-rules.yml | 4 ++-- .../esp_driver_gpio/test_apps/gpio/pytest_gpio.py | 4 ++-- .../esp_driver_i2c/test_apps/.build-test-rules.yml | 4 ++-- .../test_apps/i2c_test_apps/pytest_i2c.py | 3 ++- .../esp_driver_i2s/test_apps/.build-test-rules.yml | 6 +++++- .../esp_driver_i2s/test_apps/i2s/pytest_i2s.py | 1 + .../test_apps/i2s_multi_dev/pytest_i2s_multi_dev.py | 1 + .../esp_driver_ledc/test_apps/.build-test-rules.yml | 4 ++-- .../esp_driver_ledc/test_apps/ledc/pytest_ledc.py | 7 ++++--- .../esp_driver_mcpwm/test_apps/.build-test-rules.yml | 4 ++++ .../esp_driver_mcpwm/test_apps/mcpwm/pytest_mcpwm.py | 2 +- .../test_apps/parlio/pytest_parlio_unity.py | 1 + .../esp_driver_pcnt/test_apps/.build-test-rules.yml | 4 ++++ .../test_apps/pulse_cnt/pytest_pulse_cnt.py | 2 +- .../esp_driver_rmt/test_apps/rmt/pytest_rmt.py | 2 +- .../esp_driver_spi/test_apps/.build-test-rules.yml | 6 +++--- .../test_apps/master/pytest_spi_master.py | 3 ++- .../test_apps/param/pytest_spi_param.py | 3 ++- .../test_apps/slave/pytest_spi_slave.py | 3 ++- .../test_apps/slave_hd/pytest_spi_slave_hd.py | 1 + .../esp_hw_support/test_apps/dma/pytest_dma.py | 2 +- .../test_apps/rtc_clk/pytest_rtc_clk.py | 4 ++-- .../test_app_vfs_l2tap/pytest_esp_vfs_l2tap.py | 3 +-- components/esp_pm/test_apps/esp_pm/pytest_esp_pm.py | 3 +++ .../esp_rom/test_apps/rom_tests/pytest_esp_rom.py | 2 +- components/freertos/test_apps/.build-test-rules.yml | 6 +++++- .../freertos/test_apps/freertos/pytest_freertos.py | 4 +++- components/newlib/test_apps/.build-test-rules.yml | 2 +- components/newlib/test_apps/newlib/pytest_newlib.py | 2 +- components/soc/esp32c5/include/soc/soc_caps.h | 2 ++ components/spi_flash/test_apps/.build-test-rules.yml | 2 +- .../test_apps/esp_flash/pytest_esp_flash.py | 2 +- .../esp_flash_stress/pytest_esp_flash_stress.py | 2 +- .../test_apps/mspi_test/pytest_mspi_test.py | 3 +-- components/ulp/test_apps/.build-test-rules.yml | 4 ++++ components/ulp/test_apps/lp_core/pytest_lp_core.py | 1 + .../i2s/i2s_basic/i2s_pdm/pytest_i2s_pdm.py | 1 + .../i2s/i2s_basic/i2s_std/pytest_i2s_std.py | 1 + .../i2s/i2s_basic/i2s_tdm/pytest_i2s_tdm.py | 1 + .../i2s_es7210_tdm/pytest_i2s_es7210_tdm.py | 1 + .../i2s/i2s_codec/i2s_es8311/pytest_i2s_es8311.py | 1 + .../mcpwm/mcpwm_capture_hc_sr04/pytest_hc_sr04.py | 2 +- .../mcpwm/mcpwm_servo_control/pytest_servo_mg996r.py | 2 +- .../mcpwm/mcpwm_sync/pytest_mcpwm_sync.py | 2 +- .../logic_analyzer/pytest_logic_analyzer.py | 1 + .../pcnt/rotary_encoder/pytest_rotary_encoder.py | 2 +- .../peripherals/rmt/dshot_esc/pytest_dshot_esc.py | 2 +- .../peripherals/rmt/led_strip/pytest_led_strip.py | 2 +- .../rmt/musical_buzzer/pytest_musical_buzzer.py | 2 +- examples/peripherals/rmt/onewire/pytest_onewire.py | 1 + .../rmt/stepper_motor/pytest_stepper_motor.py | 2 +- .../usb_serial_jtag_echo/pytest_usj_echo_example.py | 4 +--- examples/storage/.build-test-rules.yml | 8 +++++++- .../perf_benchmark/pytest_perf_benchmark_example.py | 1 + examples/system/.build-test-rules.yml | 12 +++++++++--- examples/system/app_trace_basic/README.md | 4 ++-- .../base_mac_address/pytest_base_mac_address.py | 2 ++ examples/system/efuse/pytest_system_efuse_example.py | 4 ++++ examples/system/esp_timer/pytest_esp_timer.py | 1 + .../system/ipc/ipc_isr/riscv/pytest_ipc_isr_riscv.py | 3 +-- .../ipc/ipc_isr/xtensa/pytest_ipc_isr_xtensa.py | 3 +-- examples/system/light_sleep/pytest_light_sleep.py | 1 + examples/system/ota/otatool/README.md | 4 ++-- examples/system/ulp/lp_core/gpio/README.md | 4 ++-- .../ulp/lp_core/interrupt/pytest_lp_core_intr.py | 1 + .../known_generate_test_child_pipeline_warnings.yml | 1 + tools/ci/idf_pytest/constants.py | 6 ++++-- .../peripherals/i2c_wifi/pytest_i2c_wifi.py | 11 +++++++---- .../pytest_phy_multi_init_data.py | 11 +++++++---- tools/test_apps/system/.build-test-rules.yml | 8 +++++++- .../system/esp_intr_dump/pytest_esp_intr_dump.py | 2 ++ .../ram_loadable_app/pytest_ram_loadable_app.py | 7 +++---- 82 files changed, 170 insertions(+), 85 deletions(-) diff --git a/.gitlab/ci/default-build-test-rules.yml b/.gitlab/ci/default-build-test-rules.yml index b0ea742f6a22..2fbd2205212c 100644 --- a/.gitlab/ci/default-build-test-rules.yml +++ b/.gitlab/ci/default-build-test-rules.yml @@ -11,7 +11,6 @@ extra_default_build_targets: - esp32c5 bypass_check_test_targets: - - esp32c5 - esp32c61 # # These lines would diff --git a/components/app_update/test_apps/.build-test-rules.yml b/components/app_update/test_apps/.build-test-rules.yml index 82bea1b0fc65..d5682ad14d07 100644 --- a/components/app_update/test_apps/.build-test-rules.yml +++ b/components/app_update/test_apps/.build-test-rules.yml @@ -4,4 +4,4 @@ components/app_update/test_apps: disable: - if: IDF_TARGET in ["esp32c5"] temporary: true - reason: target esp32c5 is not supported yet # TODO: [ESP32C5] IDF-8638 + reason: target esp32c5 is not supported yet # TODO: [ESP32C5] IDF-8640, IDF-10317 diff --git a/components/app_update/test_apps/pytest_app_update_ut.py b/components/app_update/test_apps/pytest_app_update_ut.py index 2d28f87622d8..bd5902cb4f50 100644 --- a/components/app_update/test_apps/pytest_app_update_ut.py +++ b/components/app_update/test_apps/pytest_app_update_ut.py @@ -19,6 +19,7 @@ def run_multiple_stages(dut: Dut, test_case_num: int, stages: int) -> None: @pytest.mark.supported_targets +@pytest.mark.temp_skip_ci(targets=['esp32c5'], reason='C5 has not supported deep sleep') # TODO: [ESP32C5] IDF-8640, IDF-10317 @pytest.mark.generic def test_app_update(dut: Dut) -> None: extra_data = dut.parse_test_menu() diff --git a/components/bootloader_support/test_apps/rtc_custom_section/pytest_rtc_mem.py b/components/bootloader_support/test_apps/rtc_custom_section/pytest_rtc_mem.py index 7016cd6b94af..6dbf4030a300 100644 --- a/components/bootloader_support/test_apps/rtc_custom_section/pytest_rtc_mem.py +++ b/components/bootloader_support/test_apps/rtc_custom_section/pytest_rtc_mem.py @@ -1,6 +1,5 @@ # SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded import Dut @@ -8,6 +7,7 @@ @pytest.mark.generic @pytest.mark.esp32 @pytest.mark.esp32c3 +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32s2 diff --git a/components/driver/test_apps/.build-test-rules.yml b/components/driver/test_apps/.build-test-rules.yml index bb61cea137c2..4acec4d44cfa 100644 --- a/components/driver/test_apps/.build-test-rules.yml +++ b/components/driver/test_apps/.build-test-rules.yml @@ -32,7 +32,7 @@ components/driver/test_apps/legacy_i2c_driver: disable: - if: IDF_TARGET == "esp32c5" temporary: true - reason: not support yet # TODO: [ESP32C5] IDF-8694 + reason: not support yet # TODO: [ESP32C5] IDF-10307 disable_test: - if: IDF_TARGET == "esp32p4" temporary: true @@ -54,12 +54,20 @@ components/driver/test_apps/legacy_mcpwm_driver: components/driver/test_apps/legacy_pcnt_driver: disable: - if: SOC_PCNT_SUPPORTED != 1 + disable_test: + - if: IDF_TARGET == "esp32c5" + temporary: true + reason: target test failed # TODO [ESP32C5] IDF-10341 depends_filepatterns: - components/driver/deprecated/**/*pcnt* components/driver/test_apps/legacy_rmt_driver: disable: - if: SOC_RMT_SUPPORTED != 1 + disable_test: + - if: IDF_TARGET == "esp32c5" + temporary: true + reason: target test failed # TODO: [ESP32C5] IDF-10330 depends_filepatterns: - components/driver/deprecated/**/*rmt* diff --git a/components/driver/test_apps/i2s_test_apps/legacy_i2s_driver/pytest_legacy_i2s.py b/components/driver/test_apps/i2s_test_apps/legacy_i2s_driver/pytest_legacy_i2s.py index e7ae5f6d3712..a5a9a9a1fff6 100644 --- a/components/driver/test_apps/i2s_test_apps/legacy_i2s_driver/pytest_legacy_i2s.py +++ b/components/driver/test_apps/i2s_test_apps/legacy_i2s_driver/pytest_legacy_i2s.py @@ -7,6 +7,7 @@ @pytest.mark.esp32 @pytest.mark.esp32s2 @pytest.mark.esp32c3 +@pytest.mark.esp32c5 @pytest.mark.esp32s3 @pytest.mark.esp32c6 @pytest.mark.esp32h2 diff --git a/components/driver/test_apps/legacy_i2c_driver/pytest_i2c_legacy.py b/components/driver/test_apps/legacy_i2c_driver/pytest_i2c_legacy.py index d32f69c6b1ab..841bb08618c8 100644 --- a/components/driver/test_apps/legacy_i2c_driver/pytest_i2c_legacy.py +++ b/components/driver/test_apps/legacy_i2c_driver/pytest_i2c_legacy.py @@ -5,7 +5,7 @@ @pytest.mark.supported_targets -@pytest.mark.temp_skip_ci(targets=['esp32p4'], reason='esp32p4 support TBD') # TODO: IDF-8960 +@pytest.mark.temp_skip_ci(targets=['esp32p4', 'esp32c5'], reason='esp32p4 support TBD, C5 failed') # TODO: IDF-8960, [ESP32C5] IDF-10307 @pytest.mark.generic @pytest.mark.parametrize( 'config', diff --git a/components/driver/test_apps/legacy_mcpwm_driver/pytest_legacy_mcpwm.py b/components/driver/test_apps/legacy_mcpwm_driver/pytest_legacy_mcpwm.py index 08cf31d5ab42..a8a9e25bd1fa 100644 --- a/components/driver/test_apps/legacy_mcpwm_driver/pytest_legacy_mcpwm.py +++ b/components/driver/test_apps/legacy_mcpwm_driver/pytest_legacy_mcpwm.py @@ -1,12 +1,12 @@ # SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded import Dut @pytest.mark.esp32 @pytest.mark.esp32s3 +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32p4 diff --git a/components/driver/test_apps/legacy_pcnt_driver/pytest_legacy_pcnt.py b/components/driver/test_apps/legacy_pcnt_driver/pytest_legacy_pcnt.py index 355ddb908bcc..68f8593a2602 100644 --- a/components/driver/test_apps/legacy_pcnt_driver/pytest_legacy_pcnt.py +++ b/components/driver/test_apps/legacy_pcnt_driver/pytest_legacy_pcnt.py @@ -1,6 +1,5 @@ # SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded import Dut @@ -8,6 +7,7 @@ @pytest.mark.esp32 @pytest.mark.esp32s2 @pytest.mark.esp32s3 +# @pytest.mark.esp32c5 # TODO [ESP32C5] IDF-10341 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32p4 diff --git a/components/driver/test_apps/legacy_rmt_driver/pytest_legacy_rmt_driver.py b/components/driver/test_apps/legacy_rmt_driver/pytest_legacy_rmt_driver.py index a49ce250f8c3..104beefc137c 100644 --- a/components/driver/test_apps/legacy_rmt_driver/pytest_legacy_rmt_driver.py +++ b/components/driver/test_apps/legacy_rmt_driver/pytest_legacy_rmt_driver.py @@ -1,6 +1,5 @@ # SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded import Dut @@ -9,6 +8,7 @@ @pytest.mark.esp32s2 @pytest.mark.esp32s3 @pytest.mark.esp32c3 +# @pytest.mark.esp32c5 # TODO: [ESP32C5] IDF-10330 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32p4 diff --git a/components/esp_driver_gpio/test_apps/.build-test-rules.yml b/components/esp_driver_gpio/test_apps/.build-test-rules.yml index f0eb84e6e240..9394fb7da165 100644 --- a/components/esp_driver_gpio/test_apps/.build-test-rules.yml +++ b/components/esp_driver_gpio/test_apps/.build-test-rules.yml @@ -2,9 +2,9 @@ components/esp_driver_gpio/test_apps: disable_test: - - if: IDF_TARGET == "esp32p4" + - if: IDF_TARGET in ["esp32p4", "esp32c5"] temporary: true - reason: test not pass, should be re-enable # TODO: IDF-8968 + reason: test not pass, should be re-enable # TODO: [ESP32P4] IDF-8968 [ESP32C5] IDF-10331 depends_components: - esp_driver_gpio diff --git a/components/esp_driver_gpio/test_apps/gpio/pytest_gpio.py b/components/esp_driver_gpio/test_apps/gpio/pytest_gpio.py index 2af5378174c5..446d23dddc68 100644 --- a/components/esp_driver_gpio/test_apps/gpio/pytest_gpio.py +++ b/components/esp_driver_gpio/test_apps/gpio/pytest_gpio.py @@ -1,6 +1,5 @@ # SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded_idf import IdfDut @@ -10,7 +9,8 @@ ] -@pytest.mark.temp_skip_ci(targets=['esp32p4'], reason='esp32p4 support TBD') +# TODO: [ESP32C5] IDF-10331 +@pytest.mark.temp_skip_ci(targets=['esp32p4', 'esp32c5'], reason='esp32p4 support TBD, c5 test failed') @pytest.mark.supported_targets @pytest.mark.generic @pytest.mark.parametrize('config', CONFIGS, indirect=True) diff --git a/components/esp_driver_i2c/test_apps/.build-test-rules.yml b/components/esp_driver_i2c/test_apps/.build-test-rules.yml index 19b812ef61f9..45214c12ad06 100644 --- a/components/esp_driver_i2c/test_apps/.build-test-rules.yml +++ b/components/esp_driver_i2c/test_apps/.build-test-rules.yml @@ -4,9 +4,9 @@ components/esp_driver_i2c/test_apps/i2c_test_apps: disable: - if: SOC_I2C_SUPPORTED != 1 disable_test: - - if: IDF_TARGET == "esp32p4" + - if: IDF_TARGET in ["esp32p4", "esp32c5"] temporary: true - reason: lack of runners + reason: lack of runners, c5 test failed # TODO: [ESP32P4] IDF-8960, [ESP32C5] IDF-10332 depends_components: - esp_driver_i2c # Following dependency is needed because they might increase lazy installed memory diff --git a/components/esp_driver_i2c/test_apps/i2c_test_apps/pytest_i2c.py b/components/esp_driver_i2c/test_apps/i2c_test_apps/pytest_i2c.py index 95ce5a8ed14c..6365b4ca17dc 100644 --- a/components/esp_driver_i2c/test_apps/i2c_test_apps/pytest_i2c.py +++ b/components/esp_driver_i2c/test_apps/i2c_test_apps/pytest_i2c.py @@ -6,7 +6,8 @@ @pytest.mark.supported_targets @pytest.mark.generic -@pytest.mark.temp_skip_ci(targets=['esp32p4'], reason='esp32p4 support TBD') # TODO: IDF-8960 +# TODO: [ESP32P4] IDF-8960, [ESP32C5] IDF-10332 +@pytest.mark.temp_skip_ci(targets=['esp32p4', 'esp32c5'], reason='esp32p4 support TBD, c5 test failed') @pytest.mark.parametrize( 'config', [ diff --git a/components/esp_driver_i2s/test_apps/.build-test-rules.yml b/components/esp_driver_i2s/test_apps/.build-test-rules.yml index fa1041bd8667..cf1abd358c2c 100644 --- a/components/esp_driver_i2s/test_apps/.build-test-rules.yml +++ b/components/esp_driver_i2s/test_apps/.build-test-rules.yml @@ -3,6 +3,10 @@ components/esp_driver_i2s/test_apps/i2s: disable: - if: SOC_I2S_SUPPORTED != 1 + disable_test: + - if: IDF_TARGET == "esp32c5" + temporary: true + reason: target test failed # TODO [ESP32C5] IDF-10343 depends_components: - esp_driver_i2s - esp_driver_pcnt @@ -12,7 +16,7 @@ components/esp_driver_i2s/test_apps/i2s_multi_dev: - if: SOC_I2S_SUPPORTED != 1 - if: SOC_I2S_HW_VERSION_2 != 1 disable_test: - - if: IDF_TARGET == "esp32p4" + - if: IDF_TARGET in ["esp32p4", "esp32c5"] # TODO: [ESP32C5] IDF- 10321 temporary: true reason: lack of runners depends_components: diff --git a/components/esp_driver_i2s/test_apps/i2s/pytest_i2s.py b/components/esp_driver_i2s/test_apps/i2s/pytest_i2s.py index 44017eb69241..eeb7eefaaf97 100644 --- a/components/esp_driver_i2s/test_apps/i2s/pytest_i2s.py +++ b/components/esp_driver_i2s/test_apps/i2s/pytest_i2s.py @@ -7,6 +7,7 @@ @pytest.mark.esp32 @pytest.mark.esp32s2 @pytest.mark.esp32c3 +# @pytest.mark.esp32c5 # TODO: [ESP32C5] IDF-10343 @pytest.mark.esp32c6 @pytest.mark.esp32s3 @pytest.mark.esp32h2 diff --git a/components/esp_driver_i2s/test_apps/i2s_multi_dev/pytest_i2s_multi_dev.py b/components/esp_driver_i2s/test_apps/i2s_multi_dev/pytest_i2s_multi_dev.py index 81fe933e11f9..3d53063d50e5 100644 --- a/components/esp_driver_i2s/test_apps/i2s_multi_dev/pytest_i2s_multi_dev.py +++ b/components/esp_driver_i2s/test_apps/i2s_multi_dev/pytest_i2s_multi_dev.py @@ -5,6 +5,7 @@ @pytest.mark.esp32s3 @pytest.mark.esp32c3 +# @pytest.mark.esp32c5 # TODO: [ESP32C5] IDF- 10321 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.generic_multi_device diff --git a/components/esp_driver_ledc/test_apps/.build-test-rules.yml b/components/esp_driver_ledc/test_apps/.build-test-rules.yml index 00d99826d130..9fe6d7d7f30a 100644 --- a/components/esp_driver_ledc/test_apps/.build-test-rules.yml +++ b/components/esp_driver_ledc/test_apps/.build-test-rules.yml @@ -4,8 +4,8 @@ components/esp_driver_ledc/test_apps/ledc: disable: - if: SOC_LEDC_SUPPORTED != 1 disable_test: - - if: IDF_TARGET == "esp32p4" + - if: IDF_TARGET in ["esp32p4", "esp32c5"] temporary: true - reason: test not pass, should be re-enable # TODO: IDF-8969 + reason: test not pass, should be re-enable # TODO: [ESP32P4] IDF-8969, [ESP32C5] IDF-10333 depends_components: - esp_driver_ledc diff --git a/components/esp_driver_ledc/test_apps/ledc/pytest_ledc.py b/components/esp_driver_ledc/test_apps/ledc/pytest_ledc.py index c93955b3a94b..995b5793db05 100644 --- a/components/esp_driver_ledc/test_apps/ledc/pytest_ledc.py +++ b/components/esp_driver_ledc/test_apps/ledc/pytest_ledc.py @@ -1,12 +1,13 @@ -# SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded_idf import IdfDut @pytest.mark.supported_targets -@pytest.mark.temp_skip_ci(targets=['esp32s3', 'esp32p4'], reason='skip due to duplication with test_ledc_psram, p4 TBD') # TODO: IDF-8969 +# TODO: [ESP32P4] IDF-8969, [ESP32C5] IDF-10333 +@pytest.mark.temp_skip_ci(targets=['esp32s3', 'esp32p4', 'esp32c5'], + reason='skip due to duplication with test_ledc_psram, p4 TBD, c5 test failed') @pytest.mark.generic @pytest.mark.parametrize( 'config', diff --git a/components/esp_driver_mcpwm/test_apps/.build-test-rules.yml b/components/esp_driver_mcpwm/test_apps/.build-test-rules.yml index cbc941233cd2..14c7a0628283 100644 --- a/components/esp_driver_mcpwm/test_apps/.build-test-rules.yml +++ b/components/esp_driver_mcpwm/test_apps/.build-test-rules.yml @@ -3,5 +3,9 @@ components/esp_driver_mcpwm/test_apps/mcpwm: disable: - if: SOC_MCPWM_SUPPORTED != 1 + disable_test: + - if: IDF_TARGET == "esp32c5" + temporary: true + reason: test not pass, should be re-enable # TODO: [ESP32C5] IDF-10334 depends_components: - esp_driver_mcpwm diff --git a/components/esp_driver_mcpwm/test_apps/mcpwm/pytest_mcpwm.py b/components/esp_driver_mcpwm/test_apps/mcpwm/pytest_mcpwm.py index bbbdf7019673..aab249be52c5 100644 --- a/components/esp_driver_mcpwm/test_apps/mcpwm/pytest_mcpwm.py +++ b/components/esp_driver_mcpwm/test_apps/mcpwm/pytest_mcpwm.py @@ -1,12 +1,12 @@ # SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded import Dut @pytest.mark.esp32 @pytest.mark.esp32s3 +# @pytest.mark.esp32c5 # TODO: [ESP32C5] IDF-10334 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32p4 diff --git a/components/esp_driver_parlio/test_apps/parlio/pytest_parlio_unity.py b/components/esp_driver_parlio/test_apps/parlio/pytest_parlio_unity.py index a6a6d8ec4e1d..3db44388b6cf 100644 --- a/components/esp_driver_parlio/test_apps/parlio/pytest_parlio_unity.py +++ b/components/esp_driver_parlio/test_apps/parlio/pytest_parlio_unity.py @@ -4,6 +4,7 @@ from pytest_embedded import Dut +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32p4 diff --git a/components/esp_driver_pcnt/test_apps/.build-test-rules.yml b/components/esp_driver_pcnt/test_apps/.build-test-rules.yml index d94a1f9237b4..80540d51ebd0 100644 --- a/components/esp_driver_pcnt/test_apps/.build-test-rules.yml +++ b/components/esp_driver_pcnt/test_apps/.build-test-rules.yml @@ -3,5 +3,9 @@ components/esp_driver_pcnt/test_apps/pulse_cnt: disable: - if: SOC_PCNT_SUPPORTED != 1 + disable_test: + - if: IDF_TARGET == "esp32c5" + temporary: true + reason: target test failed # TODO [ESP32C5] IDF-10342 depends_components: - esp_driver_pcnt diff --git a/components/esp_driver_pcnt/test_apps/pulse_cnt/pytest_pulse_cnt.py b/components/esp_driver_pcnt/test_apps/pulse_cnt/pytest_pulse_cnt.py index 5c0f4a88a5b0..b2b95bcccb28 100644 --- a/components/esp_driver_pcnt/test_apps/pulse_cnt/pytest_pulse_cnt.py +++ b/components/esp_driver_pcnt/test_apps/pulse_cnt/pytest_pulse_cnt.py @@ -1,6 +1,5 @@ # SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded import Dut @@ -8,6 +7,7 @@ @pytest.mark.esp32 @pytest.mark.esp32s2 @pytest.mark.esp32s3 +# @pytest.mark.esp32c5 # TODO: [ESP32C5] IDF-10342 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32p4 diff --git a/components/esp_driver_rmt/test_apps/rmt/pytest_rmt.py b/components/esp_driver_rmt/test_apps/rmt/pytest_rmt.py index d800e611ba3e..cae5747513dd 100644 --- a/components/esp_driver_rmt/test_apps/rmt/pytest_rmt.py +++ b/components/esp_driver_rmt/test_apps/rmt/pytest_rmt.py @@ -1,6 +1,5 @@ # SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded import Dut @@ -8,6 +7,7 @@ @pytest.mark.esp32 @pytest.mark.esp32s2 @pytest.mark.esp32c3 +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32p4 diff --git a/components/esp_driver_spi/test_apps/.build-test-rules.yml b/components/esp_driver_spi/test_apps/.build-test-rules.yml index 1639bbf5cd27..04fab5889437 100644 --- a/components/esp_driver_spi/test_apps/.build-test-rules.yml +++ b/components/esp_driver_spi/test_apps/.build-test-rules.yml @@ -12,7 +12,7 @@ components/esp_driver_spi/test_apps/master: disable_test: - if: IDF_TARGET == "esp32p4" temporary: true - reason: not supported # TODO: IDF-8942 + reason: not supported, no multi-dev runner # TODO: [ESP32P4] IDF-8942 <<: *spi_depends_default components/esp_driver_spi/test_apps/param: @@ -21,7 +21,7 @@ components/esp_driver_spi/test_apps/param: disable_test: - if: IDF_TARGET == "esp32p4" temporary: true - reason: not supported # TODO: IDF-8942 + reason: not supported, no multi-dev runner # TODO: [ESP32P4] IDF-8942 <<: *spi_depends_default components/esp_driver_spi/test_apps/slave: @@ -30,7 +30,7 @@ components/esp_driver_spi/test_apps/slave: disable_test: - if: IDF_TARGET == "esp32p4" temporary: true - reason: not supported # TODO: IDF-8942 + reason: not supported, no multi-dev runner # TODO: [ESP32P4] IDF-8942 <<: *spi_depends_default components/esp_driver_spi/test_apps/slave_hd: diff --git a/components/esp_driver_spi/test_apps/master/pytest_spi_master.py b/components/esp_driver_spi/test_apps/master/pytest_spi_master.py index 88e58f9b2964..f791c6db6344 100644 --- a/components/esp_driver_spi/test_apps/master/pytest_spi_master.py +++ b/components/esp_driver_spi/test_apps/master/pytest_spi_master.py @@ -28,7 +28,8 @@ def test_master_esp_flash(case_tester) -> None: # type: ignore # if `test_env` not defined, will run on `generic_multi_device` by default -@pytest.mark.temp_skip_ci(targets=['esp32p4'], reason='p4 support TBD') # TODO: IDF-8942 +# TODO: [ESP32P4] IDF-8942 [ESP32C5] IDF-10322 +@pytest.mark.temp_skip_ci(targets=['esp32p4', 'esp32c5'], reason='no multi-dev runner') @pytest.mark.supported_targets @pytest.mark.esp32h2 @pytest.mark.generic_multi_device diff --git a/components/esp_driver_spi/test_apps/param/pytest_spi_param.py b/components/esp_driver_spi/test_apps/param/pytest_spi_param.py index fa1c3f86ad9d..9c4267d63d81 100644 --- a/components/esp_driver_spi/test_apps/param/pytest_spi_param.py +++ b/components/esp_driver_spi/test_apps/param/pytest_spi_param.py @@ -16,7 +16,8 @@ def test_param_single_dev(case_tester) -> None: # type: ignore # if `test_env` not defined, will run on `generic_multi_device` by default -@pytest.mark.temp_skip_ci(targets=['esp32p4'], reason='p4 support TBD') # TODO: IDF-8942 +# TODO: [ESP32P4] IDF-8942 [ESP32C5] IDF-10322 +@pytest.mark.temp_skip_ci(targets=['esp32p4', 'esp32c5'], reason='no multi-dev runner') @pytest.mark.supported_targets @pytest.mark.esp32h2 @pytest.mark.generic_multi_device diff --git a/components/esp_driver_spi/test_apps/slave/pytest_spi_slave.py b/components/esp_driver_spi/test_apps/slave/pytest_spi_slave.py index e3637da3589d..6a97d24886b8 100644 --- a/components/esp_driver_spi/test_apps/slave/pytest_spi_slave.py +++ b/components/esp_driver_spi/test_apps/slave/pytest_spi_slave.py @@ -17,7 +17,8 @@ def test_slave_single_dev(case_tester) -> None: # type: ignore # if `test_env` not defined, will run on `generic_multi_device` by default -@pytest.mark.temp_skip_ci(targets=['esp32p4'], reason='p4 support TBD') # TODO: IDF-8942 +# TODO: [ESP32P4] IDF-8942 [ESP32C5] IDF-10322 +@pytest.mark.temp_skip_ci(targets=['esp32p4', 'esp32c5'], reason='no multi-dev runner') @pytest.mark.supported_targets @pytest.mark.esp32h2 @pytest.mark.generic_multi_device diff --git a/components/esp_driver_spi/test_apps/slave_hd/pytest_spi_slave_hd.py b/components/esp_driver_spi/test_apps/slave_hd/pytest_spi_slave_hd.py index 6bcdb80f8048..1329b4912f22 100644 --- a/components/esp_driver_spi/test_apps/slave_hd/pytest_spi_slave_hd.py +++ b/components/esp_driver_spi/test_apps/slave_hd/pytest_spi_slave_hd.py @@ -8,6 +8,7 @@ @pytest.mark.esp32s3 @pytest.mark.esp32c2 @pytest.mark.esp32c3 +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.generic diff --git a/components/esp_hw_support/test_apps/dma/pytest_dma.py b/components/esp_hw_support/test_apps/dma/pytest_dma.py index cc78dd5f0ec6..0e8632846900 100644 --- a/components/esp_hw_support/test_apps/dma/pytest_dma.py +++ b/components/esp_hw_support/test_apps/dma/pytest_dma.py @@ -1,6 +1,5 @@ # SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded import Dut @@ -8,6 +7,7 @@ @pytest.mark.esp32s2 @pytest.mark.esp32c2 @pytest.mark.esp32c3 +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32p4 diff --git a/components/esp_hw_support/test_apps/rtc_clk/pytest_rtc_clk.py b/components/esp_hw_support/test_apps/rtc_clk/pytest_rtc_clk.py index 817b6188c2eb..384dd05fe3ac 100644 --- a/components/esp_hw_support/test_apps/rtc_clk/pytest_rtc_clk.py +++ b/components/esp_hw_support/test_apps/rtc_clk/pytest_rtc_clk.py @@ -1,6 +1,5 @@ # SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - from typing import Any import pytest @@ -33,6 +32,7 @@ def test_rtc_no_xtal32k(dut: Dut) -> None: @pytest.mark.generic @pytest.mark.supported_targets -@pytest.mark.temp_skip_ci(targets=['esp32c6', 'esp32h2', 'esp32p4'], reason='c6/h2/p4 support TBD') # TODO: IDF-8973 +# TODO: [ESP32P4] IDF-8973 [ESP32C5] IDF-10309 +@pytest.mark.temp_skip_ci(targets=['esp32c6', 'esp32h2', 'esp32p4', 'esp32c5'], reason='c6/h2/p4/c5 support TBD') def test_rtc_calib(case_tester: Any) -> None: case_tester.run_all_multi_stage_cases() diff --git a/components/esp_netif/test_apps/test_app_vfs_l2tap/pytest_esp_vfs_l2tap.py b/components/esp_netif/test_apps/test_app_vfs_l2tap/pytest_esp_vfs_l2tap.py index de7bed11eeb7..972bee544b4b 100644 --- a/components/esp_netif/test_apps/test_app_vfs_l2tap/pytest_esp_vfs_l2tap.py +++ b/components/esp_netif/test_apps/test_app_vfs_l2tap/pytest_esp_vfs_l2tap.py @@ -1,13 +1,12 @@ # SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded import Dut @pytest.mark.esp32 @pytest.mark.ethernet -def test_esp_netif(dut: Dut) -> None: +def test_esp_netif_vfs_l2tp(dut: Dut) -> None: dut.expect_exact('Press ENTER to see the list of tests') dut.write('\n') dut.expect_exact('Enter test for running.') diff --git a/components/esp_pm/test_apps/esp_pm/pytest_esp_pm.py b/components/esp_pm/test_apps/esp_pm/pytest_esp_pm.py index a2c2fc0f7656..6dcd162b61e0 100644 --- a/components/esp_pm/test_apps/esp_pm/pytest_esp_pm.py +++ b/components/esp_pm/test_apps/esp_pm/pytest_esp_pm.py @@ -6,6 +6,7 @@ @pytest.mark.generic @pytest.mark.supported_targets +@pytest.mark.temp_skip_ci(targets=['esp32c5'], reason='not supported yet') # TODO: [ESP32C5] IDF-8643, IDF-10310 @pytest.mark.parametrize('config', [ 'default', 'slp_iram_opt', @@ -45,9 +46,11 @@ def test_esp_attr_xip_psram_esp32s3(dut: Dut) -> None: # power down CPU and TOP domain in auto-lightsleep +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32p4 +@pytest.mark.temp_skip_ci(targets=['esp32c5'], reason='not supported yet') # TODO: [ESP32C5] IDF-8643, IDF-10310 @pytest.mark.generic @pytest.mark.parametrize( 'config', diff --git a/components/esp_rom/test_apps/rom_tests/pytest_esp_rom.py b/components/esp_rom/test_apps/rom_tests/pytest_esp_rom.py index eb309c8d1958..2bd712f0dd77 100644 --- a/components/esp_rom/test_apps/rom_tests/pytest_esp_rom.py +++ b/components/esp_rom/test_apps/rom_tests/pytest_esp_rom.py @@ -1,6 +1,5 @@ # SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded import Dut @@ -8,6 +7,7 @@ @pytest.mark.esp32c3 @pytest.mark.esp32s2 @pytest.mark.esp32s3 +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32p4 diff --git a/components/freertos/test_apps/.build-test-rules.yml b/components/freertos/test_apps/.build-test-rules.yml index d7bce90918e0..44a3a7d585ec 100644 --- a/components/freertos/test_apps/.build-test-rules.yml +++ b/components/freertos/test_apps/.build-test-rules.yml @@ -2,9 +2,13 @@ components/freertos/test_apps/freertos: disable: - - if: (CONFIG_NAME == "smp" and IDF_TARGET == "esp32p4") + - if: CONFIG_NAME == "smp" and IDF_TARGET == "esp32p4" temporary: true reason: target(s) not supported yet + disable_test: + - if: CONFIG_NAME == "smp" and IDF_TARGET == "esp32c5" + temporary: true + reason: target test failed # TODO: [ESP32C5] IDF-10335 components/freertos/test_apps/orig_inc_path: enable: diff --git a/components/freertos/test_apps/freertos/pytest_freertos.py b/components/freertos/test_apps/freertos/pytest_freertos.py index 6baa6ba7811b..1bd8867d0b5e 100644 --- a/components/freertos/test_apps/freertos/pytest_freertos.py +++ b/components/freertos/test_apps/freertos/pytest_freertos.py @@ -9,7 +9,9 @@ pytest.param('psram', marks=[pytest.mark.esp32]), pytest.param('release', marks=[pytest.mark.supported_targets]), pytest.param('single_core', marks=[pytest.mark.esp32, pytest.mark.esp32p4]), - pytest.param('smp', marks=[pytest.mark.supported_targets, pytest.mark.temp_skip_ci(targets=['esp32h2', 'esp32p4'], reason='test failed/TBD IDF-8113')]), + # TODO: [ESP32C5] IDF-10335 + pytest.param('smp', marks=[pytest.mark.supported_targets, pytest.mark.temp_skip_ci(targets=['esp32h2', 'esp32p4', 'esp32c5'], + reason='test failed/TBD IDF-8113')]), ] diff --git a/components/newlib/test_apps/.build-test-rules.yml b/components/newlib/test_apps/.build-test-rules.yml index e2345cd62b7b..fcc2d44faf36 100644 --- a/components/newlib/test_apps/.build-test-rules.yml +++ b/components/newlib/test_apps/.build-test-rules.yml @@ -4,4 +4,4 @@ components/newlib/test_apps/newlib: disable: - if: IDF_TARGET == "esp32c5" temporary: true - reason: not supported yet # TODO: [ESP32C5] IDF-8675 + reason: not supported yet # TODO: [ESP32C5] IDF-8675, IDF-10312 diff --git a/components/newlib/test_apps/newlib/pytest_newlib.py b/components/newlib/test_apps/newlib/pytest_newlib.py index 4569c93f0811..3d59ed842f4d 100644 --- a/components/newlib/test_apps/newlib/pytest_newlib.py +++ b/components/newlib/test_apps/newlib/pytest_newlib.py @@ -1,6 +1,5 @@ # SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import subprocess from os import path @@ -32,6 +31,7 @@ def validate_sbom(dut: Dut) -> None: @pytest.mark.generic +@pytest.mark.temp_skip_ci(targets=['esp32c5'], reason='not support yet') # TODO: [ESP32C5] IDF-8675, IDF-10312 @pytest.mark.parametrize( 'config', [ diff --git a/components/soc/esp32c5/include/soc/soc_caps.h b/components/soc/esp32c5/include/soc/soc_caps.h index 9eb54ce7836f..1acf26f6d6b4 100644 --- a/components/soc/esp32c5/include/soc/soc_caps.h +++ b/components/soc/esp32c5/include/soc/soc_caps.h @@ -73,6 +73,8 @@ #define SOC_ECDSA_SUPPORTED 1 // #define SOC_KEY_MANAGER_SUPPORTED 1 // TODO: [ESP32C5] IDF-8621 // #define SOC_HUK_SUPPORTED 1 // TODO: [ESP32C5] IDF-8617 +// #define SOC_LIGHT_SLEEP_SUPPORTED 1 // TODO: [ESP32C5] IDF-8640 +// #define SOC_DEEP_SLEEP_SUPPORTED 1 // TODO: [ESP32C5] IDF-8638 #define SOC_MODEM_CLOCK_SUPPORTED 1 // #define SOC_PM_SUPPORTED 1 // TODO: [ESP32C5] IDF-8643 diff --git a/components/spi_flash/test_apps/.build-test-rules.yml b/components/spi_flash/test_apps/.build-test-rules.yml index 0639ebde3983..a580b216a395 100644 --- a/components/spi_flash/test_apps/.build-test-rules.yml +++ b/components/spi_flash/test_apps/.build-test-rules.yml @@ -19,7 +19,7 @@ components/spi_flash/test_apps/esp_flash_stress: disable: - if: IDF_TARGET == "esp32c5" temporary: true - reason: not support yet # TODO: [ESP32C5] IDF-8715 + reason: not support yet # TODO: [ESP32C5] IDF-8715, IDF-10313 components/spi_flash/test_apps/flash_encryption: disable_test: diff --git a/components/spi_flash/test_apps/esp_flash/pytest_esp_flash.py b/components/spi_flash/test_apps/esp_flash/pytest_esp_flash.py index 8eeed76f5cc9..2bf1e7ee7583 100644 --- a/components/spi_flash/test_apps/esp_flash/pytest_esp_flash.py +++ b/components/spi_flash/test_apps/esp_flash/pytest_esp_flash.py @@ -1,11 +1,11 @@ # SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 - import pytest from pytest_embedded import Dut @pytest.mark.supported_targets +@pytest.mark.temp_skip_ci(targets=['esp32c5'], reason='not support yet') # TODO: [ESP32C5] IDF-8715, IDF-10313 @pytest.mark.generic @pytest.mark.parametrize( 'config', diff --git a/components/spi_flash/test_apps/esp_flash_stress/pytest_esp_flash_stress.py b/components/spi_flash/test_apps/esp_flash_stress/pytest_esp_flash_stress.py index bf9722982bad..bc7b9be71987 100644 --- a/components/spi_flash/test_apps/esp_flash_stress/pytest_esp_flash_stress.py +++ b/components/spi_flash/test_apps/esp_flash_stress/pytest_esp_flash_stress.py @@ -1,11 +1,11 @@ # SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 - import pytest from pytest_embedded import Dut @pytest.mark.supported_targets +@pytest.mark.temp_skip_ci(targets=['esp32c5'], reason='not support yet') # TODO: [ESP32C5] IDF-8715, IDF-10313 @pytest.mark.generic @pytest.mark.parametrize( 'config', diff --git a/components/spi_flash/test_apps/mspi_test/pytest_mspi_test.py b/components/spi_flash/test_apps/mspi_test/pytest_mspi_test.py index 83dfe27a74e6..3e9d93ecb6f2 100644 --- a/components/spi_flash/test_apps/mspi_test/pytest_mspi_test.py +++ b/components/spi_flash/test_apps/mspi_test/pytest_mspi_test.py @@ -1,11 +1,10 @@ # SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 - import pytest from pytest_embedded import Dut -@pytest.mark.temp_skip_ci(targets=['esp32p4'], reason='esp32p4 support TBD') # TODO: IDF-8985 +@pytest.mark.temp_skip_ci(targets=['esp32p4', 'esp32c5'], reason='esp32p4, esp32c5 support TBD') # TODO: [ESP32P4] IDF-8985 [ESP32C5] IDF-8715, IDF-10313 @pytest.mark.supported_targets @pytest.mark.generic @pytest.mark.parametrize( diff --git a/components/ulp/test_apps/.build-test-rules.yml b/components/ulp/test_apps/.build-test-rules.yml index b601d66f1431..50e056d90315 100644 --- a/components/ulp/test_apps/.build-test-rules.yml +++ b/components/ulp/test_apps/.build-test-rules.yml @@ -3,6 +3,10 @@ components/ulp/test_apps/lp_core: disable: - if: SOC_LP_CORE_SUPPORTED != 1 + disable_test: + - if: IDF_TARGET == "esp32c5" + temporary: true + reason: test not pass, should be re-enable # TODO: [ESP32C5] IDF-10336 depends_components: - ulp diff --git a/components/ulp/test_apps/lp_core/pytest_lp_core.py b/components/ulp/test_apps/lp_core/pytest_lp_core.py index 24fdcd3bdfef..370632de830b 100644 --- a/components/ulp/test_apps/lp_core/pytest_lp_core.py +++ b/components/ulp/test_apps/lp_core/pytest_lp_core.py @@ -4,6 +4,7 @@ from pytest_embedded import Dut +# @pytest.mark.esp32c5 # TODO: [ESP32C5] IDF-10336 @pytest.mark.esp32c6 @pytest.mark.esp32p4 @pytest.mark.generic diff --git a/examples/peripherals/i2s/i2s_basic/i2s_pdm/pytest_i2s_pdm.py b/examples/peripherals/i2s/i2s_basic/i2s_pdm/pytest_i2s_pdm.py index 08b5e606ea6b..444e1a5f97d9 100644 --- a/examples/peripherals/i2s/i2s_basic/i2s_pdm/pytest_i2s_pdm.py +++ b/examples/peripherals/i2s/i2s_basic/i2s_pdm/pytest_i2s_pdm.py @@ -7,6 +7,7 @@ @pytest.mark.esp32 @pytest.mark.esp32s3 @pytest.mark.esp32c3 +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32p4 diff --git a/examples/peripherals/i2s/i2s_basic/i2s_std/pytest_i2s_std.py b/examples/peripherals/i2s/i2s_basic/i2s_std/pytest_i2s_std.py index fdd7305c6cdb..81c60e6d4fdd 100644 --- a/examples/peripherals/i2s/i2s_basic/i2s_std/pytest_i2s_std.py +++ b/examples/peripherals/i2s/i2s_basic/i2s_std/pytest_i2s_std.py @@ -8,6 +8,7 @@ @pytest.mark.esp32s2 @pytest.mark.esp32s3 @pytest.mark.esp32c3 +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32p4 diff --git a/examples/peripherals/i2s/i2s_basic/i2s_tdm/pytest_i2s_tdm.py b/examples/peripherals/i2s/i2s_basic/i2s_tdm/pytest_i2s_tdm.py index fb6a7618ab2d..80c1bbf321b6 100644 --- a/examples/peripherals/i2s/i2s_basic/i2s_tdm/pytest_i2s_tdm.py +++ b/examples/peripherals/i2s/i2s_basic/i2s_tdm/pytest_i2s_tdm.py @@ -6,6 +6,7 @@ @pytest.mark.esp32s3 @pytest.mark.esp32c3 +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32p4 diff --git a/examples/peripherals/i2s/i2s_codec/i2s_es7210_tdm/pytest_i2s_es7210_tdm.py b/examples/peripherals/i2s/i2s_codec/i2s_es7210_tdm/pytest_i2s_es7210_tdm.py index 618c700bfda3..4f44422087eb 100644 --- a/examples/peripherals/i2s/i2s_codec/i2s_es7210_tdm/pytest_i2s_es7210_tdm.py +++ b/examples/peripherals/i2s/i2s_codec/i2s_es7210_tdm/pytest_i2s_es7210_tdm.py @@ -6,6 +6,7 @@ @pytest.mark.esp32s3 @pytest.mark.esp32c3 +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.generic diff --git a/examples/peripherals/i2s/i2s_codec/i2s_es8311/pytest_i2s_es8311.py b/examples/peripherals/i2s/i2s_codec/i2s_es8311/pytest_i2s_es8311.py index 03a991ff02bc..c888db7af6d7 100644 --- a/examples/peripherals/i2s/i2s_codec/i2s_es8311/pytest_i2s_es8311.py +++ b/examples/peripherals/i2s/i2s_codec/i2s_es8311/pytest_i2s_es8311.py @@ -8,6 +8,7 @@ @pytest.mark.esp32s2 @pytest.mark.esp32s3 @pytest.mark.esp32c3 +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32p4 diff --git a/examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/pytest_hc_sr04.py b/examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/pytest_hc_sr04.py index cb8f243bea90..f677a255a958 100644 --- a/examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/pytest_hc_sr04.py +++ b/examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/pytest_hc_sr04.py @@ -1,6 +1,5 @@ # SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded import Dut @@ -8,6 +7,7 @@ @pytest.mark.esp32 @pytest.mark.esp32s3 @pytest.mark.esp32c6 +@pytest.mark.esp32c5 @pytest.mark.esp32h2 @pytest.mark.esp32p4 @pytest.mark.generic diff --git a/examples/peripherals/mcpwm/mcpwm_servo_control/pytest_servo_mg996r.py b/examples/peripherals/mcpwm/mcpwm_servo_control/pytest_servo_mg996r.py index d53bb5d01235..11a7d01cd8e3 100644 --- a/examples/peripherals/mcpwm/mcpwm_servo_control/pytest_servo_mg996r.py +++ b/examples/peripherals/mcpwm/mcpwm_servo_control/pytest_servo_mg996r.py @@ -1,12 +1,12 @@ # SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded import Dut @pytest.mark.esp32 @pytest.mark.esp32s3 +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32p4 diff --git a/examples/peripherals/mcpwm/mcpwm_sync/pytest_mcpwm_sync.py b/examples/peripherals/mcpwm/mcpwm_sync/pytest_mcpwm_sync.py index 2976ba136c67..23ba1a4e34c2 100644 --- a/examples/peripherals/mcpwm/mcpwm_sync/pytest_mcpwm_sync.py +++ b/examples/peripherals/mcpwm/mcpwm_sync/pytest_mcpwm_sync.py @@ -1,12 +1,12 @@ # SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded import Dut @pytest.mark.esp32 @pytest.mark.esp32s3 +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32p4 diff --git a/examples/peripherals/parlio/parlio_rx/logic_analyzer/pytest_logic_analyzer.py b/examples/peripherals/parlio/parlio_rx/logic_analyzer/pytest_logic_analyzer.py index 270d0dc4d4b6..2d6bc17398d7 100644 --- a/examples/peripherals/parlio/parlio_rx/logic_analyzer/pytest_logic_analyzer.py +++ b/examples/peripherals/parlio/parlio_rx/logic_analyzer/pytest_logic_analyzer.py @@ -4,6 +4,7 @@ from pytest_embedded import Dut +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32p4 diff --git a/examples/peripherals/pcnt/rotary_encoder/pytest_rotary_encoder.py b/examples/peripherals/pcnt/rotary_encoder/pytest_rotary_encoder.py index f774c175627d..29d17f4c81e7 100644 --- a/examples/peripherals/pcnt/rotary_encoder/pytest_rotary_encoder.py +++ b/examples/peripherals/pcnt/rotary_encoder/pytest_rotary_encoder.py @@ -1,6 +1,5 @@ # SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded.dut import Dut @@ -8,6 +7,7 @@ @pytest.mark.esp32 @pytest.mark.esp32s2 @pytest.mark.esp32s3 +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32p4 diff --git a/examples/peripherals/rmt/dshot_esc/pytest_dshot_esc.py b/examples/peripherals/rmt/dshot_esc/pytest_dshot_esc.py index 26b863121778..3f2470cea411 100644 --- a/examples/peripherals/rmt/dshot_esc/pytest_dshot_esc.py +++ b/examples/peripherals/rmt/dshot_esc/pytest_dshot_esc.py @@ -1,6 +1,5 @@ # SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded import Dut @@ -9,6 +8,7 @@ @pytest.mark.esp32s2 @pytest.mark.esp32s3 @pytest.mark.esp32c3 +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32p4 diff --git a/examples/peripherals/rmt/led_strip/pytest_led_strip.py b/examples/peripherals/rmt/led_strip/pytest_led_strip.py index afafbe5d2b24..e7f73b87a85b 100644 --- a/examples/peripherals/rmt/led_strip/pytest_led_strip.py +++ b/examples/peripherals/rmt/led_strip/pytest_led_strip.py @@ -1,6 +1,5 @@ # SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded import Dut @@ -9,6 +8,7 @@ @pytest.mark.esp32s2 @pytest.mark.esp32s3 @pytest.mark.esp32c3 +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32p4 diff --git a/examples/peripherals/rmt/musical_buzzer/pytest_musical_buzzer.py b/examples/peripherals/rmt/musical_buzzer/pytest_musical_buzzer.py index ce347210adb4..3ba73406f005 100644 --- a/examples/peripherals/rmt/musical_buzzer/pytest_musical_buzzer.py +++ b/examples/peripherals/rmt/musical_buzzer/pytest_musical_buzzer.py @@ -1,6 +1,5 @@ # SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded import Dut @@ -8,6 +7,7 @@ @pytest.mark.esp32s2 @pytest.mark.esp32s3 @pytest.mark.esp32c3 +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32p4 diff --git a/examples/peripherals/rmt/onewire/pytest_onewire.py b/examples/peripherals/rmt/onewire/pytest_onewire.py index 2a6a72989814..3204c21ed9b7 100644 --- a/examples/peripherals/rmt/onewire/pytest_onewire.py +++ b/examples/peripherals/rmt/onewire/pytest_onewire.py @@ -8,6 +8,7 @@ @pytest.mark.esp32s2 @pytest.mark.esp32s3 @pytest.mark.esp32c3 +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32p4 diff --git a/examples/peripherals/rmt/stepper_motor/pytest_stepper_motor.py b/examples/peripherals/rmt/stepper_motor/pytest_stepper_motor.py index fdd2629cc542..4a730b20196f 100644 --- a/examples/peripherals/rmt/stepper_motor/pytest_stepper_motor.py +++ b/examples/peripherals/rmt/stepper_motor/pytest_stepper_motor.py @@ -1,11 +1,11 @@ # SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded import Dut @pytest.mark.esp32s3 +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32p4 diff --git a/examples/peripherals/usb_serial_jtag/usb_serial_jtag_echo/pytest_usj_echo_example.py b/examples/peripherals/usb_serial_jtag/usb_serial_jtag_echo/pytest_usj_echo_example.py index 5ffc6746148c..0bda957d041d 100644 --- a/examples/peripherals/usb_serial_jtag/usb_serial_jtag_echo/pytest_usj_echo_example.py +++ b/examples/peripherals/usb_serial_jtag/usb_serial_jtag_echo/pytest_usj_echo_example.py @@ -1,17 +1,15 @@ # SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - from time import sleep import pytest -import serial import serial.tools.list_ports from pytest_embedded import Dut @pytest.mark.esp32c6 # usb_serial_jtag is very similar, test C6 is enough. @pytest.mark.usj_device -def test_usb_device_serial_example(dut: Dut) -> None: +def test_usb_device_serial_echo_example(dut: Dut) -> None: dut.expect_exact('USB_SERIAL_JTAG init done') sleep(2) diff --git a/examples/storage/.build-test-rules.yml b/examples/storage/.build-test-rules.yml index cc6f28981be3..b7ca97546616 100644 --- a/examples/storage/.build-test-rules.yml +++ b/examples/storage/.build-test-rules.yml @@ -113,7 +113,7 @@ examples/storage/perf_benchmark: disable: - if: IDF_TARGET == "esp32c5" temporary: true - reason: not supported yet # TODO: [ESP32C5] IDF-8704 + reason: not supported yet # TODO: [ESP32C5] IDF-8704, IDF-10314 disable_test: - if: IDF_TARGET == "esp32p4" and CONFIG_NAME in ["sdmmc_1line", "sdmmc_4line", "sdspi_1line"] temporary: true @@ -176,3 +176,9 @@ examples/storage/wear_levelling: disable_test: - if: IDF_TARGET not in ["esp32", "esp32c3"] reason: only one target per arch needed + +examples/system/base_mac_address: + disable_test: + - if: IDF_TARGET == "esp32c5" + temporary: true + reason: target test failed, runner not burnt efuse # TODO: [ESP32C5] IDF-10337 diff --git a/examples/storage/perf_benchmark/pytest_perf_benchmark_example.py b/examples/storage/perf_benchmark/pytest_perf_benchmark_example.py index 55743a223167..f9681c426727 100644 --- a/examples/storage/perf_benchmark/pytest_perf_benchmark_example.py +++ b/examples/storage/perf_benchmark/pytest_perf_benchmark_example.py @@ -5,6 +5,7 @@ @pytest.mark.supported_targets +@pytest.mark.temp_skip_ci(targets=['esp32c5'], reason='not support yet') # TODO: [ESP32C5] IDF-8704, IDF-10314 @pytest.mark.generic @pytest.mark.parametrize( 'config', diff --git a/examples/system/.build-test-rules.yml b/examples/system/.build-test-rules.yml index 2e9ebc5bbd4e..d6196238feda 100644 --- a/examples/system/.build-test-rules.yml +++ b/examples/system/.build-test-rules.yml @@ -2,11 +2,15 @@ examples/system/app_trace_basic: disable: - - if: IDF_TARGET in ["esp32c6", "esp32h2", "esp32p4"] + - if: IDF_TARGET in ["esp32c6", "esp32h2", "esp32p4", "esp32c5"] temporary: true - reason: target esp32c6, esp32h2, esp32p4 is not supported yet + reason: target esp32c6, esp32h2, esp32p4, esp32c5 is not supported yet examples/system/base_mac_address: + disable_test: + - if: IDF_TARGET == "esp32c5" + temporary: true + reason: target test failed # TODO [ESP32C5] IDF-10347 depends_components: - esp_hw_support @@ -178,7 +182,7 @@ examples/system/ota/native_ota_example: examples/system/ota/otatool: disable: - - if: IDF_TARGET in ["esp32h2"] + - if: IDF_TARGET in ["esp32h2", "esp32c5"] temporary: true reason: target esp32h2 is not supported yet @@ -267,6 +271,8 @@ examples/system/task_watchdog: - esp_system examples/system/ulp/lp_core/gpio: + disable: + - if: SOC_DEEP_SLEEP_SUPPORTED != 1 enable: - if: (SOC_LP_CORE_SUPPORTED == 1) and (SOC_RTCIO_PIN_COUNT > 0) diff --git a/examples/system/app_trace_basic/README.md b/examples/system/app_trace_basic/README.md index 88c1222686f7..2da31cd059a6 100644 --- a/examples/system/app_trace_basic/README.md +++ b/examples/system/app_trace_basic/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | # Application Level Tracing Example (Basic) diff --git a/examples/system/base_mac_address/pytest_base_mac_address.py b/examples/system/base_mac_address/pytest_base_mac_address.py index 3d7fedb30b0f..6e3b61b9f897 100644 --- a/examples/system/base_mac_address/pytest_base_mac_address.py +++ b/examples/system/base_mac_address/pytest_base_mac_address.py @@ -5,6 +5,8 @@ @pytest.mark.supported_targets +# TODO: [ESP32C5] IDF-10337 +@pytest.mark.temp_skip_ci(targets=['esp32c5'], reason='c5 runners not burnt mac efuse') @pytest.mark.generic def test_base_mac_address(dut: Dut) -> None: def get_hex_r(num_bytes: int) -> str: diff --git a/examples/system/efuse/pytest_system_efuse_example.py b/examples/system/efuse/pytest_system_efuse_example.py index 8ae8d933904a..0e650f24d487 100644 --- a/examples/system/efuse/pytest_system_efuse_example.py +++ b/examples/system/efuse/pytest_system_efuse_example.py @@ -49,6 +49,7 @@ def test_examples_efuse_linux(dut: Dut) -> None: @pytest.mark.esp32 @pytest.mark.esp32c2 @pytest.mark.esp32c3 +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32s2 @@ -148,6 +149,7 @@ def test_examples_efuse_with_virt_flash_enc_aes_256(dut: Dut) -> None: @pytest.mark.esp32 @pytest.mark.esp32c2 @pytest.mark.esp32c3 +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32s2 @@ -223,6 +225,7 @@ def test_examples_efuse_with_virt_flash_enc_pre_loaded(dut: Dut) -> None: @pytest.mark.esp32 @pytest.mark.esp32c2 @pytest.mark.esp32c3 +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32s2 @@ -945,6 +948,7 @@ def test_examples_efuse_with_virt_sb_v2_and_fe_qemu(dut: QemuDut) -> None: @pytest.mark.esp32c3 @pytest.mark.esp32c2 +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32s2 diff --git a/examples/system/esp_timer/pytest_esp_timer.py b/examples/system/esp_timer/pytest_esp_timer.py index 929df5ccf105..72ac742e8d9a 100644 --- a/examples/system/esp_timer/pytest_esp_timer.py +++ b/examples/system/esp_timer/pytest_esp_timer.py @@ -28,6 +28,7 @@ @pytest.mark.supported_targets +@pytest.mark.temp_skip_ci(targets=['esp32c5'], reason='C5 has not supported light sleep') # TODO: [ESP32C5] IDF-8638, IDF-10308 @pytest.mark.generic @pytest.mark.parametrize( 'config', diff --git a/examples/system/ipc/ipc_isr/riscv/pytest_ipc_isr_riscv.py b/examples/system/ipc/ipc_isr/riscv/pytest_ipc_isr_riscv.py index 63e87e43070d..cd1bba908a4f 100644 --- a/examples/system/ipc/ipc_isr/riscv/pytest_ipc_isr_riscv.py +++ b/examples/system/ipc/ipc_isr/riscv/pytest_ipc_isr_riscv.py @@ -1,6 +1,5 @@ # SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded import Dut @@ -8,7 +7,7 @@ @pytest.mark.esp32p4 @pytest.mark.generic @pytest.mark.temp_skip_ci(targets=['esp32p4'], reason='lack of runner') -def test_ipc_isr(dut: Dut) -> None: +def test_ipc_isr_riscv(dut: Dut) -> None: dut.expect_exact('example: Start') dut.expect_exact('example: MSTATUS = 0x3880') dut.expect_exact('example: in[0] = 0x1') diff --git a/examples/system/ipc/ipc_isr/xtensa/pytest_ipc_isr_xtensa.py b/examples/system/ipc/ipc_isr/xtensa/pytest_ipc_isr_xtensa.py index cc3ce4ce804a..6a8ecdc40c01 100644 --- a/examples/system/ipc/ipc_isr/xtensa/pytest_ipc_isr_xtensa.py +++ b/examples/system/ipc/ipc_isr/xtensa/pytest_ipc_isr_xtensa.py @@ -1,6 +1,5 @@ # SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded import Dut @@ -8,7 +7,7 @@ @pytest.mark.esp32 @pytest.mark.esp32s3 @pytest.mark.generic -def test_ipc_isr(dut: Dut) -> None: +def test_ipc_isr_xtensa(dut: Dut) -> None: dut.expect_exact('example: Start') dut.expect_exact('example: PS_INTLEVEL = 0x5') diff --git a/examples/system/light_sleep/pytest_light_sleep.py b/examples/system/light_sleep/pytest_light_sleep.py index 4ac3553b55e8..ca40f57ff2d0 100644 --- a/examples/system/light_sleep/pytest_light_sleep.py +++ b/examples/system/light_sleep/pytest_light_sleep.py @@ -8,6 +8,7 @@ @pytest.mark.supported_targets +@pytest.mark.temp_skip_ci(targets=['esp32c5'], reason='C5 has not supported deep sleep') # TODO: [ESP32C5] IDF-8640, IDF-10317 @pytest.mark.generic def test_light_sleep(dut: Dut) -> None: diff --git a/examples/system/ota/otatool/README.md b/examples/system/ota/otatool/README.md index 2fc4ba3edfbf..8ee6bbc58617 100644 --- a/examples/system/ota/otatool/README.md +++ b/examples/system/ota/otatool/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | # OTA Tool Example diff --git a/examples/system/ulp/lp_core/gpio/README.md b/examples/system/ulp/lp_core/gpio/README.md index 363d0b6b6af8..0f89d7a23ce0 100644 --- a/examples/system/ulp/lp_core/gpio/README.md +++ b/examples/system/ulp/lp_core/gpio/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32-C5 | ESP32-C6 | ESP32-P4 | -| ----------------- | -------- | -------- | -------- | +| Supported Targets | ESP32-C6 | ESP32-P4 | +| ----------------- | -------- | -------- | # LP Core simple example with GPIO Polling: diff --git a/examples/system/ulp/lp_core/interrupt/pytest_lp_core_intr.py b/examples/system/ulp/lp_core/interrupt/pytest_lp_core_intr.py index a9f96aba6c22..3dbcc88c8ea7 100644 --- a/examples/system/ulp/lp_core/interrupt/pytest_lp_core_intr.py +++ b/examples/system/ulp/lp_core/interrupt/pytest_lp_core_intr.py @@ -4,6 +4,7 @@ from pytest_embedded import Dut +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32p4 @pytest.mark.generic diff --git a/tools/ci/dynamic_pipelines/templates/known_generate_test_child_pipeline_warnings.yml b/tools/ci/dynamic_pipelines/templates/known_generate_test_child_pipeline_warnings.yml index 42b222e243a2..4a7a3730747f 100644 --- a/tools/ci/dynamic_pipelines/templates/known_generate_test_child_pipeline_warnings.yml +++ b/tools/ci/dynamic_pipelines/templates/known_generate_test_child_pipeline_warnings.yml @@ -12,6 +12,7 @@ no_runner_tags: - esp32c2,jtag,xtal_40mhz - esp32c3,flash_multi - esp32c3,sdcard_sdmode + - esp32c5,jtag - esp32c6,jtag - esp32h2,jtag - esp32p4,jtag diff --git a/tools/ci/idf_pytest/constants.py b/tools/ci/idf_pytest/constants.py index 2886b3ac0ac1..8959ccec9e61 100644 --- a/tools/ci/idf_pytest/constants.py +++ b/tools/ci/idf_pytest/constants.py @@ -16,7 +16,7 @@ from idf_ci_utils import idf_relpath from pytest_embedded.utils import to_list -SUPPORTED_TARGETS = ['esp32', 'esp32s2', 'esp32c3', 'esp32s3', 'esp32c2', 'esp32c6', 'esp32h2', 'esp32p4'] +SUPPORTED_TARGETS = ['esp32', 'esp32s2', 'esp32c3', 'esp32s3', 'esp32c2', 'esp32c6', 'esp32h2', 'esp32p4', 'esp32c5'] PREVIEW_TARGETS: t.List[str] = [] # this PREVIEW_TARGETS excludes 'linux' target DEFAULT_SDKCONFIG = 'default' DEFAULT_LOGDIR = 'pytest-embedded' @@ -27,6 +27,7 @@ 'esp32s3': 'support esp32s3 target', 'esp32c3': 'support esp32c3 target', 'esp32c2': 'support esp32c2 target', + 'esp32c5': 'support esp32c5 target', 'esp32c6': 'support esp32c6 target', 'esp32h2': 'support esp32h2 target', 'esp32p4': 'support esp32p4 target', @@ -34,7 +35,8 @@ } SPECIAL_MARKERS = { - 'supported_targets': "support all officially announced supported targets ('esp32', 'esp32s2', 'esp32c3', 'esp32s3', 'esp32c2', 'esp32c6')", + 'supported_targets': 'support all officially announced supported targets ' + "('esp32', 'esp32s2', 'esp32c3', 'esp32s3', 'esp32c2', 'esp32c6', 'esp32p4', 'esp32c5')", 'preview_targets': "support all preview targets ('none')", 'all_targets': 'support all targets, including supported ones and preview ones', 'temp_skip_ci': 'temp skip tests for specified targets only in ci', diff --git a/tools/test_apps/peripherals/i2c_wifi/pytest_i2c_wifi.py b/tools/test_apps/peripherals/i2c_wifi/pytest_i2c_wifi.py index cbb456562a81..f4f4b37f93a0 100644 --- a/tools/test_apps/peripherals/i2c_wifi/pytest_i2c_wifi.py +++ b/tools/test_apps/peripherals/i2c_wifi/pytest_i2c_wifi.py @@ -1,12 +1,15 @@ -# SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded_idf.dut import IdfDut -@pytest.mark.supported_targets -@pytest.mark.temp_skip_ci(targets=['esp32h2', 'esp32p4'], reason='h2/p4 does not support wifi') +@pytest.mark.esp32 +@pytest.mark.esp32c2 +@pytest.mark.esp32c3 +@pytest.mark.esp32c6 +@pytest.mark.esp32s2 +@pytest.mark.esp32s3 @pytest.mark.generic def test_i2c_wifi_startup(dut: IdfDut) -> None: dut.expect_exact('I2C-WIFI test success') diff --git a/tools/test_apps/phy/phy_multi_init_data_test/pytest_phy_multi_init_data.py b/tools/test_apps/phy/phy_multi_init_data_test/pytest_phy_multi_init_data.py index 14c1a8fab338..569901a065f0 100644 --- a/tools/test_apps/phy/phy_multi_init_data_test/pytest_phy_multi_init_data.py +++ b/tools/test_apps/phy/phy_multi_init_data_test/pytest_phy_multi_init_data.py @@ -1,12 +1,15 @@ -# SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded_idf.dut import IdfDut -@pytest.mark.supported_targets -@pytest.mark.temp_skip_ci(targets=['esp32h2', 'esp32p4'], reason='h2/p4 not supported') # TODO: IDF-8990 +@pytest.mark.esp32 +@pytest.mark.esp32c2 +@pytest.mark.esp32c3 +@pytest.mark.esp32c6 +@pytest.mark.esp32s2 +@pytest.mark.esp32s3 @pytest.mark.generic @pytest.mark.parametrize('config', [ 'phy_multiple_init_data', diff --git a/tools/test_apps/system/.build-test-rules.yml b/tools/test_apps/system/.build-test-rules.yml index 8d2ca6ffd4dc..cdeed8fac059 100644 --- a/tools/test_apps/system/.build-test-rules.yml +++ b/tools/test_apps/system/.build-test-rules.yml @@ -29,6 +29,12 @@ tools/test_apps/system/eh_frame: temporary: true reason: the other targets are not tested yet +tools/test_apps/system/esp_intr_dump: + disable_test: + - if: IDF_TARGET == "esp32c5" + temporary: true + reason: target test failed # TODO [ESP32C5] IDF-10344 + tools/test_apps/system/g0_components: enable: - if: INCLUDE_DEFAULT == 1 or IDF_TARGET in ["esp32p4", "esp32c5", "esp32c61"] # preview targets @@ -75,7 +81,7 @@ tools/test_apps/system/ram_loadable_app: disable: - if: IDF_TARGET == "esp32c5" temporary: true - reason: not supported # TODO: [ESP32C5] IDF-8644 + reason: not supported # TODO: [ESP32C5] IDF-8644, IDF-10315 disable_test: - if: IDF_TARGET in ["esp32p4"] temporary: true diff --git a/tools/test_apps/system/esp_intr_dump/pytest_esp_intr_dump.py b/tools/test_apps/system/esp_intr_dump/pytest_esp_intr_dump.py index 9beab7898441..16e73e026f41 100644 --- a/tools/test_apps/system/esp_intr_dump/pytest_esp_intr_dump.py +++ b/tools/test_apps/system/esp_intr_dump/pytest_esp_intr_dump.py @@ -48,6 +48,8 @@ def test_esp_intr_dump_shared(dut: Dut) -> None: # TODO: IDF-9512, Update the expected output of dual core RISC-V chips when the issue is resolved @pytest.mark.supported_targets +# TODO: [ESP32C5] IDF-10344 +@pytest.mark.temp_skip_ci(targets=['esp32c5'], reason='c5 test failed') @pytest.mark.generic def test_esp_intr_dump_expected_output(dut: Dut) -> None: dut.expect_exact(PROMPT, timeout=30) diff --git a/tools/test_apps/system/ram_loadable_app/pytest_ram_loadable_app.py b/tools/test_apps/system/ram_loadable_app/pytest_ram_loadable_app.py index fa770a4c3fd2..c1b9b09e3cbc 100644 --- a/tools/test_apps/system/ram_loadable_app/pytest_ram_loadable_app.py +++ b/tools/test_apps/system/ram_loadable_app/pytest_ram_loadable_app.py @@ -1,11 +1,10 @@ -# SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded_idf.dut import IdfDut -@pytest.mark.temp_skip_ci(targets=['esp32p4'], reason='esp32p4 support TBD') # TODO: IDF-8994 +@pytest.mark.temp_skip_ci(targets=['esp32p4', 'esp32c5'], reason='esp32p4, esp32c5 support TBD') # TODO: [ESP32P4] IDF-8994 [ESP32C5] IDF-8644, IDF-10315 @pytest.mark.supported_targets @pytest.mark.generic @pytest.mark.parametrize('config', ['pure_ram',], indirect=True,) @@ -14,7 +13,7 @@ def test_pure_ram_loadable_app(dut: IdfDut) -> None: dut.expect('Time since boot: 3 seconds...', timeout=10) -@pytest.mark.temp_skip_ci(targets=['esp32p4'], reason='esp32p4 support TBD') # TODO: IDF-8994 +@pytest.mark.temp_skip_ci(targets=['esp32p4', 'esp32c5'], reason='esp32p4, esp32c5 support TBD') # TODO: [ESP32P4] IDF-8994 [ESP32C5] IDF-8644, IDF-10315 @pytest.mark.supported_targets @pytest.mark.generic @pytest.mark.parametrize('config', ['defaults',], indirect=True,) From 04be071dc6a0cc7574e06da3064e81d2071b7a41 Mon Sep 17 00:00:00 2001 From: Tomas Rezucha Date: Thu, 20 Jun 2024 11:20:07 +0200 Subject: [PATCH 66/73] fix(usb/host): Decode error flags in ISOC transfers --- components/usb/hcd_dwc.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/components/usb/hcd_dwc.c b/components/usb/hcd_dwc.c index 8187eea96703..9911c6246620 100644 --- a/components/usb/hcd_dwc.c +++ b/components/usb/hcd_dwc.c @@ -2437,13 +2437,28 @@ static inline void _buffer_parse_isoc(dma_buffer_block_t *buffer, bool is_in) int desc_status; usb_dwc_hal_xfer_desc_parse(buffer->xfer_desc_list, desc_idx, &rem_len, &desc_status); usb_dwc_hal_xfer_desc_clear(buffer->xfer_desc_list, desc_idx); - assert(rem_len == 0 || is_in); - assert(desc_status == USB_DWC_HAL_XFER_DESC_STS_SUCCESS || desc_status == USB_DWC_HAL_XFER_DESC_STS_NOT_EXECUTED); + switch (desc_status) { + case USB_DWC_HAL_XFER_DESC_STS_SUCCESS: + transfer->isoc_packet_desc[pkt_idx].status = USB_TRANSFER_STATUS_COMPLETED; + break; + case USB_DWC_HAL_XFER_DESC_STS_NOT_EXECUTED: + transfer->isoc_packet_desc[pkt_idx].status = USB_TRANSFER_STATUS_SKIPPED; + break; + case USB_DWC_HAL_XFER_DESC_STS_PKTERR: + transfer->isoc_packet_desc[pkt_idx].status = USB_TRANSFER_STATUS_ERROR; + break; + case USB_DWC_HAL_XFER_DESC_STS_BUFFER_ERR: + transfer->isoc_packet_desc[pkt_idx].status = USB_TRANSFER_STATUS_ERROR; + break; + default: + assert(false); + break; + } + assert(rem_len <= transfer->isoc_packet_desc[pkt_idx].num_bytes); // Check for DMA errata // Update ISO packet actual length and status transfer->isoc_packet_desc[pkt_idx].actual_num_bytes = transfer->isoc_packet_desc[pkt_idx].num_bytes - rem_len; total_actual_num_bytes += transfer->isoc_packet_desc[pkt_idx].actual_num_bytes; - transfer->isoc_packet_desc[pkt_idx].status = (desc_status == USB_DWC_HAL_XFER_DESC_STS_NOT_EXECUTED) ? USB_TRANSFER_STATUS_SKIPPED : USB_TRANSFER_STATUS_COMPLETED; // A descriptor is also allocated for unscheduled frames. We need to skip over them desc_idx += buffer->flags.isoc.interval; if (desc_idx >= XFER_LIST_LEN_INTR) { From 08eecfee22aff300fd8b36fdfe81a02519ea8b6a Mon Sep 17 00:00:00 2001 From: Zhang Shuxian Date: Tue, 2 Jul 2024 10:53:36 +0800 Subject: [PATCH 67/73] docs: Implement comments --- .../esp32p4/include/soc/Kconfig.soc_caps.in | 4 ++ components/soc/esp32p4/include/soc/soc_caps.h | 2 + docs/en/api-guides/external-ram.rst | 16 +++-- .../spi_flash/spi_flash_concurrency.rst | 4 +- .../peripherals/spi_flash/xip_from_psram.inc | 6 +- docs/zh_CN/api-guides/external-ram.rst | 62 ++++++++++++------- docs/zh_CN/api-guides/lwip.rst | 4 ++ .../spi_flash/spi_flash_concurrency.rst | 4 +- .../peripherals/spi_flash/xip_from_psram.inc | 6 +- .../system/inc/show-efuse-table_ESP32-C5.rst | 5 +- 10 files changed, 66 insertions(+), 47 deletions(-) diff --git a/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in b/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in index 33095dc7f151..a54b4b731e90 100644 --- a/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in @@ -1291,6 +1291,10 @@ config SOC_LP_SPI_MAXIMUM_BUFFER_SIZE int default 64 +config SOC_SPIRAM_XIP_SUPPORTED + bool + default y + config SOC_SPI_MEM_SUPPORT_AUTO_WAIT_IDLE bool default y diff --git a/components/soc/esp32p4/include/soc/soc_caps.h b/components/soc/esp32p4/include/soc/soc_caps.h index e58ad47e1b85..6a87afcac5c5 100644 --- a/components/soc/esp32p4/include/soc/soc_caps.h +++ b/components/soc/esp32p4/include/soc/soc_caps.h @@ -508,6 +508,8 @@ /*-------------------------- LP SPI CAPS ----------------------------------------*/ #define SOC_LP_SPI_PERIPH_NUM 1 #define SOC_LP_SPI_MAXIMUM_BUFFER_SIZE 64 +/*-------------------------- SPIRAM CAPS ----------------------------------------*/ +#define SOC_SPIRAM_XIP_SUPPORTED 1 /*-------------------------- SPI MEM CAPS ---------------------------------------*/ #define SOC_SPI_MEM_SUPPORT_AUTO_WAIT_IDLE (1) diff --git a/docs/en/api-guides/external-ram.rst b/docs/en/api-guides/external-ram.rst index e0f779f78a5c..34cb4de03ae4 100644 --- a/docs/en/api-guides/external-ram.rst +++ b/docs/en/api-guides/external-ram.rst @@ -26,7 +26,7 @@ Hardware .. only:: esp32 or esp32s2 or esp32s3 - Some PSRAM chips are 1.8 V devices and some are 3.3 V. The working voltage of the PSRAM chip must match the working voltage of the flash component. Consult the datasheet for your PSRAM chip and {IDF_TARGET_NAME} device to find out the working voltages. For a 1.8 V PSRAM chip, make sure to either set the MTDI pin to a high signal level on bootup, or program {IDF_TARGET_NAME} eFuses to always use the VDD_SIO level of 1.8 V. Not doing this can damage the PSRAM and/or flash chip. + Some PSRAM chips are 1.8 V devices and some are 3.3 V. The working voltage of the PSRAM chip must match the working voltage of the flash component. Consult the datasheet for your PSRAM chip and {IDF_TARGET_NAME} device to find out the working voltages. For a 1.8 V PSRAM chip, make sure to either set the MTDI pin to a high signal level on boot-up, or program {IDF_TARGET_NAME} eFuses to always use the VDD_SIO level of 1.8 V. Not doing this can damage the PSRAM and/or flash chip. .. only:: esp32p4 @@ -55,8 +55,7 @@ ESP-IDF fully supports the use of external RAM in applications. Once the externa * :ref:`external_ram_config_malloc` (default) * :ref:`external_ram_config_bss` :esp32: * :ref:`external_ram_config_noinit` - :SOC_SPIRAM_XIP_SUPPORTED: * :ref:`external_ram_config_instructions` - :SOC_SPIRAM_XIP_SUPPORTED: * :ref:`external_ram_config_rodata` + :SOC_SPIRAM_XIP_SUPPORTED: * :ref:`external_ram_config_xip` .. _external_ram_config_memory_map: @@ -139,8 +138,6 @@ Remaining external RAM can also be added to the capability heap allocator using .. only:: esp32s2 or esp32s3 - .. _external_ram_config_instructions: - Move Instructions in Flash to PSRAM ----------------------------------- @@ -152,8 +149,6 @@ Remaining external RAM can also be added to the capability heap allocator using - The corresponding virtual memory range of those instructions will also be re-mapped to PSRAM. - .. _external_ram_config_rodata: - Move Read-Only Data in Flash to PSRAM --------------------------------------- @@ -165,6 +160,7 @@ Remaining external RAM can also be added to the capability heap allocator using - The corresponding virtual memory range of those rodata will also be re-mapped to PSRAM. + .. _external_ram_config_xip: Execute In Place (XiP) from PSRAM ------------------------------------ @@ -179,12 +175,14 @@ Remaining external RAM can also be added to the capability heap allocator using .. only:: esp32p4 + .. _external_ram_config_xip: + Execute In Place (XiP) from PSRAM ------------------------------------ - The :ref:`CONFIG_SPIRAM_XIP_FROM_PSRAM` option enables the executable in place (XiP) from PSRAM feature. With this option sections that are normally placed in flash ,``.text`` (for instructions) and ``.rodata`` (for read only data), will be loaded in PSRAM. + The :ref:`CONFIG_SPIRAM_XIP_FROM_PSRAM` option enables the executable in place (XiP) from PSRAM feature. With this option sections that are normally placed in flash, ``.text`` (for instructions) and ``.rodata`` (for read only data), will be loaded in PSRAM. - With this option enabled, the cache will not be disabled during an SPI1 flash operation, so code that requires executing during an SPI1 Flash operation does not have to be placed in internal RAM. Because P4 Flash and PSRAM are using two separate SPI buses, moving Flash content to PSRAM will actually increase the load of the PSRAM MSPI bus, so the access speed is relatively slower. The exact impact on performance will be very dependent on your apps usage of PSRAM, and we suggest doing performance profiling to determine if enabling this option will significantly impact your app's performance. + With this option enabled, the cache will not be disabled during an SPI1 flash operation, so code that requires executing during an SPI1 flash operation does not have to be placed in internal RAM. Because P4 flash and PSRAM are using two separate SPI buses, moving flash content to PSRAM will actually increase the load of the PSRAM MSPI bus, so the access speed is relatively slower. The exact impact on performance will be very dependent on your apps usage of PSRAM, and we suggest doing performance profiling to determine if enabling this option will significantly impact your app's performance. Restrictions diff --git a/docs/en/api-reference/peripherals/spi_flash/spi_flash_concurrency.rst b/docs/en/api-reference/peripherals/spi_flash/spi_flash_concurrency.rst index e8181236c6c7..6db75246cf7a 100644 --- a/docs/en/api-reference/peripherals/spi_flash/spi_flash_concurrency.rst +++ b/docs/en/api-reference/peripherals/spi_flash/spi_flash_concurrency.rst @@ -19,7 +19,7 @@ The SPI0/1 bus is shared between the instruction & data cache (for firmware exec .. only:: SOC_SPIRAM_XIP_SUPPORTED - On {IDF_TARGET_NAME}, the config options :ref:`CONFIG_SPIRAM_FETCH_INSTRUCTIONS` (disabled by default) and :ref:`CONFIG_SPIRAM_RODATA` (disabled by default) allow the cache to read/write PSRAM concurrently with SPI1 operations. See :ref:`xip_from_psram` for more details. + On {IDF_TARGET_NAME}, the config options :ref:`CONFIG_SPIRAM_XIP_FROM_PSRAM` (disabled by default) allows the cache to read/write PSRAM concurrently with SPI1 operations. See :ref:`xip_from_psram` for more details. If these options are disabled, the caches must be disabled while reading/writing/erasing operations. There are some constraints using driver on the SPI1 bus, see :ref:`impact_disabled_cache`. These constraints will cause more IRAM/DRAM usages. @@ -40,7 +40,7 @@ Under this condition, all CPUs should always execute code and access data from i .. note:: - When :ref:`CONFIG_SPIRAM_FETCH_INSTRUCTIONS` and :ref:`CONFIG_SPIRAM_RODATA` are both enabled, these APIs will not disable the caches. + When :ref:`CONFIG_SPIRAM_XIP_FROM_PSRAM` is enabled, these APIs will not disable the caches. .. only:: SOC_HP_CPU_HAS_MULTIPLE_CORES diff --git a/docs/en/api-reference/peripherals/spi_flash/xip_from_psram.inc b/docs/en/api-reference/peripherals/spi_flash/xip_from_psram.inc index d0af4a89be4e..e4e0a6acb380 100644 --- a/docs/en/api-reference/peripherals/spi_flash/xip_from_psram.inc +++ b/docs/en/api-reference/peripherals/spi_flash/xip_from_psram.inc @@ -3,10 +3,8 @@ XIP from PSRAM Feature ---------------------- -If :ref:`CONFIG_SPIRAM_FETCH_INSTRUCTIONS` is enabled, the flash ``.text`` sections (used for instructions) will be placed in PSRAM. +If :ref:`CONFIG_SPIRAM_XIP_FROM_PSRAM` is enabled, the flash ``.text`` sections (used for instructions) and the flash ``.rodata`` sections (used for read only data) will be placed in PSRAM. -If :ref:`CONFIG_SPIRAM_RODATA` is enabled, the flash ``.rodata`` sections (used for read only data) will be placed in PSRAM. - -The corresponding virtual memory range will be re-mapped to PSRAM. +The corresponding virtual memory range will be mapped to PSRAM. If both of the above options are enabled, the Cache won't be disabled during an SPI1 Flash operation. You don't need to make sure ISRs, ISR callbacks and involved data are placed in internal RAM. diff --git a/docs/zh_CN/api-guides/external-ram.rst b/docs/zh_CN/api-guides/external-ram.rst index cfd851fdd40d..51c39a4fb003 100644 --- a/docs/zh_CN/api-guides/external-ram.rst +++ b/docs/zh_CN/api-guides/external-ram.rst @@ -55,8 +55,7 @@ ESP-IDF 完全支持将片外 RAM 集成到你的应用程序中。在启动并 * :ref:`external_ram_config_malloc` (default) * :ref:`external_ram_config_bss` :esp32: * :ref:`external_ram_config_noinit` - :SOC_SPIRAM_XIP_SUPPORTED: * :ref:`external_ram_config_instructions` - :SOC_SPIRAM_XIP_SUPPORTED: * :ref:`external_ram_config_rodata` + :SOC_SPIRAM_XIP_SUPPORTED: * :ref:`external_ram_config_xip` .. _external_ram_config_memory_map: @@ -82,7 +81,7 @@ ESP-IDF 启动过程中,片外 RAM 被映射到数据虚拟地址空间,该 在 :ref:`CONFIG_SPIRAM_USE` 中选择 ``Make RAM allocatable using heap_caps_malloc(..., MALLOC_CAP_SPIRAM)`` 选项。 -启用上述选项后,片外 RAM 被映射到数据虚拟地址空间,并将这个区域添加到携带 ``MALLOC_CAP_SPIRAM`` 标志的 :doc:`堆内存分配器 ` 。 +启用上述选项后,片外 RAM 被映射到数据虚拟地址空间,并将这个区域添加到携带 ``MALLOC_CAP_SPIRAM`` 标志的 :doc:`堆内存分配器 `。 程序如果想从片外存储器分配存储空间,则需要调用 ``heap_caps_malloc(size, MALLOC_CAP_SPIRAM)``,之后可以调用 ``free()`` 函数释放这部分存储空间。 @@ -114,7 +113,7 @@ ESP-IDF 启动过程中,片外 RAM 被映射到数据虚拟地址空间,该 通过勾选 :ref:`CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY` 启用该选项。 -启用该选项后,PSRAM 被映射到的数据虚拟地址空间将用于存储来自 lwip、net80211、libpp, wpa_supplicant 和 bluedroid ESP-IDF 库中零初始化的数据(BSS 段)。 +启用该选项后,PSRAM 被映射到的数据虚拟地址空间将用于存储来自 lwip、net80211、libpp、wpa_supplicant 和 bluedroid ESP-IDF 库中零初始化的数据(BSS 段)。 通过将宏 ``EXT_RAM_BSS_ATTR`` 应用于任何静态声明(未初始化为非零值),可以将附加数据从内部 BSS 段移到片外 RAM。 @@ -137,35 +136,54 @@ ESP-IDF 启动过程中,片外 RAM 被映射到数据虚拟地址空间,该 .. only:: SOC_SPIRAM_XIP_SUPPORTED - .. _external_ram_config_instructions: + .. only:: esp32s2 or esp32s3 - 将 flash 中的指令移至 PSRAM - ----------------------------------- + 将 flash 中的指令移至 PSRAM + ----------------------------------- - 启用 :ref:`CONFIG_SPIRAM_FETCH_INSTRUCTIONS` 选项后,flash 中 ``.text`` 部分的数据(用于指令)将被放入 PSRAM。 + 启用 :ref:`CONFIG_SPIRAM_FETCH_INSTRUCTIONS` 选项后,flash 中 ``.text`` 部分的数据(用于指令)将被放入 PSRAM。 - 启用 :ref:`CONFIG_SPIRAM_FETCH_INSTRUCTIONS` 选项后: + 启用 :ref:`CONFIG_SPIRAM_FETCH_INSTRUCTIONS` 选项后: - - flash ``.text`` 部分中的指令将在系统启动时移至 PSRAM。 + - flash ``.text`` 部分中的指令将在系统启动时移至 PSRAM。 - - 上述指令对应的虚拟内存范围也将重新映射至 PSRAM。 + - 上述指令对应的虚拟内存范围也将重新映射至 PSRAM。 - 如果同时启用 :ref:`CONFIG_SPIRAM_RODATA`,SPI1 flash 操作期间不会禁用 cache。ISR、ISR 回调和相关数据无需放在内部 RAM 中,因此可以优化内部 RAM 的使用。 + 将 flash 中的只读数据移至 PSRAM + --------------------------------------- - .. _external_ram_config_rodata: + 启用 :ref:`CONFIG_SPIRAM_RODATA` 选项后,flash 中 ``.rodata`` 部分的数据(用于只读数据)将被放入 PSRAM。 - 将 flash 中的只读数据移至 PSRAM - --------------------------------------- + 启用 :ref:`CONFIG_SPIRAM_RODATA` 选项后: - 启用 :ref:`CONFIG_SPIRAM_RODATA` 选项后,flash 中 ``.rodata`` 部分的数据(用于只读数据)将被放入 PSRAM。 + - flash ``.rodata`` 部分中的指令将在系统启动时移至 PSRAM。 - 启用 :ref:`CONFIG_SPIRAM_RODATA` 选项后: + - 上述只读数据对应的虚拟内存范围也将重新映射至 PSRAM。 - - flash ``.rodata`` 部分中的指令将在系统启动时移至 PSRAM。 + .. _external_ram_config_xip: - - 上述只读数据对应的虚拟内存范围也将重新映射至 PSRAM。 + 在 PSRAM 中直接执行代码 + ------------------------------------ + + 启用 :ref:`CONFIG_SPIRAM_XIP_FROM_PSRAM` 选项后,可同时指定 :ref:`CONFIG_SPIRAM_FETCH_INSTRUCTIONS` 和 :ref:`CONFIG_SPIRAM_RODATA` 选项。 + + 在 PSRAM 中直接执行代码的好处包括: + + - PSRAM 访问速度快于 flash,因此性能更好。 + + - 在进行 SPI1 flash 操作期间,cache 仍然保持启用状态,这样可以优化代码执行性能。由于无需把中断服务程序 (ISR)、ISR 回调和在此期间可能被访问的数据放置在片上 RAM 中,片上 RAM 可用于其他用途,从而提高了使用效率。这个特性适用于需要处理大量数据的高吞吐量外设应用,能显著提高 SPI1 flash 操作期间的性能。 + + .. only:: esp32p4 + + .. _external_ram_config_xip: + + 在 PSRAM 中直接执行代码 + ------------------------------------ + + 启用 :ref:`CONFIG_SPIRAM_XIP_FROM_PSRAM` 选项后能在 PSRAM 中直接执行代码。通常放置在 flash 中的段,如 ``.text`` 部分的数据(用于指令)和 ``.rodata`` 部分的数据(用于只读数据),将被加载到 PSRAM 中。 + + 启用此选项后,SPI1 flash 操作期间 cache 保持启用状态,因此需要执行的代码在此期间不必放置在内部 RAM 中。由于 ESP32-P4 flash 和 PSRAM 使用两个独立的 SPI 总线,将 flash 内容移动到 PSRAM 实际上增加了 PSRAM MSPI 总线的负载,因此访问速度相对较慢。应用程序在运行过程中对 PSRAM 的使用会直接影响整体性能。因此,建议先进行性能分析以确定启用此选项是否会显著影响应用程序性能。 - 如果同时启用 :ref:`CONFIG_SPIRAM_FETCH_INSTRUCTIONS`,SPI1 flash 操作期间不会禁用 cache。ISR、ISR 回调和相关数据无需放在内部 RAM 中,因此可以优化内部 RAM 的使用。 片外 RAM 使用限制 =================== @@ -192,7 +210,7 @@ ESP-IDF 启动过程中,片外 RAM 被映射到数据虚拟地址空间,该 初始化失败 -===================== +==================== 默认情况下,片外 RAM 初始化失败将终止 ESP-IDF 启动。如果想禁用此功能,可启用 :ref:`CONFIG_SPIRAM_IGNORE_NOTFOUND` 配置选项。 @@ -206,7 +224,7 @@ ESP-IDF 启动过程中,片外 RAM 被映射到数据虚拟地址空间,该 加密 ========== - 可以为存储在外部 RAM 中的数据启用自动加密功能。启用该功能后,通过缓存读写的任何数据将被外部存储器加密硬件自动加密/解密。 + 可以为存储在外部 RAM 中的数据启用自动加密功能。启用该功能后,通过缓存读写的任何数据将被外部存储器加密硬件自动加密、解密。 只要启用了 flash 加密功能,就会启用这个功能。关于如何启用 flash 加密以及其工作原理,请参考 :doc:`/security/flash-encryption`。 diff --git a/docs/zh_CN/api-guides/lwip.rst b/docs/zh_CN/api-guides/lwip.rst index b94f36748c40..34e8b485fe21 100644 --- a/docs/zh_CN/api-guides/lwip.rst +++ b/docs/zh_CN/api-guides/lwip.rst @@ -459,6 +459,10 @@ NAPT 和端口转发 如 :ref:`lwip-dns-limitation` 所述,ESP-IDF 中的 lwIP 扩展功能仍然受到全局 DNS 限制的影响。为了在应用程序代码中解决这一限制,可以使用 ``FALLBACK_DNS_SERVER_ADDRESS()`` 宏定义所有接口能够访问的全局 DNS 备用服务器,或者单独维护每个接口的 DNS 服务器,并在默认接口更改时重新配置。 +通过网络数据库 API 返回的 IP 地址数量受限:``getaddrinfo()`` 和 ``gethostbyname()`` 受到宏 ``DNS_MAX_HOST_IP`` 的限制,宏的默认值为 1。 + +在调用 ``getaddrinfo()`` 函数时,不会返回规范名称。因此,第一个返回的 ``addrinfo`` 结构中的 ``ai_canonname`` 字段仅包含 ``nodename`` 参数或相同内容的字符串。 + 在 UDP 套接字上重复调用 ``send()`` 或 ``sendto()`` 最终可能会导致错误。此时 ``errno`` 报错为 ``ENOMEM``,错误原因是底层网络接口驱动程序中的 buffer 大小有限。当所有驱动程序的传输 buffer 已满时,UDP 传输事务失败。如果应用程序需要发送大量 UDP 数据报,且不希望发送方丢弃数据报,建议检查错误代码,采用短延迟的重传机制。 .. only:: esp32 diff --git a/docs/zh_CN/api-reference/peripherals/spi_flash/spi_flash_concurrency.rst b/docs/zh_CN/api-reference/peripherals/spi_flash/spi_flash_concurrency.rst index 75662fa99107..eb3b3dab14a2 100644 --- a/docs/zh_CN/api-reference/peripherals/spi_flash/spi_flash_concurrency.rst +++ b/docs/zh_CN/api-reference/peripherals/spi_flash/spi_flash_concurrency.rst @@ -19,7 +19,7 @@ SPI1 flash 并发约束 .. only:: SOC_SPIRAM_XIP_SUPPORTED - 在 {IDF_TARGET_NAME} 上,启用配置选项 :ref:`CONFIG_SPIRAM_FETCH_INSTRUCTIONS` (默认禁用)和 :ref:`CONFIG_SPIRAM_RODATA` (默认禁用)后将允许 flash/PSRAM 的 cache 访问和 SPI1 的操作并发执行。请参阅 :ref:`xip_from_psram`,查看详细信息。 + 在 {IDF_TARGET_NAME} 上,启用配置选项 :ref:`CONFIG_SPIRAM_XIP_FROM_PSRAM` (默认禁用)后将允许 flash/PSRAM 的 cache 访问和 SPI1 的操作并发执行。请参阅 :ref:`xip_from_psram`,查看详细信息。 禁用该选项时,在读取/写入/擦除 flash 期间,必须禁用 cache。使用驱动访问 SPI1 的相关约束参见 :ref:`impact_disabled_cache`。这些约束会带来更多的 IRAM/DRAM 消耗。 @@ -40,7 +40,7 @@ SPI1 flash 并发约束 .. note:: - 同时启用 :ref:`CONFIG_SPIRAM_FETCH_INSTRUCTIONS` 和 :ref:`CONFIG_SPIRAM_RODATA` 选项后,不会禁用 cache。 + 启用 :ref:`CONFIG_SPIRAM_XIP_FROM_PSRAM` 选项后,不会禁用 cache。 .. only:: SOC_HP_CPU_HAS_MULTIPLE_CORES diff --git a/docs/zh_CN/api-reference/peripherals/spi_flash/xip_from_psram.inc b/docs/zh_CN/api-reference/peripherals/spi_flash/xip_from_psram.inc index 0ab88d805b2c..ec11ccda61b9 100644 --- a/docs/zh_CN/api-reference/peripherals/spi_flash/xip_from_psram.inc +++ b/docs/zh_CN/api-reference/peripherals/spi_flash/xip_from_psram.inc @@ -3,10 +3,8 @@ 在 PSRAM 中执行代码 ---------------------- -启用 :ref:`CONFIG_SPIRAM_FETCH_INSTRUCTIONS` 选项后,flash 中 ``.text`` 部分的数据(用于指令)将被放入 PSRAM。 +启用 :ref:`CONFIG_SPIRAM_XIP_FROM_PSRAM` 选项后,flash 中 ``.text`` 部分的数据(用于指令)和 flash 中 ``.rodata`` 部分的数据(用于只读数据)将被放入 PSRAM。 -启用 :ref:`CONFIG_SPIRAM_RODATA` 选项后,flash 中 ``.rodata`` 部分的数据(用于只读数据)将被放入 PSRAM。 - -相应的虚拟内存地址将被重新映射到 PSRAM。 +相应的虚拟内存地址将被映射到 PSRAM。 如果同时启用以上两个选项,则在 SPI1 flash 操作期间 cache 不会被禁用,无需确保 ISR、ISR 回调及相关数据放置在内部 RAM 中。 diff --git a/docs/zh_CN/api-reference/system/inc/show-efuse-table_ESP32-C5.rst b/docs/zh_CN/api-reference/system/inc/show-efuse-table_ESP32-C5.rst index 83365425f174..1da159cd1068 100644 --- a/docs/zh_CN/api-reference/system/inc/show-efuse-table_ESP32-C5.rst +++ b/docs/zh_CN/api-reference/system/inc/show-efuse-table_ESP32-C5.rst @@ -1,4 +1 @@ - -.. code-block:: none - - To be updated for C5 +.. include:: ../../../en/api-reference/system/inc/show-efuse-table_ESP32-C5.rst From cb771eaf1bfc58a411b6225ca7868e75304e2ea4 Mon Sep 17 00:00:00 2001 From: Chen Jichang Date: Mon, 1 Jul 2024 15:41:13 +0800 Subject: [PATCH 68/73] ci(spi_lcd): re-enable spi_lcd test on p4 --- .../esp_lcd/test_apps/.build-test-rules.yml | 4 ---- .../test_apps/spi_lcd/main/test_spi_board.h | 16 +++++++++++++++- .../esp_lcd/test_apps/spi_lcd/pytest_spi_lcd.py | 2 -- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/components/esp_lcd/test_apps/.build-test-rules.yml b/components/esp_lcd/test_apps/.build-test-rules.yml index 998917f0ab94..d6308cf692b2 100644 --- a/components/esp_lcd/test_apps/.build-test-rules.yml +++ b/components/esp_lcd/test_apps/.build-test-rules.yml @@ -52,7 +52,3 @@ components/esp_lcd/test_apps/spi_lcd: - esp_driver_spi disable: - if: SOC_GPSPI_SUPPORTED != 1 - disable_test: - - if: IDF_TARGET == "esp32p4" - temporary: true - reason: test not pass, should be re-enable # TODO: IDF-8975 diff --git a/components/esp_lcd/test_apps/spi_lcd/main/test_spi_board.h b/components/esp_lcd/test_apps/spi_lcd/main/test_spi_board.h index ec4600376d86..9ce7d5224e84 100644 --- a/components/esp_lcd/test_apps/spi_lcd/main/test_spi_board.h +++ b/components/esp_lcd/test_apps/spi_lcd/main/test_spi_board.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -28,6 +28,20 @@ extern "C" { #define TEST_LCD_DC_GPIO 1 #define TEST_LCD_PCLK_GPIO 2 #define TEST_LCD_DATA0_GPIO 4 +#elif CONFIG_IDF_TARGET_ESP32P4 +#define TEST_LCD_BK_LIGHT_GPIO 23 +#define TEST_LCD_RST_GPIO 6 +#define TEST_LCD_CS_GPIO 4 +#define TEST_LCD_DC_GPIO 3 +#define TEST_LCD_PCLK_GPIO 2 +#define TEST_LCD_DATA0_GPIO 32 +#define TEST_LCD_DATA1_GPIO 33 +#define TEST_LCD_DATA2_GPIO 22 +#define TEST_LCD_DATA3_GPIO 8 +#define TEST_LCD_DATA4_GPIO 21 +#define TEST_LCD_DATA5_GPIO 53 +#define TEST_LCD_DATA6_GPIO 20 +#define TEST_LCD_DATA7_GPIO 5 #else #define TEST_LCD_BK_LIGHT_GPIO 18 #define TEST_LCD_RST_GPIO 5 diff --git a/components/esp_lcd/test_apps/spi_lcd/pytest_spi_lcd.py b/components/esp_lcd/test_apps/spi_lcd/pytest_spi_lcd.py index f2ad352216e7..2cdeaf11e8ad 100644 --- a/components/esp_lcd/test_apps/spi_lcd/pytest_spi_lcd.py +++ b/components/esp_lcd/test_apps/spi_lcd/pytest_spi_lcd.py @@ -1,11 +1,9 @@ # SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded import Dut -@pytest.mark.temp_skip_ci(targets=['esp32p4'], reason='esp32p4 support TBD') # TODO: IDF-8975 @pytest.mark.supported_targets @pytest.mark.generic @pytest.mark.parametrize( From f0e8b606b78dd72b7b009aa8c20b4221d0318320 Mon Sep 17 00:00:00 2001 From: Chen Jichang Date: Mon, 1 Jul 2024 15:44:19 +0800 Subject: [PATCH 69/73] fix(spi_master): change MOSI pin default idle level to low --- components/hal/esp32p4/include/hal/spi_ll.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/components/hal/esp32p4/include/hal/spi_ll.h b/components/hal/esp32p4/include/hal/spi_ll.h index 645d5dbd0bf1..e45f48454972 100644 --- a/components/hal/esp32p4/include/hal/spi_ll.h +++ b/components/hal/esp32p4/include/hal/spi_ll.h @@ -42,6 +42,7 @@ extern "C" { #define SPI_LL_CPU_MAX_BIT_LEN (16 * 32) //Fifo len: 16 words #define SPI_LL_SUPPORT_CLK_SRC_PRE_DIV 1 //clock source have divider before peripheral #define SPI_LL_CLK_SRC_PRE_DIV_MAX 512//div1(8bit) * div2(8bit but set const 2) +#define SPI_LL_MOSI_FREE_LEVEL 1 //Default level after bus initialized /** * The data structure holding calculated clock configuration. Since the @@ -880,6 +881,16 @@ static inline void spi_ll_set_mosi_delay(spi_dev_t *hw, int delay_mode, int dela { } +/** + * Determine and unify the default level of mosi line when bus free + * + * @param hw Beginning address of the peripheral registers. + */ +static inline void spi_ll_set_mosi_free_level(spi_dev_t *hw, bool level) +{ + hw->ctrl.d_pol = level; //set default level for MOSI only on IDLE state +} + /** * Set the miso delay applied to the input signal before the internal peripheral. (Preview) * From b40c18be89e2cbef99f86299d94444b0f4cfc4c7 Mon Sep 17 00:00:00 2001 From: Mahavir Jain Date: Wed, 3 Jul 2024 09:50:36 +0530 Subject: [PATCH 70/73] fix(mbedtls): correct help text for few config options Closes https://github.com/espressif/esp-idf/issues/14126 --- components/mbedtls/Kconfig | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/mbedtls/Kconfig b/components/mbedtls/Kconfig index 67cf8cc483fa..0f4b84eb97f6 100644 --- a/components/mbedtls/Kconfig +++ b/components/mbedtls/Kconfig @@ -744,21 +744,21 @@ menu "mbedTLS" depends on MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE && MBEDTLS_ECDH_C && MBEDTLS_ECDSA_C default y help - Enable to support ciphersuites with prefix TLS-ECDHE-RSA-WITH- + Enable to support ciphersuites with prefix TLS-ECDHE-ECDSA-WITH- config MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA bool "Enable ECDH-ECDSA based ciphersuite modes" depends on MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE && MBEDTLS_ECDH_C && MBEDTLS_ECDSA_C default y help - Enable to support ciphersuites with prefix TLS-ECDHE-RSA-WITH- + Enable to support ciphersuites with prefix TLS-ECDH-ECDSA-WITH- config MBEDTLS_KEY_EXCHANGE_ECDH_RSA bool "Enable ECDH-RSA based ciphersuite modes" depends on MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE && MBEDTLS_ECDH_C default y help - Enable to support ciphersuites with prefix TLS-ECDHE-RSA-WITH- + Enable to support ciphersuites with prefix TLS-ECDH-RSA-WITH- config MBEDTLS_KEY_EXCHANGE_ECJPAKE bool "Enable ECJPAKE based ciphersuite modes" From 020a79371e02af4beec795c5dfe9e6b4c7d49661 Mon Sep 17 00:00:00 2001 From: shenmengjing Date: Thu, 27 Jun 2024 14:48:37 +0800 Subject: [PATCH 71/73] docs: Provide Chinese translation for COPYRIGHT --- docs/en/COPYRIGHT.rst | 96 +++++++++------------ docs/zh_CN/COPYRIGHT.rst | 176 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 216 insertions(+), 56 deletions(-) diff --git a/docs/en/COPYRIGHT.rst b/docs/en/COPYRIGHT.rst index 8f022e98adb2..e708d26ac823 100644 --- a/docs/en/COPYRIGHT.rst +++ b/docs/en/COPYRIGHT.rst @@ -1,6 +1,8 @@ Copyrights and Licenses *********************** +:link_to_translation:`zh_CN:[中文]` + Software Copyrights =================== @@ -21,62 +23,62 @@ These third party libraries can be included into the application (firmware) prod * :component:`Xtensa header files ` are Copyright (C) 2013 Tensilica Inc and are licensed under the MIT License as reproduced in the individual header files. -* Original parts of FreeRTOS_ (components/freertos) are Copyright (C) 2017 Amazon.com, Inc. or its affiliates are licensed under the MIT License, as described in :component_file:`license.txt `. +* Original parts of FreeRTOS_ (components/freertos) are Copyright (C) 2017 Amazon.com, Inc. or its affiliates, and are licensed under the MIT License, as described in :component_file:`license.txt `. * Original parts of LWIP_ (components/lwip) are Copyright (C) 2001, 2002 Swedish Institute of Computer Science and are licensed under the BSD License as described in :component_file:`COPYING file `. -* `wpa_supplicant`_ Copyright (c) 2003-2022 Jouni Malinen and contributors and licensed under the BSD license. +* `wpa_supplicant`_, Copyright (C) 2003-2022 Jouni Malinen and contributors and licensed under the BSD License. -* :component_file:`Fast PBKDF2 ` Copyright (c) 2015 Joseph Birr-Pixton and licensed under CC0 Public Domain Dedication license. +* :component_file:`Fast PBKDF2 `, Copyright (C) 2015 Joseph Birr-Pixton and licensed under CC0 Public Domain Dedication License. -* `FreeBSD net80211`_ Copyright (c) 2004-2008 Sam Leffler, Errno Consulting and licensed under the BSD license. +* `FreeBSD net80211`_, Copyright (C) 2004-2008 Sam Leffler, Errno Consulting and licensed under the BSD License. -* `argtable3`_ argument parsing library Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann and licensed under 3-clause BSD license. argtable3 also includes the following software components. For details, please see argtable3 :component_file:`LICENSE file `. +* `argtable3`_ argument parsing library, Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann and licensed under 3-clause BSD license. argtable3 also includes the following software components. For details, please see argtable3 :component_file:`LICENSE file `. - * C Hash Table library, Copyright (c) 2002, Christopher Clark and licensed under 3-clause BSD license. - * The Better String library, Copyright (c) 2014, Paul Hsieh and licensed under 3-clause BSD license. + * C Hash Table library, Copyright (C) 2002 Christopher Clark and licensed under 3-clause BSD License. + * The Better String library, Copyright (C) 2014 Paul Hsieh and licensed under 3-clause BSD License. * TCL library, Copyright the Regents of the University of California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState Corporation and other parties, and licensed under TCL/TK License. -* `linenoise`_ line editing library Copyright (c) 2010-2014 Salvatore Sanfilippo, Copyright (c) 2010-2013 Pieter Noordhuis, licensed under 2-clause BSD license. +* `linenoise`_ line editing library, Copyright (C) 2010-2014 Salvatore Sanfilippo, Copyright (C) 2010-2013 Pieter Noordhuis, licensed under 2-clause BSD License. * `FatFS`_ library, Copyright (C) 2017 ChaN, is licensed under :component_file:`a BSD-style license `. -* `cJSON`_ library, Copyright (c) 2009-2017 Dave Gamble and cJSON contributors, is licensed under MIT license as described in :component_file:`LICENSE file `. +* `cJSON`_ library, Copyright (C) 2009-2017 Dave Gamble and cJSON contributors, is licensed under MIT License as described in :component_file:`LICENSE file `. -* `micro-ecc`_ library, Copyright (c) 2014 Kenneth MacKay, is licensed under 2-clause BSD license. +* `micro-ecc`_ library, Copyright (C) 2014 Kenneth MacKay, is licensed under 2-clause BSD License. * `Mbed TLS`_ library, Copyright (C) 2006-2018 ARM Limited, is licensed under Apache License 2.0 as described in :component_file:`LICENSE file `. -* `SPIFFS`_ library, Copyright (c) 2013-2017 Peter Andersson, is licensed under MIT license as described in :component_file:`LICENSE file `. +* `SPIFFS`_ library, Copyright (C) 2013-2017 Peter Andersson, is licensed under MIT License as described in :component_file:`LICENSE file `. -* :component_file:`SD/MMC driver ` is derived from `OpenBSD SD/MMC driver`_, Copyright (c) 2006 Uwe Stuehler, and is licensed under BSD license. +* :component_file:`SD/MMC driver ` is derived from `OpenBSD SD/MMC driver`_, Copyright (C) 2006 Uwe Stuehler, and is licensed under BSD License. -* :component:`ESP-MQTT ` MQTT Package (contiki-mqtt) - Copyright (c) 2014, Stephen Robinson, MQTT-ESP - Tuan PM is licensed under Apache License 2.0 as described in :component_file:`LICENSE file `. +* :component:`ESP-MQTT ` Package (contiki-mqtt), Copyright (C) 2014 Stephen Robinson, MQTT-ESP - Tuan PM is licensed under Apache License 2.0 as described in :component_file:`LICENSE file `. -* :component:`BLE Mesh ` is adapted from Zephyr Project, Copyright (c) 2017-2018 Intel Corporation and licensed under Apache License 2.0. +* :component:`BLE Mesh ` is adapted from Zephyr Project, Copyright (C) 2017-2018 Intel Corporation and licensed under Apache License 2.0. -* `mynewt-nimble`_ Apache Mynewt NimBLE, Copyright 2015-2018, The Apache Software Foundation, is licensed under Apache License 2.0 as described in :component_file:`LICENSE file `. +* `mynewt-nimble`_, Copyright (C) 2015-2018 The Apache Software Foundation, is licensed under Apache License 2.0 as described in :component_file:`LICENSE file `. -* `TLSF allocator `_ Two Level Segregated Fit memory allocator, Copyright (c) 2006-2016, Matthew Conte, and licensed under the BSD 3-clause license. +* `TLSF allocator `_, Copyright (C) 2006-2016 Matthew Conte, and licensed under the BSD 3-clause license. -* :component:`openthread`, Copyright (c) The OpenThread Authors, is licensed under BSD License as described in :component_file:`LICENSE file `. +* :component:`openthread`, Copyright (C) The OpenThread Authors, is licensed under BSD License as described in :component_file:`LICENSE file `. -* :component_file:`UBSAN runtime ` — Copyright (c) 2016, Linaro Limited and Jiří Zárevúcky, licensed under the BSD 2-clause license. +* :component_file:`UBSAN runtime `, Copyright (C) 2016 Linaro Limited and Jiří Zárevúcky, licensed under the BSD 2-clause license. -* :component:`HTTP Parser ` Based on src/http/ngx_http_parse.c from NGINX copyright Igor Sysoev. Additional changes are licensed under the same terms as NGINX and Joyent, Inc. and other Node contributors. For details please check :component_file:`LICENSE file `. +* :component:`HTTP Parser ` is based on src/http/ngx_http_parse.c from NGINX copyright Igor Sysoev. Additional changes are licensed under the same terms as NGINX and Joyent, Inc. and other Node contributors. For details please check :component_file:`LICENSE file `. -* `SEGGER SystemView`_ target-side library, Copyright (c) 1995-2021 SEGGER Microcontroller GmbH, is licensed under BSD 1-clause license. +* `SEGGER SystemView`_ target-side library, Copyright (C) 1995-2021 SEGGER Microcontroller GmbH, is licensed under BSD 1-clause license. -* `protobuf-c`_ Protocol Buffers implementation in C, Copyright (c) 2008-2022, Dave Benson and the protobuf-c authors. For details please check :component_file:`LICENSE file `. +* `protobuf-c`_ is Protocol Buffers implementation in C, Copyright (C) 2008-2022 Dave Benson and the protobuf-c authors. For details please check :component_file:`LICENSE file `. -* `CMock`_ Mock/stub generator for C, Copyright (c) 2007-14 Mike Karlesky, Mark VanderVoord, Greg Williams, is licensed under MIT license as described in :component_file:`LICENSE file `. +* `CMock`_ mock/stub generator for C, Copyright (C) 2007-14 Mike Karlesky, Mark VanderVoord, Greg Williams, is licensed under MIT License as described in :component_file:`LICENSE file `. -* `Unity`_ Simple Unit Testing library, Copyright (c) 2007-23 Mike Karlesky, Mark VanderVoord, Greg Williams, is licensed under MIT license as described in :component_file:`LICENSE file `. +* `Unity`_ Simple Unit Testing library, Copyright (C) 2007-23 Mike Karlesky, Mark VanderVoord, Greg Williams, is licensed under MIT License as described in :component_file:`LICENSE file `. Documentation ------------- -* HTML version of the `ESP-IDF Programming Guide`_ uses the Sphinx theme `sphinx_idf_theme`_, which is Copyright (c) 2013-2020 Dave Snider, Read the Docs, Inc. & contributors, and Espressif Systems (Shanghai) CO., LTD. It is based on `sphinx_rtd_theme`_. Both are licensed under MIT license. +* HTML version of the `ESP-IDF Programming Guide`_ uses the Sphinx theme `sphinx_idf_theme`_, which is Copyright (C) 2013-2020 Dave Snider, Read the Docs, Inc. & contributors, and Espressif Systems (Shanghai) CO., LTD. It is based on `sphinx_rtd_theme`_. Both are licensed under MIT License. ROM Source Code Copyrights ========================== @@ -85,20 +87,20 @@ Espressif SoCs mask ROM hardware includes binaries compiled from portions of the * :component:`Newlib `, licensed under the BSD License and is Copyright of various parties, as described in :component_file:`COPYING.NEWLIB `. -* Xtensa libhal, Copyright (c) Tensilica Inc and licensed under the MIT license (see below). +* Xtensa libhal, Copyright (C) Tensilica Inc and licensed under the MIT License (see below). -* TinyBasic_ Plus, Copyright Mike Field & Scott Lawrence and licensed under the MIT license (see below). +* TinyBasic_ Plus, Copyright (C) Mike Field & Scott Lawrence and licensed under the MIT License (see below). * miniz_, by Rich Geldreich - placed into the public domain. -* TJpgDec_ Copyright (C) 2011, ChaN, all right reserved. See below for license. +* TJpgDec_, Copyright (C) 2011 ChaN, all right reserved. See below for license. * Parts of Zephyr RTOS USB stack: - * `DesignWare USB device driver`_ Copyright (c) 2016 Intel Corporation and licensed under Apache 2.0 license. - * `Generic USB device driver`_ Copyright (c) 2006 Bertrik Sikken (bertrik@sikken.nl), 2016 Intel Corporation and licensed under BSD 3-clause license. - * `USB descriptors functionality`_ Copyright (c) 2017 PHYTEC Messtechnik GmbH, 2017-2018 Intel Corporation and licensed under Apache 2.0 license. - * `USB DFU class driver`_ Copyright (c) 2015-2016 Intel Corporation, 2017 PHYTEC Messtechnik GmbH and licensed under BSD 3-clause license. - * `USB CDC ACM class driver`_ Copyright (c) 2015-2016 Intel Corporation and licensed under Apache 2.0 license. + * `DesignWare USB device driver`_, Copyright (C) 2016 Intel Corporation and licensed under Apache License 2.0. + * `Generic USB device driver`_, Copyright (C) 2006 Bertrik Sikken (bertrik@sikken.nl), 2016 Intel Corporation and licensed under BSD 3-clause license. + * `USB descriptors functionality`_, Copyright (C) 2017 PHYTEC Messtechnik GmbH, 2017-2018 Intel Corporation and licensed under Apache License 2.0. + * `USB DFU class driver`_, Copyright (C) 2015-2016 Intel Corporation, 2017 PHYTEC Messtechnik GmbH and licensed under BSD 3-clause license. + * `USB CDC ACM class driver`_, Copyright (C) 2015-2016 Intel Corporation and licensed under Apache License 2.0. .. only:: CONFIG_ESP_ROM_HAS_MBEDTLS_CRYPTO_LIB @@ -107,31 +109,18 @@ Espressif SoCs mask ROM hardware includes binaries compiled from portions of the Xtensa libhal MIT License ========================= -Copyright (c) 2003, 2006, 2010 Tensilica Inc. +Copyright (C) 2003, 2006, 2010 Tensilica Inc. -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. TinyBasic Plus MIT License ========================== -Copyright (c) 2012-2013 +Copyright (C) 2012-2013 Mike Field & Scott Lawrence. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: @@ -142,12 +131,9 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI TJpgDec License =============== -TJpgDec - Tiny JPEG Decompressor R0.01 (C) ChaN, 2011 -The TJpgDec is a generic JPEG decompressor module for tiny embedded systems. -This is a free software that opened for education, research and commercial -developments under license policy of following terms. +TJpgDec - Tiny JPEG Decompressor R0.01 (C) 2011 ChaN, is a generic JPEG decompressor module for tiny embedded systems.This is a free software that opened for education, research and commercial developments under license policy of following terms: -Copyright (C) 2011, ChaN, all right reserved. +Copyright (C) 2011 ChaN, all right reserved. * The TJpgDec module is a free software and there is NO WARRANTY. * No restriction on use. You can use, modify and redistribute it for personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY. diff --git a/docs/zh_CN/COPYRIGHT.rst b/docs/zh_CN/COPYRIGHT.rst index 6da18a6c32fd..527b3ce000ca 100644 --- a/docs/zh_CN/COPYRIGHT.rst +++ b/docs/zh_CN/COPYRIGHT.rst @@ -1 +1,175 @@ -.. include:: ../en/COPYRIGHT.rst +版权和许可证 +************ + +:link_to_translation:`en:[English]` + +软件版权 +======== + +2015-2023 乐鑫科技享有本代码库中的所有原创源代码版权。源代码根据 LICENSE 文件描述的 Apache License 2.0 进行许可。 + +以下各许可证还包含一些第三方版权代码。 + +如果源代码头文件中指定了版权和许可证信息,则该信息优先于此处的摘要。 + +部分示例使用了未经 Apache 许可的外部组件,请查看每个示例源代码中的版权描述。 + +固件组件 +-------- + +以下这些第三方库包含在 ESP-IDF 生成的应用程序(固件)中。 + +* :component:`Newlib ` 经 BSD 许可证许可,版权归各方所有,如 :component_file:`COPYING.NEWLIB ` 中所述。 + +* :component:`Xtensa 头文件 ` 版权归 2013 Tensilica 公司所有,并根据各头文件中复制的 MIT 许可证进行许可。 + +* FreeRTOS_ (components/freertos) 的原始部分,版权归 2017 亚马逊公司或其附属公司所有,并根据 :component_file:`license.txt ` 中描述的 MIT 许可证进行许可。 + +* LWIP_ (components/lwip) 的原始部分,版权归 2001、2002 瑞典计算机科学研究所所有,根据 :component_file:`COPYING 文件 ` 中描述的 BSD 许可证进行许可。 + +* `wpa_supplicant`_ 版权归 2003-2022 Jouni Malinen 及其他贡献者所有,并根据 BSD 许可证进行许可。 + +* :component_file:`Fast PBKDF2 ` 版权归 2015 Joseph Birr-Pixton 所有,并根据 CC0 公共领域奉献许可证进行许可。 + +* `FreeBSD net80211`_ 版权归 2004-2008 Sam Leffler 和 Errno 咨询公司所有,并根据 BSD 许可证进行许可。 + +* `argtable3`_ 参数解析库版权归 1998-2001、2003-2011、2013 Stewart Heitmann 所有,并根据三条款 BSD 许可证进行许可。argtable3 还包含以下软件组件。详情请参阅 argtable3 :component_file:`LICENSE 文件 `。 + + * C 哈希表库,版权归 2002 Christopher Clark 所有,并根据三条款 BSD 许可证进行许可。 + * Better String 库,版权归 2014 Paul Hsieh 所有,并根据三条款 BSD 许可证进行许可。 + * TCL 库,版权归加州大学董事会、太阳计算机系统有限公司、Scriptics 公司、ActiveState 公司及其他方所有,并根据 TCL/TK 许可证进行许可。 + +* `linenoise`_ 行编辑库版权归 2010-2014 Salvatore Sanfilippo 及 2010-2013 Pieter Noordhuis 所有,根据二条款 BSD 许可证进行许可。 + +* `FatFS`_ 库,版权归 2017 ChaN 所有,并根据 :component_file:`BSD 式条款 ` 进行许可。 + +* `cJSON`_ 库,版权归 2009-2017 Dave Gamble 及 cJSON 库贡献者所有,根据 :component_file:`LICENSE 文件 ` 中描述的 MIT 许可证进行许可。 + +* `micro-ecc`_ 库,版权归 2014 Kenneth MacKay 所有,根据二条款 BSD 许可证进行许可。 + +* `Mbed TLS`_ 库,版权归 2006-2018 安谋控股公司所有,根据 :component_file:`LICENSE 文件 ` 中描述的 Apache License 2.0 进行许可。 + +* `SPIFFS`_ 库,版权归 2013-2017 Peter Andersson 所有,根据 :component_file:`LICENSE 文件 ` 中描述的 MIT 许可证进行许可。 + +* :component_file:`SD/MMC 驱动程序 ` 派生自 `OpenBSD SD/MMC 驱动程序`_,版权归 2006 Uwe Stuehler 所有,并根据 BSD 许可证进行许可。 + +* :component:`ESP-MQTT ` 包 (contiki-mqtt),版权归 2014 Stephen Robinson 和 MQTT-ESP - Tuan PM 所有,根据 :component_file:`LICENSE 文件 ` 中描述的 Apache License 2.0 进行许可。 + +* :component:`BLE Mesh ` 改编自 Zephyr 项目,版权归 2017-2018 英特尔公司所有,并根据 Apache License 2.0 进行许可。 + +* `mynewt-nimble`_,版权归 2015-2018 Apache 软件基金会所有,根据 :component_file:`LICENSE 文件 ` 中描述的 Apache License 2.0 进行许可。 + +* `TLSF 分配器 `_,版权归 2006-2016 Matthew Conte 所有,并根据三条款 BSD 许可证进行许可。 + +* :component:`openthread`,版权归 OpenThread 作者所有,并根据 :component_file:`LICENSE 文件 ` 中描述的 BSD 许可证进行许可。 + +* :component_file:`UBSAN 运行时库 ` 版权归 2016 Linaro Limited 和 Jiří Zárevúcky 所有,并根据二条款 BSD 许可证进行许可。 + +* :component:`HTTP 解析器 ` 基于 NGINX 中的 src/http/ngx_http_parse.c 文件,版权归 Igor Sysoev 所有。任何对源代码的额外修改经过与 NGINX、Joyent 公司及其他 Node 贡献者相同条款的许可。详情请参阅 :component_file:`LICENSE 文件 `。 + +* `SEGGER SystemView`_ 目标端库,版权归 1995-2021 赛格集团所有,并根据一条款 BSD 许可证进行许可。 + +* `protobuf-c`_ 是 C 语言的 Protocol Buffers 实现,版权归 2008-2022 Dave Benson 及 protobuf-c 作者所有。详情请参阅 :component_file:`LICENSE 文件 `。 + +* `CMock`_ C 语言模拟和存根生成器,版权归 2007-14 Mike Karlesky、 Mark VanderVoord 和 Greg Williams 所有,并根据 :component_file:`LICENSE 文件 ` 中描述的 MIT 许可证进行许可。 + +* `Unity`_ 简单单元测试库,版权归 2007-23 Mike Karlesky、Mark VanderVoord 和 Greg Williams 所有,并根据 :component_file:`LICENSE 文件 ` 中描述的 MIT 许可证进行许可。 + +文档 +---- + +* `ESP-IDF 编程指南`_ 的 HTML 版本使用 Sphinx 主题 `sphinx_idf_theme`_,版权归 2013-2020 Dave Snider、Read the Docs 平台及其贡献者,以及乐鑫科技所有,基于 `sphinx_rtd_theme`_。`sphinx_idf_theme`_ 和 `sphinx_rtd_theme`_ 均根据 MIT 许可证进行许可。 + +ROM 源代码版权 +============== + +乐鑫芯片中的 Mask ROM 包含以下部分第三方软件编译的二进制文件: + +* :component:`Newlib `,如 :component_file:`COPYING.NEWLIB ` 所述,由 BSD 许可证进行许可,版权归各方所有。 + +* Xtensa libhal,版权归 Tensilica 公司所有,并根据下述 MIT 许可证进行许可。 + +* TinyBasic_ Plus,版权归 Mike Field 和 Scott Lawrence 所有,并根据下述 MIT 许可证进行许可。 + +* miniz_,由 Rich Geldreich 提供,已置于公共领域。 + +* TJpgDec_ 版权归 2011 ChaN 所有,见下文许可证。 + +* 以下是 Zephyr RTOS USB 协议栈的部分内容: + * `DesignWare USB 设备驱动程序`_ 版权归 2016 英特尔公司所有,并根据 Apache License 2.0 进行许可。 + * `Generic USB 设备驱动程序`_ 版权归 2006 Bertrik Sikken (bertrik@sikken.nl)、2016 英特尔公司所有,并根据三条款 BSD 许可证进行许可。 + * `USB 描述符功能`_ 版权归 2017 PHYTEC Messtechnik GmbH 和 2017-2018 英特尔公司所有,并根据 Apache License 2.0 进行许可。 + * `USB DFU 类驱动程序`_ 版权归 2015-2016 英特尔公司和 2017 PHYTEC Messtechnik GmbH 所有,并根据三条款 BSD 许可证进行许可。 + * `USB CDC ACM 类驱动程序`_ 版权归 2015-2016 英特尔公司所有,并根据 Apache License 2.0 进行许可。 + +.. only:: CONFIG_ESP_ROM_HAS_MBEDTLS_CRYPTO_LIB + + * `Mbed TLS`_ 库,版权归 2006-2018 安谋控股公司所有,并根据 Apache License 2.0 进行许可。 + +Xtensa libhal MIT 许可证 +======================== + +版权归 2003、2006、2010 Tensilica 公司所有。 + +特此免费授予获得本软件及相关文档(以下简称“本软件”)副本的任何人、授予其他被提供软件的人,无限制地处理本软件的权利,包括但不限于使用、复制、修改、合并、出版、发布、再许可和/或销售本软件的副本,但需符合以下条件: + +上述版权声明和本许可声明应包含在本软件的所有副本或重要内容中。 + +本软件按“原样”提供,不提供任何明示或暗示的担保,包括但不限于对适销性、特定用途适用性和非侵权性的担保。在任何情况下,作者或版权持有人均不对因本软件、使用本软件、或其他与本软件相关的交易而产生的任何索赔、损害或其他责任负责,无论是在合同诉讼、侵权诉讼或其他诉讼中。 + +TinyBasic Plus MIT 许可证 +========================= + +版权归 2012-2013 Mike Field 和 Scott Lawrence 所有。 + +特此免费授予获得本软件及相关文档(以下简称“本软件”)副本的任何人、授予其他被提供软件的人,无限制地处理本软件的权利,包括但不限于使用、复制、修改、合并、出版、发布、再许可和/或销售本软件的副本,但需符合以下条件: + +上述版权声明和本许可声明应包含在本软件的所有副本或重要内容中。 + +本软件按“原样”提供,不提供任何明示或暗示的担保,包括但不限于对适销性、特定用途适用性和非侵权性的担保。在任何情况下,作者或版权持有人均不对因本软件、使用本软件、或其他与本软件相关的交易而产生的任何索赔、损害或其他责任负责,无论是在合同诉讼、侵权诉讼或其他诉讼中。 + +TJpgDec 许可证 +============== + +TJpgDec - Tiny JPEG 解压器 R0.01 (C) 2011 ChaN,是一个用于小型嵌入式系统的通用 JPEG 解压缩模块。这是一个开源的自由软件,可用于教育、研究和商业开发,许可证政策如下: + +版权归 2011 ChaN 所有。 + +* TJpgDec 模块是一个自由软件,不提供任何担保。 +* 没有使用限制,可以在个人、非营利或商业产品中使用、修改和重新发布本软件,但须自行承担责任。 +* 重新发布源代码时必须保留上述版权声明。 + + +.. _Newlib: https://sourceware.org/newlib/ +.. _FreeRTOS: https://freertos.org/ +.. _esptool.py: https://github.com/espressif/esptool +.. _LWIP: https://savannah.nongnu.org/projects/lwip/ +.. _TinyBasic: https://github.com/BleuLlama/TinyBasicPlus +.. _miniz: https://code.google.com/archive/p/miniz/ +.. _wpa_supplicant: https://w1.fi/wpa_supplicant/ +.. _FreeBSD net80211: https://github.com/freebsd/freebsd-src/tree/master/sys/net80211 +.. _TJpgDec: http://elm-chan.org/fsw/tjpgd/00index.html +.. _argtable3: https://github.com/argtable/argtable3 +.. _linenoise: https://github.com/antirez/linenoise +.. _fatfs: http://elm-chan.org/fsw/ff/00index_e.html +.. _cJSON: https://github.com/DaveGamble/cJSON +.. _micro-ecc: https://github.com/kmackay/micro-ecc +.. _OpenBSD SD/MMC 驱动程序: https://github.com/openbsd/src/blob/f303646/sys/dev/sdmmc/sdmmc.c +.. _Mbed TLS: https://github.com/Mbed-TLS/mbedtls +.. _spiffs: https://github.com/pellepl/spiffs +.. _CMock: https://github.com/ThrowTheSwitch/CMock +.. _protobuf-c: https://github.com/protobuf-c/protobuf-c +.. _Unity: https://github.com/ThrowTheSwitch/Unity +.. _asio: https://github.com/chriskohlhoff/asio +.. _mqtt: https://github.com/espressif/esp-mqtt +.. _zephyr: https://github.com/zephyrproject-rtos/zephyr +.. _mynewt-nimble: https://github.com/apache/mynewt-nimble +.. _ESP-IDF 编程指南: https://docs.espressif.com/projects/esp-idf/zh_CN/latest/ +.. _sphinx_idf_theme: https://github.com/espressif/sphinx_idf_theme +.. _sphinx_rtd_theme: https://github.com/readthedocs/sphinx_rtd_theme +.. _SEGGER SystemView: https://www.segger.com/downloads/systemview/ +.. _DesignWare USB 设备驱动程序: https://github.com/zephyrproject-rtos/zephyr/blob/v1.12-branch/drivers/usb/device/usb_dc_dw.c +.. _Generic USB 设备驱动程序: https://github.com/zephyrproject-rtos/zephyr/blob/v1.12-branch/subsys/usb/usb_device.c +.. _USB 描述符功能: https://github.com/zephyrproject-rtos/zephyr/blob/v1.12-branch/subsys/usb/usb_descriptor.c +.. _USB DFU 类驱动程序: https://github.com/zephyrproject-rtos/zephyr/blob/v1.12-branch/subsys/usb/class/usb_dfu.c +.. _USB CDC ACM 类驱动程序: https://github.com/zephyrproject-rtos/zephyr/blob/v1.12-branch/subsys/usb/class/cdc_acm.c From 3cb4880d02df957860d10b37eeac52f3927583cf Mon Sep 17 00:00:00 2001 From: shenmengjing Date: Fri, 21 Jun 2024 11:00:46 +0800 Subject: [PATCH 72/73] docs: Add often used espefuse subcommands to idf.py --- docs/en/api-reference/protocols/esp_tls.rst | 4 +- docs/en/security/flash-encryption.rst | 4 +- docs/zh_CN/api-guides/flash_psram_config.rst | 2 +- .../jtag-debugging/configure-other-jtag.rst | 2 +- .../zh_CN/api-reference/peripherals/ecdsa.rst | 4 +- docs/zh_CN/api-reference/peripherals/hmac.rst | 2 +- .../zh_CN/api-reference/protocols/esp_tls.rst | 4 +- .../api-reference/storage/nvs_encryption.rst | 2 +- docs/zh_CN/api-reference/system/efuse.rst | 8 ++-- docs/zh_CN/security/flash-encryption.rst | 40 +++++++++---------- docs/zh_CN/security/secure-boot-v1.rst | 4 +- 11 files changed, 40 insertions(+), 36 deletions(-) diff --git a/docs/en/api-reference/protocols/esp_tls.rst b/docs/en/api-reference/protocols/esp_tls.rst index d4937a9619a9..b0c5c9911efb 100644 --- a/docs/en/api-reference/protocols/esp_tls.rst +++ b/docs/en/api-reference/protocols/esp_tls.rst @@ -208,8 +208,10 @@ The following table shows a typical comparison between WolfSSL and MbedTLS when ECDSA Peripheral with ESP-TLS ----------------------------- - ESP-TLS provides support for using the ECDSA peripheral with {IDF_TARGET_NAME}. The use of ECDSA peripheral is supported only when ESP-TLS is used with MbedTLS as its underlying SSL/TLS stack. The ECDSA private key should be present in the eFuse for using the ECDSA peripheral. Please refer to :doc:`ECDSA Guide <../peripherals/ecdsa>` for programming the ECDSA key in the eFuse. + ESP-TLS provides support for using the ECDSA peripheral with {IDF_TARGET_NAME}. The use of ECDSA peripheral is supported only when ESP-TLS is used with MbedTLS as its underlying SSL/TLS stack. The ECDSA private key should be present in the eFuse for using the ECDSA peripheral. Please refer to :doc:`ECDSA Guide <../peripherals/ecdsa>` for programming the ECDSA key in the eFuse. + To use ECDSA peripheral with ESP-TLS, set :cpp:member:`esp_tls_cfg_t::use_ecdsa_peripheral` to `true`, and set :cpp:member:`esp_tls_cfg_t::ecdsa_key_efuse_blk` to the eFuse block ID in which ECDSA private key is stored. + This will enable the use of ECDSA peripheral for private key operations. As the client private key is already present in the eFuse, it needs not be supplied to the :cpp:type:`esp_tls_cfg_t` structure. .. code-block:: c diff --git a/docs/en/security/flash-encryption.rst b/docs/en/security/flash-encryption.rst index dcf28dd451ea..6600c7eba2e3 100644 --- a/docs/en/security/flash-encryption.rst +++ b/docs/en/security/flash-encryption.rst @@ -55,7 +55,7 @@ Other types of data can be encrypted conditionally: Relevant eFuses --------------- -The flash encryption operation is controlled by various eFuses available on {IDF_TARGET_NAME}. The list of eFuses and their descriptions is given in the table below. The names in eFuse column are also used by espefuse.py tool and idf.py based eFuse commands. For usage in the eFuse API, modify the name by adding ``ESP_EFUSE_``, for example: esp_efuse_read_field_bit(ESP_EFUSE_DISABLE_DL_ENCRYPT). +The flash encryption operation is controlled by various eFuses available on {IDF_TARGET_NAME}. The list of eFuses and their descriptions is given in the table below. The names in eFuse column are also used by ``espefuse.py`` tool and ``idf.py`` based eFuse commands. For usage in the eFuse API, modify the name by adding ``ESP_EFUSE_``, for example: esp_efuse_read_field_bit (ESP_EFUSE_DISABLE_DL_ENCRYPT). .. Comment: As text in cells of list-table header rows does not wrap, it is necessary to make 0 header rows and apply bold typeface to the first row. Otherwise, the table goes beyond the html page limits on the right. @@ -164,7 +164,7 @@ The flash encryption operation is controlled by various eFuses available on {IDF * R/W access control is available for all the eFuse bits listed in the table above. * The default value of these bits is 0 after manufacturing. -Read and write access to eFuse bits is controlled by appropriate fields in the registers ``WR_DIS`` and ``RD_DIS``. For more information on {IDF_TARGET_NAME} eFuses, see :doc:`eFuse manager <../api-reference/system/efuse>`. To change protection bits of eFuse field using idf.py, use these two commands: efuse-read-protect and efuse-write-protect (idf.py based aliases of espefuse.py commands write_protect_efuse and read_protect_efuse). Example ``idf.py efuse-write-protect DISABLE_DL_ENCRYPT``. +Read and write access to eFuse bits is controlled by appropriate fields in the registers ``WR_DIS`` and ``RD_DIS``. For more information on {IDF_TARGET_NAME} eFuses, see :doc:`eFuse manager <../api-reference/system/efuse>`. To change protection bits of eFuse field using ``idf.py``, use these two commands: efuse-read-protect and efuse-write-protect (idf.py based aliases of espefuse.py commands write_protect_efuse and read_protect_efuse). Example ``idf.py efuse-write-protect DISABLE_DL_ENCRYPT``. .. only:: esp32c2 diff --git a/docs/zh_CN/api-guides/flash_psram_config.rst b/docs/zh_CN/api-guides/flash_psram_config.rst index a3aa3dd2883e..f7432c30e4ef 100644 --- a/docs/zh_CN/api-guides/flash_psram_config.rst +++ b/docs/zh_CN/api-guides/flash_psram_config.rst @@ -257,7 +257,7 @@ F4R4 硬件 .. code-block:: python - python3 ./espefuse.py -p /dev/ --do-not-confirm burn_efuse FLASH_TYPE 1 + idf.py -p PORT efuse-burn --do-not-confirm FLASH_TYPE 1 .. note:: diff --git a/docs/zh_CN/api-guides/jtag-debugging/configure-other-jtag.rst b/docs/zh_CN/api-guides/jtag-debugging/configure-other-jtag.rst index 7280aa23742c..d176f3d6930d 100644 --- a/docs/zh_CN/api-guides/jtag-debugging/configure-other-jtag.rst +++ b/docs/zh_CN/api-guides/jtag-debugging/configure-other-jtag.rst @@ -12,7 +12,7 @@ 配置 eFuse ^^^^^^^^^^^^^^^^ - {IDF_TARGET_NAME} JTAG 接口默认连接至 :doc:`内置 USB_SERIAL_JTAG 外设 `。要使用外部 JTAG 适配器,需将 JTAG 接口切换至 GPIO 管脚。你可以使用 ``espefuse.py`` 工具来烧录 eFuse,以完成接口转换。 + {IDF_TARGET_NAME} JTAG 接口默认连接至 :doc:`内置 USB_SERIAL_JTAG 外设 `。要使用外部 JTAG 适配器,需将 JTAG 接口切换至 GPIO 管脚。你可以使用 ``idf.py`` 工具来烧录 eFuse,以完成接口转换。 .. only:: esp32c3 diff --git a/docs/zh_CN/api-reference/peripherals/ecdsa.rst b/docs/zh_CN/api-reference/peripherals/ecdsa.rst index 829c89230f02..c9e444bd24d1 100644 --- a/docs/zh_CN/api-reference/peripherals/ecdsa.rst +++ b/docs/zh_CN/api-reference/peripherals/ecdsa.rst @@ -22,11 +22,11 @@ ECDSA 外设可以为 TLS 双向身份验证等用例建立 **安全设备身份 在 {IDF_TARGET_NAME} 上,ECDSA 模块使用烧录到 eFuse 块中的密钥。密码模块外的任何资源都不可访问此密钥(默认模式),从而避免密钥泄露。 -ECDSA 密钥可以通过 ``espefuse.py`` 脚本在外部编程: +ECDSA 密钥可以通过 ``idf.py`` 脚本在外部编程。以下是关于编程 ECDSA 密钥的示例: .. code:: bash - espefuse.py burn_key ECDSA_KEY + idf.py efuse-burn-key ECDSA_KEY .. only:: SOC_EFUSE_BLOCK9_KEY_PURPOSE_QUIRK diff --git a/docs/zh_CN/api-reference/peripherals/hmac.rst b/docs/zh_CN/api-reference/peripherals/hmac.rst index 7f30144f2177..dfa39222acec 100644 --- a/docs/zh_CN/api-reference/peripherals/hmac.rst +++ b/docs/zh_CN/api-reference/peripherals/hmac.rst @@ -98,7 +98,7 @@ HMAC 的第三种应用场景是将其作为密钥,启用软禁用的 JTAG 接 **第一步:设置** 1. 生成一个 256 位的 HMAC 密钥,用于重新启用 JTAG。 -2. 将步骤 1 获得的密钥写入 eFuse 块,且 eFuse 块的密钥功能参数应为 HMAC_DOWN_ALL (5) 或 HMAC_DOWN_JTAG (6)。为此,可以使用固件中的 ``esp_efuse_write_key()`` 函数,或使用主机上的 ``espefuse.py`` 完成操作。 +2. 将步骤 1 获得的密钥写入 eFuse 块,且 eFuse 块的密钥功能参数应为 HMAC_DOWN_ALL (5) 或 HMAC_DOWN_JTAG (6)。为此,可以使用固件中的 ``esp_efuse_write_key()`` 函数,或使用主机上的 ``idf.py efuse-burn-key`` 完成操作。 3. 使用 ``esp_efuse_set_read_protect()`` 将 eFuse 密钥块配置为读保护,防止软件读取写入到 eFuse 密钥块中的 HMAC 密钥值。 4. 在烧录到 {IDF_TARGET_NAME} 上时,将特定的位或位组设置为 ``soft JTAG disable``。这样可以永久禁用 JTAG 接口,除非软件提供正确的密钥值进行验证。 diff --git a/docs/zh_CN/api-reference/protocols/esp_tls.rst b/docs/zh_CN/api-reference/protocols/esp_tls.rst index 534c8b792415..9b77551370e8 100644 --- a/docs/zh_CN/api-reference/protocols/esp_tls.rst +++ b/docs/zh_CN/api-reference/protocols/esp_tls.rst @@ -208,8 +208,10 @@ MbedTLS 与 WolfSSL 对比 在 ESP-TLS 中使用 ECDSA 外设 ----------------------------- - ESP-TLS 支持在 {IDF_TARGET_NAME} 中使用 ECDSA 外设。使用 ECDSA 外设时,ESP-TLS 必须与 MbedTLS 一起作为底层 SSL/TLS 协议栈,并且 ECDSA 的私钥应存储在 eFuse 中。请参考 `espefuse.py `__ 文档,了解如何在 eFuse 中烧写 ECDSA 密钥。 + ESP-TLS 支持在 {IDF_TARGET_NAME} 中使用 ECDSA 外设。使用 ECDSA 外设时,ESP-TLS 必须与 MbedTLS 一起作为底层 SSL/TLS 协议栈,并且 ECDSA 的私钥应存储在 eFuse 中。请参考 :doc:`ECDSA 指南 <../peripherals/ecdsa>`,了解如何在 eFuse 中烧写 ECDSA 密钥。 + 在 ESP-TLS 中启用 ECDSA 外设前,请将 :cpp:member:`esp_tls_cfg_t::use_ecdsa_peripheral` 设置为 `true`,并将 :cpp:member:`esp_tls_cfg_t::ecdsa_key_efuse_blk` 设置为存储了 ECDSA 密钥的 eFuse 块 ID。 + 这样就可以使用 ECDSA 外设进行私钥操作。由于客户私钥已经存储在 eFuse 中,因此无需将其传递给 :cpp:type:`esp_tls_cfg_t`。 .. code-block:: c diff --git a/docs/zh_CN/api-reference/storage/nvs_encryption.rst b/docs/zh_CN/api-reference/storage/nvs_encryption.rst index a5fb70084513..41997211cd1d 100644 --- a/docs/zh_CN/api-reference/storage/nvs_encryption.rst +++ b/docs/zh_CN/api-reference/storage/nvs_encryption.rst @@ -122,7 +122,7 @@ NVS 密钥分区 .. note:: 可以使用以下命令预先在 eFuse 中设置自己的 HMAC 密钥: :: - espefuse.py -p PORT burn_key HMAC_UP + idf.py -p PORT efuse-burn-key HMAC_UP 加密读/写 -------------------- diff --git a/docs/zh_CN/api-reference/system/efuse.rst b/docs/zh_CN/api-reference/system/efuse.rst index 7beb1e600f8e..3b1e98525ba2 100644 --- a/docs/zh_CN/api-reference/system/efuse.rst +++ b/docs/zh_CN/api-reference/system/efuse.rst @@ -421,7 +421,7 @@ eFuse 位序采取小字节序(参见下方示例),这说明 eFuse 位按 .. code-block:: none - $ espefuse.py dump + $ idf.py efuse-dump USER_DATA (BLOCK3 ) [3 ] read_regs: 03020100 07060504 0B0A0908 0F0E0D0C 13121111 17161514 1B1A1918 1F1E1D1C BLOCK4 (BLOCK4 ) [4 ] read_regs: 03020100 07060504 0B0A0908 0F0E0D0C 13121111 17161514 1B1A1918 1F1E1D1C @@ -511,7 +511,7 @@ eFuse 位序采取小字节序(参见下方示例),这说明 eFuse 位按 }, } -可以通过项目顶层目录下的 ``CMakeLists.txt`` (:example_file:`get-started/hello_world/CMakeLists.txt`) 来使用这些函数: +可以通过项目顶层目录下的 ``CMakeLists.txt`` (:example_file:`system/efuse/CMakeLists.txt`) 来使用这些函数: .. code-block:: cmake @@ -522,13 +522,13 @@ eFuse 位序采取小字节序(参见下方示例),这说明 eFuse 位按 espefuse_get_efuse(ret_data ${efuse_json} "MAC" "value") message("MAC:" ${ret_data}) -``value`` 属性的格式与 ``espefuse.py summary`` 中显示的格式相同。 +``value`` 属性的格式与 ``espefuse.py summary`` 或 ``idf.py efuse-summary`` 中显示的格式相同。 .. code-block:: none MAC:94:b9:7e:5a:6e:58 (CRC 0xe2 OK) -在示例测试 :example_file:`system/efuse/CMakeLists.txt` 中,添加了一个自定义目标 ``efuse-summary``。这样,不仅在项目构建阶段,而在任何时候都可以运行 ``idf.py efuse-summary`` 命令读取所需的 eFuse(在 ``efuse_names`` 列表中指定)。 +在示例测试 :example_file:`system/efuse/CMakeLists.txt` 中,添加了一个自定义目标 ``efuse-filter``。这样,不仅在项目构建阶段,而在任何时候都可以运行 ``idf.py efuse-filter`` 命令读取所需的 eFuse(在 ``efuse_names`` 列表中指定)。 调试 eFuse & 单元测试 ------------------------ diff --git a/docs/zh_CN/security/flash-encryption.rst b/docs/zh_CN/security/flash-encryption.rst index 0eb8b130f2b8..da68d9e4b515 100644 --- a/docs/zh_CN/security/flash-encryption.rst +++ b/docs/zh_CN/security/flash-encryption.rst @@ -55,7 +55,7 @@ flash 加密功能用于加密与 {IDF_TARGET_NAME} 搭载使用的片外 flash 相关 eFuses ------------------------------ -flash 加密操作由 {IDF_TARGET_NAME} 上的多个 eFuse 控制。以下是这些 eFuse 列表及其描述,下表中的各 eFuse 名称也在 espefuse.py 工具中使用,为了能在 eFuse API 中使用,请在名称前加上 ``ESP_EFUSE_``,如:esp_efuse_read_field_bit(ESP_EFUSE_DISABLE_DL_ENCRYPT)。 +flash 加密操作由 {IDF_TARGET_NAME} 上的多个 eFuse 控制,具体 eFuse 名称及其描述请参见下表。``espefuse.py`` 工具和基于 ``idf.py`` 的 eFuse 指令也会使用下表中的 eFuse 名。为了能在 eFuse API 中使用,请在名称前加上 ``ESP_EFUSE_``,如:esp_efuse_read_field_bit (ESP_EFUSE_DISABLE_DL_ENCRYPT)。 .. Comment: As text in cells of list-table header rows does not wrap, it is necessary to make 0 header rows and apply bold typeface to the first row. Otherwise, the table goes beyond the html page limits on the right. @@ -164,7 +164,7 @@ flash 加密操作由 {IDF_TARGET_NAME} 上的多个 eFuse 控制。以下是这 * 上表中列出的所有 eFuse 位都提供读/写访问控制。 * 这些位的默认值是 0。 -对上述 eFuse 位的读写访问由 ``WR_DIS`` 和 ``RD_DIS`` 寄存器中的相应字段控制。有关 {IDF_TARGET_NAME} eFuse 的详细信息,请参考 :doc:`eFuse 管理器 <../api-reference/system/efuse>`。要使用 espefuse.py 更改 eFuse 字段的保护位,请使用以下两个命令:read_protect_efuse 和 write_protect_efuse。例如 ``espefuse.py write_protect_efuse DISABLE_DL_ENCRYPT``。 +对上述 eFuse 位的读写访问由 ``WR_DIS`` 和 ``RD_DIS`` 寄存器中的相应字段控制。有关 {IDF_TARGET_NAME} eFuse 的详细信息,请参考 :doc:`eFuse 管理器 <../api-reference/system/efuse>`。要使用 ``idf.py`` 更改 eFuse 字段的保护位,请使用以下两个命令:efuse-read-protect 和 efuse-write-protect(``idf.py`` 基于 ``espefuse.py`` 命令 write_protect_efuse 和 read_protect_efuse 的别名)。例如 ``idf.py efuse-write-protect DISABLE_DL_ENCRYPT``。 .. only:: esp32c2 @@ -405,13 +405,13 @@ flash 加密设置 .. code-block:: bash - espefuse.py --port PORT burn_key flash_encryption my_flash_encryption_key.bin + idf.py --port PORT efuse-burn-key flash_encryption my_flash_encryption_key.bin .. only:: SOC_FLASH_ENCRYPTION_XTS_AES_256 .. code-block:: bash - espefuse.py --port PORT burn_key BLOCK my_flash_encryption_key.bin KEYPURPOSE + idf.py --port PORT efuse-burn-key BLOCK my_flash_encryption_key.bin KEYPURPOSE 其中 ``BLOCK`` 是 ``BLOCK_KEY0`` 和 ``BLOCK_KEY5`` 之间的空闲密钥区。而 ``KEYPURPOSE`` 是 ``XTS_AES_256_KEY_1``、``XTS_AES_256_KEY_2`` 或 ``XTS_AES_128_KEY``。关于密钥用途,请参考 `{IDF_TARGET_NAME} 技术参考手册 <{IDF_TARGET_TRM_CN_URL}>`_。 @@ -419,28 +419,28 @@ flash 加密设置 .. code-block:: bash - espefuse.py --port PORT burn_key BLOCK my_flash_encryption_key.bin XTS_AES_128_KEY + idf.py --port PORT efuse-burn-key BLOCK my_flash_encryption_key.bin XTS_AES_128_KEY - 对于 AES-256(512 位密钥)- ``XTS_AES_256_KEY_1`` 和 ``XTS_AES_256_KEY_2``。espefuse.py 支持通过虚拟密钥用途 ``XTS_AES_256_KEY`` 将这两个密钥用途和一个 512 位密钥一起烧录到两个独立的密钥块。使用此功能时,``espefuse.py`` 将把密钥的前 256 位烧录到指定的 ``BLOCK``,并把相应的区块密钥用途烧录到 ``XTS_AES_256_KEY_1``。密钥的后 256 位将被烧录到 ``BLOCK`` 后的第一个空闲密钥块,并把相应的密钥用途烧录到 ``XTS_AES_256_KEY_2``。 + 对于 AES-256(512 位密钥)- ``XTS_AES_256_KEY_1`` 和 ``XTS_AES_256_KEY_2``。``idf.py`` 支持通过虚拟密钥用途 ``XTS_AES_256_KEY`` 将这两个密钥用途和一个 512 位密钥一起烧录到两个独立的密钥块。使用此功能时,``idf.py`` 将把密钥的前 256 位烧录到指定的 ``BLOCK``,并把相应的区块密钥用途烧录到 ``XTS_AES_256_KEY_1``。密钥的后 256 位将被烧录到 ``BLOCK`` 后的第一个空闲密钥块,并把相应的密钥用途烧录到 ``XTS_AES_256_KEY_2``。 .. code-block:: bash - espefuse.py --port PORT burn_key BLOCK my_flash_encryption_key.bin XTS_AES_256_KEY + idf.py --port PORT efuse-burn-key BLOCK my_flash_encryption_key.bin XTS_AES_256_KEY 如果你想指定使用哪两个区块,则可以将密钥分成两个 256 位密钥,并分别使用 ``XTS_AES_256_KEY_1`` 和 ``XTS_AES_256_KEY_2`` 为密钥用途进行手动烧录: .. code-block:: bash split -b 32 my_flash_encryption_key.bin my_flash_encryption_key.bin. - espefuse.py --port PORT burn_key BLOCK my_flash_encryption_key.bin.aa XTS_AES_256_KEY_1 - espefuse.py --port PORT burn_key BLOCK+1 my_flash_encryption_key.bin.ab XTS_AES_256_KEY_2 + idf.py --port PORT efuse-burn-key BLOCK my_flash_encryption_key.bin.aa XTS_AES_256_KEY_1 + idf.py --port PORT efuse-burn-key BLOCK+1 my_flash_encryption_key.bin.ab XTS_AES_256_KEY_2 .. only:: SOC_FLASH_ENCRYPTION_XTS_AES_128 and not SOC_FLASH_ENCRYPTION_XTS_AES_256 and not SOC_EFUSE_CONSISTS_OF_ONE_KEY_BLOCK .. code-block:: bash - espefuse.py --port PORT burn_key BLOCK my_flash_encryption_key.bin XTS_AES_128_KEY + idf.py --port PORT efuse-burn-key BLOCK my_flash_encryption_key.bin XTS_AES_128_KEY 其中 ``BLOCK`` 是 ``BLOCK_KEY0`` 和 ``BLOCK_KEY5`` 之间的一个空闲密钥区。 @@ -450,19 +450,19 @@ flash 加密设置 .. code-block:: bash - espefuse.py --port PORT burn_key BLOCK_KEY0 flash_encryption_key256.bin XTS_AES_128_KEY + idf.py --port PORT efuse-burn-key BLOCK_KEY0 flash_encryption_key256.bin XTS_AES_128_KEY 对于由 128 位导出的 AES-128 密钥(SHA256(128 位))- ``XTS_AES_128_KEY_DERIVED_FROM_128_EFUSE_BITS``。flash 加密密钥会被写入 eFuse BLOCK_KEY0 的低位,留出高 128 位以支持软件读取。如小节 ``同时烧录两个密钥`` 所示,在 espefuse 工具的特殊模式下,你可以使用任意 espefuse 命令来写入数据。 .. code-block:: bash - espefuse.py --port PORT burn_key BLOCK_KEY0 flash_encryption_key128.bin XTS_AES_128_KEY_DERIVED_FROM_128_EFUSE_BITS + idf.py --port PORT efuse-burn-key BLOCK_KEY0 flash_encryption_key128.bin XTS_AES_128_KEY_DERIVED_FROM_128_EFUSE_BITS 同时烧录两个密钥(安全启动和 flash 加密): .. code-block:: bash - espefuse.py --port PORT --chip esp32c2 burn_key_digest secure_boot_signing_key.pem \ + espefuse.py --port PORT --chip esp32c2 burn_key_digest secure_boot_signing_key.pem \ burn_key BLOCK_KEY0 flash_encryption_key128.bin XTS_AES_128_KEY_DERIVED_FROM_128_EFUSE_BITS 如果未烧录密钥并在启用 flash 加密后启动设备,{IDF_TARGET_NAME} 将生成一个软件无法访问或修改的随机密钥。 @@ -706,7 +706,7 @@ flash 加密设置 .. code-block:: bash - espefuse.py -p PORT summary + idf.py efuse-summary .. _reading-writing-content: @@ -806,11 +806,11 @@ OTA 更新 #. 在 :ref:`项目配置菜单 ` 中,禁用 :ref:`启动时使能 flash 加密 ` 选项,然后保存并退出。 #. 再次打开项目配置菜单,再次检查你是否已经禁用了该选项,如果这个选项仍被启用,引导加载程序在启动时将立即重新启用加密功能。 #. 在禁用 flash 加密后,通过运行 ``idf.py flash`` 来构建和烧录新的引导加载程序和应用程序。 -#. 使用 ``espefuse.py`` (在 ``components/esptool_py/esptool`` 中)以关闭 ``{IDF_TARGET_CRYPT_CNT}``,运行: +#. 使用 ``idf.py`` 来关闭 ``{IDF_TARGET_CRYPT_CNT}``,请运行以下命令: .. code-block:: bash - espefuse.py burn_efuse {IDF_TARGET_CRYPT_CNT} + idf.py efuse-burn {IDF_TARGET_CRYPT_CNT} 重置 {IDF_TARGET_NAME},flash 加密应处于关闭状态,引导加载程序将正常启动。 @@ -940,15 +940,15 @@ flash 加密的高级功能 .. code-block:: bash - espefuse.py --port PORT burn_efuse DISABLE_DL_DECRYPT - espefuse.py --port PORT write_protect_efuse DISABLE_DL_ENCRYPT + idf.py --port PORT efuse-burn DISABLE_DL_DECRYPT + idf.py --port PORT efuse-write-protect DISABLE_DL_ENCRYPT .. only:: not esp32 .. code-block:: bash - espefuse.py --port PORT burn_efuse DIS_DOWNLOAD_MANUAL_ENCRYPT - espefuse.py --port PORT write_protect_efuse DIS_DOWNLOAD_MANUAL_ENCRYPT + idf.py --port PORT efuse-burn DIS_DOWNLOAD_MANUAL_ENCRYPT + idf.py --port PORT efuse-write-protect DIS_DOWNLOAD_MANUAL_ENCRYPT .. note:: diff --git a/docs/zh_CN/security/secure-boot-v1.rst b/docs/zh_CN/security/secure-boot-v1.rst index 2b493e4d7228..bff6c2691af6 100644 --- a/docs/zh_CN/security/secure-boot-v1.rst +++ b/docs/zh_CN/security/secure-boot-v1.rst @@ -149,11 +149,11 @@ 1. 在 :ref:`project-configuration-menu` 中,选择 ``Bootloader Config`` > :ref:`CONFIG_SECURE_BOOT` > ``CONFIG_SECURE_BOOT_V1_ENABLED`` > :ref:`CONFIG_SECURE_BOOTLOADER_MODE` > ``Reflashable``。 -2. 如有需要,按照设备使用的编码方案设置 :ref:`CONFIG_SECURE_BOOTLOADER_KEY_ENCODING`。编码方案将在 ``esptool.py`` 连接到芯片时显示在 ``Features`` 行中,或在 ``espefuse.py summary`` 输出中显示。 +2. 如有需要,按照设备使用的编码方案设置 :ref:`CONFIG_SECURE_BOOTLOADER_KEY_ENCODING`。编码方案将在 ``esptool.py`` 连接到芯片时显示在 ``Features`` 行中,或在 ``idf.py efuse-summary`` 输出中显示。 3. 请按 :ref:`secure-boot-generate-key` 中的步骤生成签名密钥。生成的密钥文件路径必须在 ``Secure Boot Configuration`` 菜单中指定。 -4. 运行 ``idf.py bootloader`` 将创建一个二进制密钥文件,该文件派生自用于签名的私钥。同时将打印两组烧录步骤。第一组步骤包括一个 ``espefuse.py burn_key secure_boot_v1 path_to/secure-bootloader-key-xxx.bin`` 命令,用于将引导加载程序密钥写入 eFuse,此密钥仅可烧录一次。第二组步骤可使用预计算的摘要重新烧录引导加载程序,该摘要在构建过程中生成。 +4. 运行 ``idf.py bootloader`` 将创建一个二进制密钥文件,该文件派生自用于签名的私钥。同时将打印两组烧录步骤。第一组步骤包括一个 ``idf.py efuse-burn-key secure_boot_v1 path_to/secure-bootloader-key-xxx.bin`` 命令,用于将引导加载程序密钥写入 eFuse,此密钥仅可烧录一次。第二组步骤可使用预计算的摘要重新烧录引导加载程序,该摘要在构建过程中生成。 5. 从 :ref:`一次性烧录步骤 6 ` 继续,烧录引导加载程序并启用安全启动。请密切监视控制器日志输出,确保安全启动配置正确无误。 From 5957b637a3bb3ef5119aea8f5cef114e8824a5aa Mon Sep 17 00:00:00 2001 From: Zhang Shu Xian Date: Wed, 3 Jul 2024 18:35:01 +0800 Subject: [PATCH 73/73] docs: Update CN translation for esp netif: add blank space --- .../zh_CN/api-reference/network/esp_netif.rst | 56 ++++++++++++++++++- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/docs/zh_CN/api-reference/network/esp_netif.rst b/docs/zh_CN/api-reference/network/esp_netif.rst index 0b6a9a34fd0e..a57d4b5496d9 100644 --- a/docs/zh_CN/api-reference/network/esp_netif.rst +++ b/docs/zh_CN/api-reference/network/esp_netif.rst @@ -152,7 +152,7 @@ E) ESP-NETIF L2 TAP 接口 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ESP-NETIF L2 TAP 接口是 ESP-IDF 访问用户应用程序中的数据链路层(OSI/ISO 中的 L2)以进行帧接收和传输的机制。在嵌入式开发中,它通常用于实现非 IP 相关协议,如 PTP 和 Wake on LAN 等。请注意,目前 ESP-NETIF L2 TAP 接口仅支持以太网 (IEEE 802.3)。 -使用 VFS 的文件描述符访问 ESP-NETIF L2 TAP 接口,VFS 文件描述符会提供类似文件的接口(调用 ``open()``、 ``read()``、 ``write()`` 等函数访问),详情请参阅 :doc:`/api-reference/storage/vfs`。 +使用 VFS 的文件描述符访问 ESP-NETIF L2 TAP 接口,VFS 文件描述符会提供类似文件的接口(调用 ``open()``、``read()``、``write()`` 等函数访问),详情请参阅 :doc:`/api-reference/storage/vfs`。 ESP-NETIF 只提供一个 L2 TAP 接口设备(路径名),但由于 ESP-NETIF L2 TAP 接口也可作为第二层基础设施的通用入口点,因此可以同时打开多个不同配置的文件描述符。特定文件描述符的具体配置很关键,它可以配置为仅允许访问由 ``if_key`` (如 `ETH_DEF`)标识的特定网络接口,并根据帧类型(如 IEEE 802.3 中的以太网类型)过滤特定帧。由于 ESP-NETIF L2 TAP 需要与 IP 堆栈同时存在,因此不应将 IP 相关流量(IP、ARP 等)直接传递给用户应用程序,此时则需要通过配置过滤特定帧实现这一点。在未过滤的情况下,即使该选项仍可配置,也不建议在标准用例中使用。过滤的另一优势在于,过滤后,用户应用程序只能访问它感兴趣的帧类型,其余的流量会传递到其他 L2 TAP 文件描述符或 IP 堆栈。 @@ -188,7 +188,7 @@ ESP-NETIF L2 TAP 可以使用 ``O_NONBLOCK`` 文件状态标志打开,确保 ` 当前不支持识别 VLAN 标记帧。如果用户需要处理 VLAN 标记帧,应将过滤器设置为等于 VLAN 标记(即 0x8100 或 0x88A8),并在用户应用程序中处理 VLAN 标记帧。 .. note:: - 当用户应用程序不需要使用 IP 栈时, ``L2TAP_S_DEVICE_DRV_HNDL`` 将非常适用,也无需初始化 ESP-NETIF。但在此情况下,网络接口无法通过 ``if_key`` 来识别,需要通过 IO 驱动程序句柄直接标识网络接口。 + 当用户应用程序不需要使用 IP 栈时,``L2TAP_S_DEVICE_DRV_HNDL`` 将非常适用,也无需初始化 ESP-NETIF。但在此情况下,网络接口无法通过 ``if_key`` 来识别,需要通过 IO 驱动程序句柄直接标识网络接口。 | 成功时,``ioctl()`` 返回 0。出错时,返回 -1,并设置 ``errno`` 以指示错误类型: | * EBADF - 文件描述符无效。 @@ -373,6 +373,58 @@ ESP-NETIF 编程手册 * 在 ``AP+STA`` 模式下使用 Wi-Fi 时,须创建以上全部接口。 +IP 事件:发送或接收数据包 +--------------------------------- + +每次发送或接收 IP 数据包会触发 ``IP_EVENT_TX_RX`` 事件,该事件提供有关数据包传输或接收、数据长度和 ``esp_netif`` 句柄的信息。 + +启用事件 +------------------ + +**编译时间:** + +编译时使用 kconfig 中的 :ref:`CONFIG_ESP_NETIF_REPORT_DATA_TRAFFIC` 标志,可完全禁用启动事件。 + +**运行时间:** + +在运行时,你可以使用函数 :cpp:func:`esp_netif_tx_rx_event_enable()` 和 :cpp:func:`esp_netif_tx_rx_event_disable()` 来启用或禁用此事件。 + +事件注册 +------------------ + +要处理此事件,请使用以下语法注册一个处理程序: + +.. code-block:: c + + static void + tx_rx_event_handler(void *arg, esp_event_base_t event_base, + int32_t event_id, void *event_data) + { + ip_event_tx_rx_t *event = (ip_event_tx_rx_t *)event_data; + + if (event->dir == ESP_NETIF_TX) { + ESP_LOGI(TAG, "Got TX event: Interface \"%s\" data len: %d", esp_netif_get_desc(event->esp_netif), event->len); + } else if (event->dir == ESP_NETIF_RX) { + ESP_LOGI(TAG, "Got RX event: Interface \"%s\" data len: %d", esp_netif_get_desc(event->esp_netif), event->len); + } else { + ESP_LOGI(TAG, "Got Unknown event: Interface \"%s\"", esp_netif_get_desc(event->esp_netif)); + } + } + + esp_event_handler_register(IP_EVENT, IP_EVENT_TX_RX, &tx_rx_event_handler, NULL); + +``tx_rx_event_handler`` 为处理该事件的函数的名称。 + +事件数据结构 +---------------- + +事件数据结构,:cpp:class:`ip_event_tx_rx_t` 包含以下字段: + +- :cpp:member:`ip_event_tx_rx_t::dir`: 表示数据包是传输 ``ESP_NETIF_TX`` 还是接收 ``ESP_NETIF_RX``。 +- :cpp:member:`ip_event_tx_rx_t::len`: 数据帧的长度。 +- :cpp:member:`ip_event_tx_rx_t::esp_netif`: 数据包发送或接收的网络接口。 + + API 参考 -------------

;$Px2bQ>y^}V85o@!+7l@}q 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 F{|{B5pgjNp diff --git a/docs/_static/esp32-c3-devkitc-02-v1-isometric.png b/docs/_static/esp32-c3-devkitc-02-v1-isometric.png deleted file mode 100644 index 24636265821fc4352e61806e66bd47399cc4b047..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 244132 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