From 7c6eb4fd25d76d9a28418885ed88aaee1af207f8 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Wed, 28 Jul 2021 12:10:17 +0300 Subject: [PATCH] adding an GetEnabledSubsystems API to storage miner --- api/api_storage.go | 2 + api/api_subsystems.go | 61 +++++++++++++++++++++++ api/docgen/docgen.go | 11 ++-- api/proxy_gen.go | 13 +++++ build/openrpc/full.json.gz | Bin 25240 -> 25241 bytes build/openrpc/miner.json.gz | Bin 9479 -> 9538 bytes build/openrpc/worker.json.gz | Bin 2710 -> 2710 bytes documentation/en/api-v0-methods-miner.md | 14 ++++++ node/builder_miner.go | 2 + node/impl/storminer.go | 13 +++++ node/modules/storageminer.go | 19 +++++++ 11 files changed, 130 insertions(+), 5 deletions(-) create mode 100644 api/api_subsystems.go diff --git a/api/api_storage.go b/api/api_storage.go index 154abcea713..3d33f38f43b 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -166,6 +166,8 @@ type StorageMiner interface { MarketPendingDeals(ctx context.Context) (PendingDealInfo, error) //perm:write MarketPublishPendingDeals(ctx context.Context) error //perm:admin + GetEnabledSubsystems(ctx context.Context) ([]MinerSubsystem, error) //perm:read + DealsImportData(ctx context.Context, dealPropCid cid.Cid, file string) error //perm:admin DealsList(ctx context.Context) ([]MarketDeal, error) //perm:admin DealsConsiderOnlineStorageDeals(context.Context) (bool, error) //perm:admin diff --git a/api/api_subsystems.go b/api/api_subsystems.go new file mode 100644 index 00000000000..0eb0b67a174 --- /dev/null +++ b/api/api_subsystems.go @@ -0,0 +1,61 @@ +package api + +import ( + "bytes" + "encoding/json" +) + +type MinerSubsystem int + +const ( + MarketsSubsystem MinerSubsystem = 1 << iota + MiningSubsystem + SealingSubsystem + SectorStorageSubsystem + + MinerSubsystems = iota +) + +func (ms MinerSubsystem) Add(single MinerSubsystem) MinerSubsystem { + return ms | single +} + +func (ms MinerSubsystem) Has(single MinerSubsystem) bool { + return ms&single == single +} + +func (ms MinerSubsystem) String() string { + return MinerSubsystemToString[ms] +} + +var MinerSubsystemToString = map[MinerSubsystem]string{ + MarketsSubsystem: "Markets", + MiningSubsystem: "Mining", + SealingSubsystem: "Sealing", + SectorStorageSubsystem: "SectorStorage", +} + +var MinerSubsystemToID = map[string]MinerSubsystem{ + "Markets": MarketsSubsystem, + "Mining": MiningSubsystem, + "Sealing": SealingSubsystem, + "SectorStorage": SectorStorageSubsystem, +} + +func (ms MinerSubsystem) MarshalJSON() ([]byte, error) { + buffer := bytes.NewBufferString(`"`) + buffer.WriteString(MinerSubsystemToString[ms]) + buffer.WriteString(`"`) + return buffer.Bytes(), nil +} + +func (ms *MinerSubsystem) UnmarshalJSON(b []byte) error { + var j string + err := json.Unmarshal(b, &j) + if err != nil { + return err + } + // TODO: handle zero value + *ms = MinerSubsystemToID[j] + return nil +} diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index 39980023f0a..1e712a0aeab 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -46,11 +46,12 @@ import ( ) var ExampleValues = map[reflect.Type]interface{}{ - reflect.TypeOf(auth.Permission("")): auth.Permission("write"), - reflect.TypeOf(""): "string value", - reflect.TypeOf(uint64(42)): uint64(42), - reflect.TypeOf(byte(7)): byte(7), - reflect.TypeOf([]byte{}): []byte("byte array"), + reflect.TypeOf(api.MinerSubsystem(0)): api.MinerSubsystem(1), + reflect.TypeOf(auth.Permission("")): auth.Permission("write"), + reflect.TypeOf(""): "string value", + reflect.TypeOf(uint64(42)): uint64(42), + reflect.TypeOf(byte(7)): byte(7), + reflect.TypeOf([]byte{}): []byte("byte array"), } func addExample(v interface{}) { diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 7d96425ffab..4c9f936d757 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -635,6 +635,8 @@ type StorageMinerStruct struct { DealsSetPieceCidBlocklist func(p0 context.Context, p1 []cid.Cid) error `perm:"admin"` + GetEnabledSubsystems func(p0 context.Context) ([]MinerSubsystem, error) `perm:"read"` + MarketCancelDataTransfer func(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error `perm:"write"` MarketDataTransferUpdates func(p0 context.Context) (<-chan DataTransferChannel, error) `perm:"write"` @@ -3743,6 +3745,17 @@ func (s *StorageMinerStub) DealsSetPieceCidBlocklist(p0 context.Context, p1 []ci return ErrNotSupported } +func (s *StorageMinerStruct) GetEnabledSubsystems(p0 context.Context) ([]MinerSubsystem, error) { + if s.Internal.GetEnabledSubsystems == nil { + return *new([]MinerSubsystem), ErrNotSupported + } + return s.Internal.GetEnabledSubsystems(p0) +} + +func (s *StorageMinerStub) GetEnabledSubsystems(p0 context.Context) ([]MinerSubsystem, error) { + return *new([]MinerSubsystem), ErrNotSupported +} + func (s *StorageMinerStruct) MarketCancelDataTransfer(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error { if s.Internal.MarketCancelDataTransfer == nil { return ErrNotSupported diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index c940d921b0af50de4f243bc595a80f87b709ce86..6a9d9cb68382a58c2d2eee9242040957d335f2a9 100644 GIT binary patch delta 20849 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 M|07{hm(=S70K{y2X#fBK delta 20861 zcmV)nK%Kvt#Q~Vb0kHJ~0V|XC0*rs|)oie%DRQopmC|m9 zEo9k{xG3-zm`nf`%Xo$emwRw)<^A?K^t=+GEgz`VbBE*2|X^f3!Pjvev#r4OBJ--SZqk z;sOXhiBeO@rdwGY{G<1)1bgGfVDt}k5FE~#JKb9h;c$XD;;qDj@!^K`0qTRvGt^}XaR@E@EJ&=BKoMGop4QKd(xa9Ti7(;(ldnsRt6=G5P zBZ4jpmO{#?@lN#NJh@94M%;Hs8=akBUbn!i- zhCd<3-~^o`2VtMH?wZ#Pci7_L>BYfh5}*m>NVIw>*JGWTMST4kVjRwVWss5U=>kto ztG}m#C{Ca!?JS}RHEoBGq4x;MPu9?ylOM)i8G_V!8`yzj#kGI1ynpmCM>BSp)HgR{ zrO4M0U=YBC98PK(JcQ{lu%-q?Cyc8l;RzdTM|^G%EpH@YfhJ|se5O{A7Y3$9#gf@9 zj3>tc+Ep)MyUmC%5esb^_!`f2n^9z0!NWvK&1NmnNfLB%cU!V-lcnUG$)?F7lXmPp z)4=jBWzoY0SCxM|8g}+`JT3$4&i3xMfvy?zzm;^(s1*a_>_M!Jo1n{E-p3?I0aL9gRY2+ z$I|-7ld+5gI#a`dGXxkSE(!qT$sDou9zaPIlR?S?VoL#)Tydu9d6mNx$Y-W9+ z1dJS&HrxY;1_5%CDREKs<>c_J$>NckEb4h};kAE>sp8OM33yfJfD7dK*ZGG>*wueG z)il!`v=j3013GJt4nIKl9-$-Xx2k%IXV?(@e}L>PKr2gtGJWFuKyCxK+jP3V-Kuu0cC%Hb`9-0ThhXq}dYay= zoqA18?*k%;;r2S7u3zq?rq5a~v40^nmgNeaZmm;QE}^hqfs6W1A0+YNvtM zZ)ouxJp1;&x!{hwskv7Xx7++GMfrG)#d<<69&@MukdbX!aFy;M$(`o zk=HNqZGXt7JRrNn>(`TENCM>k^Ll(sb|-(m8V=nd-5v73$-p0A|Mqqo+&I%4)cg5; zEf~5?f3C(0q%e!=H_PWwC;{L5k(KCMBkf!Ot>#V-t!zsxc2%e2r#?ms_$WR9Ve`*7 zyY>82u)@|nQ#`BUlj;))<>tiq+%Ix^O&FwTvs1N36IsptI^tY<&6#XCT^8I(IM6B7 zPA0pEvor4uEe73rPJS8vC3j&nSlepTtFE5zf3>)s?YDIoPYZ|4trerG2cx$5Z1o<>N7(5g!kt2V)u}OudAgtN18+ZVoP|C}~5x zfAM*kMcTArlnhXUUUK@95~RG?q+pn3MM}guWpEWvE5vSGUwPC?B95?YrOG3gDy7?| zM8;H=Td%};}s@5bwL9p>)_KBLv3w0{$!XeQyE8K9GL6 z3=o7|z2RL&~x=Lz@Og~`Oo;_!SgWr2|t6K^Vlf zy3=7S2W=sCs+aiMqHGS@M%YXZWcVOMgr)|tTOzgu>o7Z9D!3(esd{EPOX);sUbm31 zZ9YO_#vhqv9KLNL8P$dG_NKzp)*gs#)YRUka7-p>73mleUM?P$yR4Ote^xqL>1d^+ zm5v$d_-aXvii%4#rs7alH+Kkae3wa;?9}Tirg`}(nC?A&nMqqHD*_|NW3>Y4J`7y; zX4u*p%HEQzkZN`h7kYYDV=PfKW~oRj4pv(7oT%?L@SfDL%nny_6nT_hGcbbAwS>KK zxS1$=Ow5~9x{@oBiHAdIe-x^wynH{?AS3|6z{4m|Z?8xcMJ76k?~c_yFtlY4BP_4p zXkPug?iTMy$Xdt9S9O;=N{uM>mU3LxSUH*9#^fzQc)Dkq(t!ay1~7?l4bUxS ziIbAOllx>`h{U2T%&dO6oDGSdQq+ig2$BcRNZ!<4HT;O6+mekSf9Q4*^Fp-K9Zb_y z)$t9{Us@@QZv0Kf3+2kLIED>&@c>r$+q#Qj=Lov3<)p4`;!!+W@a0}#y1iPjFL_wd zc+n@6E|HlL2`an=_B~gomtkh{E##)SB8eQ8(joRPhI1gu@6dd2rR#=C*VrJv0e0#Q zWk`dax@!*?h_{!xf4Z`6iu%8i$^@01R;!%V34ng(Thr zzcYP>z=1Npt+mSDho=A3l28o>b)M!I9P-wHLRVe_D3qf?3@*Nm{u1?;q6^)44Z6@R zHHQ}o-3A8Fh>kdQDTf?0jvbatS2_uxKh1%TU+CzsUzEA?f0q$t=oe`N^cYQ`h)l_> zRQmWLk!U}TjSYc|$Kxw9LVS*NNj|4Q?E;HT9tSe1_g=7HX0tG(W;=z+O`eT!?Ag67&iL+|4ZZ}vry(}swGJa{G>TdU*k|l1i zTjk5^VMO>5^qeC)o1Hc19ohQJ12f5D=Sxh_*+#oDKosd~LC`UdLx`!A(h{m79-%#i3@$-{osf5TY-f~tt<4G0Mzcy#0;aVJt^g=OXtviF` z;ct|FfBo>!?LWW$=ifKzPqz&k+wWx`Ey?g2mZs!uT>RRdK!`Dl~(^HR4;M?8&hq zkIVGXC6mjOz8p{$$%)w;0hCOr05b7lfh$Uke;`9HpaiHvcgD`j=X7n{>{VNCX7}Xj z&frazznxrI;?tdB7AHGxQlHa7fYHFzwJZ?bu&b-Nbk0McOm= zze5x(zKq8xSk4clPHH`5lLlMx#MCgBf4H(_35q!ellCqarF6eR00IXETn4eg9_nXY zViQ^!ct!~VzBZUWx1K1Ef|u5s0be}vPoqOTbm)AX?57eJGGF9}cTr`1Pic29FamrmY!7+=4+8 z?5OB+1t`^ShYm?uYM0r9(ln%R$x5pb2bc&DDFec3fBxv&y^Ek{)tX14)|7f`RqmPe z8zWX9P@gjBb()3mfdUrlLeMh&sn$d6ik4aw^1WJvA(Oe(4rd6W(dz(t-S744FllTuvFj6GUyqrV^xI6yuNW6n?kr3T@iBqD9V1#wXQAmH8>egzxP>2hY@Z zF*ZG^R?Ce~SG}uVYwJ@?uA%)&6OxW15i)IQg216}ciu>9f3DW%mA%_Kxj~s3CN?PF zvz>WU_us49OQ;_qJEczR>l9J-4q~Tf+UqKOYM#htdoAuiFY2k zL_u!>WZ*ZOg!%CrdTj*N0#kWgdo|=_CU#~^mZB;zIct6np1n{7&ryBqs8pLBo*>0U zE@LRVXDt6=f9jk$6i6|5((FSnHW8 zsLf4jTy~2?ue3rZP6f>T-_qNqU3hk7KgZ}nCT}Z30%eh#g^;);!k}g{K z2bYbgj^By$34Q6~a;>n?F@T;I-#g`TSvr>YDprm#e_cBA67R_JQtNe-v_m$3s^+*G}+((SbsP@2|df=Lk)38kXrmJm~} zEHi^HisHUYJs&u-mDLjAAQ>%$6p`Yo%#btHi8_Fg zhje_3Z~y{IIXF5wW*z806(>Wf7x!~dS*)6h!-#(GH?&x%I&ne6z^PRv9`EKI*4|ka zi!_d0xXS)b8mZdCaS3y?M$%~QX3n(Sa!+UIe_yt(Q*>3EI)bE7m93+L?VcHX$*#}8 zU$gan!4W%y*nO`h@6rt|Yn&qo;TuyG!)p2uSmUwE%+u8LP06U$z*KCm_E8E~(%uB8 zYNfoz`d8WJHvgWKLr<{Q<}^G^rOSpQse^U9wc!S2jGmgvMP|4z*GiScn09R3(gA+b zf4Kx@-hxzYwkDC;a=q6ez?H(Y6$fdW)gVt`1O;I#23tPji34V$mel>a4SkaP3TAHE z`que+QU=+Kc^m41Tbq%=Mv&_^f?N$3ZWujI+g9!%4n!0LA_>QkM46M37&5Y1J}E>{ zlR+G+BBbdivym?{f#u?8amjlDL)wN6e@Nh;iVV=q8Pvw!>j+KT*n4*ud+#Bm+gG(W z8YSO6VAm~SZB)Gq&n7vy26=4z96Wo$I1S(g>GUcW>em6gUXEy^jyt?1ks6ChY`&O+ z1gkPUA;<;EIKVidv)tVY30k|ust+PrRS~pq9Kfzrq132GX1sfpRHfALeCob{zg+qU`9R@h5#YIC)o3mz5l4wAK&v~(xg zT1)!vYU`B^$keh~Mi%58&3w)Pryx-8ZSq!|ywxUey%R?Gwl;aIcJgSOXDq5-#qwew zk}rXa0+nwkjuNnx!>P8rVrwy_ChBh7IaVi=IvHe=iIt84jB@C(l)j6Je=JDFc)L@3 zv-5Z_H{vVIyD}n+#6rFOoq;}V?$Fk&K1adW`!KA(5%Ep+t@Na>Q5&>2;YVx})*G?u zC%O+)a&20wryL*UsezSO+qI#KBB6X4EVQ0+LRdH+V@IaH3yIs-580q)Lmw7nSX0wg zw}_{HOv_Cx%gHTM@EC`le}~+(FEb@^_6=V#T;M3bvMZv_;$eUQvnibm!^2x zR!#c%<-I@Y(js#rOX~{k`YbL#S%xB7=5>7lIZD0?23D_m$ZMIoe}gO849g}QiClS) zsOLeBf>=Y+H%xs`oH;QzTB9p^r-B`fr0}qKUWRA)1AU$bBOd;?fJFDFV-Z z{L)Jy#bvhEL&M_gZQ4e5@s^D#+HQBFbCjNcC;p4pv9T-1#!Uqp!`hq4@?N@!7+Vc& zByFqptKU3mpkBL9zmQ;BC17xRohIw!QF0K5b7gGH4EI>0H&LV9<@RnMOZUQJJE zV_ytC_a^=5k8S4JpuXde-VC`|F0m0NFj%}J4s`{m79WwJz1>tCk(ByDTR>;E{#qbz zW~dpg#nE8BY1Q6#;Qd*2qs*~pBev4f4f1}00r-9l$sVW6%!f1G{8UGYYKg^ zp&(_i;#y@&j>f!l1(*`G(Ez9v;faPWMz|#EupF6ew*(@oVbnXDmQj)gA|X?Hvq1ba zHEgLq#L?sU))hJ7U<|Rx03OGM)B{cdx%Bs!sTuPohgOD)9 zW3^Zs_c8K1yh&j7VXF^YeRz}g;XGS3+@qi1?R%uQTf@a1)x7fyl=h5ZC6B5+C%25= zGJ1c@=r@beZ>D0fw_Oou<&%t&c;LE+(1YTWH`NL94KxX+UuFTzSfju*gWCpq3TjMU zQNaEtnn1|_mn#7UnxN}4bwwC(s*cNK5da-dy9*n&$+nz_Zh6`m<3kxXsB*S`;=b1R zoR45bg~3im91F#@J|KRM7z%DsaXFbugH(SD#&Ic(k2eZktm9~-Y#i0@-bIooh^vrX za7IJI0Ubxoe+sz_B;kZXfC%>%Ac!hODOL2`JYJz-?Y>>_=s`tb3biuNk%u5d?LyEL zn`i>@vT&~QmPWCYRqtw)l3nlaR6<0cenikM-m0TTJTLOe`^O#p#lW3o12(6mu40b?~on~@@n}Lte zYej+;36E7Iys8M-AVZqyOZ|drH5Y#hxdtko!{pmbH1j>kQR4F@AAe$#TE?I2qZ5Cx z62hzPeO-BGWhTMY>mwgE=?n&9H+HtxyK;-@_b#z>tzyvpasK`+pmbbz*e~PzsFy!_ zUoknNAyLi*OKKe==uje$f>{)aN;^Nqzq5g$QrW+D2Yt~Q!DMnqFSzbUM$vz7<}Z+? z;ztj2G+Q2fzC4svtMl`78WN*J{jz9G`hiLu|1+L1v!G1TM{6+BZL&bx4LDgK z?LJlHUDK?VbtK5AaGM6c#xva-Mn7o@@Nl() z$E*=#()MQn&y!xRkL`cD$zDa&SjpHwAjzXo$e6Y}U`RF4=-hdPw~nR|6KUnFx_tf# z3#~kAf9XL)ik9vUBC-Qqe)fDhMFEm-#e{OOKpa4_01lna1)SUFr!xKF6(0dxF;kL?i z^2ij-l1Zt^2@-$mrU*Q{Dw^j9DXf79G12KoZGt-EjnZyKUC2Dp#u!%=M{bKO-VvdS z?{~EdQ*7amf-rw0J?@sV&QW!m;_v#eM~tx0v5@jYq;YEau-_toeGoB8YVs_54nF5Hj8-NKtt^ zcVQ)pJ6nIVxhOp-Q@c?@o2daw-DM5qdW?pFgE~y8U}cPzF;>PrWEo@aO4hDaC+l~r z;?fHFax_Iw;vv>b%x9XYk?^|6SwJ~eALH4#@87=b$Fh|R4tdCy%KA)?wPL=k`Q|b| zKf)#AK1-gD0X3;Y8XJ{q>X>w1vo32a4XcUP=8oL{SWA2H<_56 z3(4ALXc_k?*=QBTTI{t}yH3dR#vT_!fSN6~cR`Sv{G^4CSlx>7As4*zEJM@Qi|Vza zzCjfpN`3t=zpe1qADIvzRK*jH1sWS~2H!c@yFWR?e4@CS{o%lpTLM;{REN`XB?`in5)FI587OTUxBE)Y6Mq zt<51|ywYD)MT{07^aJ8Yl#FpP6qC_vkE@rg_*Cv^xy)p_r4TZ1v77t1c_M4}LDI8o zhk<7hIMiPNI({y9Vve@xmPpX#U!+Im)$qK5@;o>m8@2>+B9i4P1@b! zows#CFIJ9sVG!!VEYL+e>%+1L7j4c>8pp6mQ=yE7(DN1mG69yPF-x%TzQj(fFBfr) zr!`&tthsl*cyhcb})#9-k*pD?)k-r)Q9%dZSamlR|8URcjFBBUAU?P25rJL)>qt3N; zXj`*GTdieGFHWP$+8JyO+d8vauR06eEOdM5(Cu+~)x8vikC zUT1G4pYFWbt%`xe@Z`XC4}3qMH!b{dGSwU95-vO&g6NK)zgzP9RmrnGeZBu#AsS|_ zHkKi}8|R(;Jfu?&ivfR$0SJOC*mIU5sQwk|m>-}UOhe`^fM6z+Ar~CDuEfwm;=yym z0f*N}G4(O^JUSQ3o8ra$;40kS9y-!M!SEywNhY46zJ9ANB}VUr3Mksrq<|TlWQ)ht zL`L?LV_o2iWJ(0(-4QfbX8Iued_F~diqwrswetlj(Z8hS1mA)%872r}fV zb{_9#$ok~W8%%966Z7U?)=a1_UNPO|Iezt^sNLJ3;3Q>%l*`?YnuS_^dIx&xc)l(2 zWLry(wbXQKsc9Zx`XM9yy{ec)3R@mQ;-I3=V+in7?KR{36|lUbuS+N&kGKrU*P?h$ zizENp1PrezX#;=ZEl9T@-GcNrf^-XeE$p?h*TP;4d)va^*HuC46c{^G7^f}n)zw!8 zzQt#|tDs#?RhMu#8E78w)?(d=5)CDp7^wiQ+66m^{DdOdx<-_%Nl3w5i()N`-Dqly z=+)vuiw7+pw0O|s!M1qtO;uP^0a#Y?a%k@25Su#-0I+`*?(5oJq10EQ2JO{3C%jB- zi4k;*jEbWL-~l8II%2lL$#EwbFzzqcwk#CkL_`3$k!9GsiInKVm5gbkoSB`&V9Gfa58)ifATs^Iv0tb3tWQENS zAxFQQ3{gj3^K?;tHH)Mzl3tS)bd#wqp5dp3jTx!i_uyc=$#eSpLGH3QC0CpUj4+$p zf;QDQbc5ANtxjrnQmd0bLY?&Oc2)dvh9@gHG&lEVUZR8M^v&|Cig6pSSI{>*c66@w za*luW%WB=S#?`r6rCh)Lf2}%Kl{d9jxva|dQ0BO(a&4j#^U&`!K7@5!RK2VcW0e@I z#8@T9Dlr`?F@vhO-vU4f2=aCgNvdj<5)&&M1Muy8sZ06@Zyik`ChvUeOwF~JbfH!X zj3m1|1tyw><^fkUC64?j4&W*@jyd!^#0`J-l-OT9aUoZVLr&XJXEo9}UI(4c6$pt( zoonERfs6|kL4NfT6U;I6zzBLm|1i4tsm51OR3?xCKfq4cO2tEfJ4NN9ushZek+Q(f z+6LgO)i*L5dTpO!XM1ORXDv53tqRh;3bHYCY5~3l_!i(>fd3c){;(=YJ;Rd^h#!C4 zKSDeWVUk zRl*O!Iw$xBk<<--WgXc9Uj*MQtqB7J#-W!u>$-i>(n2MACKPy-Oi*w|pzk9XfGLtr zx|YXU9=j~lNN%r`Wf>_JS#O3B?O-p}g^t3sE9G#xLeWG|c__-q<4;)e_EmpPF!m3K z|AE>i0ZrFlLDtFRft3{oMaCM{gm|20*OwEL(rN*m(U8b|SMN_wl@f5HN@0>d5s<$e z6mW3iZMFZ zb0uRfw=IfMJ?(W18{cyyG5X`V(f$xT`HH?y_Tqx|YqEY#*00I>HFbpM-_(TGKSwiq zgH#HmR**j3z$S&)Pt(;Ie9sNmJj8y6ni#+f$SOYl4fK>%M@Kpx2XvMRx3A79pyMDv zO86Z?cuv6#UL$o=Uz#}gv`2&MsIQ|h^?u=^gJqX4;Jv;dT#D*`<#8o_*;>0Zys zQ?+SrGPMu=cC-!4Z?UAsk`_x^EZG)IzO4z%e=&#tDxvvP_1Ax#p|tEmYzLwJQv>J> za%Lx`xz#vLQ)$fD#AqstDu}wq^iGwbPM2pftq;s9v1UnjsC?Ea3oAE{TAQ=Mfn!xTa^F!Q2t`bcPEyiz)=Q|G6nHhc=ny*LlHGw+I zaD1nJAQE{7QN7O-2uZUOs42J99BTL^3+u!X>n5d!bC+A*O6f2ZR5wEVoE(fkZ9 z1hQ|pn3MXe>Pg?eYXjMZj~t;W>2{42rG$*`^rg(uma9!x585zli+WIIiLHT?$ccTPh;OoS5d<> zvcUwk{)FcJ7~g*>8;*Vu=g5uO(no|RQ^T7+4Q}9EASXclEI@dsFFdvSh8K83paL0< zW_6{7b15IRo98>@-!GVr?tdw(=xxE8U*O+(TZ~+K^Qn?Io8Ze{Mr5-&EAPS9dR4Y1X~EJ@`+R(-FQ*tIZb3u7&ewJ_GgSPNqCV|CKRkOgr4$%#j!pbQCaNp->nYgHVOk_oI!7 zGT5$*BNl~-2uCx#ngCZ#tj+z)^yXxSnsr>D%n#Rke%a$Xdt7HBjfFH8(rhfGv7TS+ zfAjpZAp~p)0b?+}QxRqJf z&T)CFRErGoDFS{t@~{K0(IT1+K*#dU1m7S6PL8AJSL8{e_S||fqPC;m-Y=x+_lIoC z1F}23emxn6BtY&zugAA!cke!HqM$LA{^f@64QOqYrn) z7Y7w#Th&hXyib^*;5`gI-aN!gNgI{?afG*IUTm3Dxq>}@`~E_Kh&e*f1B8;7=++l&2*3OS&T69!<8`4ki2QF=Xs&NV<{l5*^mG0QyP z-LcNh2U(lzh*Zp5=jXNDw6nt@x#-G{gQ6GfJpeLJr7qQD1Md)nqv1zpZXUBEI*$o| zhjrOu8Xm!zUnc8UQ6vd)quHror-mt)Hh__vMaNH7{5t{ zwk$jv*AhiLO_o>BfZc}s4ZXfEv`+bwrf25(aoCjd)?6vX|N27d&X#gjD;;|R4cU& zR|$`;;jF1)K!Z)*xR1bLN8Z+H0Po)qFo%Y)z6T{KtALGR^K?Vte*PBl|^rChu} zIj*|k&{$_q_1fJg{odQ2PPP@NN^fNYV^o|^edGGB+C6EJskyR zlhwV2is3*e_C~D*lgnK&tJZ#5VEyW%>kY9lH%5b4&q@u-hI2O1bPVDQXQI=oj=swK zHZ8!>tuIqq9K*%AOqkNXi3kXI$epyf>-+B3$4x?MpQvOVZM(ZrVbkc?6ahdFxvkKj zTB+(=n{}23L+w6)Y?pZeHWW?l)CJ5?lI#Xz4~{&vnp0g_Q>$SL_2dvwP7IPCmiAu* zB+`wyg$~8h8l#6ip=o=+AOTYX=omnS7=B@q$zQ<IoB$dC<|AVL>@12{ zh9c4nzhWZemo~Lxo}CWrqCm*4eT<;%Vbbeh*H(16fVmZEmvHsTSaTEM3+jvTCeVOjF}&DfeR$&K9U)3&5WUx z@r!UY!%U_hv_QDPxrcQTH6)jL4@0lDi%ZhLYCL;{`4}V5-8#hlz4*h7b*rvx_;#V) zmh3woqbcuy)|ADJ8$^^uXRA>r(y=JGi0x*X%O#eLTQ+XO#tW;w7-77mgu#5i>hG*6 zy2ggG%iX%52y$bW8XnD=rKr9dt5g=wxG^(EDN5Ek0%qH6$t3mIOj)F)spJSD>wsc; zpyh!^PKVhgT=X?8yf^VZ`7$S2ACIpzxXwQLjON9Ehhkd?)H{fxeyFUOQT3xKBomZ% zy*NWCIB|RXy`91F@Ha}oe)#A1pWpuT?;G^-f4Ki)?|=or|JR}O_4ec8`-{Ox_KtqI zybV5`-u(7IeBA5zWb7KTypz5#aq0YwUT_JkFXc?XiO;L0$H8!S`0DNJ;hW*!n@j~5 zaQV%DqSICx62Q6=6g=_Oz?=XEQiVf|z&8dYpLWhMLU$;EEneN`7$MRUT` zFJQ}Y9p3L@8gZc;rnh5;IDNzaBdmt}x2 z3#HRJMOMNj>3?+4qV&%vinA(LoFPg`9T&gJAL+i$9S?WowJMrChj}m3*r`APfb^lc zE^&^04?5@w`q06A5zUu=tSFD|ep2XXUd7zMrx+-ONdhQd+?eeUkgaC#i3hck+Xtbe9>qR*%8`HYn&P45I( zZ^!IA!xYI;h5aABb2vX-aHN0B%d!6*LJ#xBf%{kTR3_cv&}&ieBV?a2(T~J`up1gV zGWE;s2-yKOXt_XeV>y$VgjJ(dPfUEklCjs^(z@7xylK^`XV2wrgB;dZW*{ki^SZE3?$QwVE z*EO0zvP?@W+BRexTjq|ax!${fwsI84W^C`s(d9tT2|bxTPQawd*bg8FjLr~1f(=R( z1>@UTJ_;~(uShy$X1emr0D0185;cw~VKxMYWv)wYC&?}=+Dj8e*nL4XL)yPt}+ zD}xxt&rXPoZWX@!;-dsQ9(k0Z9wL+EiL{y@g`AGZ@w2be`A>F#l3W#)O@GyH zfnp1(0@+G&`^t&1;^ir&*CXg$XNfpQjt3Re%h1!*TQwP?k%y|9AETm~Z(&j+Gr7hU zN+!ZAjD}nRCPmc>F}k#uUTQ{8pcP-bdEICU8P_bVSo50M75(JAPhagU4d@k}aIJJ{ zJZa=!ZXhPz-@z@!%veo-kxh!i<+l-o_|VbbNVJH>-blQEHab`u$w=8s4m^)4;@k7m zTuV(DDjeahw9%%*Hb0`&AbxfUE#=%*eWq5tv^dr#M)y2*&J;P<4B)ZMXD;4JBW3jd ziE_;RqF9@^*jwu?cHa!2(&Dut{c!oLiJnrQFtVyYY|cGg8Z=3N?F|+0WL2&$TUjx! zYtq{C6xaE#>k_-B+HHw^vtu-czG?E(206td1hS1lE+(mhE%stQ*X&CZYuzcn(dVzq4_5uH98<;L4NX~5BgU4ag<08C!&V=gm1B2le5KU` zmbVC1{-VU3QE`)hW3>q8_Yk|h7`5CSv6sdy&zU!33Bb0%i86kSvBy!6vYIe;Mg=`D z79lV|029XxUF1I1L!IKXGm{nDYtrd0y0|-_wg6!Ksbt3!*nJYUp*H3XiL;XByfI>N4C^e5zoI_Gi& z7;t*gQI~996K=%gW#57Phb6fz5o2(I`T#N(&M=t(%)uP8*!HW=5=S0&u8To~6yV&t zB3I;O450oEuF*mu5?^KLb^G$%5vsl&(TDC;6dKczxPTJiOd%%yDNq9*jko(`}Oe7YQFz@zjUxghiv*?1h0 z6n6tAki86$A7CeHijtR-{-l^7eT4LUBNw~`n245S;xC4@d!iT`azSblZGB>sBdo_x zCIn z<9UGcDGJngLL3E5eL&IuGe*O}LBG0)aZIG?v42GfB@XJV3ak$hceb8e6>iO-r55RF z?!H_nE0x{Zw#1eZtO7A4b|?f4dE=LVs?10%3P-o0!LVSsacf)Pgex8y%#aI43jjfE z<$ypy2?sn=8zDmLa%qPi$BuaW(ua=VW>GI;2T{ru6$chTe~7~)-rGBoGY1)IFOy}tGT9+Sa*?EJGgyBSPp^qS8{?(H?a-DMI| zeqxhzM}C}lx0ow5yWQ`dOHo!%zz4{Ff0yy_-~N<8jwq82d{P{^yYCQpB&X*PGV~sy zLq(T(^5q5v?-<83$$L{T)SXF0pmY#P9$n&S^3TyYBvH#UCX5<|il_5ViYH9TWdM~@ zV3&mXl6WU@U99dXdE4vvj>G79Zf`sOPc5J+3?@kyii>b0V37XZu)(H59l|DOe}|?nq^Hs}>qM3kc{ozmv@K9JI{;B4k(7f01Z0*0@?EGuth$L>e_%Pl@0%{Jg&#C-{lPV5^BQ z8(<>t5++#KRAm)Y(5sQ9GX$#$V2Uc1Q=H*J9ZRUlPRU_UDx?#Zd7T}EeRV%fRMMv*^C=2YbRZO&;IGIP`TXVb z-9C^4c>NKEusB=Xie~3Rp9K*BN;!F8FF1ht7cgT{m-d~ZUlViZAkmz%n)Cq;2 zkzX9_{-W&d{ZympdJbfxVx2)%{)#AjWaOTRBF#N|P@s2fZRazykn!~SOmRvok7wkl z`#@g=l;ipndLEtYpo{LG$(ejN7tbK4&ssDj7HQ8p08 z@H$(|U9qx$@1wp|(WT`J8E9HLdV`jx1MtmEy}1@%>T z&Qe$ETB>^4R@M-)e<^dDGwI1d|I1eBQVlE&+VCQHfu=~MQ_*}O*H~G3`spwrQoTW< z&QneGXTvz%w>-Q%KlJk5UPMBb<#K7 zv8qq_0rAq?{0*d#Zeracs7Zv93}Iahpk%y_q)$Xm`r=URe+(^yk}ONjvjxs|T@rd8 zz$EdHjzSNLW^mfOTiG9D_i0gJDe?BXTc#?UZ3uDsT?zM@5X5++EHeut$Y<8TOhm1vsb>Xb@dCXQoqj4ka z#-pdyX<`tG>FOGerU%>zkR}w3F>zU(t>{-jej$(SvXJyiXNk1P?r9>sXs_49x>P9> zOqWfvnaQi!Jbz|`q?3)(MLsq$v|AUOyFC4Cdr_2be`pQjs5ED7b2CYX%$gui%ereG z?Wug4nhCKC@oC#i{Km|E!)3lIkB7DE@aVtn<6`xBD>$q=YiMej`(qr zY!ll`i`?67O%KtRwW+>ss_*q%Rmxmdid(4Z8qV)FYu#xBt6$Y+L-^y<5e`(|V=@uo z&|5?}f3O|Au4&LbC~BdJrEs~X+ZxzhsM8!L*N=Beh}1f&CmW#d;8oE2ks2HI^tj1Eh(pDfBatIul+?i9tDw?M&61&u3 ze-B_O^#XbQiBNzD4;Il~xVRw>M;?lryCO+TPtty51#E*Oh5WWF9w(HPF!=i0Yx?jT z%6DJa=f{S8HrHWY>V<3%EtHGOF)mXqmhoOq zTBJ-w^){HbTBz3vXMMe0m&xEO#JqK|99_AJmnLCx1|Y6Q(oV*}~fKsp;9NXN#6*^HPlMc}67*V;V0b_Z*5?Xr<Qt%r%5|!%-c_%WQkA8!#txqDT0&I@ z@Hox_C-C$P1_DYzp<=mFqBI>Tf3zRjuTiP}A_8|h+0C-l_s=BUf!R+ea?W(SWJfGvoF+^s9} zJJYr$bjt%IL-$B?p@kBU7D_xh&he`1;_iYt<>}K+_(qiaKhHIugJ&<|_sf(IS*V-S zoD@mbOhfgTKKgdTKpBeFf2p`WC6E&8ef9XG}kWa-63Rc!rrJvM1mth-rMiFkfWCz&rq4orLAG7aCwU7Og=SN zv^Wg7Ifa)nm^8P1^m|`vaE*fOMX*&;-KEyTlM7Sudavp}mDpq9e`tpJp+E}lcwSP! z3NO7-AYPXF#3oB{Q>wu(uv3=4di<2`+JOX&5C{ce;1n?V3P3>6+*<%AK=N=|S!UEx z<<=D;h|h&C#HRrbCsTFkNT}Og$lu&t8ZyU^2)gQ8q)fDyPJereools0|2TiIZ+8}r z=7KSKNT%wHZ-9Qqf8>aUL}kcbQuz=;hmv=M2Xfad{`?h_GkU>wJ@xDi3em%|KQkAV zGluY}gp?HLl=ALQ7F5HUYii>*>#lj-aEC1(o?aYGCIOlVp}GH~cPUxepx--&99Ddn zOFTo2!bih{9ykWHDencAja#AYz>;dbr@IZ6es^jJ-5{bQbVD>E+s1 z!M3)`)4}W4RTsq<#QB}fU~qlld2NqA(hZbaGHZ4BbnPyb_Z&6VntP^WKMW>Fo_T2f z+=0#%^}!5Yi~WN+@F`<>Cvm5Zlu^dph@6ILDjqsvEEi z;{2g^z@-cj)rx&&n=rqAKcduIc6yg>yPUD8iEhYW3Pjg4nH(L-_LxtRyyua*Tch)i zW2P7kf1m*%lv^jBdvM~>e*X92{J*K}V5j2R=2z%>h#x`^5~ulreWteICHUvynLdBP zlM}-0m_erbnur_e_8NuT$kSiV53;1BPx?ptnLgsrTyc-$@kQPMQv}^OlHasb#IbQV z*UL6$`a@N4xcH^LdY#|Hg9_h&wKk8@7=|9Ne+nI9ww1Gul)K?Hh@ex}=$azuRM20y zn{#xP1EnV4IyjAMU>DE?NmvfXY z6I{AeSN@}-%jy*_z0KRM=m#&5o}5~^TjB1lmdU$YvG7`M6IIz91!^~(-_T-NYLs;Q zf1P-B<_KQ4dvwof0pSPu266u?0iX^wzNwNri_QXELN$${d7NlHO$tyfCD~XDBPNe31)HfAxDm za*z6EM1F!yp10A>VH$=?W4Z;XEblQ_&=k0{mJKVXmKfz%bN?=&uG3@$*O2y zCRPO%>Yff$_jbzF+$1fvg1Zb)#JIPv$iWT7o($S6G-Wv}`(Wg;K48f42e0<7cT#`8 zl!@nqE276C!$Fd8h63zBFRH!+e_p0*55P-sczPkQb+Y_AK6lk0(oDbzaowfwf|Y_D z@qxD$-c)L>U&JQ@E!jcRKv%Znq{VLR#Tg2h?fq2e%EhYWcvJpQM(EZhDd{j**v2hv zYeGI9yxpnrEYhn6Pl`#|4fhY8kS3AzzkMGqxDc){oM7Q|x^ujv+=us3Zn(lwI5s{29jMjVH8e zPtn|)^rJtv(d|C{9ox#02esru={wEowZE}Y|FH&Ce><#os*bJzt>#soYo$sFP@kvGVL`5g zwH_Q42eZtOn5Qnfe}I`d%E0K{K*iG5al>5XP*-_hLoi34_fp?t)Pv|uE4cG;-`2{% z#vQ#|>j^H?RW?sPoUYv5MkzDZ6>LPtK5eSoPTkt#k)-p})ox-%1Bcfc|M5P6>10^) zMm3!wWzf{#HKl%Wai#di=)YVsc*AdZE=LOgSbg_n*k+?>8Uj|9*Wo z`}M=szh9rt-~503>g?thfXE$o9kOB4@(#L~Z+bjL0d;`qY!KK&y6yo;EI!sJ!Uki{ zVn}{jBLYll+ib+dG_l7qz=Y$-7=rixL>f|1CCoFwEx3dB4jD0a^I=pMYrpMmTOwTf z!`S926s)%Woiq1jAZPA#1Z{8T5D#0({e8K#F+taex)^`mL7Ts<#PY>p<)$l@9|KdcztSYmUQDln&GJr`WKi>?6%wFJ9WNVUr33R$saM|W7B^J!TiH4W3a+^h(ymX&bgX!=o-0v zRT@kDRV;sd1-@FTUE~vrUX0&hcs}~oasGJs_x<0${`s#v^vnOz?YqgD=YIIdYx9r$ zUtYhR4}bCAIPY%m-S?Mwzy2RxR*nUHruBS&I4j^t5nLiz^c|vS-fazeCjiK`{!e~g ztqp%~c{s-_5^gZhyxTk@AP!tE$q2T~X!;bkt!Vgy`DRwRxV=uzDAtlkBw~{x(Kn(v zviP(2n8YIR2K~{nXS|2^*=M5ASWt$sXWZZo@+jPFS&Kn`&@ z$HT{-!R7$P%6&CN6|rH@;8FLd#=nT&|8sx-dTo+_tkM7e{Il^`vgoWo)e=1dRCOZN zlB=QBBeABMJ*tH?@()=$icx$S9mHZ^S*Ll5!pb2g4P%TGPKggJNUKs2ot{y;%w29& z;`gj2riw6*P;7=ru(j1i9FjtBxIq(NGU_UeIOt}zMhfY6)Q4o+S)Czoq*r%b1SfyL zexQL;_&_{fD=ktJSMXtj2<0nq2W=+SGY>C_=_2SMF7wMt@CsG*0xx3?yW@|_Y%1wXEQ$WvkdrO8W<@;98s3rHe1YwB}T;8hPY`)jf ztCrJt;aw0+F{F+w%hzHJ=7{)NY}vQ(k>|k`k|x^yPS?o2LW!=i!m|{vQ1LY&sk*pf zC%sEVQn`z~EThFXiskL7^Y~Ym%;(ZsRYvU6SxI5~8E#b&mhDi}m$Uo^H}Zck*Xp>c z6u_OQxzCS0-KE-d#h~RGaCYWeO11l+$u}J;qL5;;wsOEx3P!y=@D#8%vca?Xb~)i) zPPn9JmlNLQgxB}J?wKYTDT4JPsd_<7hlwp(BZyTAO{HCuCsrJmzN$%$k*jnR169;O z+1a(Eixg<9?;Mh}Y*$O2S=N8s9kIL_w#v)vvpa}wxUkV%#|>TL^1V%@)-q7UtMBZ@ zrzbW**dbMSK+x7Ty5B;N7A!CShS$hL?wzpA%VCqZ^L&pev>=67kgnwo!n>%X`drzs zGmtt1>3JAP0VP%vg2DB)Rr+3|Wl8D}BGX%^ooo1oN57Zo;W)HBT7iE@Ar!?5FF_)X zq1-h~Wi8B@#jHoQsI2?M_heoai)z_DfyLv<+>mjq^R`aP4XIx5AHcdED?;NVi?M-J zd=)U2ZJj>Z4@5HS#OYJd%GOE9_l@kr5i6S8Pg5*k1AmF#t<$Gn3p|hoWv>AJ7P6pc z%yzC@I%31OPECX>S*L%xGrdGBXg*xI4s}dNVJPQWx>xYQc3`!u|Gq&aOFb)+U%gmz ztHots#bcQ=8=gx0zOB=2P_($ZgO%fk{4dDNYBG%_m;+i(SJn z6*ty(Po>J)R1SsqJa8@)Hg7nDYtJm9qukV}D@53*uWJLv!N>=#pI8fVwQiH{4Q>Qa z;-M##VGbSxswhO0f(|kQp5&9Z4t{?peML$3P%Ji->OL<_b>~V&me8%E2#RyvD`lY8@Is7R{j7LNB0(b<2+x%99~ zhjP$37nR7>-V>EDQe-!WaxscC ztECh|Fy+)j*iB0@gsq!Z4RL?mJLT{rD+e_*s9I@ldt<__87&bD6MD+o2$7^EDYi-Rl2 zc1cX-EO&!8TL8D1(Hx-2qnNBp1x3jiF^;nItTy&i$L99y9Sr*Ye$NQ9kWWe)%TdvU zLbFsq(Rtqt$74lI?KP*aGfSMWS7Mwb2$g4nZOZTxn&@x_ZQBoLaXln)^%Jru)57UeS4KRL^lKq{A>@;MNhU{c@C#$)v9{2l-GzVXD zVFGRZcO5r^4A2uu@5FcwiShItI(gp7^G=?3^87i;^MR8P5+r{~h7T1<9729wBUt-z zB7{*&elHxyu6`&Hj@gVDk58faSfUf;ogjZALH;x~8aiKmr%QBn$w-l06$nuqK@W*+ zO_U8MDx*;nklNoDqy}tCsibGo?GHM&@+{O!C(}Eb?#uMCB0EaRusMSE%-L)(%?cWQ zc^-pON|yVVO&x#weShE4>N|!Q4$X-7MqpO_A3I_oEl5auG3_lCVPgO40V6|uuh}xyGA=!qz+3&b=|F4 z1gMfm6Ow3#Ew3SU*5IxzF||&eb?WTdsk4ZCG^r#!4{ogV)4Wl5B?&JYyj(tId>Njk z$Wo`bJH4%;x2L(a3;fdCH6sLLP}+~>hz-_^UQS})#c*^A`B^CBPKI|fT*&Z2Uy&ov zY!ysaXA6_E6Cz)MBG23B$+@{k);Wf&Ix;5&qLMq}hRzq52?WNMUmx?z#-*V)Qa)RP zs#*?ZFtB!;tp~6V40z%_U=(BRY~%uuLW&xzcJ=M9dyIXe3|7f^8WL440|iRe46SF% zXhX9!6u8qe7JXrzPaBblQJOu#M}Kpo21H498f~1rI(D@H(3m|fz%^q>hp6R+QpN^# z`5$5v>N{kXuCocl(!d1;mV>y4rpVo30x92cI^@7yLri)=+zo9)@`)@EupHvs17e(; zpnuaL;6pOrhQtEIi2$-^Hoil#2r%0QCfs=lMBKte1GE`yG#jMVZ33P>KM$25)9lmD z8~5odAgVY%={_oAcLnff_+O2Akw8$P<+bF)&11{&#=+Ea=jC`f%8j$0H{%+f=evfh z@nL~)xB~OVan#_r2m$XoxPm*L+!vl4=TAmg@d!abrKS!~#=taY4ab2t#Fj}k3)wP` zK#&~(Z5vs@A)$$i33#*F(g)zU;17uDIp;#2bmV;^)B)7Rs}*v?%p?R|`=K*je=IgU z%9DK=Pk)@`MhbS3Uey{sVgF)o6viYHua72 z@~j%*Eay*-0kmzlBVC2QBd<|z`b}=MN}CjO)yKhb)Ef-PpPx_h=4Z+aCzIqFM1LjA zkNUYGN!~SD)?#(mU#|W(aQjgZ)n`Vg&_>oZT52#g1DV6ja=29(+Q+?itgwvqn|=lo>a@AqTb=NIR^%w0SKeLOunp7eW0P(FnJe&j@+lU^D|0k)dDu3L*kx1NM7 z3${1{@q6a&VQ#RJ$F#z(7IzB>x_|y*UX{u(59fbkvUD^!UJO%MbBdR>s=(*rEb?mz zze7}bj0HB%5S17&h5j>O!r&tCLggG|AFvoP5r`8@gg^g7Z(Im4DBl$S-ku)d-glI!5b98 zhpzn)OuJn9lsL9Jn#KRTWq;%4eL|?x&Hq?syT;eCY{4O)9NUfU4?mmEvd1Y%r+tcO z$}T`i^^$xEPWaUfo?kJs-FcW~(>z8yA|nRlAj@PQ+Gvg}6`+>h#6M zSA!qru)i!Yf$qZ_VmjO}erhbBhbH3~no;jiWa(Lsp>%4&(DbEnnSV?i{n}c-Y=5F0 zn`E6cs-ng~Iqlh$W13G^f=s5K%1M=d+ewUa!=$~rZ%WnKN(c~YUqQ^1^%)b5g0%t2 z0$)K2Zlw)Gh`V~{;Qs=cEFHFYXv%FanS#`dkZq$?-PAXAPY1((fm5IX*4;O*8Rv#C zdv!1I$%4td3nIECjDNe?`~uM;MK!1<{Q7~S3u2*rUN2fzT6*m7?4f-PiREkv^1L3{ z9)Tdlp)e54Yw$84=_e~mnPX4{TgM=gawim%=kBA#J!^RN}y@*&wZDRN zeZx1>FFt;jDY%?Nj}&tGWgs)4%bj~<7ozx{zQ!;7O)hSG?ygq0V@Wb-4f)Y{baZk& znvN#ZRy>bc($%!W{SpyP8sIXrmR07gW+K(e&HC|-mw!Erl0Q);iHUD;j!YZ6NbqwV z)sg^Iu<^M#Pw5l>V3enQ#(wy1(WWSYMnij}^wiQvbge55zGQmRNoyZeIhk2cEofh5 zuQ)s`XMsOi_Gp6|=R4B>*|V;17a#qj?Fq(xRaT=fm|SPufaDILG%U6?q;)uSQ=&RP zmnSvsJAWD7$>=AQ(Vc+29FGU898e(+-eO|a7myK@;?recM&?+uqpTk#Fm7Y+4gbiq zjQ=D;Q_F#p9-)dGC9yJ3Y8H2rOg~cWxl6Lb0I~1R+w`1_W;Ms>c$g$jzc)YAm5T+w zvOb+tsg~LusnWA^h^vIcW&I2HA}_&6jeoW z8C6>y;h`lrl)DCAiza1OpAK88KJ#R`Eqh&1W_+YdX!8lXZYZlNjy1#JLiXx#wmPC! z!jpR;C@dzbER2vAZfkPEZ8JWy>SqcJhlWlQ{OLT|IYQ^u`azsp-_JC%%?onTnE%S%t-XeGA5W*Osio{Jos9f+O0j2KdJ&lsuDohSbk!_1BNQq-1 zKpi$0@x}pPcvBBtU(FgU4bTRJ(v7>aIR6+wHJ*_~Ao%wku?8 z*fYrl1sF@u)r$M*SbryIIkiqs;P7BFog5vE2h)>->2e7V zPL^odUrzfIgix#~q#tsvDi1m6_x%_b<9O1a4i>O~Fc~bYgYgkOI#`(f=>c5!kCp>- zI6+5NRPMR};tlj}nY2LAes$M>#dwOB{(i;mkLw-z17d2N_PMXhrN*f-><{|~gTcXI zcz@GBIUNp9`^SG8J>wV0qyDn59giBVoa;w}NStY`|BvUv{2?9ixnJirhl#Bq=Qt@aKWseK*dQ>E>Ll*KFz7PuLciL zO~`MdBznfhia0L1MxL{C&6r$>J^5<9N1LnlgNIFM8>hqL@$~rkq(3A?JRMEO)1EQA`rsL-lX1^@$N%=xfbXt8fWc^VY=3-a z?D~elg&ncxd$jrBA?rORTnPq0;XVKPZo3nHHXrL5|81Q19}ARUnTS{)rq)#|0rIl= z*brH1@T~uZ8dJvU?Flr2p2M2Dzalh=W+Z~lLMb$0U$K;#a)4%skic?Vt0H$5JrfI7f)HVAAXUH1Sa79Z;qVS}+} zF(kjN5dkK&Z8l!MbMdPlHNLa>wmNP}QM zkUQk^y-%}F1_S~sJW|A;aEhEG+R`a?5oFcIQ$(!iZ#9cxH?jfMm_X}!C*Lky_=nr= zO!AX_2(o|Tn0y9_iR^Po;f)K4x0Fzg4!f&>skq&O6jHyX}wC`Qc>WSP_IJSo9sDXWnfMc_#qKkI#Sds|js*%fmTdkK}_m2y~19*2cZhD6_pqG#gI-eVGrI~w#y z!=8Wf9^Pl4iSkN8@wuLHgEz>daIDVptWpogWePx~IDGDoxm^64RPB?!hKCmFIN~J@3M(N^Sxv^N^vzC}BVmv~z z86G^!S6Sm8Q zt?zx^Gfgs7MDayZ^@5lV6I--K=$;aqO1mUatT-%vRg)ScSLrAQs;GgovujBgDbQBm zv?6KQu9iBpthYO2c{6O4m)B=^5ZiEJqqmM5y2Rysn@Fu?pomxB*@;h2Y=E#ss_uZG zt!s3@g&r+fUj7ZQk%!znVVQrI!zOR%`5sYdK?<)RUCSGUH}FXHxw2npAaw@P^DvMC zN~|OVgG)K9^u0#QlGGo>xo8%Vo-1m@$i4 zk7`j__lfVxyeJmcvfI&$$C0@q<5cHuos=6=z1}~7bv;rf07MpJ0||e~Dqt$xI(@Pq zh-B7@)2E)5t&@iA8`*^;Ry4PtrbM^~{t~-er%$^UcpwYPUVQj1WI@lE?OeBX#D;I3 znh002PIYH`iB`~jxN;rpn2y3w&a-r{;DhbJY8Re;gGiQoRwTc0uH;sW%f5=oGG#VA zmx!#WrmFsZx%3b%@ZU+|;NmMA)aVYXil>$gQ7P3vr=nlPeBx1wZ1Ur$>{W4ju!d zsEL!l4l)8B=acddet*-cqE34#78^=+pBJXObEP6n=+;pL#kuYkG(rmD*6Y4?+3fqC z&EAQe%h5?+l{$|JCac%%>sOL9VRuCx4PnFF;O!jI+#{6`P%~9C;&`=FDkDC#tW-(8 z)e$E%Y=vhfJPa=U^$WtQH8oC)4?p(Fy?HWFBvo?@$9sq9?0@21dRV1HxoIE;WgZwU zZ+RE$xaiRDlt~v_6+Kx(%nBfB8!a&;&d-{dw12L~h1sQJ z^3(-isFgHxsvqj52d{P#Trw=V`a$G1vh|~jO5|$qiAoqMvYSJ>7{!^@QVJoMa%v&$ zrllCd*3GJhIDhV)a`=&zgPIvst+ckiG2zyXmWYK3J!N=L7aqE|p%Et|Me?$cl9$+{ zGi))UuND)L1yket-Yl@jukMxN+g;ncCpRoSS0)@Qa-1S+6o0G9g5qzDFrfHbi|iNT z+A&|pe62Fyks_@A%0|`-3A>{j!IfjXB&KqfyFr^R zfLqLH4p8J#Ojf0WqGXI1M_GDS8+)l^bNlrU2K|1&X9QWuCnb&LsAxi=S*oAtyl;l% zL=jVa&8h3m66foc7$*rr-Np=*Qv~c69 z5ra|8w;OnWApj00J!6AO>{oiLIIohR*RBkyU%5Olo+`max&#utm!xUON7&KKY55*=MKR3ujgLexgkLn2!fWy6WeXp{t` z_V)#;0h>}P=~;C9gHEkH3$@b8^iHPxGJT}TjuJ9#j-WkrHXBT{f<|AS$Dovw<^E-V zQ-^-v-*>e7jvKb;ct5aRiQFU>a>9kg-wf0kM9VxOLBl&#gqGmQ; z5ul2?3pKUhyM}w>9+k zac=Dbzw~y^2*DVX_G39>gEgaa7-?=&Q;S_TS~su^0(lhFo!vv3r^0RdE# zF&3}^Mw8+eT47j`k}W>mJ4D~yZ;?rvkcRg8&V@c{ROMa;L^&T*yg`RSlVUbjz|LXl z!~hleSv{LP&Q{^MLe%3Ni~P5M;m55C7&z~!!=3lFxi>NM%=b*cZO02Y>4*PRcE&wZ zwmMRiofl0zX`)DA6D0B;y0>o~_rrGOLaSQjpbSvn*_3E6zDRBeN)~MWP!uVut%szf zr`;MIpH!vZE?VMpJUCX9B^XD4GgSojrx>KZ<0lQO8Q)JDYMbsK$qclFOR*Cu5;6sT zATDk?A5iB5igECXGNhY*xNEd=?&{dp0zhN-v;fzP9UY>U7fKl$)a8GOO{njXS-Q?9 z3`+wS6j%=88k!<^g9)U3!|9L%a}6=+0dY693CSn2K)`Z{Zx4uZZh}sKhky^scpDN6 z5GMl2p4s>g#Uj9L8<=qCArNs36AjR2tkG8?-QL91?!!y3lhC3 zU|H#@OcK}(Tfk+c&v5qmcG+GYh&BsuUHCAdWx2@nkOgoEjl143xAQm10*eO#!9S7f z@wgWVW{!nS@IpA>FtM=7g(UV|8hY!)q(t$( z)d83L$4lQgpHFg=vKl8xac;zvcZt2KHG0DS#oQ{sNHNE9aGGrD8|CF$HNaWUpBw{d z+iXX=3VlajqulhH+-Q|HDdwt=gW;$*7>++bpW@BWlozIxAR9z~C(EDYh9r5{XjzNZ zS%10u+raHdK~$d^nL-;`*J!E1)C^<}Gt1#tVQ3%s+Ofhi(wAeIS!rc6ot*QNX}{l( zWuIT1^D=kw4D|8z=y=la8A16F{`-*=c}{w17zNmB>bh<%4&8bZvMku*2*mH0w@3Zl zU?q=fgMVoUzxRBfX<64g@j z+Js@PJjOdhDe>SMQI`wk@vvvyI6)$izrL5yqi$%z_)eVL zhn1P`x7bZSVl(~&;nkY@g`eU@ZW1pp2&Nd?S2nVE`D6C%cXER_D1r}N`yrTix$-G- zY;`n?|9Q)Q#>@MJP^FvyvC4LhuVdMQLq0jS8`~d#Hl1aUQ;<&k6w#DjfRO4X`4XJ) zs~J4MVq(d2FqFl%nK;-WkHXDXZ{{~HG;^zVD@~nwY!Brf6x^1%;XE;|bj!rEIY3SpXALIRVsXl%($fmc zZ?TT{xIdaUQA#^oxca-S2tHQ0yy9ZzyS|qW_o#~jYcK|^3oN}HkH(X19xOC_q)O8e zEO=&FmyQXuYof)nNf>J5pMA7E)=a{w&72vup5PKVR~*P_kagl{qoeH_v^`Oi%pUK5 zbgatA5uE-SdGyS-9kY&F3V{?~y(>gK!{X*)E3V~>wh_KNbrfrV1?l>RZ=_#*{47&& zIfou8a1NdPL?_*|T) z^a+13%F{k$Km4|6Q}wGXPC%&eytw6C&P93Galz@IF8 zv_XyY9qIqpCaOkE)b$l*QYS?#wGP;w| zPb#B30eLwd_fHlb|6#ERIxJ7$Gg(*5rcQW_)DT&lDIA4V@RK8esh*{o0VlaL}Xe_TcGi6UF(568Vl?#v;CF+dfGn}ATc;6(yT z-OYO%CAC$U9F`*67FUoG$3lQQY%b!B1HSO49=N`mHCP&;E0Xc#yl~W4Bp(Q3_=mHo zb^$}wU42}(+hObQ!-w!}SIF3~XPzk$fiE~aD;T5H?kX{-)(+ANFqWRH75CAxe@@VH zYMq?G;lX4&IXV~*rY8r}aPEa@f0up{fgNi*E{kD z#MC(Lb6=H9jZ=06eey#QAIk}LSzZy%&-9Sdx z7NqEa;ti6Ov=>ZLq3-^k?XHgoiqsJy8|M_#I{J&Xve_O*z2dSXp zf>}L*ij$&TpyE`0np1IK4IZGHkl#W{^o)xYaa?qbJZI;cF}VGAPNe{wP&_t>lX7q~S}2gB)fe9|9Gr_(-v9J$MegYofrI+~29J!5wD!81-L z>%RE;!iq`7ZM^SD(44=5up{SNV57~+Hsv1xz$YgT?u z*vL5SXL{aR{9lxB1_WvVuoFhQ3jkn2kJn3B84T_3!=VIKZEVBr(wYOaX8Nm+optQo zx7c~oE{>g-Y{(5GrY0%Q&n!L+(KVMvKz+Yb+)J7>ihVJsTS?y(F}K7iWGYp04FBR% z&AZaTA3YK`(7yR{#JGTKkUW17_ALEu;Z(s3{tVvLcp|AyT-@(1HAoPT zT1R!k`PEk${qOem8)%5~Q~iH$3*u)*tnvL$ z0f}9}_irb`S3~a_dhc6IJL?w5v@4><(lDBZG{xXMTEv5F#Gyb}T^5+arj~@HqV|l! z(u~)w!0#gNO7a@HO506toD+5fFYNrEmtK{hbI+qHuRY5xEJbMsN+YEt z?sd3+Vj$)GXk2JB#8&hXay5GK!MgBxP4p1eKVInKoI27Ff7QoGp)Z(6FEk+G= zcOs(h0?^G{#~vP)E4A}CEo*+G^Mc3P`l==D={(Mu#)A?%WTw!i15D8&O>1(JF#SJ& ztYK0kcf7)BX}@04Yt7Rv{TJNS4wDQgoxyiv1L;0VXM8g0lJ1Ebbmaqh{$Kq0Z$FrD z&;M)S4Pi3u_J*_@OiqFTdY#8!vD+8S)5Bmwxk->!FG%YJ>08Fk-I7C` z37*S`@2Z%&W4`Z3m&P#i_du-;b35CAhq;|Phr4UGxeL%Xuf%T;?$vRwj&u7K=Xxb4 z%(X+m60m-HC?VcRhG=0mwMGO?7}{nK%!r*%_tdd)C+v3@V&UGWdFs?hjUs9k@s3c$ zNy$Ot*!K{_RxQ#53q19z(RvSq50-|7Vou6?U>hA;7}R9Rj}SI|9*DMpOqYH zz5%t~OEMF}GMG5v++DKUFKOVlJN`1PEZOy!bm$TBAdwow%qoaP5Z!CetfPUxaD~*E z=pQPP1f?h&-7=3%kRlI&2pYnF6Ov$a=18PC((av%hys0~h4%a-lkxV^kB$?biZeBwEOq%JOHejiWUTs7OE(y*6w$q-JOziJF_`4 zeVxOcu6POT5&v6$;_qZg{W4v)FrK%(WNEyjd7}k$T9RTznAJc>w?V7b1r)uw;MEJ^ z6;kA8WOe;23AdSDX)T?9nO6TL-16!Zr3d9IlW%JLv@$`p->IXsZppEnX#4Iu->gbe zuKQ}Q*@tZYIZ<%Q9C%*w>8ir*8pp_{PUD<9hEH5l{BP@VOLmCr^EmZ$mrAb*%bCR% zzwgv*b9(LkX^#nR^G2yHdIOZmZE64-R*o>JC5$CLLQfFJO7hV_3wa! zGE~VqU7=EzCcoxnug!g>`!80%q^p6;?FWehrl^b57z7|90I}#PokSvFEPS^2N{xMY Z$*9v7o=)$k{|f*B|NppeK@VAa000lYfIR>J delta 1731 zcmV;!20Zze6_ypS`vL>BkF}Hj0zZGwNwF&Z3d$ZEDpE*ehGr8-8sz#bM(%d(s**z_R2b2+)eusE23~@q+*ff9rH7ma+ zY-AkvGd*uD{x8Zm0|GSw*a;)u1pu(1$Ll4m42Jgi;ZTCAHnw4QY0ZIIGyPS^&N_DP zTkPze701p?Hspp8Q?m|Nl$GL@=0hJSIX z=3Qyvj~>uZG?=^xn6acG@bAX;(yzrC~G+X^O#jw1@}Uh(m#{x-2k-O)UvYMeP}d zr5UeVf!{^kmE<*YmA0GQI4A4|Vziipxca7MsrYW>6>^yL6Ss*Q@?LcJPoSf5rDVzm zQzW};YiI2eTNB&{DQ}ZG1!gygnSJOKo7pwEKqP!+5{UWUp9Sh4`7CCk>us&n@)Fjo zwVlGAyRcfTpT^Wn!g@)#&r8D7R=1Pa1yz4)_lk{6ugcH4=TVi{p5+#nqBH}gkx~-( zI$S?7kaB)BF0>h9EBXkz8ol^nU3k1EdWh;DFLZHE9cc)1Q(|lj;ATf^anG?9qXxP= z5m9#m=;p0s50A=~+WDK7HNVk$!DDTG)e`n}9%oGBK?xl)Q|QtGrs$BSH91L`{vUtV zFsYF{Ug5N~U$5x3=4qDx3vOzMNrsco;5)H_bf2U%KACh$_e2f4@&P>mFaG?uA56IC z|26Q2Fd24xL)r}{CqV$c&SNiH18lNALsyw}ZZ@CkVKAZGB*>~4r1gUIEo0_R$sx`J z&*j5+Rm|Km-*=-+V;K2+pw@=Do$Y_a+)kat-8I|X1!$XB;Nr=&xqXXs-I5dL z+M!R7lF_PYzQaPQMRb?T!=5jBc&D~zPX;od#zGC=Cu_#REBRAtar=5o89uKCnblP zZ$Pd0lFWp#3?>dZcbDw;OB#6Xj=u~mOLqMw9ePAONTkLvvkD>+ME9CA>u8`aTp=|k z`iDv+K`F{cx6C6Gq{ssxf`)(age2IUIT9(3w0kEbqCj6LA|H@ecPDT+xX19vyq&Y& z#P_LpdRB61GTuJ=(Q(34ai)for7mA&3Cc#x>?hmKtBokfR=Fi@Y(*62gsQzDG5!9L zO}>!u-D&lQlH-Yg5czNs`94F9PEnR>GZ0rhL>YDyy~3hYvs3N8R;z!rtZiSTb7EG1 z{b%#B)wIK29W}QJ^`0|UYxld*?smz!o!Ok2 zzRqDzSG)xFi2p4=@pm$$ewi*?7|&Z?vNT@NywQR=ElIH<%xa*c+o09z0*YQ-@al!| z3Mq0kvbuhigxk!nw3dI)OsoGAZh7^I(t~o9$u~8ATA85Q@6^#*r{q{pw0(D-Z&sx! z*L}6u>_ayHoG7?t4m_{;bXDPYjbmg}r*Tdl!zV5&{ z-*@V@x@VjC#M9n>scO&m&*Trl#NKoD%oJ{N$+mS)9VB%35}1F|qDXLuM^T*tWuquc zFolTY2#^vSMCYwF(52D?Fyz7m2Ms2Op#MbQV6+fH=iC7s9XySxJw}u{REwzl@B&v+ zTi-qMiTwc1ycZR&MhJ5dL7#Q4F_Gg&R&h3S*rxtaME#Vqeo7fZ&2GtQme`gJVP;HK zyhNM3hjN$~S6Ooc@!}dr$S&b(EAQ7U8>*yyOHs7j?sh(`9Y=RmA$uj;&i^D-{X3wb z3{`SYSE!Vw$*(!tYja=e{)^Qw>1yC|`$3|BDe59M1_6i&KrDJnCy@vk3!m-1Qe)p; ZGV1sgPp5a&{{;X5|NkSxhw)i@000ixVY&bS diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index e8598ff0ceb..a6f19b5ccfe 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -35,6 +35,8 @@ * [DealsSetConsiderUnverifiedStorageDeals](#DealsSetConsiderUnverifiedStorageDeals) * [DealsSetConsiderVerifiedStorageDeals](#DealsSetConsiderVerifiedStorageDeals) * [DealsSetPieceCidBlocklist](#DealsSetPieceCidBlocklist) +* [Get](#Get) + * [GetEnabledSubsystems](#GetEnabledSubsystems) * [I](#I) * [ID](#ID) * [Log](#Log) @@ -533,6 +535,18 @@ Inputs: Response: `{}` +## Get + + +### GetEnabledSubsystems + + +Perms: read + +Inputs: `null` + +Response: `null` + ## I diff --git a/node/builder_miner.go b/node/builder_miner.go index 0c0f9d15af9..444e82d733e 100644 --- a/node/builder_miner.go +++ b/node/builder_miner.go @@ -72,6 +72,7 @@ func ConfigStorageMiner(c interface{}) Option { return Options( ConfigCommon(&cfg.Common, enableLibp2pNode), + Override(new(*api.MinerSubsystem), modules.AddMinerSubsystems(cfg.Subsystems)), Override(new(stores.LocalStorage), From(new(repo.LockedRepo))), Override(new(*stores.Local), modules.LocalStorage), Override(new(*stores.Remote), modules.RemoteStorage), @@ -215,6 +216,7 @@ func StorageMiner(out *api.StorageMiner, subsystemsCfg config.MinerSubsystemConf func(s *Settings) error { resAPI := &impl.StorageMinerAPI{} + s.invokes[ExtractApiKey] = fx.Populate(resAPI) *out = resAPI return nil diff --git a/node/impl/storminer.go b/node/impl/storminer.go index 9db6a3775ce..f820f9b2224 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -48,6 +48,8 @@ import ( type StorageMinerAPI struct { fx.In + Subsystems *api.MinerSubsystem `optional:"true"` + api.Common api.Net @@ -703,4 +705,15 @@ func (sm *StorageMinerAPI) ComputeProof(ctx context.Context, ssi []builtin.Secto return sm.Epp.ComputeProof(ctx, ssi, rand) } +func (sm *StorageMinerAPI) GetEnabledSubsystems(context.Context) (res []api.MinerSubsystem, err error) { + index := 1 + for i := 0; i < api.MinerSubsystems; i++ { + if sm.Subsystems.Has(api.MinerSubsystem(index)) { + res = append(res, api.MinerSubsystem(index)) + } + index *= 2 + } + return +} + var _ api.StorageMiner = &StorageMinerAPI{} diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index 3a3914e0c85..fef01ba797d 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -1007,3 +1007,22 @@ func mutateCfg(r repo.LockedRepo, mutator func(*config.StorageMiner)) error { return multierr.Combine(typeErr, setConfigErr) } + +func AddMinerSubsystems(cfg config.MinerSubsystemConfig) *api.MinerSubsystem { + var res api.MinerSubsystem + + if cfg.EnableMining { + res = res.Add(api.MiningSubsystem) + } + if cfg.EnableSealing { + res = res.Add(api.SealingSubsystem) + } + if cfg.EnableSectorStorage { + res = res.Add(api.SectorStorageSubsystem) + } + if cfg.EnableMarkets { + res = res.Add(api.MarketsSubsystem) + } + + return &res +}