From 1249fb9787802d72b7cfc2c4d1a4015c14a3f747 Mon Sep 17 00:00:00 2001 From: hathach Date: Tue, 10 Nov 2020 22:38:10 +0700 Subject: [PATCH 1/4] allow variant to have it custom partition --- platform.txt | 6 ++++-- variants/adafruit_magtag29_esp32s2/partitions.csv | 11 +++++++++++ variants/adafruit_metro_esp32s2/partitions.csv | 11 +++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 variants/adafruit_magtag29_esp32s2/partitions.csv create mode 100644 variants/adafruit_metro_esp32s2/partitions.csv diff --git a/platform.txt b/platform.txt index 03970457c36..6ea5c33c5b1 100644 --- a/platform.txt +++ b/platform.txt @@ -95,9 +95,11 @@ build.extra_flags=-DESP32 -DCORE_DEBUG_LEVEL={build.code_debug} {build.loop_core # Check if custom partitions exist recipe.hooks.prebuild.1.pattern=bash -c "[ ! -f {build.source.path}/partitions.csv ] || cp -f {build.source.path}/partitions.csv {build.path}/partitions.csv" -recipe.hooks.prebuild.2.pattern=bash -c "[ -f {build.path}/partitions.csv ] || cp {runtime.platform.path}/tools/partitions/{build.partitions}.csv {build.path}/partitions.csv" +recipe.hooks.prebuild.2.pattern=bash -c "[ -f {build.path}/partitions.csv ] || [ ! -f {build.variant.path}/partitions.csv ] || cp {build.variant.path}/partitions.csv {build.path}/partitions.csv" +recipe.hooks.prebuild.3.pattern=bash -c "[ -f {build.path}/partitions.csv ] || cp {runtime.platform.path}/tools/partitions/{build.partitions}.csv {build.path}/partitions.csv" recipe.hooks.prebuild.1.pattern.windows=cmd /c if exist "{build.source.path}\partitions.csv" COPY /y "{build.source.path}\partitions.csv" "{build.path}\partitions.csv" -recipe.hooks.prebuild.2.pattern.windows=cmd /c if not exist "{build.path}\partitions.csv" COPY "{runtime.platform.path}\tools\partitions\\{build.partitions}.csv" "{build.path}\partitions.csv" +recipe.hooks.prebuild.2.pattern.windows=cmd /c if not exist "{build.path}\partitions.csv" if exist "{build.variant.path}\partitions.csv" COPY /y "{build.variant.path}\partitions.csv" "{build.path}\partitions.csv" +recipe.hooks.prebuild.3.pattern.windows=cmd /c if not exist "{build.path}\partitions.csv" COPY "{runtime.platform.path}\tools\partitions\{build.partitions}.csv" "{build.path}\partitions.csv" ## Compile c files recipe.c.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.cpreprocessor.flags} {compiler.c.flags} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} -DARDUINO_BOARD="{build.board}" -DARDUINO_VARIANT="{build.variant}" {compiler.c.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}" diff --git a/variants/adafruit_magtag29_esp32s2/partitions.csv b/variants/adafruit_magtag29_esp32s2/partitions.csv new file mode 100644 index 00000000000..a23b9798223 --- /dev/null +++ b/variants/adafruit_magtag29_esp32s2/partitions.csv @@ -0,0 +1,11 @@ +# ESP-IDF Partition Table +# Name, Type, SubType, Offset, Size, Flags +# bootloader.bin,, 0x1000, 32K +# partition table, 0x8000, 4K + +nvs, data, nvs, 0x9000, 20K, +otadata, data, ota, 0xe000, 8K, +ota_0, 0, ota_0, 0x10000, 1408K, +ota_1, 0, ota_1, 0x170000, 1408K, +uf2, app, factory,0x2d0000, 256K, +user_fs, data, fat, 0x310000, 960K, diff --git a/variants/adafruit_metro_esp32s2/partitions.csv b/variants/adafruit_metro_esp32s2/partitions.csv new file mode 100644 index 00000000000..a23b9798223 --- /dev/null +++ b/variants/adafruit_metro_esp32s2/partitions.csv @@ -0,0 +1,11 @@ +# ESP-IDF Partition Table +# Name, Type, SubType, Offset, Size, Flags +# bootloader.bin,, 0x1000, 32K +# partition table, 0x8000, 4K + +nvs, data, nvs, 0x9000, 20K, +otadata, data, ota, 0xe000, 8K, +ota_0, 0, ota_0, 0x10000, 1408K, +ota_1, 0, ota_1, 0x170000, 1408K, +uf2, app, factory,0x2d0000, 256K, +user_fs, data, fat, 0x310000, 960K, From a67ae1747faf29740808721436ac741cdabfd22f Mon Sep 17 00:00:00 2001 From: hathach Date: Wed, 11 Nov 2020 00:10:26 +0700 Subject: [PATCH 2/4] simplify call for esptool_py.cmd --- platform.txt | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/platform.txt b/platform.txt index 6ea5c33c5b1..096dd00bf8e 100644 --- a/platform.txt +++ b/platform.txt @@ -4,10 +4,9 @@ version=2.0.0 runtime.tools.xtensa-esp32-elf-gcc.path={runtime.platform.path}/tools/xtensa-esp32-elf runtime.tools.xtensa-esp32s2-elf-gcc.path={runtime.platform.path}/tools/xtensa-esp32s2-elf -tools.esptool_py.path={runtime.platform.path}/tools/esptool -tools.esptool_py.cmd=esptool -tools.esptool_py.cmd.linux=esptool.py -tools.esptool_py.cmd.windows=esptool.exe +tools.esptool_py.cmd={runtime.platform.path}/tools/esptool/esptool +tools.esptool_py.cmd.linux=python "{runtime.platform.path}/tools/esptool/esptool.py" +tools.esptool_py.cmd.windows={runtime.platform.path}/tools/esptool/esptool.exe tools.esptool_py.network_cmd=python "{runtime.platform.path}/tools/espota.py" tools.esptool_py.network_cmd.windows="{runtime.platform.path}/tools/espota.exe" @@ -120,8 +119,7 @@ recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" "-Wl,--Map={build recipe.objcopy.eep.pattern={tools.gen_esp32part.cmd} -q "{build.path}/partitions.csv" "{build.path}/{build.project_name}.partitions.bin" ## Create hex -recipe.objcopy.hex.pattern="{tools.esptool_py.path}/{tools.esptool_py.cmd}" --chip {build.mcu} elf2image --flash_mode "{build.flash_mode}" --flash_freq "{build.flash_freq}" --flash_size "{build.flash_size}" -o "{build.path}/{build.project_name}.bin" "{build.path}/{build.project_name}.elf" -recipe.objcopy.hex.pattern.linux=python "{tools.esptool_py.path}/{tools.esptool_py.cmd}" --chip {build.mcu} elf2image --flash_mode "{build.flash_mode}" --flash_freq "{build.flash_freq}" --flash_size "{build.flash_size}" -o "{build.path}/{build.project_name}.bin" "{build.path}/{build.project_name}.elf" +recipe.objcopy.hex.pattern={tools.esptool_py.cmd} --chip {build.mcu} elf2image --flash_mode "{build.flash_mode}" --flash_freq "{build.flash_freq}" --flash_size "{build.flash_size}" -o "{build.path}/{build.project_name}.bin" "{build.path}/{build.project_name}.elf" ## Save hex recipe.output.tmp_file={build.project_name}.{build.mcu}.bin @@ -137,6 +135,5 @@ recipe.size.regex.data=^(?:\.dram0\.data|\.dram0\.bss|\.noinit)\s+([0-9]+).* tools.esptool_py.upload.protocol=esp32 tools.esptool_py.upload.params.verbose= tools.esptool_py.upload.params.quiet= -tools.esptool_py.upload.pattern="{path}/{cmd}" --chip {build.mcu} --port "{serial.port}" --baud {upload.speed} {upload.flags} --before default_reset --after hard_reset write_flash -z --flash_mode {build.flash_mode} --flash_freq {build.flash_freq} --flash_size detect 0xe000 "{runtime.platform.path}/tools/partitions/boot_app0.bin" 0x1000 "{runtime.platform.path}/tools/sdk/{build.mcu}/bin/bootloader_{build.boot}_{build.flash_freq}.bin" 0x10000 "{build.path}/{build.project_name}.bin" 0x8000 "{build.path}/{build.project_name}.partitions.bin" -tools.esptool_py.upload.pattern.linux=python "{path}/{cmd}" --chip {build.mcu} --port "{serial.port}" --baud {upload.speed} {upload.flags} --before default_reset --after hard_reset write_flash -z --flash_mode {build.flash_mode} --flash_freq {build.flash_freq} --flash_size detect 0xe000 "{runtime.platform.path}/tools/partitions/boot_app0.bin" 0x1000 "{runtime.platform.path}/tools/sdk/{build.mcu}/bin/bootloader_{build.boot}_{build.flash_freq}.bin" 0x10000 "{build.path}/{build.project_name}.bin" 0x8000 "{build.path}/{build.project_name}.partitions.bin" +tools.esptool_py.upload.pattern="{cmd}" --chip {build.mcu} --port "{serial.port}" --baud {upload.speed} {upload.flags} --before default_reset --after hard_reset write_flash -z --flash_mode {build.flash_mode} --flash_freq {build.flash_freq} --flash_size detect 0xe000 "{runtime.platform.path}/tools/partitions/boot_app0.bin" 0x1000 "{runtime.platform.path}/tools/sdk/{build.mcu}/bin/bootloader_{build.boot}_{build.flash_freq}.bin" 0x10000 "{build.path}/{build.project_name}.bin" 0x8000 "{build.path}/{build.project_name}.partitions.bin" tools.esptool_py.upload.network_pattern={network_cmd} -i "{serial.port}" -p "{network.port}" "--auth={network.password}" -f "{build.path}/{build.project_name}.bin" From 00f7e170cc7ca394f40020383834e4dca1542e56 Mon Sep 17 00:00:00 2001 From: hathach Date: Wed, 11 Nov 2020 22:39:37 +0700 Subject: [PATCH 3/4] allow board variant to has its own custom bootloader.bin --- platform.txt | 10 +++++++--- .../adafruit_magtag29_esp32s2/bootloader.bin | Bin 0 -> 21120 bytes variants/adafruit_metro_esp32s2/bootloader.bin | Bin 0 -> 21216 bytes 3 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 variants/adafruit_magtag29_esp32s2/bootloader.bin create mode 100644 variants/adafruit_metro_esp32s2/bootloader.bin diff --git a/platform.txt b/platform.txt index 096dd00bf8e..3ebccd7f166 100644 --- a/platform.txt +++ b/platform.txt @@ -92,14 +92,18 @@ build.loop_core= build.event_core= build.extra_flags=-DESP32 -DCORE_DEBUG_LEVEL={build.code_debug} {build.loop_core} {build.event_core} {build.defines} {build.extra_flags.{build.mcu}} -# Check if custom partitions exist +# Check if custom partitions exist: source > variant > build.partitions recipe.hooks.prebuild.1.pattern=bash -c "[ ! -f {build.source.path}/partitions.csv ] || cp -f {build.source.path}/partitions.csv {build.path}/partitions.csv" recipe.hooks.prebuild.2.pattern=bash -c "[ -f {build.path}/partitions.csv ] || [ ! -f {build.variant.path}/partitions.csv ] || cp {build.variant.path}/partitions.csv {build.path}/partitions.csv" recipe.hooks.prebuild.3.pattern=bash -c "[ -f {build.path}/partitions.csv ] || cp {runtime.platform.path}/tools/partitions/{build.partitions}.csv {build.path}/partitions.csv" recipe.hooks.prebuild.1.pattern.windows=cmd /c if exist "{build.source.path}\partitions.csv" COPY /y "{build.source.path}\partitions.csv" "{build.path}\partitions.csv" -recipe.hooks.prebuild.2.pattern.windows=cmd /c if not exist "{build.path}\partitions.csv" if exist "{build.variant.path}\partitions.csv" COPY /y "{build.variant.path}\partitions.csv" "{build.path}\partitions.csv" +recipe.hooks.prebuild.2.pattern.windows=cmd /c if not exist "{build.path}\partitions.csv" if exist "{build.variant.path}\partitions.csv" COPY "{build.variant.path}\partitions.csv" "{build.path}\partitions.csv" recipe.hooks.prebuild.3.pattern.windows=cmd /c if not exist "{build.path}\partitions.csv" COPY "{runtime.platform.path}\tools\partitions\{build.partitions}.csv" "{build.path}\partitions.csv" +# Check if variant's custom bootloader exist +recipe.hooks.prebuild.4.pattern=bash -c "[ -f {build.variant.path}/bootloader.bin ] && cp {build.variant.path}/bootloader.bin {build.path}/{build.project_name}.bootloader.bin || cp -f {runtime.platform.path}/tools/sdk/{build.mcu}/bin/bootloader_{build.boot}_{build.flash_freq}.bin {build.path}/{build.project_name}.bootloader.bin" +recipe.hooks.prebuild.4.pattern.windows=cmd /c if exist "{build.variant.path}\bootloader.bin" ( COPY "{build.variant.path}\bootloader.bin" "{build.path}\{build.project_name}.bootloader.bin" ) ELSE ( COPY /y "{runtime.platform.path}\tools\sdk\{build.mcu}\bin\bootloader_{build.boot}_{build.flash_freq}.bin" "{build.path}\{build.project_name}.bootloader.bin" ) + ## Compile c files recipe.c.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.cpreprocessor.flags} {compiler.c.flags} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} -DARDUINO_BOARD="{build.board}" -DARDUINO_VARIANT="{build.variant}" {compiler.c.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}" @@ -135,5 +139,5 @@ recipe.size.regex.data=^(?:\.dram0\.data|\.dram0\.bss|\.noinit)\s+([0-9]+).* tools.esptool_py.upload.protocol=esp32 tools.esptool_py.upload.params.verbose= tools.esptool_py.upload.params.quiet= -tools.esptool_py.upload.pattern="{cmd}" --chip {build.mcu} --port "{serial.port}" --baud {upload.speed} {upload.flags} --before default_reset --after hard_reset write_flash -z --flash_mode {build.flash_mode} --flash_freq {build.flash_freq} --flash_size detect 0xe000 "{runtime.platform.path}/tools/partitions/boot_app0.bin" 0x1000 "{runtime.platform.path}/tools/sdk/{build.mcu}/bin/bootloader_{build.boot}_{build.flash_freq}.bin" 0x10000 "{build.path}/{build.project_name}.bin" 0x8000 "{build.path}/{build.project_name}.partitions.bin" +tools.esptool_py.upload.pattern={cmd} --chip {build.mcu} --port "{serial.port}" --baud {upload.speed} {upload.flags} --before default_reset --after hard_reset write_flash -z --flash_mode {build.flash_mode} --flash_freq {build.flash_freq} --flash_size detect 0xe000 "{runtime.platform.path}/tools/partitions/boot_app0.bin" 0x1000 "{build.path}/{build.project_name}.bootloader.bin" 0x10000 "{build.path}/{build.project_name}.bin" 0x8000 "{build.path}/{build.project_name}.partitions.bin" tools.esptool_py.upload.network_pattern={network_cmd} -i "{serial.port}" -p "{network.port}" "--auth={network.password}" -f "{build.path}/{build.project_name}.bin" diff --git a/variants/adafruit_magtag29_esp32s2/bootloader.bin b/variants/adafruit_magtag29_esp32s2/bootloader.bin new file mode 100644 index 0000000000000000000000000000000000000000..a8e1bcf74d2924c9fa84ce7a06654a6f287a759c GIT binary patch literal 21120 zcmcJ04_s7L_V}GQ!!W>0hd)mEZ+$a3I2hV6n1JRogGjn*;XksrRt6XZ!GAJh<Sqh zyxdME|I#==IjM9JW6&2QF#4)_Oi8)5fT^%n+KcVQAmD`y)v+_3CZH%>~cwL#T;NRqi zlK-D@DnN_*PdRO@EQXmNt1ITHFZkb0Qer5s&n4OZLtd5nqo&FHRQ0%zbE#Zdhxy54 zcUo~3>_>4w+;$6NvsRXD!u?fQUa^U(DzC20x6PhCTUx%%6}KGH zYjIf>Q(9eOFRp;SrUw(Wtt$m)RkNAf%Yd)F$i{%>+hO0?n2p6HB}|@;0rRe~6$FP^ zfWS@c!cGP4nKJDS74*yr|Dma(KvRSDR&zTn!! zEJB~g6qhmL03#@i4Q(j@K6n)ri^m@z!aivCyI%Yjq!Zw7-Ra;9K=nuPc!vgS5 zz%$70m&SXp)paR4LU78UlfugK(#wiLKV4o}h&vqZP3m7=c5hkv#xgRZ6S7)DV1II3 z&PwK9+omdFE3B@vU24MV5LAr#u_8+h9(`AYN2_58pw#wqdO{1nLTFR(?W0abG>F`;F1~uAgc!hS5tusrZ#T+Ch&I zdQn*ctlHJ5_|~`(^J#!r0X_wIAK-5QAjTESMk6XND=Z(yM>-h5sH#AdoqnG#%rpUSn1p zL>EnHl<37}_rZx$kO;$;h)yfdnt$&oG5&p4j1|;ec1gZO$uEI;aCDVi9{HNC1*SIQ zrxcT=>C9#ziB>lX~4jVP;KODNa zEWf0>z;@;Evx{&HlQf2jjm|+=IBMiE9%$^y!Dt3T zo$4|S1Q-moZ3PhWSizHzmS7B%%SIE7w#A593blh88G8zh={=&Rk->wT6xDbwsYk8) z7z>xyK9MOXw^fzRu!Gq4{36N2N=>5}jyZ`&#@55tpaS>H0*RivZ*&E9DK^|x172;e zc=;Q}aqO(bm@ycWpfzl)1V?r4d&0sZTmHROa5_n9o6Rh=mgHBLSnUw+peo>E2m2Yn zt~KHkam1kZVC_bfP*`k7r+C@OFOf)`MhygVUhUE*amL1=bj&P9G8{Ny^UEtMt1Ijh zuSGQ#aH|E8MNXsa0^K8Aq}IXpxN2?C1raI4Su1*ypp&vy5$V!};#U3By$VwtF`ZeX zgTGOmc*J}~mP~$8amD4vYpGF;<1u_+mU$C&39brE6i%=5jn`hlC1t1yywi{Fc&$+` zug0ipNRFbcx-<_Q&Ock~%e}<|7qyKiJiHk|j01r<#2t9U*_0^WGDJrx2?9>604^@t z1DqAM0zGRg8Kx0B_F%7l-VOK-nJLYtOlkodKERaI-nqZQ9~sR~Ea z|DXB6afDNbImWLQXE|zMv5q6-oMs0pB`Y4|Z_ur;tN_<4MctQADOjc}uCGYC3{QZ6 zjWi1%UYM2mzHkNCF^5L>irblm*{em%$+N*SN$*B^o0vN?R|T)CKqHAhrYE!qi81KL zF+@h$3(+%zU)*SgM=ocYS2aMG02C57Oqd%JX!Otc#Kt6!{xXP!mN$p7eq#tw)={!z?c5d z?8cbgn7*)dAOSdx*|>&3X_A&fie3K?9mXh~LOfbfUOF~nE`&FewNk@Xv>6O3;8G?Y z`4ybG^nKf4b)umHn$PM)%E`ojj|+cHgX|q_mV->r(UblhX36scEwc ziYx7#uCntNt<0XaBr^+DZi1x;-vM{;%M+2b{!@wYE&?x?jJ>!N9uAH3l1%fA$r5p; zJ%4R}$-P%m*U0f$D84M0hYY~TjdBv)QYuBu@EM1$mV$t%ou)qEtr&(2= zFW!TKj_$^wD6pjB48{aR85!A2moh7F&suedWyK<9p=BwPWm&RR5=kT<<0D37A1mLA zMYljmR#I)7hv(xz2`a10g7-9Vv6rTgPk4pJ>#C)d3hCJ zg(JkaOL)-<{B&j`qM|>&JeDY?G=`$VoUQ_(0n`970I>j502qMj00w|W03*O0fK-5+ z0n7lI0E+>Z0%QZM0$2lpX^YYSN&r^@U@$S z0DA%U0XzqA5a1O6E`R?WE<2mFY_+I4S9U}nnf_rE}2>Vh|K(4v&?JCDOE}xEhpU(kjuIAHaRZ<-G|={IsJj4E zMsxZBD8B+9|2HUKfl{2I8fPgZH^V#}H&7%D@VSFa(+dEK07?KV0PFxY0O`=a5TFh~ zO_rv|0IUK0-2kd5W#%Wh%goFJGV_UtWM)^H%uK3f=97S1BM|e+i86CG$n;BqbpRUx z_5lb82VPUqAiqHT0?9`G{{vRQCzRYEGsghF<7t^0b$j?eKAi_3pbJABA)m`penJe; zcJf7;dB#RQJs-dc@Df1FMPep>VDAj-j=^>P7~n9#c<5Fkt+enh)PGzBIshC)2xiM* z`Qbmzkr9%S&docK4K%+2_-}yk1R9-vGpd{(VDr5OXek6EY5Dhhe7y z%TJ*F0mP}uYfyS%4F!Q0>_9gKAiY-*T+ojY^EA>c5SSInKorn39l$po?DF~=KHUiA zTqu7HpgKv)dptp*?@7MPt8Mtl(ZqaxIEF3jT(g3uxA9Cb|` zCGb7hLfANAa9^b3cM}+wY~Oy1<7I}MChY%HfSo1`s>rZfv3(K@t`r2IO`0rZJUP@N zpPx5aAGy;tm>N0HWo~sQX@uT`k^5Yc#+TcSt~O(9n5gicbAOy@-U$;nZ8kRa^`TTq9@$*CC`1yv%`q*KPRX;ru`{J#s|8pP(|TgRR1#4_I7}tuuSe=w8iYUYfeYqm0@1FCEIM*%!#u7C|FMNx9p_qZYK03 zb_iKnPVjkM!kQQmFEu1LSq)`cNYbBqT9305r<%O{P2M`dyFzkZPU{P^dF$JJo7?SFl1im4Pf1PcbXwe%7B0`y*8UH{IX%9zjR3PERYf5KWwDBV z4M%ntDl~OrdaoSj_8iY0;uA~RE^Mehd)!U>+~$EUriW$^Aqv>jicT)W;?A(ZZ<~Hd zaD`Z&=FKjrr44>jqU_Uh^J#f@X7AQH=jrJ%(2^&TcJmn=j=e;l6-u-_aS=>;WcaKc z^z7NebC2=5X9czahv=cYWT4S_>W8d@xJ{PQUGynskCNSqtzAm?Q7jiLwm%0G-y;FK0vy=B)XYMm!Xi;dUNKS^Q%IE^Dh>yP!P5l8+xCYEnmei z3;!;gKbFmVmh&AULmXiXv8_wN+OUMhDG-^sBX`fKwETkKy{bh24i2%HhdD%HnJiMy?C^DYU ze;s;C3Cz6#WS+(^4S~L?itJ=u-ZX{fCVs`Uhl40_w<#HiiKbfd4<`4o%uzWvomYN=zO9F%m$rfB&cYeY3KxA0)5b6vjDD_+re^FMmul}) z*aCw4iC#L|9k*rb8PVRH)O8sY?Qlh!T?`!(Z(#I&@(k*_A&Tw^cVtF-rtsVpe(+O< zp2fb6^4I>LpQdn97OEQcg(;xS>yRYhpeGf?dW9o$ZVZ} zRSW|5JHQ@{9Kq|)f<}S$$0$%?XJ@}pn9Gvx(}5{VyFhE~7l>aVTSm3T5%Y7*WZiIr z?AGMM72nd6yCU=nGEgGuzCDq!F9i0eP^DPsejo7sK0rsfkMy$JkwZ||-CTg{3>@r0B75$ z0v$_JZbLJ}4|4jcvQyMi3hTquiT)8dRoXl% z+uekFG2nSI;6BiH41S+*vM(a*fI1i0M+)`EQ6kIP4NVS8MzZ3%$I9)rnq0j7^(Q;}r&G29!! z7ZGz1F`}cLfi}0y_NW|IWvj^R2=P1$Dxkw{JCG}k$2JEVn**>d4jSO66@OZaP%l&5 zt+;_&izLkUz}R{U)N#*A?Jn-O*e?ExSQqwkaZbcC38L>sR7VjVroBIq{ni%q5gF5| z?(M{;Jw-bvC?XzdXm}DyI&>Wbni_VBj5>n7=qcKYfcdR0*<<>3h3$w5$#_jLyRmCa z3wCW)gJjx5oKtH{6D5PvRHWJ43Z{qK4MemWrSkwM*HNQ;mNYcjFOOM+q^hJl z0zoR3Sf6qBM<`!1z>m(LnR+HE3))5Bk6a8jre{g8UZeb0K;6>xl!tm>VcOh(uzex0 zivnb3q(i56JE|QzhRp~#I@N9+6I?5L`+hg+qS$x*uzuht+4+I^Xcapz5FbaeKMT}H zrBSY^#xym=h0$B)1R6w9bVV3g=nVRS)sfP{bO~cg3|xsZ`~;)F z5|i;PxuRFbGs0L*H2r{dy6TG1&*}{7T02l=ufX+NQ6vg#&}Tdej1Y5Kpl}#$3?`%P zGL1!n3kWm0g2p2FM`KJyH-G{~wi8AAsH6-25nV({7?K$&EsU-xh)Fu*zY_D+PcUEn z1T#Da(`1NB8uIVc%Zy;+;$CP9@=u@_N|vK5N&pd>4Dq%5!7K+?M`qtCDJ4EA>pQ?v zQo)F1f4Kq^%`oRiCLB#u*so|}R-b5Jt|$YQ(-xkcJv}};U9*M6$K4g5yxF!;04kF~ zuYJaEUM*vi)!8ca-4w?8{OreO>@sv@K4 zdgX`GkWtz#NMpPTO^ou`2+gmNCi^Nh6O?a`&{QE!#Z_oD%ENf>qdptg`j6y+08MCE zVmVP6z=$>2&Rz7K974QdrsM#die`#c{YX_0r=Yl+MX_Q-)JQ{A{{<;7ZGmx&M#afC zXm=*)wX6K*YmWeXS46K%-QZ#xZ$^u#k3dw|{=HYnar9-R(YV{7EthG~AL6&rHLG_nffzIgAT2)y;NNdUZeJ})|I#foZz44+?Ln-z@dl-ZU+#Zz5 z6~_JGbGy__!$$^cbDP-jaADZ5eL&EndPQz}_BY^0pwfzw&(er}(!m()KaBm`+Q|q5 z<#z%xxgEw$ z)yMtC*Zq!s5u|##;eeY3i-3U(yl@M!EwQyGdh0Q+7#-1RjB=7>r2WKVQ!TtYG(I}4WcZq?SPSae@e*EhM((5f9x zpVJ9+Y#TQSFEE5I&hiU%n$jojvm`ajk^xtTU&O@6r0sf+cG1yYs`%+~!(US1?m~Rr zY#&>Vg4o`{YhJ2+_r)iaQIoY>dOH_$sxHGauP< zw~Af}AIfuZOsT+|#>c&({9ITj2NCIHINw09oMe8Piq5}V1>efkcxEt;b3_-(7#Q|C z6fgnJ6z!Brv|Mib42P7OunoezPf$?yBQH2!XzEZ!B#-hKEg;v!xE-ZiEsC0|YJAtr z{pf8-R=eArfJjrdUliCQ-o_)+bfDog(>Sfo%LF^29NMqESwa2jKM|4+BdIBl80W=k znkle7{f|OnG{b)AZHY=%rA*W`{@vTwZpPul+!C8GTArp#rH&jpsC(fCMTbc*I>^Fk zJ^NR0Q|DpiXCN@PDADjq;b4^QEuq6S{D>er$ilb*dK=q;lTG5hEQbOZn;$}=xB^~l=o3TS0rTiP}UfX~*7o~mPYj)uQ zs(sEo)1^J&Wn69AymOJ2}@ z%Nzeo!oXD?TI%H{8N-I+8g$8r-xWBU7cQy8?+I-lwe4*|-OWHCVbX@$UK38v)W3+E zsocwz!)jfGF73bP)f_YYkpS8YI^mQzcjqcOY?AI3^rbq(|YYOX>l;>sV zcoSHoNxii>1TLS$TZI{wP-H#*vpt*d^Y^ zC0^rnJkp9_jn$1=-iAVTZqRtNnaIXKg$_kwsd^(XT$_fdBGn8fUhE7i>)DHq^S!y! zolZsKE^|s5!zoGZM&;%ffIxL7GO$GkQh4GKT})YLc-g;PM21Q(0*oA&AVJCAE1}?# z0PG(0PhThD_o5!zZ}69!;AJOyA6H^uJlQmPVcLn3)XWSEU{jUs!HbU7kq&9UDU(iJ z1Pwq#k=(Ib?R-XXzz)w`W7N`Y08vbN&R(qhlW<0yo`m@JVisg$aL80u=qFU&yF%6nl7H4e zE-VZ0k#|wHPXzZvmVr)L#7^UDPUE|6boA~t87)`$$a*=8`)MY^)wyTe7JBkPl4Zv{ z@IqvsYun50delJhy{3htW8=fZTJoCS3cQdYqg4(@f!i2;Cj>PrX4@8r!~QsBHrxFM z^fQ8P@{W>LbN4Au-?|xnR}#(Z4{H5g#4CcVT>7WPI`@kbssOhq8?ffs={Q$;P~F z0^b+mJ5G5~puZ0ykadVz1?edFr^K8IkP3OnSjY{k0fcG9PX+}cmVr6|uppQ>gu|Yw zpiVPtvJY~e0{{;s$i&>|8p!KmKC%Mxnk)bz>EuNyA$J4+#9zqO5%M+QFkd>7A3O*7 zLCgzc9usqg)ARZCN`O}YfJgc_1$_GUN|{*+GJ9ko%1R@LljP5lSP#9DtjF4g}6s zOC?C0nf@DxAgG{(44RndgZ_biXUys8XT*6aI^bIc@G&MT1>p~iVH~1%STRp|4&()X z9!M*aBpc+}00_BoSP(XnhwGuP?2@rWNpMD>}GyodaKfO`Pk&|V28*l4dHCJo`vAWDQV`-cz!(7a0B-=4tRUv?0Q5>?hW*Pjn73RIF6A#Z2SVItyYaqN zM)xXX$tvTD)yCA-Jrp|;iJ1LN#cqbx;CBy|`xL`Q<7Zb$50yB~s_{GJrU;-iKEbdw zR&Ti}43b(3HViA^8>YNA<-nBp5|vYaoN~JE3-SKjC>M^qd%?H3!aS5P5WHqK@_aYJ zCy9vgF|u7F}4E^biPhmFKI-|*Zw zNC^SWNY5{&o+I7FIEJ32|3(=0i^nedRP84`lV@fmCkyp1d3=;2UPn(o!=A!Cf%pKz zp2W{AFBk##={*o>ez}iv+u8RKFY<+~Ec-6sqS{v<+2HDhYuirOfD4{H`-1X8oWUMN z>Y$&u{)x{}5{+G^_X~Itd6Vbf>K!Te>mHZC6j&b@2~K8C7=Gp^9rBz3eUa5_x7m+iowAjmR{E*XM2!nR`{+D+kZf2 z&+y#yJY)f$M|4*x`y!S~xcAUeP&D&Yy9b-uz4%M3oEb#h z!Pj1>hszg%+(9YDFfs6cyDM+_8yu;b=i2yF!8~W}Ss*eqF`6iu{%f2vrYs-CM5*#e z!6@R}zeGG-syx5txkq`p>1!TQnKLYdnUU)=m&leW*U0XOIoS9h&pP>6%GDJXNB-fJ*Y*%#d4=UA86HIixu#gWCe==T@G}<-bXyY{!C|N=Tpv|B**228#DwbyKZ8aNX?Iov?)JBS_{K0KsSmqUs)F@U9+Hw$lafCMeI%EK!6i`3 zd5?T7iY2^fQ@%IJYs^)X){=mcqzu%vcG60zzzHmvQx9Qgye9Vt|c^XF){w9;psz1+>>kbhk=%xC}NviJv1cxqAa6$4BE% zktD3U;}VK}Dli3~hQXN!rz=+6m)|I1uJ|W5__umCx40J{3vjyvm2SeW#ayHQTj8vG zm-lQ&-;~nO1)=wZZjwC|`gmv?6|#Fb)t^cXx_V1%QbHuV8mYl`t-`XqIiPg~xaL5U zR_?+(&r8&;y4_7b7-Za{fMf7nXU6GIwTl9li~v2}d{AwEOD%eMa6pU1?(+lYEox)K zxkFj&ldaCc&P=oUhm;rQFCEwI2%H*6PowEBs@?)=H5hB@xE^H}MNd05t`CI12~kNK z1GRsJQ4KJ7u5@*idu9ZJsdS6%fsMwhzX=$Jqla2;?SEyM^zU32kIyUL^ ziB2mUq)7Ljfeyu?&h9mV-Sgu#^|FiF_J_df9a|mnWCyra0d@kCpVd+wF)ia=iaoOK zY^g&wbeOSg7&UZJYuko>mIgcv1KceER)u{oXj_t8mNny36-6(jGGn!%s^1c z(4r7?vJu|Y9jpbO+Hh~VqI%><3}|)Wq4n>RoS8yd4`Ed=7hvrc6kmM-9(n?Z=6GJ+tc< z!<9%F9>{*3VLOqk4j=t(8xR{JV%rgGt3U)LBHV~rps2BIjGxq{(ANs>W!T93kw>dI zQdHfiLZzJ2ydf{Vo~qN44WIh;C4w^!pH%CUT+!Tj{(7xbF8|Xf^^s0FbxK(;3xtB4 z+pzcKLer~E-9JDKpxApN{>}NdVGS+n4e$92UpnY;%(=l;69+NZHfKxprqoJZe5+yd z#>%|-4e$7sp9#bjT@zQYV~_baneJEh|6Qnwb471jQJ=Blb${01fM=y#etz97T!M{} zn`>%9-JxW|8~(cYCBmqBYQtf_@?BxW%l^9K0@-lL-#;M0Z`NP%xBsXx*F!p}1yt?X zUEYJyT95xl)0FmK!Te7|dmi?4fAkNz8Fmd$L-*|C;5tbAS^@qrBWI>ee>YHl9(_XY z+2-f=`ujo8pp8B^1AnXcB6dim_a9fk&9Mit(nYlw3fjGXS_My25P;d<@_)7785ghV zpzy8gF&{8345#|1l6~7Ex3MmjE-pU8#TbS#!fW#|wtm0nwBHq%RPNUl$!x1|GjOeb zu=*rq53d6d3k|Qpg?kvWHy}1uRw$26W#i@Hsowz){Wjn3=qNhcltJn!LQ*$$$%b9N z-OVRys_snzc(3vAifz9Qc|3qTCLs@HpU}PxP)FsQ!w;b}*tCryZBKm8{sx=b`~8jc zq+FU(y!_6!QnjBilW%P;5jlB}4zbP&X{tZbo()$nF@j>*L@82FpGb zC)EEo>d5JKq#TSqHqY;w@8{@elO5ef~@~6@@EY=mR9elZ-9d&9xLK~ z27}z3DA_Tc-=p*IchBH-e%6Bnn+IaHKYnbQ-!s*p_+Z^dfxF%>$&2S9{Qa2x$k}5P z{GN$^Zh}AYOZGYJ0}03@&3*0@>^~&Y*=QW+Qf|2oj-c_<$YP9{qKiC6`#m&_JDsEb z>=W4Qj_KjY!u_65f8sBdUihn}l>Z$I1KJJ2qIWN$fT|0qr^MTEF@S-6{LsOoVAC2e#H`V((CQCW@GA8Q21W4_dkI z5vu=h!mtK6$6tNi`@T)GfZ}U8Trtv61^w@X1M@+8g4QVC6VDaY{S0hs+~Dip;M>{c zbjx8s1_V8M$15^A0;1&Z*L?KE884&4T@1WJe$`TVS0Z=F*I4K4Y}@@( zEO$^W)!d7|P8~dY&q$*j9gN#y$9oN}stdrf;qxKbtxRWC>)hWac<2Z^%DjJz$*S46 z&z|$(I^+H=IXA2`<}=Hm@tNXeDbL^N)T&J!H6u2vJq%`bLgRrfXorstL7`#8&=K$u zu^cP2ieufDJr$YHc(F7ZT zmLY}G^J^dXfbUc&`?1s(3V(q5LeXUKDtewDQiMYHN*{N>Z}8JOK=fB6+V!gDz3)N% zkoF@&{}J>;_k{OcH0fnI-`^@aq5awzdMdrWD|A@k7liLxum2XL@uc{;g{Y3lL^)oE*=e39 zK-%Y4Ww$fKFTpfp=&+(#dQz?<#<8=x!C}uS3T;gBtxKzD(#EueHCZDc+|j0uY_d*h zeA`Q3->}ocz2)6;h;r0`Op&a|%Xz%p>YLoMt%s;4crw|@R8-hC>oTFSO*_F|Z*(}$ zX=)atmag{|Mp6Aw2)1GT15)jTA#LPwZM0{ckDKbNdrp9eRh=|Wq}eIxKjHJV(Qqp2 z`l$iPZccZc$nYq9T$E3FL;!hUvD&P$PHikG#^F#ntyAJBCJ%qiH)&&8!JAW0Sie^@ z15>RyROFC$0uJ@Pms9xawRu)qo|UjUsFdwn)Yy^Qaho|IyKKaF;6@3GfhU5 zc9KauAx|4)DkiW7mGLs?o3dM5A1vHl<+MgOStr3FW$h5ec}5SpA)zkIeaq1krr#&z zc)fLY&~-)bIXax4I;5SN+tutY>piQT2!oNr$TNlc@5hETX@8cpM*+bhy!+|j=N}J0 zxo!9zT(!5o+(%yUYN6~b6tVXEx*S-jsO$~~OxAx0rr#5m+s`yv8MXllnzT$;Sop8@p>(XxY5KzvMkJ4pwU5h|&Fwqi;RYgisFm!#SNY zM}KeIlf-=_A1p~4WcXoF2M%(pE9-NCeD}2X#I!8<|36X{DKF~sV09n$7HX)hIKlQh zPP4(wJ>g}~VcI3@XDF_5V=qjzvLHoc2y6c%@1Dox>{K;PPsw}sjPosZha$H~-B8y{ zPd%#Y+_T@KuGG>n?(hH)BUYTK-qtu2Hol_ahlW!|dSb;XqdTp+qQ+8jztQNngH0Y; zU-9!^ z_7*8p9;LG8p-VGOPbr$1^1=<`{`Z1qXMN2NzX(>V0nYKV zK0WGt!r5OTIVeWc83KGjiRoVM4lnxzj^W9H-YB(Q0B;75kn_ECNFF%XIx25^O51dj z7_nYtw~sFk*KGa}1aJ=~(w$FAsnjl|?Ik`({%qZ6Jaj+ED`Djb0Vk+=1pZQm0At%` zq5m{k;`J@6F7OPDOR{8h?~Q~e+EgZYs=3th_4d`(A)+hwd* zPELk?MX|YgmUYR0hoGlpLe@oL0fjGK_fuKl2@AsON`IzSjw{Ag0czRT>{ll z2_|c7om@OCd*E_N&(uE*rwGJIR@w4NUT~Z>6X=jT6{S@6dklNMw@E|5@9cX$a%<~7 zF3r{#L;VYN9A@yE;;9CgV{6JcD_)m5-MO%^TOawej+1MmdHpWbXPB28=Vfmf&Eb22 zwD06At#}hS8&7?%@yNWK%zG+?y#?FrFdzWk!AM(M*K2xY8o8`}2QvBbBImux{v3&b zcNWB&5cI42V832KT%VS~zspv$KVS_Ow#`$-evjW%V3~{Fev17RE4#uq-}~B|kl`m6 zxz8?w?g>2=E<6ThAr(IGUhfAAno_0hd++^FW(Fffuo7JR?mUbYNlLUoX7ZJxqJO%pR-3t6WKm}S%*=HDy!Sijy+Ocqzu*1t_s7Tc z-n-|Xd+xdCo_p@O_l#dDs9SBXD@@-JLMQdpzi>>*L#l~dLXAISPLvr;^!6dh= z%tj{t#&COLLdgOqMxP(c=qu+k#buU!rrc6tE3y@pl`=Lpy2QEbGdGVoPP=bu?wGC<3j* z2uIMClvv6c+uEW$>xdza((kpz*6KWKWhGNtwBE|-t8dgQ&yrVYl_XhNQc|@N6;og- zf@z%#`Ut*Jvk{$%qgYvCh1spF$XjX2&#ypRsAfvbY|O0q+;ui9V<|3LRcg)u7rCM2 z|0kUC(PI8xPHQWQU?j-unlbA0|969w7>e_ARknYVS4G~4VKTo|J+9*%DhKA__QcUE zt*8>#qqrXKxr?z{DvH89Tn|qg;N0Ty@#bDR^{2O<( z0DT%$RLY1Gyb`3(x7aL9S-G`B^kKK4*JI|1Gc`igQS-4BmLUwT%2Lcgdsvlg=7Dzt zo_=n>F+6yqrWxo6!6}1I3M$G?8u6-5Q>MhsE3lo9PlDK+!z=Cce9YVM8bqN11#ORlw;8S%Hg z63zSS-?DY(R%Yok=3Ysk43l9kU1cl05l6i-pV7xB%&r`I8jRJ9UV0?sSMo>)Jxb^W zrTH*x*B|2BV**U)0A2(59NXeN@KYXh><+0t>Ej*g|03`QjwM1meNgRXp7D4P6TiZOBhC z;!+w8bYRh<#~VgmYom!J_YH?U>DP>CXk9W8Zk3_;yxPrGhBq4RNSQ`?yGnEd zs`7FO6K{opU?jTAR#aSMTX#zy89|$G&8=FsGPkOrz*<49rTGbWR@z{pCj6US7nSA} zSLIu;?f#ZR?87MaVI;W_wTOW!hAkK_Rai<_SxFf%7U_r5{nHKdKGn@ZE~r!|KgekCkwtN zUV4EUi0cRqCnF3nuTl$7N|tT8ge{1+PgUEzqHM|q&pJ^P~>2z9DT zF%V!d(6;77$YTLdK2m~FOooldA8m^fvlMFkH8Oe^7}a`6O+%gg7b&XoMpBQM^-&fs z&3zn`UuLZ=oo)lMZFz-~hn1>EFdVfL4fU;uqd_^Ymw6IB^YF+5>Qbz@ts1=AZ1M0n zg5&5>i7}%;CP8ahTLF&h#^;3jh1R@>Dq(k$)OHIq-%^}cRcx_Ayo0KMgB`4A{JK$( zi^LxN+Jm_pQbIwI4V~h!kzXZ|IF0BC;l~*9Hdsk@wjrO-vtpV#91kN62FtORubvZh2mEJ)3pji95S8wk-^`H zMLcA_B1 zJR{@(#$6{GD~%(!qRK)GIBnb`R)VE5dS(_g4^9Ll_eCHv-Zpz>0R&`Va3jpbUmStrhonsR&!s|DW-} zc7#KQF-ETxM>(Qnv5Y)6|-=JGxS`MyNin@n)DVU~fj;~0%7zMn}midpWKqHAhswLF>i81KLK14>D z^U*VcUtDW}OE7WI8W~^z3oIl{l~D?nIsqnk7CdzS~x!4aA(c4;5JrK1&8BO2(#9LUl18pSRXE`1Yi2!vm0f0 zquRpMfdt?%ZoxVHMU^xSQtbMF=rBg;6ynkRvXapea{=6$tduIQqfLKE0f#bi+aKoT z-;N4lkF?(S&h-Xk{N((eY2G@iLAA|Nyb^Kfm$R15U%6tLIb&sd)`BG~VSW88PP4KsPdo?t z9o?;dQD92N5sV6mQd2WCGMJ_JrZ2nCoV9?NZ_Z%S&5JT5kwo%QK4M7r(eh<2xC=tE z;wtN0+#ml*P+3*#Kc|6+5U;;=3 zSO|~-kO{C1UQa>p(y|6`QvH|47w-es~1%CZC zfFl6M0R9ee5&-@E9^enM*+~wcg884bfHPI`DY8nbjD6(5cN(!rL!3K1b0aAJe!2#_EF-=9&gi(PEL;)>R06f#cF2`5%DF%4YhWGCP z6sY4}(591^UWfNV;L{2CuK-M`peiU&QcY5k^TJq$3nUvpo;1H2a8U6mjMWZ(N!mp1 zpa6o5Pa7aPM358VkWW|$eJuwdBoah9FAVu1^ht%N;~W^np9P^q)Hmvx*o)zNwwbUx zVPH?F{SV_9hiuPYv;9?uyII)#u8+N07*LURwPN!`=v*lXvn?cHqR{-znPj`20mP{rIr2f&j7#GD8A+|3N6s0|CZm}W7i zb8=@|Z<0h>9CA7{QJo`^6%TxBo)?@w#beYGU7u|FmhBAC>Uy^tFHJd5V0_vOJg}?P z5j*p_y>W1QEA><)p{Xh7XLB-jD5KYbK$|BHzM^m*VEUZSE*bj+4+HO#S^uCoHA5eu z=m~b6;kh$BdlK>e7X>xP4DL{*KL2!l@Ldz%=#mdA6b1KF{VPb@J3e~cV!3m{29wjK z=^S@|s%hzlOp{G>F~a(@V1AFkYa3N}7l}K`euS*df8%qzgsf@tYu-c=lLK-R)j0Bi zgg)N#8loJpl{?fq4%A1(Yw%c+SH4`GvmDF6&Rg;_Z|UW0^(4npYk85+akPP^%g@Pk z&dJLQdh2IjvK-*soX%P$sZh#tmDI$}TC=ml%;lQfte*+B)1oWd2rw#Cl@}nxA{F}r zO64q2XzGI7f0DzvpW(SqKCXoQ6IRq*IPN5UPSepYriW%b5e4jNMJJbPcBY!)**17u za0HnD#G4$o=0z)_b_1I+()g{w&ifHPm^e$X>8FUwYTG^vy>#(*<$=2d~ zp~hu56c^EC}ACMUWZb}$W1zA7%Lx~O|(^f!o&RZeWAyycvls_mz&O2@$6H` zOl#v4Y)}<)tde(?K~+rpWuZNZu#H&D{&D!3P|Vk$sK^;-KUQv?K?WC+_64Lpkqq8O z;)AnKPS7Xg`~C^$T)s3}10HXezVtPqVUU`Z-pe|aK2@46hZ#LTa~JZ8xq{Fi4{OK#^sJWDOPlLyYw^d70{ z&DgXS_|M_(kIlNYB527%e!vmB@%JlKgYO|-x|)rhf|=Pv^f4Jgo%gpNq`(d`1AYO;%(|UPWQn@>$Ox@}tC6sW9Kn)8T+I<`eT| zdp{bUC$>jWQM zjHae<8;>ZVkRwu3))Fmyn44AXv4o=V+xhN63d?P;Md z70;>ofzKH_o_zu3ulcEcf})lhvpBf^z@))fV1Q?+F)qQ!5&pD--7S&C2TVD?GxD;2 zzx>lnzRltA=n1|6WIy@1pM5~qhGhLep`QntHElAGbnv3kW+rWYj1@m*^yD5{7p0Gr ziDR+g#C?yg2EQikm%g3Ji<-XlIf7ayw1zef`WhW-@yRsE^nW2vXT;HsvZgb>4q0QT z+TO|Rl36w9`qSBO4VCi(sLI08f3r9zdWPPvUf*G3;5;ym2TRwD<$uDc)i zaZmYqSr=_oDAK#V$h% zt_C<;KNsjonsUZ$VVE44YuGQJ^U>5MZcak1w*9wY4V$?3e6oqtPm!Ibj!;-0oJRCd z!Vc8tQdu7$+zy{>htIjM?HD|F)UrE}_mNr=QkHj0Rw5iz8rI$xVpHrObKS*b*P`(fg$1r^Z2gH6a4`ePsUH9hKsWwAd79HBC4a14$>C+GT+`{ zIxJ&4)xDiqwX1OJI7P^ljg8MBNr$e3Kvm;5kx_@g6+Kz|fY0>yhRjjzx`MVw1f;$$ zn4H+Or3IU|szEYs7LKX4rJ0h!+gPaC-3srRLQRz-A;TBaYLNB=99&1W?s?MKXdCXc z8c9_N^L>6Ql~|sB;b(Zi5(5uijAqLD1S8aoz8|^7R2!cs{&KbQdjWMz(~}?XJ;<~< z|7`tAU=w^~MyOqEw?d10QwPqNc}(cvmK+7}%~ zvBAEEusM_?tV!?FM)@)`71{f+V_o4)Q5e0M@imH~=nC}`=IHWJX=A#IF-Q8Y#YFr9 z6M8Ks^?7nltJLR&(U@@hF==}z0-fJ+a zZNoI?^ImBr*U*^19@WZNI1>~ovYjB(hb4UO9nwXZgdu66(!}Tr{g{MP-fJ-@eu4Sm z7nozCFwHSx34itO(aQ{A;^JCp_VbUW=S!BOD~tsZnq#7C_JUasEDz26wWO42zpRIV zqokA}$zHt%6V5Ofhg1+wQ`oL>LVBNQUyiUCD!VN>Gjm#Wc#38NiH^EII&r=JP64Ql zF?#JbuW7lANmOSpWwd`mb!Lg?kxUs3<0d5%xyfW|0&Hqww4_69^9OJFP@Ag_QVXZ| zUm9Xs?{!{>Ag1m+h`IdzKI%Ps9g^7oK_NQ)-rXCbqe=@BH;c4k+TVFIGb0*Dk)tY7 z3&$%@N?nF&%aF!!9hwN`u_2mONRxRTnsLgvhG1&rgj3n5G!Ch=veE1?}BU z_Bhnt(?nE|NafObfzYLeCraff?7rCxgnOR>auFNEPVzQQ!e*^1b|U&N82tq0=c0`4 zcrVkqtXtzf--=$iL$#+>-5ufG1Ab51JJ7LqsJhi&=Ba6bHME9~t_blmtyqyWs-i{3 z#3|ak1lU^2b)k)tCzpJ5Q?qBN?Dwk-W7~a(b$d9s2Rds}Y2BWoKAJ8e$`R!B4~21F zY`-XAJN7G2o6|1R4-tz6?i*-~4y{#{{*yG9>{$-sca2(16>8 zQaOUSPd!eDIwN?fqc*3JJ&hB?ek2KXP;PwwQE($7XAmGGWRJ8l`r9AF_HFHCh=KA4 zff${3Ln~8v!Ec*vzlTOcbg1A?AUZOr_AQ>CNC(+>ZP~l?C>)pve-8$dzxh{eFYxN) zUiEYz@-U82XwedkQ-9C{lLKY}hz5vwMSEwvJ=}gtLI}XX%eBcysiW;VoP$1>R%| z-O@Wer!6Y(S&y!dhgxo@hk16(P&4aKLK_#y{wEF|IsrS@wqOS_6m!csG5*m$Ax;WK zQ#g*~peC?jIK4E)U_=P?O`AR310I784GN}Cr{OEY&XRq@jI{|5R+yI;BnI2B{-%5b%LKU6LNM~HtapyxvD0)(xvw-~% zB&8pF;3hgwLaax`X$5`9UZ)HR9u^74emj88^6oE~#z?D<0wF%*DA*dIkl&|~O%M-)8@K>8^5K@klodb5aP??=Qp?`W5M z=D_U;>QYtng0w@&g8W5vh9t{9V#6#tt?sV^n8Mil=7_-y6rR*|9&Uk$ZFB=4>q&l+ zuK$eRrnG6OKiDpqiw65o_055`uL(6D)xR=c|Gn5S!o%I+F}%mHEVk7-WBhhw^$OGH zGR(HV#%{CoReR&BeYH;Va&vHP9@!P%8Wo#JN5;c+KA@@(i$wPoHon<;o>pybK1;{a zk!{=n+}04fDBUa2bCe!woh5kPAWJG79ex!N9WiJ73$%j{?@~oii?V(}fxG*`%}w;M zD^U>rU-6iiEFb()Fc_YglxW!4w}{#mHb>WB1OeHvkWsR@vS7(Z*lQKvB)4&xya!b9tvrW&24lZSbfHWP!(KtY zvEso6@p0zis^h~|Xu}ZZ{S5_W-*kiHg;pJ^ki-!lqXp!80+*w7szp(gRZYEa?lX5| zqT1P33y3+Y_A3Ir-`%ud8V*!^VH~4f;%5Afa4xirJKe88{bxeLvq)-;B8IsUnk^LA zp8jW{Ae>?Q-7R6ss-y{;ro-;Gb`y3Nsgn( zx$_Y6iy_cAe9Tb|o)Y$lS>F~qjDt@KqJu1mI!bS3pTNN;Jnm*6M*(8wcAc8Nas`$w zTQ4d`j#!m(_fY(d1BUo}gByahgc5k7SBh07w7a#BVuLx9@?+G!wgyWMO6zo+9JqmM z|LmUO(Eg{JakOb$-1gcJn3!6>O|skEoCV2SRE;`tV`^?ImRhl|78UxDC)|J?+C2ap zqiSk&50yp#!Irpd){FEe9qd$UuHhOMb-!RiHw<$CpURP@yWMjz=yC)ZWz)Fd!E}X! z`-)}letkDBa~owC#KX2>bDvL?L2bv?T4#He{zsvMWn!LicIgK%2?@pSrec)B0f#)l z`<6EqNf1Ff$Mr)IQw z<6^qs&E4;2H(?WNE3bx&(|-s~xS!p-7mUyF8bja2p2JG#xp4NQD|TaO3=4A#^OUgI z%`)y-)?ifEZwbJ|XT31JVr=&!H+&yRq(ck`HneYs0XW+N^gHmqW1O{B+;d?*7gL8X z4F0E3Fp=tC2Dh?29p+5kpjG2wR#2HM%+b@R{(DKFl}f({S4|;R%Mp748b@v}VQ0CU zX1NX1a7!zMIaW6%xEl-9Iez2O-imBusK7H}_*T7{8?2p%s6y3rB_8ZzRF;pgG)22} zq%)n0L=AJ&jp8&}Y)0ke~ty=%2nx!ndFv*^~I>h?@;?Kdr>JxU*?;gR}}sYG%3_u*pjHnJf0?p>}D#DHGnl z0vdpdLb-jpy7oE24&#-sndJo$W1(W9JgZB9Yg_nS1P6Y4THUikbOfb*L9iUSQY&60 z$0$J{sE<|FJtq`IsHM>WqKI;xzEbzDa9$jqggAL69kM&vWwI*pGpg==A^juCKkJ_s z76JPg5q7%^PFb zxZ#@Oant;XCic>Avcr2 z_Z9e#QeF}0AN>eq9bi&HddvAaF{J?{Lmo2{a*b*LVJh*G0YQjlpbP*k2<9PSvnMJj z(~O$zfn4fQfX8BGVor4hTEFh4o4R%SZ9MrJAom=Afy4uC8G z^%8lG5DxM}PO~v5Rm^EelC+dK2jr zq$x>)74mifgj_x(2y4j`_-%sPaJvQaaQJ1y9B?b(I{`idxT%0o!Th5M-j4xb{`nBR z1%SX+FkXPk0D6F#0LcJmfJFdH03HN@X(OxP%>jG_AS(p@0xSji1As7=H4Z!6f znduMk-XAP8nII?p2cWl?^C{cleF1<67+1`v%m7FOco4t|^%d|28|@VY1);wbQdX>o zGUmpK2LO^egg+EGIRJEq5C}j4fT5EshX|wWC4}sG6L=g0fH@gUF@!9E`M9ZsPYDBn zdYJ~^zX8|^@IF9jDW8%J0QBSuc)tk{Sq3?8(3t}IUJc*d0En89Q}B)kIcKA+04C5A z=Hfdu33&<1eE?s7EeKI-pbvlsfHwh(vxsRk0KJr$VEwWT=0fKMvs3Y{*%#n6*$fXa zGdPzSikBI(mK&0n_fYHvtYr2w;>QA2y#)vQU5WsiRZfs zUP*KWu>#*K9Tf4*-4W!E0kHr_s4M(Y|B`|o9IY}efR6n2e;y9~YfSAO^bFcBId@JGHLx(|WAC`3KWUk&HXL5WkMYg{sWlz~%Sk3OnC#|YYCE5LB|v_1baE zT0_|l$R3m-rct{ac&>)0$I>@v+;k*>{ST~b3Ee$$S7`en$aEsqRmx+|vkEIS{%=>z)19F!2-oJERz};!-0|Hxwb@8y%A5lQob`6&11;c@+ z0KaN3yp%|#_Y2z9{CP-h8g*MpKU`I!y?{z`oy-}hBC~WuPVE`Zei@t=KtFf$Tn_)O z66Qk8E!JGdlOf4@?2KlGZ15!NBIgU{w8CZPx%+r=*EZxtXzFD8k3^HXo#&SFcmz$w z{_Ei0UCK#bn)`xfA%DIzwDT{u+eo&<4JT*_PPX61E<(afbDtclQ+@_*79g@89URJv zc50T!b7^icJ6q(_q1%Sb9P97EX@vLY=YtMI3d$cul;~5fUayB+K-$N!j`oEEU zM-0z}NNaa;$k6I#r}1#_B`$DRG~TYjr~d@g_WYxx%i`UPSkI2&-J zy8WtRxARq;{Z~}oZK4=pBjR2V(!EP6!(IXP4I$mFQW*||P0!%x&`s`c-_Z8av`r)l z>h8FTV*lcsj90_p%>Ba^3(ny?N*F8t90z{`XmyHf@lQT(yRX7Y*p*`5@_XTebG!RO zYTx9Nzk>1v-CKNG2PQw8wQ>iZ zd0wIJ*6nQmDMrRE@Yx40cBY>DT)V($PW91aP5afRx7DJD2M4qO*>vCTGi^{C8ZRD5 zU!7>F^=(TtnSM%o>Gq5<-FDyUG4xcL?xGsZ>|7+y7}KNdqUfoo$Mk{Fw;?KFt*_?q z&}$5Io+BOIK9g1DD?o6pc zCN!A7eGoNtMQh!NZ8ChW`9AJ0AFIMPm$fYk4)cn!$%?{=No(&GHl_7Bytobfq z!W>_H*n|RVMtdDJ<;ghH3aWwn@A)x)wfY}~weFQs-f+YMA1^YgBW32(q2^lxl2biONAp;8o zOo;}#Q@68bxN5_-bPyo5oUex2a_6|>}m_tZ9P6$%jUgIz}s+v5w^LNsMU`dn(b7HdCFoU57bzZ$GS z!eC$K8w}ftRCRdiZ(W1f01?}cSZg^VC=uaA#5_f{d2RH>E``2EXfMS|-ith1#h$|I zJ{KzFl;%x&!FZ}pN7j7q)fWr3QFx`=kl+aCe(*MEYvuBHKWhlBl~bpc4KiOK$hi?) zPbx6J#?*ZYVgSYN6VY$oUK7;VqF(cXx8RlicKfWEj_N3gxi;3egs)4k&_%b#Oj=u! z8@=W|uks6lIKr!=8g%S2?>gfns{T)f>L^F}x~zuOHE(#+KL(x^a`~lI@i+x*L)TYV z2RZ}Enm4_5A4-H_4b+-LUgi73npeGb#|5(HfVcms0MGQl;j{mUFxy2ssCiV)h3)SB z;aZpXW#i=b-@^D$gu9;ba{uK$<7C(sI1JtMPlM|q?JEWNVMg{0nf?KwIvajM?%L?( zc6<9l&!CMyCj-Chdl?(V(R+`p-{IJOSm>hK3k27t@T98Am^jPTlA%;39T%{i|lDxu7)DU?~4;bP!gy~yEGv*lCbQA<;N%~GNBbW=JHx~1aAPW|qX{okjG=lL(GjS`-JwzfI1@Q>|O|^!KSSYY1?s@eH6Q3AMrNLm2zoH z@$fs_Le-pIEU({E(j#l@QxE=4*u1(6fBx9sAz)5tA@FkD>E+gVSqd2-&Mm-?Yd}L| z$X<)NR%>pvn0D`n=Er1%?+V+uMJsv|9`piI1RURIyXd3m#|( z-NL=%_TZ=TE}B!ksS2Wb|HmGA-KPQ^GW0JBb%TQS4rG^#?2aM3J`N6GFzr)tK>hEa zj%uCur2V1C=6YSXd%4@adw1yAPmmN%2xIO7m=j%$agHoDR4FGlXY04zl$;flIwv$% z79&dzg?q2dNy%etbW7x^5T97zaNtyzHn@u*EPY* zjq}ER&AxzbxG~LRVYHqm=wxF?6&ti<3qzgSpdtEg2JB_2g><(;o z-?ZRk!CqIOH|{q|H~eZTX&PLP(G%{|$>^ZQ7`1qU1AW}Jg;FjgcSVIBQ+QnpFQ@SC zN%_50S_z>5YP2~2uMek7zP5PoHLSttpPS57&<=6g^1 z7W>xZ#B!T`ZSs=tZ#qhv`h-dd|w8#!uvWLSF;jOv8O<@9hJ9yS1lh6O{1;BPXq z5HDB$2J`?pz+@n%S*y7_za!{0wM#L1bB}Ux94zGQlR3cgrDTl5jEYH`Evojv2@eKq z?$1FI>rtUrp)fkXs#YXL+M2cM1cxVjLiV5x6yKpME)o2#&8*`?9 zmo7TE^#EB6OB;qvdAkr&b%D6vKcHF3q9(cN3#_(xoVR z$uduJz~=czy)663yG19oR~tc3p*MF04hsCd;O(pR--9%+Bo8+q)$u1$jyGU*nimO> z_BmCV?abgSFw6)#s4$YAm}8HyZ`;ynw`CUwHYIsh%_(ozMzjPqTS7N&ZPSJ}TgElL zfa$)2SKz8+Hq&Jp~to1t}z~Nil^=c0U}m)!WfZeo1p)U&((&*uBhv$ zjzV^Gn*BtoOX101SHoZ)AjkWiQ9ylw9Z((e(n z-R?RY=(;@TA{|UmIisDD)3wD}+IvAe0XicEq2~+oK8y@#*4~`GO98)DD$qJ>LD*6Wai16iGj;T^!TFrMZ#B^bPBRDFUShVtl3toAu75XJcKWyc;LBjO8sHo)J3cMRwZhGny4i!sTKNSJ z1Dr=`K2Ykr`Rw&dIFP_^ch#%{XSgc>`fGnoaOJt!{pmNo~_e zT*zvX-5$OqShM~l2;dxuqdT8rd2HULw7$Y;%b&0Nf`{h&c_qvoA>afxPr@%%2r#y; z7y8eEC5~@Vb%AGKtm1ro*Eeg&Pg=XFwb?Qr{8iHQ)BW%tUh+b>6*!cEd76#@r^C>o zoRkRd3L|rJ&8reWg`lTnT>2GZ9)&kvk5K792=jvLNR6QeAkf{%XC`;mgi|AvBnXu>b(8-enShPX~#;Z9uvA#X+|5b(n}^xD72 p)9-k8-|gk&QXi>_{@s)P10R1jH7n#F&z%@xTQ>BZ+oag^{{V5B!+`(* literal 0 HcmV?d00001 From 6416334a2afd5116fe757aa2141cb1b20c249e3a Mon Sep 17 00:00:00 2001 From: hathach Date: Sat, 14 Nov 2020 00:38:26 +0700 Subject: [PATCH 4/4] rename label of fatfs --- variants/adafruit_magtag29_esp32s2/partitions.csv | 2 +- variants/adafruit_metro_esp32s2/partitions.csv | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/variants/adafruit_magtag29_esp32s2/partitions.csv b/variants/adafruit_magtag29_esp32s2/partitions.csv index a23b9798223..164ba0d5965 100644 --- a/variants/adafruit_magtag29_esp32s2/partitions.csv +++ b/variants/adafruit_magtag29_esp32s2/partitions.csv @@ -8,4 +8,4 @@ otadata, data, ota, 0xe000, 8K, ota_0, 0, ota_0, 0x10000, 1408K, ota_1, 0, ota_1, 0x170000, 1408K, uf2, app, factory,0x2d0000, 256K, -user_fs, data, fat, 0x310000, 960K, +ffat, data, fat, 0x310000, 960K, diff --git a/variants/adafruit_metro_esp32s2/partitions.csv b/variants/adafruit_metro_esp32s2/partitions.csv index a23b9798223..164ba0d5965 100644 --- a/variants/adafruit_metro_esp32s2/partitions.csv +++ b/variants/adafruit_metro_esp32s2/partitions.csv @@ -8,4 +8,4 @@ otadata, data, ota, 0xe000, 8K, ota_0, 0, ota_0, 0x10000, 1408K, ota_1, 0, ota_1, 0x170000, 1408K, uf2, app, factory,0x2d0000, 256K, -user_fs, data, fat, 0x310000, 960K, +ffat, data, fat, 0x310000, 960K,