From cbd175686df489f9dc89627e57a2be9e93c3b0cc Mon Sep 17 00:00:00 2001 From: Daniel Maslowski Date: Thu, 4 Dec 2025 17:21:06 +0100 Subject: [PATCH] update and move out milestones Add a reference to OSFF for credit. Signed-off-by: Daniel Maslowski --- README.md | 32 ++++++++++++-------------------- docs/osff_logo_400.png | Bin 0 -> 25194 bytes milestones.md | 22 ++++++++++++++++++++++ 3 files changed, 34 insertions(+), 20 deletions(-) create mode 100644 docs/osff_logo_400.png create mode 100644 milestones.md diff --git a/README.md b/README.md index 5cdc358..d616c52 100644 --- a/README.md +++ b/README.md @@ -33,25 +33,17 @@ To run the CLI via `cargo` directly, remember to add arguments after an extra `--`; i.e., to print the general help, invoke `cargo run --relase -- -h`, or, for a subcommand, e.g. `cargo run --relase -- me clean -h`. -## Milestones - -- [x] bootstrap a new, general CLI, `intel_fw`, with an `me` subcommand - - mimic the `me_cleaner` CLI, using similar+same arguments and switches for - compatibility -- [x] port the logic to Rust, using `me_cleaner`-edited images as test fixtures - - NOTE: committing the test fixtures would be big and a potential license - issue; instead, add notes on how to reproduce them, via public vendor - images and extraction utilities (e.g. from Lenovo) - - [x] step 1: port core logic to produce the same output as `me_cleaner` for - Lenovo ThinkPad X230 + X270 - - [x] step 2: full feature parity with `me_cleaner` -- [x] expand the documentation - - [x] higher-level view on Intel platform boot flows - - [x] how the Intel data structures work, in prose - - [x] adding support for more platforms and variants -- [ ] work out a reusable library, i.e., a Rust crate for - - [x] turn all `unwrap()`s into `Option`/`Result`; add lint rule - - [ ] add bounds checks - - [ ] publish the crate +## TODOs + - [ ] sync up; has another patch that coreboot is missing, doing rework and adding ME Gen 1 support +- [ ] [IFWI](https://github.com/platform-system-interface/intel_fw/issues/80) + format support + +## Funding + +The [initial work](milestones.md#initial_work) has been sponsored through the +first [Open Call by the Open Source Firmware Foundation](https://www.osfw.foundation/funding/small-scale-high-impact-firmware-contributions-2025/). We highly appreciate +their support that made a first release of this project possible. + +![Open Source Firmware Foundation Logo](docs/osff_logo_400.png) diff --git a/docs/osff_logo_400.png b/docs/osff_logo_400.png new file mode 100644 index 0000000000000000000000000000000000000000..27f74f3474cf1d38684ba12e0277ceb00e534313 GIT binary patch literal 25194 zcmY&pcxVf;r zFbGI}EbNCN1n@JFu@pca1jLI11mt%x2*?}o((h9c5LYG;kaGhN5S}y;5KM=x4kbR| zS3#u3gjGD&|8=`(;hlJ%y!uvl@F>hcr(uJzVwsSzfPg~r!B-l(!r^u0KG>Ab&auXwi_x~0OmQKT#n`tjqR_%Ts1wj&WQ4Is$ zOz2Y}_p7p#mhW---aD6$z~huT;s+!G9+yKL37RDMe~aBdVx<4QvWpb{|NaFv6!5^CX#q)8mJMTv9Sawmxc4Ylp)qoS(n9^z=HH1Z_E9K{XcmfMcEjs>r+wmMGolu7BVRcPTu%b2v{1slo3nv+_K3VKF?9Sc_PG?>R3)84@r|Ch|ts^ za-sN&GdM3^i@hsH7yCJ<^Cstw1Bmk(_fJ{6+SW`>{WIZ@uRXdd9_iD_F+uqQo(e;q z-Q?{x)qtKp^z- z@FP=hpWD5S@(R9jMFK$qT044G4y4M!+GApNNDsU4s zk2d>fD-1@OLtg)9oX^kv3#0sw_{}|nJp_A52&=yU%k0Ly>2KHYC5Ih#^{=I*-&4@uU+)DsB&HMgi^dO7$n(noZ8s;(`gl!e z0Y04J^V|Jsbu5I&i{~XL+Amm0Cee zFwP~P-ARbfJvhuzKKJv*YQ!?7JiqcKK|c3+uMeB0COFwKB(600Wl)I!LMQPL>O}t( zl*tKyltz1jk6KdCWbs`eZAlj_2)0KKjW6Clq9x&0oVU^yv2h40fyV zS@T8ZG6lW(tw$qvpQS5tkf>&2f`_N6%FS0B@~P4vkDCQCykz@C{9xlyZEY7drY$n^ zEAU!cke(OS9DfKd4LrEQo5sN>CSh;B-cxwg#>kh`cLNZsh>+^sc+*QvEU3on53=#N z=M~gfs6q|b6CP)>X>Ytv)H&pO{=NnYv3gD{qOa>J-a-bLIn@+sOB1!PEew;m`VAMe zBtsFxvek*>I!g`p7r&9G6IN@h%Sbz>96j@Q8-F~Q+uuFK3lu1!iVLZwWI_^ZjPSeH z3N0+QbsjukRC0Ng1zE81H*Q}zYx{8u5SZD}xsW%3w72`Q>{EFX6R|ExPA6*soCI|XO$~5fDnCQjWB<#?q{?UL>%F>bZp~W|!W>P}z z3oo_ODC!pnjcP}XoCLh!PZ|Q`;wg58KPU=VwA9L@FL|wDqax^OmSqw@AgCEXb4lbj z?!AI%+@3+`^FydZ(hjm|u}`OFMu>?De8~R(=1?8Xv8X{MaF4?afFfRP>)D)t!@`EX zJ9U4WU*vmx*JWYiL)i-xEY>$DzsNA2hI_aiuJGnYKb4=_5%!C@=MN#hTsrOnAvH92L1uFB*_O4F+{S_zZ zYvQeQA+CyU*X`NgMI4u@lUTLvWvki|Fc4wEtQavgL{q z)aJ&;nMq41XixSGhdl741moVRX_v%_sZA5tIIJ~BE>q|e#TLrGZGeOJ0;LkQpE0Nz zFS59YIliwb3%@j7ap)zk7dZw8c-Z&*ghjyS*n|xY-9Cn?$=?y!=6uW+Mb4!C9y7f- zY^zGT_(lhYolN-#N~obj%mfX}sRowWOR0>O0iKK!))z#If*U^2o;uO)e-Lh#H*9UX zKb>0hkbdbT#Y`6GT{wGRml3b+T}m`UbKp|(aW;qVh(|KeF0&%Z$@J6C=_s6m5+JZO z{$)3^M*es6Fvq7F5nq5_P{`z0@00?gC<%kbvgJeJfRY-{cws{>(i6@?p2!#&L(IUx z!X7Ajx_NCsM4m#XYIC~#CNY4X*N)cE=$it5`Lg78m%aXLeuL&b}Z!; zYGr9d=Q#3rRbwb&N|ynGd6Y96tZkS-(5i5XQjW1VB8gmgYtz(=3yVQey_A4Z57{_| zL%{ku|3~6{Vw}Y>%@nNbr&|qdQ1LnwSn2C}Omr{<-9nNWNe4tb6h@Ny+=8*LO;JVQ zKRQZXcZo<b%YNESz5Jd-X=>=M~ z_gXe8=%7t(=(tV}2nmR()vAKFe+C}Z|4T|fC_5`y7%NezcPlod71kMR!e!KpX0MT^ zv0)i2LW@qjLW2@(AQ>0XjH&l|5_6uPpn31kLifYb>PuQ|+uFElB6DQ=0Tz+&;u=$D zS|9o%jbUFKoP;cX4iAmE^lJ?MpvDAb;Z1q*Mtvr3lr1g?U+^oymFiY z=Zdw*DT}iG4;DTaaR-)eHS7x6{3bG5yM>{F0Xc#9^hcj-LPS<}*K+YwCu+W%fZ{3* zJ-hrmGF$U7v+9VWWRcLnx9e@SMJg8TfL1eC@Ii^67R%rX`C>`|Dp}PuDBt1%PVnPD zZKHL2)FwfA`s&V1RXS?I;mm0%kdt8)gD1kJlJWK4-yMO~AN^CWTMBP0W0dx6z9miW z+Yki?{lv*DCeGPey4V8Rauvf~&lYW2#Z)UDhK(imF5`EvdicmZtbyO_-Xpd90eW9| z4(PHskFEc+R#^sNh%A7oB`G0QpL@F2FHw(k`}fYU{@1fE8m6wEGimVdvNlFyD&}sh zVs>7SBb24g#3ajFcjX^>+)8@o-=xUdD+q2=ufwOPKSeYWb-5Q0x=6;Ka8xXiOabeD}olGz<0;$LG?V&&_?LGOpOnS3EporQ(y1!`~Etljplk} z{_;33p9Q9khsJBb4i^jKl`o(JYGdf9iXot=Xd6TcWY}tqFU(udv;p-04<&>CSa8Czb(4zq_B53h>jX z1FEXKkJHtfm?A=IEr{aCDd-2|yM6r(FfiN4q=>eC2h#SlwpbL5y?|Lpf7M*Kgn=aq zF&M8H5LvqQ-&9g+?G%y085J-BANi(L-Q`Yyki!k$TZ)0l|L)&?wPj+srHtR_28BpI7NMub z4{q-AM@ya^m)o7MPqO;ekMW#2WEUK6y5-P=3a0>*n9f}DLI`O^ba0K!jH1;N%9Mx! zX8!v~s?E4X4^lwC{Q$Y;b5TN{_8gyH%(3phIaxsKBOFP;>4$LMUZkt6n*%<|Sd$aW z%bu|$w`WBv;&yN7c?H;ppBg|0xC8s{t&!f(4=(<0R&9q08V_LX;Cty?Z__kf!O^Q7 zp%nCEEg|;28g6NF|1P2Syb4jn$qap6m0Yf~GKH{fo#fcgzo3{le|tSj9Q8P{_>Qj1 zvo6j;5O-evr$o={C!>4t&jIn?B_ZIH&aiG_!!VO=&K}%CzCL}Q?RE&dYx0ah^HbtC z27fGnyibSRtgE`Tqsa3;z=Ig^6*tRBG)xHK8Y`tIxHuSJ_*tc?JCveLOU*c2SjU7~ zyAqPLK(FxTHEJQSFk9)Zb#|JO<%l0x07c;8PmjpoW~Y!a>iOb>llyi!ja4!p#h5F< zv7T`iz&`T*F#?)GH)HtTVpUNALrpz1aGi@_CQ*K$hN$1C8wYMGK3ST`$UXZ3ML;xS#NC7GQYMgMt^4Qk1Ob&7w7BKbUGpaSmW2 zW)}evdu4OJg-ey9ric=;3US%ojO-C0^sYsXR`1?Y0pp2fhL|x$d^oo?1DZIp&#tfR z%T3tIf!k~qRORT6lSHe%oxfU1xM6Z-B71u=N*EqIR+0WVDQC}u7t%RVsOEH%6rA_Ed>@r?CwPUIm;3Z* zVCB)__*fbR@?hLQ-oFtpo5Rxlx&DaB%2yeAI{1xi+KRKKWlk|*h17OrCDtqmVvQ#u zat+B)NYb(?0;TW~L9{LH>4QjMSKCVC|M|PX^#{Gd#MHxG`|S3}vGzn3_KmcWSjUT@ z1GK1_!E!7;@}eZHCy7ctKz;KS)_i4u_a`Y5vBBt*jKF8P_Raf={~kcCB$d&}kF|AM z=R8g-!Gg8xJAvqSSPL1K&e(^8%Z?q~SpFgAgctErTNh;&8 z-c}YO_j9V+#6&|qLzX%{EzLW*4iy!7<1K0vPY~Exx-D1JJE`d>oN}`FVCoE^_Vai} zS0!l&oC1mk)P|lZ)NZ33s136;w-NBBejckJ=|ZjgSaauo4r-52J*+2;MkMMsxkuM| zpG>r6TSrAUc%BBisvqLq-&eD0ZTpobNB>TBy`Z7r=srAtdp%&>p4suUCzOokz28q1 zM*FXHMi_2b%Zq7Lz%7_(57dv)Rhi-3s?!B4QNd#7Z#sv-i$0t)cu^+6FeUkGONZ`^ zaX|!U>0jewI3jH%;IFR+@mnIHru*!GD#gWyt7Z1leoNryudy@900sDFLwQozw*@Ts znt=8lmup3)z27^?b!TlTFxGJ}1W1jeS4JU;XpAuH`MiP)evNnfTq@cbZ>@(o)?V`c zgrt1E+POU1LKU5nkwZQS<4&eFoLGWd6B(r^Gc0E^uyVoHdn?WiSD9BBpFw5bfGf#U zF}Gz>sR`F*$+F^Lwy+Xo0Ne{0CYUdT3Xq_O7Nsy* zuV%&Zo#T4FF1sTzvEWEcN$ul^S5i_K`#jqt-j&8e*=aTQ-SNP{u)HJ+ZcnuKcBU#n z4$fG~nU4N35UF6p0>z2$L+2i?TddInTL@poYL_{Ikq%)vOJ^N*Wb$XG%<8{b!MH6B zYmG}hXeCCpu=sbB8GB{!LB?_d!7G4#u;G7?GrDux)Eo>0%j$Vpsa;+usf;0DWa#>m%^8k@&0mL_>PT}BS>E~I%>@KwzcB%ES5?ifre>*+bp;?k}%9Y z6X^oP`9z7v4UQsxdhU*@TZApC^V{2F?R~5XgGBG`zxq}+k|cYbeP@Wc_86T z{qPVyzrY$HT_Dx`e@!p~nwR40dib%9%$pP!nOqeMY5aCibq_hau8 zUo?wrOS$b4Q4-T}0af|fRg)Jqkckb7C{IZHWiy=E3EyKxo1J^&pMDY9? zm*yW;l;S7pGbiH6Qg6Ar(2j9;)+L>tb1%v1G~z~c{e5Xoi&IfkCyRI86eqQusaNQ9 z*MNX8Cx@8|WC2wmu&3g*r!!w`AZcj);n9r~YRG~f{a27_2G`yVn7hOrm41KUJlZBD zubJay+Y;^r?=I`E$aHq`OSS(h+ciZQhBO{)mTw_$Ib5B34~WpNHMCRMS);3}wq48= z<8iHW^OurpqIkLxesAR38qXDw$jTNqH2fBPe^dK<%k)l9i*B$IC&pb)RgTMzm^~4u zTDYI394Rfc$J&kI?8L%@ne9|+0otssAF8NnXf_D3%HSZBhK04;al=gtn)gaa!Tbb@ zpf+kAJVnxblxfGug;95_KdGj;gC#1NmWHm^|5*&P+Sb?-w!D&eY|i-7W?Kifm3uIO zT)aw4b8O@Kf!ufMD*(ygH%F|ZI!s$t9sN%K>pq)GB)^CZRyD?+ZQE%Qg}{qyAfEK{ zV}Bgg#Z{4~Q4)x(s8OxI;~l1n%v> z9pPsuQtQw9c3#kh$qyU-oE1=y6$tYD2dvTF(!C0h`LCWcN*dm`d30(Pht^g&hdFzi zQCCLS6dpR~T-_5YbX&xkv2h5rZkJIF(csX`FG?E(az z*QU|XOr|ofyDP1O?FBl*p8iB6eQWC+0^_HQEaxv{WkO0t#F-bIOzjaa&x*;r_oK;4 z4V`Q+cuB=;wg{jP^M2L^r(M0grz`GEPzrRQq)rke1CPIsF&Hw~ReNP*7=cdMD62Pp zQ%9%d>vHS!{BjPDClqL>`%*$Wb}wP9VOrONljwXsH1BE0xby5v;l*v(o);g^^QD%R zWz5<{9_1J(!IrG|`#*NoMYd$bE`Rpt-ri+wgQLEHAZuA7SWJ_Q)Q375UUJ5b#of$f#=@A_J6JPd1K||{4crCQU-2th-oSqRA(WH@A09Nt+j}7 zv&UPq+0-}GQs(K(ngor-OkN|tY<#ko!wBn^K0~N)+P5>Mr2F9dU&bM(B0(eHm#36x zebyyJcKY5?KBRh~<(+9@pqSb%iy9r#Z||d?u8JE~u>W@R8MfVbpps$l4>X7a zV{j{9hZ9TZt=`Hi0ypfco8VIr5fq$WrZN8DUyE|eou^H#^TniiwgNcSws2lZ2(m%&);o zhyGKZ^G8Y8U$~hQi2|5P`QJn|sEB3&kl4B!F_vN?loKo%l-S=YUdym0Vfw>FN8@qj zS)#n0*Tugg;tGduU{FP23aFxGlZgih(O{IQQ6@%%#E=_v6S#c&Ia~a>sKM4cO!G}s z5-nx)wv=ZP{au0$Zk{z|!Vui+4~NZqp2pNB=&b~;tYxUip653>lkY-ydOSf*i`P!#!*0hUOAsBMW~BAY|5o#&5YM1RP5Sg+toQu&;z zi6c$Q=*1kKL@}+UYZb|BQExWRiqwZYtOv2mcu$&d<#%z7w7{NVkd@;x=)&kTg*78- zyz4qR;)@nNC8{1ns--xesa13uXvTvLf_S5H$BEb-m3o1VTkNlDc;ym>0_X#NC(IKm zB}0{tv!zC^O7mL?bIlKj3a@1j+7W>=V$|1IUc1tJ>Mxo+?26GA#uHlu#|MBmp z!Uanc4=%NyG9@u7VG@(4v)i}I`8h6M>;Nvf`yne`CYZ>fWtU?qZbmpUT}sbHzZ>uT!*+QjN2#1A_ATl9QXsU*zU+ z*W_wy0XQV;>7NSQg(WAUgzK3%5!M+-Yj#^q@_L@lw=8#USd@zJb0)|hYG@(DQ2@fC zrl%5;$$ehxz3EnMY`hL9(bAF8LOh;DBW!;v>T$D;OIT$AJ6G2~||9v7)krUbgjO}ZC62){G&2i{Ha<~c|(xkFIGClBd+jXvQ=6i7M zZd((Yc<@8V*Kg+}B=>i%m)P`DjY}B4=LvD)gzDh-757j{FnKiEa_tX0GQyjO`%>&t z&5NrMTENaMESX(?V;{T34a`)sI}q(uQVrO-{!?2eFKt}tyZnpJjD-zNa8d?pY(mDC ztmGKb_Dpb5&|O{*1x)lF!^io#l;!3*_C_{zHp0&JFw+_gmzb_@vO< zNsB9pT3-~q?z5Q#18{~n!+qH2o4(Yjqox;%9b8z=tpYky1UFB&<$csJi|N#U0YxhK zC$QL*?F;;YPNG!E<0!UqjF33vm|ifmYlpC399Q?8iOjGJC9L&)KjknHj*$YOgzDvJ zQQ8v5uIgc7qR{kL)-!Zc)`p;g;V`f9eZsvC9}nvOX`?#Du3=&VjH8NHT7GR1iF^H<~$F?4ZrD$VAko|)5DF=Vc;VrQ}OHV0zvFD!;&&Qs z(sn(40`iQF;kQ_^nwHr{1{O27$@ zKFCQH&a#6=jL3zC1*L#D_-fNbyz0pow>&;UsHmfB#3dfuc;AT!qaR^cwMbLe)L!S8 zTRv1k*A_Yl9*pwR_3C#t1)EZ%-LkVIYIo$NEG5_b*~VAf0GXYZ===x7=-DWcHws(4 z-nt!?p(2^6oXL6%>d}H?w&6Q0X5UjlJC#0UU`ZyY(ekBfN*S@+tCj;f5n==pjjjuJ zI`B&tOU`Lb{L;nsZ{pF2@7iM-;uptO!X!+;7+%Rb%+V9+w+Xaq4-uZJGWm3&#}B$T zy`$kWX2*T|ZcvjMqNDy{Kxh3aCLH42-!x|-bXKz|eT@l55Y^>8yCN{u)V0*Xl+x5h z(Enb?`1&G5oZCX}$^+T53#rbeeR&z>(7MWkA3QuP|2lNz6mi(8DSq*_o4oM33h^>} zTT)H{LOgHnUdz>$(bnkg?8#fa7hIm_%|%rOPczIwYoej+_9WhU==gj!wvr4H1AFf4 z0pE&>ybhWu!LNPWlyL-rjF#5Vnf9^cCxjLe_;s2T>hjywL#OSfAE%f}7;Pa%QV|Wy z>dq3BO0K_7{aQY35ahzP-HjViWznY;xwz6)8-mhSPSEN9wFmaE8x6cx+-lW zHnr_y*#@QNzx@$Yr)WbKYRqq=el0M#{cZxg+}fovG=EpnrYTTc}-!_sET>u8JDQFKuPKXF*I1i%}+B zX@yN%x|;?=(d1&n-eT9^q@!=O9U!$HFWnS~!<4HG4%xU(S?eUyE&qe1g^Y&#V%Lx@-0PI%7B8L%&_IxU zq!T!^Ht#Ooa1x}6v$=D*H7fdz%y?cd9 zh`YNmNKk#{3!+)vtbOyv%eQ~B@CaKsyIypj5~Z-}*yYFjS7wp^ka1jw{LX%+BOWcN z*kY2?+ggw!b9&qYuTLAlXIyOb(bUwDojl35v%hoyzA+o1qoF2OXWezdUQQldib99rd5^%zedySe83G_LB z8@e||XU9Ob1w6+nXj&4CAPha3a)eT;roBN!5>#u4q$dS{={i}W^lZ)Mplb$XAiert`gqwe!czR{U`L4jVZr~*_@WzRK$y;IlA{8=!t zGa)K>dlMB+{P-7PtWI8UP{M>Pm!Y?@^CBLt_@;RK7){aADLE#vqD6*&NW&9lQ-v6@ z`>TkA*i)zOrf7gs6c%bj0~02}bRDYZqR*NkfMC$tax2^Ywi}aH7xi#egODOHRTMUn z0ul0l2n>|#LyfVvXT6W#ol&vU^mRBb4eI_Nw|m-zsU5D0_qwd0jA>y$!Sk~DSa!Wk z$2OSsXYG}xiIS`EX3|j=9b@NJ^`5@J51pZFS5kt$fM>=;h^LK)K6ha{t+KL`-^T(c z00+^h8hyc%KS&;GvIP%>!4OahUnhop=vxvNszF>Ud2hi27Hn$dN$)PdUtg}CmVi?$ z0Sf>;UWSI1Xn59SR$o1kB1O zTP2rtzc$3|2WlYlOzigMVJf=fX+{SP9;j z>dqRU)2JuVN?kpXugIKv6b1k6eoK%O91Tg1yhFtHdA`;=Nmjpz7zV_0!Xe1teG+z! zI5W18ZWKL?<5v@42evRy5NQ{!K=)@%oXa9iAq(8uec*WlAF622ohyjWij$8E) z%6IUMt!Q3pbQhAEn&I!Vd)Ef<8C&$`B0p$JB+G9^$`UjpBgKY`2G~a+KVm*krciC% zV~6C)RpU))o`g63NLj0Ydd74RS{my@fxgPvZ1ch9hSy8rnqRih0tFYbUf!=xBh(GH zUb5*>84t3Of)*lLKetM&6@@#IceM_oX~qr(5bTTW13tC`|Gti1_YR-E>23S(&|uJw zHCD5wqL9R6N&acMe?c7uz#MmM!MJa=FW$WXq2wID7RMQvG~c~qjH?c3YzT!4a}Yb9L9Uk7714k*AS;XdK{WrCa<#*R+dbEykp~YhF4QDo!2bb1#Wq%Fyl?KlIhPGnO~_pxdJSxVAVTCAD_$%!CLHF0?{k`|oV` zFD^e&!ZcCMsSeP~ku_AJIOonl2r+Vbj-H#J2U14bmX`Rk+;N>iv`97uO%r7yp49y8 z0&yDK@XsF!j{^tTPWS3a+)gUSNyB?v^sXC#whV^2@dDM(+swtGNvCFWLt1h3tBLvh zFSHO1HVOA@aLL%G`DFo)${$TN=y2e@2$-lT3|CJr6je)g4N@E)9ne%f-$*(x((&op z*Lq;_Y{qEJ;KXM;Myhklg})7&Iq7rOdp~X$BqR`d&3i4jUipBsK4L^*}neR_uNs z30ABqa;0GMw-Cir$9DhbK-I4vOBoU3p!hkeEq>v*H_>Rtp>T=mrsR$Nb38RV#@3Io zE!6C$mY8YofTt(<+nM;rl;>^_C1fBPodMC1kaqkiO@Mj5oC#0pkE%1YqfoVqJkfjXJ#{)7s=?6|0_BGUC zc&~LQHYDHXagMx6MI;^Op&Yy>6l=PS0MXzQro!F0J@sFWJh;+Xi|YlQ%Nphm zblwQNY2~_zMG>lQxJ)wff+SVIl1jl(&9tG#(N<&4mZdkKQmM7|xkCLy(H&pm!|?;+ z{Xupn!o;y^gjWnGfGPxYStoM#Fr- z63}jyis6uoiE(03EvRyPUguE*N(!`G>CGQ)zD8eg{P^0ZIBxssU9O&+4-{{ze#*s^ zXarQ#ae8#Do?**nh^df?%S4lqA9ryf1OO`rdJ0a?o{K&YzT^@N5MrVNT%JtGNpoU`O+5`e zVb@viRTHgUSsz3NsL?EqnTkiiB+wb&fGP^+!jdsmdGiAZT6wC$ixoy1=GPZwOL%vB3e6o@)NI~2U{pta1oT;R?^~7g#pbr}r_jj=$bjtu{uOc$ip4>%8U7Kdz2f?WobbNPy>p?l!mtnv zD_e_=p3z!IVXuFd`g7AX?jC_(V`igym_}3C&D~ZC5-_AsGv@G(_ZeV8p13ti**!n# ztWGmJ#3=3IoB*K~TN9={b5;W{tP}>8VBvCoKg`Ys=i`B-2g<7{QM7jmVDBn8ChCIum>Q`#cbQDH+GY>qXtrr7(hO1ny zM)q!H`t>{#ZGrr39|%T;@}lJ@FfZ$3NyrgOnsb#aO5SWZV9PcMv(T+y(n_^>@p$m2 zOluDEOjZj&-?|kgX?NkLm>i%`;PPh!onqcm;Y#>yfD{f)CYX<0svbuSwU>}qwGuv# zcmi9ISzfE(q_sBa(h@Be2g(nn!szd!-RiTe0`l1M1|~oUWrvf#_;5F$^}b?&2aRL3 zvo@llBCxF}E%CtkgkSb${D89N!evvXZVJ6f2Dg3c^AMS5sYa*gDjkR{H+vPuydn z(LG3NAFLxOCI12w2Oc%CpsU!< zMn4i21!cO|na=V!Ng!)KtpZ=_`fgK0>h&{>^hmlmJQD5dU5+jnb3SX)y`2{}Ckkz? z;}Zm^owRY>STT>0!W7KWnhH<%Nzo=5r;=K>41!K%G{fb56C2T|$_zIj!#bD>iaZ7dNY|7&Y<|2eMphO&qrErsb%s52FCGmz8? zGRkY;8{co7IO$29k?L}8{)^`0ev#ylge;(a813 zC*?_XTv#Y+*K3Na^!*Y zQ83v%z#e8m&Z(-_d8^~wwW=bop2zh0hnywfL?NERrFiI*$jT8@FYX32YK???wP1^ z)Az8PIEkx528;qmctPH`DlU~oya{`|XqIvIIxnQzDf)St9ZTSkn9SPgWz%>Oi$`v4 zcIbFJ~l2%ebQhUHRkRrG-oDfj77@+ zzO)gQY~Rz>SjiHi!8B{IQVltJethI-V~?5f7It@q*+rsct6)0vK<%Ml!D6W}O67CrFBU95S?nL+#ViMrdvz+S zgp+%Z8XTGf2KBU3%{avB5d}tB*8EomqYeue;6Us&xR}LyPkY>DZtGwV;D=9Lq6J^C z0}sdxy$QzxlUA{cmS%+S$d%yl3szC?xmNc2DG0~Vsxog3h^i!l2k(VSRkAl(U$^|3 zXNaOOkdY|VTYf9n2Ci6?=0rZ_q#g$#kABYDgjX>Fn96ima`H9d3V6vQ5@(tdqy&xz z$=-yo?WAEtl@y5*t<3nBKwWJ#qvdk;v{zqH%=Z3L{KsR#JVoSnRVb0CCkUYP) z63C{*03okTMg7$1r<-iLFqD!4y3OtO`EM+9HrnZ2CH3f;Ry|3%kqa|dari=MP6tLI z-wUsGGGtp!y|q2N>(u%3`g6o{``u42OMAe3cd!s+I9vrUI4;5X&f zE_s?=#>@HkND?IDwB<^)-Q6ZEe3h1Jz@)3^)ab?1OJl9QxfP9!9A_Gg1Qt%tZZ;`D z9{2jB3DYqe9*@KB?g$Z5tF|GKplI`!#8*{?Xw#9I@6H9{c>f_Yu9P>%qmULrS;p3U zLfg*C3FO#pZRW@L^gVy_CHqXcgFdDrE*$W;5e$){&yGZ z8Yws+qQde0D7Z7eo=Kxj5ql3M>5_E81d>M;I3?$22fdUjz6fN+*2CtHIGX0|AmkSh<_>dNpe_cqdnihi!yv@OTbhFy$XlTTZV+yoF z*REIw04M5#E`AHyt*K0OG{f4`BT|!x8X94l4Q#7HK&1N|=BuXM3m+%vq4$RoYDxR$ ze4-7=9wzRl$y&><)_2cq4*&OHinL~;Hy6>Nj<&P%6J|EN!<)VTh+R?~Rt>e(+38G- z`aBX&JGT_1IzwM{@?px;E9e<(VNA@|RRiUFql|>7C*p0N${1Gq!WSO~AX@<3O0tRB zh@z{SY6x%3^4&bGd2OYOInX$p2H*g|zf!XZSA*7O*WZ%8ow+kL22z_Q9&Ggv;h;*PXo2T+Wk%>BbZ(Grv!R<1 z^!sMIyd1n``~_u|f>uy*zYW>`b`xy||exS)!z*%3AMFH?I&-9YfAdUpD5Zl>?lWH1IMp8_mL;BM5ws&Ur0oc&KPv+?>)|3xGzu;niA+8u#`cHv!P4JkiiwaO5 z_m`6Y0f!)vr5jXiNcJekTyW2#(KG-PD@L2)vGgF7R*&vcCD@^O*G7V|I1xi zoPu+wYjqx;m5oiBjl&;TW7H^NZ_hCg*yljC?9?auzHeX?L=2IyRBO|e)iBhNU6-&9 zt}NA&Sspoi`*SP^bH?lkXhnorZn|D#Msz z_xgT9n#RJu{-CoRj^Q9SOGc9DKBH1*NO0#CcP>?r#Q^LMMvc?iaQsB5vlbZT2%cK= z^a4h{ro9k)W6;Q5IU6O2M*ln_M`1gLk$dtn097~I0V|#t**&l+;T14Isq&sI;*N}; z9?{n%CAs|c=e=LiWxX-~W|yU-j{8zzq)yKhW#(&`KaZHb{;3F^)B;+|rrHdpK+D`b zJXXv(9{;kpF0xcQPQCod_i$TlYw#;8x z96or_N%sIYLF(dsQ1%)_oq>+!6J@^_I|u1`nX#C|gB}F6j(55Uq15vSvfk$|uN-HV zx(3j|5=`MY@B-*@7F(!Z2%xfbI7wA{Ox~%~I}N|b%_%u9W}0MNg`~>qxnXl_7J)wu zSeJ3Gf!@TVYj#4h|JpG3^c(MR&EaN(g$t^OP2lIOJQ+vLU5RM^L zp8|C`O-hU+t~7PP=RwS!fGAf3r=}(Y3t%Dc(EWx zCrPeeSJ?0o8^;WA;HdLG_`ihGd?r?AcoY?7B6Ww0*4d{9u@Ab?D)!H$lyo?^ZG^LU z&D(iqB*7l5{zkseEs97KTkBPwXm(C$OdW<`UX*KV8EM8`-L`2odVyA|tAdaio|h-x zJn`B-JSa?i4>NNRn0^OP5VZN*>Tu>F#ie2z0Mn@F6VDW>Q?MxM zOZ$<)lkRaMW<;FMv#A>*Be4Itkr!C6%-4h1r=_weuB-uC1u$yz&~VGr12pl z33cJ_H{fEdk)8XB|2oi{(E{yo=+JXJ_JApTS(*adpN9?Do-dd`e+mxTP+SaF#ZRqcK(%CT9aMAZuOT_3Hp98y+66@ zxla`I7zX!#kAA|z$rVWxBpe?L^gLdEM*oqplM10tS3q0L{`Y@c09Lt2=jNO3`-x!2 z{6h{!PCvt$$UDuN$NCHYPBTy-X;8Plz;7&l3Sgqx;$R^2m53x4#cBb-N-J)jloPj) zZiE15p;lr80vS}{$|>M5-o>N0wrjA9r%O60N~&{f+HeD0X44-iLzMN9DL2wnn7>B# zyQc_!?NBS#)yepif5}KI&SC+#F0bcb$Z6R5oZf9Y@We~JE0g_oN&5NG`+aXJ@EwM$ z*;2)3`6@=j1F3I+EGfu6ajKDoi(c(T07)`jgi^$ggbDDdB?|-`a4JV}*NUi;70V>C z=jh!f=fxZ$70sX@W@{YN{evOr^|8&G`;o;|(uj*$Zs_)IMtQjaLLrY>cFQTOXE;^% zhjMTPEWR%od#7EwJXG_rq4kjDf9m?ms5YBu>y{RGDYUpt2~Y^G#XYzchhoLuwODZo z7PNSA*B~$M!CKs%;sn>5u66%?_xqPw&#WZRtT|`z*+*u&e?v~-q2LY+LRpvmKC{u( z0q(Kc?0opgS`whjYOPG`e%tY$vjbs}ZK~$93CZQAh^;)V-IMyF|1+-sGq&r%S&=v; z#zc4-M2@a$*2*VoJNK_J2U6x*~|yWFB$A zlcoqAosNT5cG}@a4wSgoul1^-H-mw}Z_}LB>p2XFg&k3ime`O@vB&Z94Hr>p_TROA zBjAf>&}fknfk_&Hk_`b)KO%&^abN{3H)BgnfmrvYTJpu2mQ_tB>E6ewU&ELjjkS(} zsL^Hh3oW%-b<=i!qPS6bQnZ|iicAC?jh=fxq^HLi)*5ydvmCWq;olq^NsEhzA19RM z=L1A9yWN*-?O7&7Jww(+W|X)EA0VK_$nJk%YGo{hpv~IVAM@I{P~&ypAW9u#Cg-`w zet`Y4u*0UXnN~TCr|jFj+0vHWO>2zj0B=0@1)=fw^KTG?^B=xz_%59L8B0t_}=NJn3KOrBKQQCKQ@TLKg@Sp=) zsi^5P?f8=QiT9$bQOUKvo&%d%NoG7|;8TxdXRV7qL_h|Sw~tWeWz^o5UA#1V?y6~P zd3L@WxtZbKhD+`4faXuIs znQba8_E{&R@&AmJ!AE}k_A6!CPv&nwciXl;Tt94SuaxDV^i}3FI|a_R1*&HGhWlTy ztUWy(ubnm{M_LnKd5sm<*O4zj+?BTk*w}w@Z_O7&5_eYP&Apu`_*Rm3Hfn5NQgYMN z5=)Dpc^__ss7x@QL;0cUJ?3fR~=TdSa zlp@&xPvH+DIlpS9P5%9D(UgeZ&J?|!VtDTjC0kx5hdyQ=*xSp67GEz|?!Ef)5r;aw zlQ_YYV>)$0#i z4mMk*CheK1PTGoqq&ZnXyR&*o;Z0+T&L9Dd1CBWfo1ObhIn-kh%h~)b7fNex<+IwZ z%(PlBtVWr?e;MJWDuC^|u9d4!mweapjq8OWbP38KwGy;v-=gil|-azb9F*<~_61 zN}|d>Y>CXq;?ua6k?7pVg2f!uG81JBV%>qZg!ms{?wJ`%@M_ChbBb? z39b-ed4d+}UYvq(c+^zXPW}8dh)&3}F~7wN?dum{Ii{L5yM>szIz3ih=ZxX6#mT`gU?r`Fx$|9&Wp}q-2G%Aw4Vq(C6J($zFxwk`8i8Y z+bd&pma-ln0E92#v7b1KIobR;EgAGMRdAlVH)MRK$IdhxkNnf(Vgl5|b*_KF0#g{u zuT446WS&12FTKcufvyV}k&-0K{&Vf2WCG&c_vMY1X}h})+%&%`06%{*v*xY0tbk71 z%td`~I-*Q}UC=}&Zd;pnf}w|5kXofX^Ef$wO?=&I>8R4lHvp$19bI_3T3>V?SCwln zY~LsE`D;%Wzjpj*9Kr-h+^ZP^z^1KSl?M-8p)ld+@5xsx1ekpsh94@$(dg?bM2HxM zrzZ$xrm=37EXtK`;4917y}A1HET|_x-RdUBAd^o|b?*``E&#jZ%66&lo~VeVdBgUL zZzA0ZVR#{cTv)~*;O+V`CLzW|1!PAlC%N~WaD|!Z90j8Ev5=BmK}HLAG$BL`xx94J zmt_{LBe-8DB21Z{G5IbT=gn}aKG}hit-)hjvD^mP4I4Klxco5^4}Qq+_i2V~HZrl$nUj>(bM)?xeNg@=h6` zXqLgdB7zd=bMY$B&&;<6DU3Z0=02ySPFG|$w%@o?fvFWIh*I9~QOC<48~GcI^+-B_ zTr!nTA5TYNHXMrnUe~E=ns!WKvyIHDae3XLd!b8Bi|aMIoaaECJT~M4tbjH!>OE`W zt4HxvI178iL^F9^A z!q?qM2bec(p^3e-XWK2cIt1Nua_<78x8nsjS+%(GG}5jAEd?SuVg#=2>ZV$b`hZOT zT=PMhw%rTpG8ITdl2PM!Huv8pCks3mdC{HpIUn{7yUm)iepa9M-6--J{>M#>H9VI3pE#?p(oMQts?z=} zAQif}m8x=3*U=Idd_%7Dhg^qsDJCTJO{3H#4M%>E!8+V?(TMUmbG#d?;5;0&eW2i3 zFALOLN1<%FWWhq+#KwsQ3~oUy*4(SLAA}Slaoean^oR&x^{VS_lE9y6(d6wV?jsnc zY8EvUbwo`Q*eWnBX?PYLNa;>6?<GtCr^xjjgwMy?aNjNOL@zt;{tlyK6k3Z8E&Z037r56@t1xfuB-oYRLH zd*|)2JCT_@IkJCqU!2W%h- zT~@sUl{rd-{wxMEN+u)95w3WiONWB=%iV*~U@T59JLos?go~mnLYtL!W3OUId9jg; zB1*pk5HMLExpp%?Am{SJZt9%YY^pSJA5W52giOnDBsMvKJvR{roj26iACVQ~iXY6K z=cCP~8{J!n=R%V%E|x<#-L|dCnz+Q-%L0bbeH}wU2S111YUvDk%u+>?xjN#7gvTE_ zb^D9bwSK42LsaQ&$X|%7XsLNZru$)X3{+>o6fv+Yz)+zllJ)^OLeN$nBL2O(DO<*w6LO2G z%3C99Fd(eMii|$uj!8e)rczI*K14I>JKPb5NBa6eZYk;;m#g>8P_!}TMf_Bq8ms|bsVp8UhoSpoFneKJ4-Z@E+du(}indwwMi&PIIPDFT>EeoILB0|qg zoed)G<)}k;k-rpQ8n(^*cA})-v%-pXa?X23_yUl)n2s9zRPhJ)}RhP>40w$^lqSegN4s5q0M7P(!xLka4^JJnrqG$`B*z4JGDI|(tUBy!ot5hHDfin*b$HAk~wG{cfNP&@j#0D5&DYF`Rz3`r0nU$W5I@y%?e*Q{OfYE>R&WWW` z-oWOSt6?R;-7xDLNwHFw;H(8J^{Wz6U%iJpPtNhF34Oq*IN-edlHe;`vULLCbVjECtF172?=?E4%#6hmrnoOpBSj#d>7R%!6=OKD zL@>OUu9kk8zWGdzX`l5FDt}LNk=7XWD!q6cH*k5>IA=lrlh-q_U3LEJ%Dss2{XDx? zuqTrI5W^o-d||ROa{MMAc1(kDfb+GH`a~)qneUswbvwd7lKYT^Y=su^K@MSZQUjTk zv5=q`)8=SuU8)Qve)(U`uToo7fODLkwpGPSVq4O_R585o!^a6#DA#3QT7P_x$RH$E zAfJs)9iJ+w6n;Fj40yR+#jIm$qpcODe~EN%k>MKE&bsj=1>ic$mL;u1CFhrS?IX$l zaMu7=?ufA51!*2~~_la}-2Au$9-ghXqRw3m1wrqOea z2e~QnBIoKjiqWL+;AsBTy5vjXn6-@O9W09SWif|%@WDd0&VKkr#GahL;fJ()k>7ea zX<2zRqUhqs$<%6~($az`DEph$XsVCL(Kkk-I@K7CQ_|L33;UiIF;0{nvFnW1(C>}t zgQ4J5z7vx*8zFB7Znivq8ftf1^}eUtYTT6I-(ZJ(`e54epM#`I{FpRe44U9GU*eF@ zD6ZWJM0Pl{>k0`imNfgyYWLeMJLVcrKFik${{_%7m0odvj&M6uGC=`fne_MyuoCJ! zg%jDKtHeRYvll`|%vYMxm zrpE4*GTEr$OY9oAGU9Db)V0{}?kFW_z`LoUuqMV!cVrQUwW<)f2Vm*lUXJ3p;G+@zhMj+wrZmak3YDYyFMXoM(y zz2m2tf-f``wiZQ5M!;$|?s~I?|3t(T(2G{XJiF?X9{o68U0oeNZs)N%qmt)Nbay>X zq-^i{S zQ7QdIcq6Uu$o)=@brMrV{8+z?)}coz`}iPn^Lm^$^MTaYCc&D&P?$O3=Nq`=7U!ER z+q+&LCK+cM_?`2!NsI;mBXi7&%VtI3Y+&FE@5Mzs-6HH$1a93l$_!~c>P*9J^J#~i zj%TQfznQ3xArG6!3$ECOU_`vf097&tDdsLo{omaWO64qhHJ?~La`O`8B_)NHJbu^P zxQYY>K8{;qVhTT22O5U;=6w$ZjvGF1zI664Tu(-tXM)O}>s#hHJaFky97)h-oneG<9cF?(RebM^|Ci|*#ID#u`GTRzOdb==L! z%akfm&)2CBpg)6*s1YP0mO;Jf?8M86?9y+q61TCzL4GpZI>j6WpuLJ86qojPP$C)~ zaT$WSoUhY4PXD3!z}d^rHeTF7j~Zk`&2`k)#?H(-O2ae=u2HV~l{v;%z6(Fe(RkcA zM%IHZ8n@D zpI@&i{`<|(%O|&zj%s-k6aJQ*id8vLqdSr2*au^oI>T84?*PWU;I*d!GT)nQ3R7$W z@{p*DJ>ZZn8EYxm=1uc`~QgvE!-UMtY7*w4(Kn2L1*r4#j!fyLEL%yRJm+qchtB&7!f`dzsa;W&mb4zP- z{ayB(u@k+kMYhiPe2sg%7XWh?lmGDIpB?|bvI3FD*VUSJm!yhiet1iCt1YuR7Z~*qyO#3St9Ug-udIkO9UNbx2l_VyXBSJ zNsGU!UAT=NFCw?O#^3kNAjmDxCIkY+&~y2tSqx&6nR(k*Rl7N$=jL{MH?g`pt_|ATeOK=c&E9Vt7|Gl_yS~;y z6ufj7#M?(#F=3hBU(z~s*#~HTr9WDBPx_9k55pJA>=Xr7TEV?3{B}Bv5VjH9T8?0h zN6Rb!!Lmzi9C4G<_Ds+7F{%uNQ`*~qA*bi=?NEt&vXxAlfKh3bc@yZfw{srIe+~FpM490xm`XX1S`wIr8*O_CMu>14e$q9Ph z^@5}nEw2PZ&D3cA89EW*gPxLd_f&stAbNd+>Aj!WTzg*`+Jl6v^IK~WWw+ky;dUdQ z*Y)pZ5R`SuF#wtggT119*-zTvY@8deEVo3Y5-iy*trE@EMPbyuqQAmEw&{RMy?LN$ zo-lzOMa_#eHC&zzaTr;>1jm`q!ZICs)PYxc#!n+$WlSV8D@M`_2;DXMb}D{Nt_A1o z5&=#AX3Ya*4>CAikb!A~=laxf zv*QLdSOL4JGkCsZ<#XBDRPSS64MkwDSqOTl$*mQ$Lo;l-Rf|(BfSG9Hpz)L;_A^EV zTaF$Sx3|U&;c?25;`O`MC$?@PZZ`tkM-mIzYP-u3>+{gnl%)s6l;!clcFNC-VAGH5 zgPp=#TU^wnk6siN{cEq2)LqJInH+Ro`R!&_Ihg^{VS4=8Bmt3GLeTW->F(~A^DB-n_f1hePVe<@J})aPNu}hd==#>v(a{!5dFcT#`c99! z5`Wbf1BI0k7d*ljBYQF<|H>RfY>@&{o$&_s&gY4_xLaRY*#t4+&a_BVaOPHi9WBRo zAd`x_OYuVP#qwaB=k)Y+Z=pQ$)CX&Cc0D~%2+d(gvznr95Y^M3t>1B%@x*d#3K|W< zHSctCaP-bNeuzO~F&&-NsA#pP!HM`h^A>1H)Qvfq|9x3N&0+Y0BOD|8WOATiLH|=1 zx26Al)7OdB;$)iPCbos9g2cnL+5AIN3AD10@G0)ZvpXLjy2r~6zPk&t3RNhoS{56TUAZUdAdNq0Q&7&bhQFzf<_=q zw5(JWA`vvADF<9fHzUyA!GM?0aBfJHX+j1)a+Ba@>k{h1j*N_dk-u7ElgeP}c2EJ-XoJ!TpG^{(9Qg# z=*8^9P|-m8O7l0tLjv{*s}ES=07N%Cicks0=2b4fV<~M0>L|sKRARA+_y!{aB(tTY zs*_qse{PwA%X7G-pa=grJVbst&BsYJjSqhxY%PZ-Dj*k0# zEXwBv?USdFVN{1-6o1xvl8@|2*yq;aAMn3RwS6&2Mt)j2B_U(UE1(NX{!W+}T(hm2 z<(nmjrvPnGX1gshh)oaR1LC_4mesXAr(S@J3fDROoNfkCGvIX zbyKp9-$oY1b#gQ9#ZhRZrn@Y~b+C`1HNQ%DcM+^U{d+m{(*y&gpBL}1U=G6HjMz8J zll!M!ea8JFW;)Fvb?;9U5&S=ig`uh4^ufo zp*Ng2$_{a;5gK@LeT1~K0D9t|&3r+SZYaWEP`=DiA|NJgb91US)}=1HLRa)Xifsn( z>5-iRGi9}%XkTK1J>9d)%v%Jv8cqJ&*ZBmA;C)pFH~f}mp# zUqtCFyRWXo7VfpTyp5N*?Po=OBc-FuAOZ!K?OoM9UI-icSAvE8#RcvZxEe zUP>hwUCyYT*KZ=Xy!$EdV8UfvT8JE;coAPWYp~BA!BQbRbP7=GJb}Kn&1q z)_(S&%-iL|+{CCQ(i%Ata32+FItwZpKvGjFANn&dFI!BkmBSqWJvL&$M=4HXc%K&$ zZtr=w9>N3-*irwHn`c+W*1Z#Iw#p8)*E>7j2-c4R%#uV=d9q-t?hu{+<9w;hm&r@9 ze$9i4;0YmqRL1v%7R%nUd?F&^7?}0Utm8khzl58fAGL{O+2h77xz2$&Hmq>{Th{6b zo*2~o@H}Js+pvATZ1v#`Hy}xx=-ekW)|(exCg8WxN$&1^)-s4#brjI5?cf-51KwI% zG1R-`(uc(Kk6lgDImY~QtN3?pr1yByO=8MfRPl|-^*!kf+1w=ORz|c7WYta;+0CzE z7-w5~yc^DL@7!@)hLqVWQU;n)bpl96)5d!?CY|`X5q#kla&H`Vgz~K8e6K49xn$f{ zp$-~8-xoOrc~8#-tGSNRw!JvRWXP@Vqz7-`%iTt~->ycquFs0wvI8op1mvE@^P#r} zfpzp<{zuvPI}0g@bKWVTMo*o+R9ADq;6(659X&^<=ESuptj6b$8}V3f9|EYn?pX&> zzM~)@4AJ17j?7pz$0d~%NB{Bf+^MSZ8mzK;tRP>QgLgDOm9@Fl(b{T7u@nSF+%?em z?~Z`B4unY)-2@aR_g*L_;p`IF*`9fgHpxo;)Ju)Ytmaa+d>Vr|{9_8OBseo}15`Sb zUju*mvPcIC+H}<}3{u#^}G@ zf(z((G=aTcr+pcf2>}MGr22r9<7fmCGP!d^KMSYpLR+F_|5cxPS|Do-ejS1soDSiw8#_D8G5$E@GKy+!&qZ zA&BF5a*8GP7@3!2Aenyv-GR^~ckoi>23*hyO7T8ini`MoAXlL#3l!V0lRUU8=_{L1 zFetdy1jY*ysK*!{cfZl+U!~$h9>RJ3e}s$wl{8cl1RSA(Fi`)S_TKYZ aEcTM%nE#900^%}=SMt&zsVWJRkpBVTV1mp5 literal 0 HcmV?d00001 diff --git a/milestones.md b/milestones.md new file mode 100644 index 0000000..2ccc100 --- /dev/null +++ b/milestones.md @@ -0,0 +1,22 @@ +# Milestones + +## Initial work + +- [x] bootstrap a new, general CLI, `intel_fw`, with an `me` subcommand + - mimic the `me_cleaner` CLI, using similar+same arguments and switches for + compatibility +- [x] port the logic to Rust, using `me_cleaner`-edited images as test fixtures + - NOTE: committing the test fixtures would be big and a potential license + issue; instead, add notes on how to reproduce them, via public vendor + images and extraction utilities (e.g. from Lenovo) + - [x] step 1: port core logic to produce the same output as `me_cleaner` for + Lenovo ThinkPad X230 + X270 + - [x] step 2: full feature parity with `me_cleaner` +- [x] expand the documentation + - [x] higher-level view on Intel platform boot flows + - [x] how the Intel data structures work, in prose + - [x] adding support for more platforms and variants +- [x] work out a reusable library, i.e., a Rust crate for + - [x] turn all `unwrap()`s into `Option`/`Result`; add lint rule + - [x] add bounds checks + - [x] publish the crate