From c2c6282271ee9b283bb72b98bc2a452d3c25e5cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marin=20Ver=C5=A1i=C4=87?= Date: Tue, 18 Jun 2024 11:54:08 +0200 Subject: [PATCH] refactor!: fix naming convention for assets and permissions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marin Veršić --- client/examples/million_accounts_genesis.rs | 2 +- client/tests/integration/asset.rs | 8 +-- client/tests/integration/events/data.rs | 8 +-- client/tests/integration/queries/account.rs | 8 +-- client/tests/integration/queries/asset.rs | 6 +- .../src/lib.rs | 4 +- client/tests/integration/upgrade.rs | 4 +- client_cli/src/main.rs | 2 +- configs/swarm/executor.wasm | Bin 514262 -> 514530 bytes configs/swarm/genesis.json | 14 ++-- core/src/query/store.rs | 6 +- core/src/smartcontracts/isi/account.rs | 52 ++++++-------- core/src/smartcontracts/isi/asset.rs | 24 +++---- core/src/smartcontracts/isi/domain.rs | 4 +- core/src/smartcontracts/isi/triggers/mod.rs | 4 +- core/src/smartcontracts/isi/world.rs | 50 ++++--------- core/src/smartcontracts/wasm.rs | 2 +- data_model/src/account.rs | 2 +- data_model/src/asset.rs | 40 +++++------ data_model/src/events/data/events.rs | 10 +-- data_model/src/executor.rs | 6 +- data_model/src/isi.rs | 12 ++-- data_model/src/lib.rs | 4 +- data_model/src/permission.rs | 39 ++-------- data_model/src/query/cursor.rs | 4 +- data_model/src/query/mod.rs | 11 ++- data_model/src/query/predicate.rs | 2 +- docs/source/references/schema.json | 68 ++++++++---------- genesis/src/lib.rs | 4 +- schema/gen/src/lib.rs | 7 +- .../executor/derive/src/permission.rs | 12 ++-- .../executor/src/default/permissions.rs | 4 +- smart_contract/executor/src/lib.rs | 13 ++-- smart_contract/executor/src/permission.rs | 10 ++- tools/kagami/src/genesis/generate.rs | 13 ++-- 35 files changed, 192 insertions(+), 267 deletions(-) diff --git a/client/examples/million_accounts_genesis.rs b/client/examples/million_accounts_genesis.rs index a8bc83ebe1a..2cffabbbf94 100644 --- a/client/examples/million_accounts_genesis.rs +++ b/client/examples/million_accounts_genesis.rs @@ -28,7 +28,7 @@ fn generate_genesis( .account(signatory_alice.clone()) .asset( format!("xor-{i}").parse().expect("Valid"), - AssetValueType::Numeric(NumericSpec::default()), + AssetType::Numeric(NumericSpec::default()), ) .finish_domain(); } diff --git a/client/tests/integration/asset.rs b/client/tests/integration/asset.rs index f0fe33e8fd9..85aecc3e6df 100644 --- a/client/tests/integration/asset.rs +++ b/client/tests/integration/asset.rs @@ -5,7 +5,7 @@ use iroha::{ client::{self, QueryResult}, crypto::KeyPair, data_model::{ - asset::{AssetId, AssetValue, AssetValueType}, + asset::{AssetId, AssetType, AssetValue}, isi::error::{InstructionEvaluationError, InstructionExecutionError, Mismatch, TypeError}, prelude::*, transaction::error::TransactionRejectionReason, @@ -402,7 +402,7 @@ fn fail_if_dont_satisfy_spec() { // Create asset definition which accepts only integers let asset_definition = AssetDefinition::new( asset_definition_id.clone(), - AssetValueType::Numeric(NumericSpec::integer()), + AssetType::Numeric(NumericSpec::integer()), ); test_client @@ -435,8 +435,8 @@ fn fail_if_dont_satisfy_spec() { &TransactionRejectionReason::Validation(ValidationFail::InstructionFailed( InstructionExecutionError::Evaluate(InstructionEvaluationError::Type( TypeError::from(Mismatch { - expected: AssetValueType::Numeric(NumericSpec::integer()), - actual: AssetValueType::Numeric(NumericSpec::fractional(2)) + expected: AssetType::Numeric(NumericSpec::integer()), + actual: AssetType::Numeric(NumericSpec::fractional(2)) }) )) )) diff --git a/client/tests/integration/events/data.rs b/client/tests/integration/events/data.rs index 1e35a9819ed..8fea7736954 100644 --- a/client/tests/integration/events/data.rs +++ b/client/tests/integration/events/data.rs @@ -240,13 +240,13 @@ fn produce_multiple_events() -> Result<()> { DataEvent::Domain(DomainEvent::Account(AccountEvent::PermissionAdded( AccountPermissionChanged { account: bob_id.clone(), - permission: token_1.id.clone(), + permission: token_1.clone(), }, ))), DataEvent::Domain(DomainEvent::Account(AccountEvent::PermissionAdded( AccountPermissionChanged { account: bob_id.clone(), - permission: token_2.id.clone(), + permission: token_2.clone(), }, ))), DataEvent::Domain(DomainEvent::Account(AccountEvent::RoleGranted( @@ -258,13 +258,13 @@ fn produce_multiple_events() -> Result<()> { DataEvent::Domain(DomainEvent::Account(AccountEvent::PermissionRemoved( AccountPermissionChanged { account: bob_id.clone(), - permission: token_1.id, + permission: token_1, }, ))), DataEvent::Domain(DomainEvent::Account(AccountEvent::PermissionRemoved( AccountPermissionChanged { account: bob_id.clone(), - permission: token_2.id, + permission: token_2, }, ))), DataEvent::Domain(DomainEvent::Account(AccountEvent::RoleRevoked( diff --git a/client/tests/integration/queries/account.rs b/client/tests/integration/queries/account.rs index d89d74b8ac0..1f6addaf7f9 100644 --- a/client/tests/integration/queries/account.rs +++ b/client/tests/integration/queries/account.rs @@ -24,8 +24,8 @@ fn find_accounts_with_asset() -> Result<()> { assert_eq!(received_asset_definition.id(), asset_definition.id()); assert!(matches!( - received_asset_definition.value_type(), - AssetValueType::Numeric(_) + received_asset_definition.type_(), + AssetType::Numeric(_) )); let accounts: [AccountId; 5] = [ @@ -61,8 +61,8 @@ fn find_accounts_with_asset() -> Result<()> { assert_eq!(received_asset_definition.id(), asset_definition.id()); assert_eq!( - received_asset_definition.value_type(), - AssetValueType::Numeric(NumericSpec::default()), + received_asset_definition.type_(), + AssetType::Numeric(NumericSpec::default()), ); let found_accounts = test_client diff --git a/client/tests/integration/queries/asset.rs b/client/tests/integration/queries/asset.rs index d306f5b9540..8229cc2e7d4 100644 --- a/client/tests/integration/queries/asset.rs +++ b/client/tests/integration/queries/asset.rs @@ -44,7 +44,7 @@ fn find_asset_total_quantity() -> Result<()> { &test_client, &accounts, "quantity#wonderland", - AssetValueType::Numeric(NumericSpec::default()), + AssetType::Numeric(NumericSpec::default()), numeric!(1), numeric!(10), numeric!(5), @@ -56,7 +56,7 @@ fn find_asset_total_quantity() -> Result<()> { &test_client, &accounts, "fixed#wonderland", - AssetValueType::Numeric(NumericSpec::default()), + AssetType::Numeric(NumericSpec::default()), numeric!(1.0), numeric!(10.0), numeric!(5.0), @@ -131,7 +131,7 @@ fn test_total_quantity( test_client: &Client, accounts: &[AccountId; 5], definition: &str, - asset_value_type: AssetValueType, + asset_value_type: AssetType, initial_value: T, to_mint: T, to_burn: T, diff --git a/client/tests/integration/smartcontracts/smart_contract_can_filter_queries/src/lib.rs b/client/tests/integration/smartcontracts/smart_contract_can_filter_queries/src/lib.rs index 420ff477e67..0e45690ca93 100644 --- a/client/tests/integration/smartcontracts/smart_contract_can_filter_queries/src/lib.rs +++ b/client/tests/integration/smartcontracts/smart_contract_can_filter_queries/src/lib.rs @@ -35,14 +35,14 @@ fn main(_owner: AccountId) { Register::asset_definition(AssetDefinition::new( time_id.clone(), - AssetValueType::Numeric(NumericSpec::default()), + AssetType::Numeric(NumericSpec::default()), )) .execute() .dbg_unwrap(); Register::asset_definition(AssetDefinition::new( space_id.clone(), - AssetValueType::Numeric(NumericSpec::default()), + AssetType::Numeric(NumericSpec::default()), )) .execute() .dbg_unwrap(); diff --git a/client/tests/integration/upgrade.rs b/client/tests/integration/upgrade.rs index 2d06f4a8a75..914dd7aa3e4 100644 --- a/client/tests/integration/upgrade.rs +++ b/client/tests/integration/upgrade.rs @@ -146,7 +146,7 @@ fn executor_upgrade_should_revoke_removed_permissions() -> Result<()> { assert!(client .request(FindExecutorDataModel)? .permissions() - .contains(&can_unregister_domain_token.id)); + .contains(can_unregister_domain_token.name())); // Check that `TEST_ROLE` has permission assert!(client @@ -174,7 +174,7 @@ fn executor_upgrade_should_revoke_removed_permissions() -> Result<()> { assert!(!client .request(FindExecutorDataModel)? .permissions() - .contains(&can_unregister_domain_token.id)); + .contains(can_unregister_domain_token.name())); // Check that `TEST_ROLE` doesn't have permission assert!(!client diff --git a/client_cli/src/main.rs b/client_cli/src/main.rs index 3a2ea0caa3e..2a674c52f28 100644 --- a/client_cli/src/main.rs +++ b/client_cli/src/main.rs @@ -712,7 +712,7 @@ mod asset { pub unmintable: bool, /// Value type stored in asset #[arg(short, long)] - pub value_type: AssetValueType, + pub value_type: AssetType, #[command(flatten)] pub metadata: MetadataArgs, } diff --git a/configs/swarm/executor.wasm b/configs/swarm/executor.wasm index c3d58d763d5a5db0669f99cdb72bf826d455750e..cc07cf92cbc049ce0ace3d631f1611c651d5cfae 100644 GIT binary patch delta 95959 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%0A&5}5$-|$ ziANxtAvNML>|E<;@?(%L*3q|*$=mUh{!T}KoKJ5wF zC#es%bGS`7ZnQoiFEU{BIYjnT@~)^YE@=qGrFh-a!s^kOr(_15e?n&4BP4AauBuS( zlk#2rn4(2lsxsZy9}DpZ%Iz<6L4+F*fB7y^enqN_L(=I64uPXZYF7tk77dE3T zs<~Tk8!CFOhQuz5Nw7 z)swXDEBO?obNXH|&qL^ey|Ob3&fF^>vQA9;8s*lK?`!n;1m&2wJzvY0?V(|G>ppoK z|4!ZqPIm|$+9w;98;qz9P^$?HB&?QT<*fhJL$oEc?x_?*ENvp*3p4A@`>=-x+t8<`hE-2gX#EI z-kMYh@{Rok8cu8{9w>=yjZRn&N57Tz?8}Or?;vo_MMytDnrW;lcOL-o5#&24nG#?}~(m3?On2$`L@RltO4H5V@pKR}K4Tz$+czGBN4!xjfPBS1^ads~_&)-2`# zK3-_&M=}Z8m57b94#jVfjajV<1lQkLAJl6DBu{VF@Xu-bW|JIkeqN?Sn`I&+@h_X@GGv_lF>;)sy&uc;9@;cH6~rAT7R<0? znq~UkaR3_O;VmzfC2zcdqq8CD)J94ukG1VP0Jbl*MF>BBPgM$J%bME9;BZL)+6YP! z0(&4EYht4KK0@6o@bDOg6VzmjtOJyLaEn~s7K4rfZ{#0uxGe?^w;5}UiN2>Xo&o8= zI@pYOIO+CJdLY0|300TY)ik+a{pGj}# z360WeP?DnYwe9p4w(v2@XBid39bjWvFeGX2Old0~%)>UcWimV7Mvpv0N9Ft$-LdUZ7_d$?>l1r~LATi!=?4$G93?=3Ut zdA83sc)y=k@MCYEB55x4|YY-U45%ljt z7@%U>G6=-$SGx5%`6$nHc^IH!b<1MA=||7;Oy?haP7b%=3G>Vg(r=Su{ti2&f8zM4 z%o3XWf}XhVUeFUa?BAdtFi`v(d|V+t{Gy(!>=$L#$e;8|^Yn+m#qt-S_Bl>_UzA1F zPGDhpQd%H3Dkcl~oyWh>gu_`a+*u`Q?@O|J(hqv|tkSD&F)r`Ls}IHwEPdx?kfuX4 z<7FTN94cRyJ=*ZZvJp2zPb{2UK^1wRSw!QBJ&T5fvcn}#y?CXunEAo=dfcy^oGV>Lw3DX6$n=4QWR`6ASFyul=%UDNhqiJ zMN@&H*&dn^DHB!40q{V5gKkf?D}Z)1&6bbT@OLyFd3K}p(x>lWZ`nc(hRcfOjggh( z%V}mp%L4ZdhYY=iCJ&b{0tMqoKudLqx+5p#ji*M)%8Za86JdUYoG=1|wS+c~kj-%k z#IGY{BmC4F30`J64Hzj0f%FuPl#iusQ&17YXzK9NE9d3Vx*$9;n()v=qhv)LUZNb< z`4W0_6c*!hS~3dEA8rbrEK}&2(J~eg-yAJ#u{pI75X2ydWOHgI5G};S!cJT;8tcUf zIf$Xe=F}u}kHs&e(ZE8gH%24%n#K{H<(?4=Hfa2nf7-x#Oq;-Ya<+e>k&B45>#S_wG> z=hPg^p>gs_zrD1QPPucu7P&IVg9O97Y`pZ_OR)g-;>(2$5rH9ty>ujUJUu}+EB}se zWe>9(bz={N&uH}oaO;KCW+Ixgm7bgk$>|*$J5hE{MxS7{MPKw5{@YYM zQRYEbA3I4_agF&nR)((_A|nz4(Y*BiB+$K&DV*dGVA}|iEvqtxV1be))_BN!-guyj ze>#4lBP6T1+aLT14N;8F1=cO0cDb^7bcy^aI?|?GS()C=mCHc@+zgp}DW@fTMpD~lI#Mf+!5jV&1ZR^-9{j?R2z|u?aYTDXhvRs1U0hZPW z;K(VmHrzwe{?Ztl1cSf9(4JFdz~FB%G&$Lf$bY6l#al=lr)U&CK1Eig*T%?LDmN7- zj4$%jr^$jdJAMxAufuaZwy^9u2gVa$-ho{L3;jSJ3SNe0BY^o2Zz;NZa;}_vN zct*jK@Jt$jY6m(y^pqddho^;TG zo_PT@MOaadrgPw*?V9x~Q(hi+#zLw!6S#Uw?>qHaMq&5$uqc?ao|y@uwUEMRfq;BL zEoK2%FHzrFvU3W$84Fz9ZgBPIAYA=T(s>{?9iJutowQkxMz#&2?i1c95Lts{Bj|cu8*W+O7e2s&5&)56AwE(nu1Jzp~U&bKJ zU7%6@(*^Pkymelvv1-6VSyk=>;rogSU*#~p?>c+)mo1c^TGrR};v(6lJTM4+xszdt z8k51VY1bn8b@?1UI?-mx!@V&KCV#Qqh?`|!T7uegD0d00fnVxut29b2ww*nGlme6` zGB3fP6dVJ9QV2d0>v4ceLzhB%1RROe=w&{FsfLS8{^q5yfCijB9E}wxL3+VCP}*|Y zKNg)Zr6>8gW_{{0@iS}yc5}l9%%S3JIhlH` z#1?Xro?eMI9H$v8AxzGpwJSCITyB+Yr!H8w$h0+I@xVbpUjb@lL!%FcFiRq-60(Ti z=rxz%ufd2er5Fw9keLi?R>N=x%s{XxrzmH&tPol+HH;RnmW`Ua>_iy2itD)vXcWwd zX!+G0DL8@jSOrV-LF&H>+sg@>v$);P>*ba&_4u0(Q{a@OQ_b1ZM^n9Ral;e*|M)lX8y93iJRcv^gi^o6Nw;0A`@9 z?#bF=7n)yiX|7}MDG^oGh2~5T!{7m43iUlAt47aoUmfQiIEWnsIay1+j>)<-<`~$d z8MNmZ@M$f@{Q&YiojUy>8`9Vx{Nfb+j1xum$)s*<5JUd?&UJK2vV2RcPC}5dT1e^Uvcu>md+LgdeFlMmB zDcP#xY8M<}tSABZK8^Wb9}l0B-h>a#7;DdI&{)`9V3SHX4OE&&r%pr7yoTDI0Vg}1 z`kn!ap20trXxj3gYht3$sPK>(jhjgCOq`|{6s>9Z@-pHV7| zVt1>&({i+BOVG40Z-J{}J_1qi24EFC`9^akAq~4I}zdwu<9BeRz{&OD1Ze z?LW%a74sPilR;$H=3&N7t3Ta+PS&YPxtl_KP~bqr;ky7QXXhK8mmRr%%X4YQIoYK0 z-l517im(L zWcTo*)yS=I9Y>X7SuuR?W(JD4D?i~aZv);O|F@#GcnkA?JGjGrd$m|LO4zqz$AT;8 zzMZ`}B;)r3SI%FVe*D+RXhSi?@HJ5P7R%I1e~w)E{^?!gFZ5!`%gXqC_#b=D>|J@F zEqTvNuYGJJb;d8;eI7qA(>s<0j+tQG+~k~s>6TSSm;%_5QiDKc1nQtK&Vxd&&p&fs z!UwxBf6UKvpACnb$A6XgmJd`Nl>f_L) z9E__8MqL6%B9`+dncfg5J0pGAw7|V04|8t#s|z92P#bGHpM+Wi4pModIA$a@{vA~O zOM3Ko^cMG({0>g%E0TX;LSQ@oL$i9%{2>$d?L|?ZI2S?|^Prycx)Ia(BNU85zd#i`A@W95B>K~ zZSZb&MXtb5p1A^h!(3``RVF3Q+cj?F#TBQ2{Wc_H_JZ8vai^F5^koRG4^wG1eP>4l znS`^=0%ip8hxafmqXZRb&Q)l!_m4#EYnXqE=<-#WUcF4H;H!Wtwni0a%fy=%LGVHN z-HuenQmp)W%2LVY7kqJS?EW979jTi!{_21C9=$Yi?oyg;sal!tlF+R=xozvR{bx4* zGAa|1G`M+tN3Gm3a^Ci#|85cbvZnSrb_3joa0vTz4*9WQ6#5cj`f}tyzbu?R=Hlu( z{?fVcjoLhP+k(XvxHKHpxrpVf&h}L>*dfhBK#r(`t;#_ga)+&|qnj_6j2G0yt8@Pk1yBbj8LzkECj$s-`ubx`bj7r_vMrGna;ks77j|99Ly zTMBpEl?Ajk>cSBWL5g%k*ayeAc@M?|-dm?9a9d7Bsy5YinqE_QDP=-ewp4$=fW64s z7S!n?-OI$1_GXlHg@?b^KX0^FxtoFUy-_d!9@*&}uIgI3!97VYvq7c0vYorKg*ry6 zoKEwN*AiH_FT>c%?yLwTG}lgP_yQL;{g?xaI~F?}GkOyO+0Ik>DD~Lg|J(bkiyu~r zyV%SCgb$536`)>_{(Rf?6ONGVic+_#Q7hrGikoJm)hHY$yBY(!FqXWrsyluL#Huv> zTS+s$(cZd>Z-)XZ%son zchE2Jpkn~wj*CGH6dTD|+%Y;ki8gsvVkU8#+n}j<=3*eIT#UW;c(@k_6X;pADm(InOoAWC3S!SJGnYP)}8eUC&8wpSH}?4IwP9qK6u)q~_~+f^@hY|JJ~oM&25B@)yum z?8xq>fxS(C`F1ibX{ait9OoQ5nvXvRhDhi5WilOUs8Z@&<{TV7gOSnfkUZ|14`_gf zaXp)-BhM(G4g?y51N&rzi0Xkl`|Fica&frz)(r^ z-M^g}Tr(9IDr>&ymfAPW_pRX@hyGVOg(SU z$BCwiss_E#T-D5Uf`kz zF6iczXWjE%kQ#Bmi&I`UA6|FN(XJQpVT%4R%!QT>mo}Y%jnQ(ZaW56qMTAG2-a=J` znQlF)=0T@i{vb#tqba$i>dyNyZ@YVQwiR4>!MR`g6; z6=53LjFz@lFM(k}OH(MLo$6tlTR(idTN~X|S#?I@w92YBem<*=Ib26SR#vy-r&Tf( z1MBFqWc3hxq-*=0<*Q&k(zU?0j=oD)jS_dT-zK*&+^g9t59B)!_3opR?4m7x2`#KW zMD2CdyS-`}u^@PGDo4THk)6$fXB%l{dsWB&Q_|t~sxgKuzJsb6w*$9D`*8l$$3z7_ z?Oi$mR5s;wP#q!q?dhP(ClA9e3Aq-cDt@{_Ol<%%0$((bkLYR#Ox{%L+EMYr;%7SQ zksr}f^{Sb>1tVLr)W}{hmCh^^IgT0RXjz2ifr=o|`X$T>A6_?I*8`nXCeS&1^k|g< zbQo*Ks{Tbw7hVf=k5Ao+F`s#}M%yPcfVS_^*ef`P8PLQMX^8K^)X(x3v zK1O#|jnzfoVb{{eu0V>7^kiqSu{eD@va{+Em8GKK-@^v}f)f01;2(hS{-UwV z{zhY$mul>C)7aeIWi>Wiqf~HXNp(}*%5G`0zolDtT{o;Wx|>Q*3XlTs1uk0vKACBz zsg+bGGo~qYxe|n>b%cR!M)xGCm+TM1X-|^s?H}F`OpA*Pbc@6NxI%YTQ5_?3j)V6< z_)*i?t~fKXu8N9PYXaR!F10K!Q~~uEMir{6r?2f&<-oWPD?o2*|HZhky>{H0*1`GW za8FgO48+S~JJ?^%<@&N<+Us}S2%C$)0MMkrXz0c=fv(wlBcMf}0jTFMfNm}m=*8_f z0=j?u-vIi_wLmxB0&@DvjbNT+s^k5OhHkwUrrwfPt-BG>6Ker9`7eNOFB9nEk8cF@ zTQ-;e)#QIsCeT$oZv^yv#;DTU+4b~sPnkg1Z@UrDsoMY)0qTPG$m@abEdyw6s9RZw zSjoRQO9=TYp8FI!eK+>+Zz%2_^)j#fy0}MkeV*RjLHt(SqmtwON5ZhP!$&0)R?xzG z)Po6SXgK$m(Sme)|K~UA)`HK`ghqeStpjBOJ^96rfKL58tM5>mK=W?c(t@pMY4yKo z>5(#l<`^EK4C1ruV*vfDm2#|1pvTtSsQcM#{szz!WdfaWL;Ne^iE8{8-9KG6&`)(s zYg~_jJ3ax>((DPfxwjPKr>VlhO*evYk#~d|rJ6ayMuQsn-wW`i}r12#;uK zZ>s{h%YoCaQP#Tg=f6x>XJ=_ZNAVkd zxAlCCK5wd}XA49q_8zN2S=8pwGVv|zGd)aqT|Z1y(cf#Z<$5BTh3L?b1L01@NO8T9 z#_Urc-KdVD^{C^o7}=qJr;ePBH>zX#2Gmi#6vABJkGK9#9hXfVWuSHLM$}QWR2}rM ze%GUQmZ3vsY%dG)0l`D>Jq#XlB<*=vjmD(+`=_d>78_jLG}pS-dKc%wtsZJOm>ZyC zqes+61q<*I{4_Yq*F=^%-))+>?+=nbi|D1n8vIAxo zK4gvJ}>V5WO1FOCKZtV>bQGssi59UsrAG`CaUAAuRj= z**w;tBiNw~XN$vx8kITxD~(U_Q-%UF`#yH{XD&a5YVO1L~<&`6u2`tu5=l z{M1Z!hZW?q=Flfus#EyS>?IfN%qC~BdQ@Q`Yz)M!gH=7m)15z9_2ndir05~4R=DfI zqcf+`vqPb>oj}Wms@E$bm*vc3iy5~RnyAn?M4fq;8V^pP=9)3l&WN%&7U+1s?fxx z%){1kZo(?Rz%F3u$-Zz}HCl~SU%!V>b!pdF^cztQ#;MBqd1tIjr7dGrRh6{}pPQHU z`SBcl{(wKHT=V&Oj_MfpC4VUhx#kl9ceKXQwy{`Zf!gYhgH3q@-8xQ9arR;Hvtu5n z2CkL}iT&$1wVhLyPK9?XrtBNqGhUBO^aPcIQJ6MCbt#AQFi@fc<=I6yRQu8XGC}o< z`YuAN$Dy}BK)oia9)H({vB~&TrJF!yjod(GZQVd+d@h{Wzlnsulo&|ZXi_I&B;jwtCK9|N*1k5A zfT`n?z)eXtO#eScNptj|2co1!t)`hRRKg7`Ex7(DS9L%{qK9+g_4ygSnF}A(fC1$| zu4)>!CEyc>2*(rQiBRye6-6E2Ref6?jEGKPqYLn2lNDXweSA+vmvbK%DGt1+Gb~md zdrv=Zqi^1YU&JN~pRC5fPLn%XZL`MYKQcufvdVvKs)HrQRO}px7~eImqxJFl?6hhT zNv@f9J$*C{iswJ*%rwnxAK?Zuakr+RehQk61&qV2&!JGqWHY zoTdh|)%{gRpzRt|^Ndtxb8Nn71(v@U?BoD6f3|8<+Z|LLhvXzu;ZM(JKr-rK9)gE# zDn-pvEo05}@cA*cuqE}LqY}am2v19TdJYKa9Lk=fnwFKZx<4aaoHJ@d`<+oQifds@ zyxaM?WX)AoJtehFMJ+8tv*Uq)IB(?#Kpo}+>nGC#b5(N56^!iSi*CI&R}F9wX1<523hBaoQ2I}z3X4=G z8aZi^s#B#FMrvwYe=pnTPvZJ$@f=P&+P+n>{k`d-a5lps@f|O^D~hwe6Ad-qxND^SvmD;p^q?;OXt{ zqD?A#)xn|GnGF1|pBeHqT8$&`wL=Tyyj}QrO&oHgrd4s?+Wd>&)Zz36Zm-ZA-K(i? zuX1&-c+rA;sKqf3_(U@*C>a%o&v4LdJu2ve9+eiJ2k-zut@#50aj~p09ID}nYv?kc z#m7uShzNB7+rBlpn;DVLbu}Hly*ypKy?G|K>I+oy(Vx+iPUn}XgoxVSWKSJ$N^}Cn zE>-vI;5AECEB>9gRJ9Ik?ThfL=!$e=shS0K_wZ$^N+#T>YIFaayZr}Is%@kHh;5qA zvx)k2vs-0^fIQVML4;F41nx*`=*=SjM}cix(kL4$Cv+4*w=t&IKZON42h0ZFX_mK?gqotlA`A}^Y2Wq z0u-KWcRCQ7U&Ci8aKv#jAPkwRm7NI=v2LbtWU3mRNymsXc#;&z#rtrTl3bJYSaT-V zBRvMUFf{{Sdb(!tnc-)L4*MGz8d)aL%pjQ(cj!4M1?2aUmzqS4dx%Uo7o9q4KpS|jS7Z}E#?1}b|r9C zRa^hud*N*Eg$oBnKoC6_M4ZI|Q5=sWIAKAG%?OAHf&o^R2K2P2mOh+Vm_zjHm1cd< z_dZ`(nQ5A$O;lPmSX!D^mef;IbNK#ip9@^>8-DNmKKSi>_S*BX*4k_Dv(H-pL8I@-$r`oaHqrRgaVi0D!yY*<0YZBMn5aa?XNfH4WcDEh~av2PR z{1|zdW2Z0-jup%CSa+syI8bN!^S~az@xYwnqxEIayJQvMWZZch)}!(vo;^P6#&C0~ zaVO(tYX}z)J`HtI&Hn! z!j^kh;-=ts}S`a5P-E{m&KwP7ki*Yrt>_Zx@>A2Bb_K=wxFFed$4tZwa-p#-IK=q7aD|sehnOL*VY&?qw^Sr#&g+?G>}@I2@GXZ( z5sY4p0;e1-6`{M^x6T6zAS5QDMtxMDGr*Lx;!^gp2Y_In_|ncSNj*` zO4B{ET)yBeHIy|A@N-yGgVhxOrKq1D=);n}RGn`k(29ROG8mrbE+v)&6ZNzfT#@*S z-gU+;JewZpxm#_)NT34ucN0eGT%ch=x-{TfbKe2ml89xZ?Dot~9-~ z%LxG+io*LFEuEI63erw8+}2UO$W-nEWW4!NfO{a$&@Zp4gCUnYK?3cl-)=S5x=PS= zJn`CuiIU29<7T~^Xa}`S#2_OOEgJ4h4hW&AcdH}ISIQv;Q?VHp>wfqG#~6}BpopH_ zG0=4{9zU?TbaQrG(k2<`x_2u@w-n-NE(C|>FX=sBVk&dp#s#6kK0Gi$g6RySz`lT8 zykgGa0F;=Z_j2{q(_NW*hHIwo03+?~>Q5D~t6}B+bz2k~K3bp7p3!=Hy)S#(>mB(> zGs@LbkJ4eBG79^cWPK)klJz7#lRZh$Sk#X_0s2_|Huj9w$LKTIGX{Eopj|!671(yI zXqg@ij_ma~NC|TL*k*~g@pfAt#lY|b6O)vclELmB7~&+!d)fL#%cR}D2d^<|Y5N{E zV^p$!JJ-z39L}C3X`liF<&0@o*XooThFwmUV2!;n`3@8_cJU_=d`dC$4Rvw|?;~-_ zh1cmmP*o+>&~AQ1?bHK>M|cS^JBwXH;|52BNA;P$RYUH9VN@gU0Ht0u+{ z#>No}&%jO%zXH7fWvkgPn{^cQ++caQm4E29y=tuEvB&o*P*i3$9;35+RcL0U9{be$ zv{)TqfuMw#-~!!ef-{!3?^9t>7FIIx;mjbqxerJer(613?v4pI{9y_PCDc3S#y~Zh z28j$CC$=|=XM=+!H%N32m%sL&FBE#oOcCg3c_}nC;OzijUInB%<8%%~jS&U9-vofL zpUjqFaJ;J{lODkUl1f8qSX?b5bRjcy8^X;Jpt`dF*1y70jB)d(?LIEX595pj1{7vx z{h#m$!-tXo?MO5#7 z%{!pR_@7pdN^DFXoZyV9TX#TBv)~5uDQMz@<|5yN>a6xBRP7{AG>m!-JGg^!)-l(m z(V~Mm$@!YL9K`vUO0OKmQWZic5268IljRWJaD`BxLx8@asfW}oOFZp3q(+2l&~<3h zF}Tj&iUM7>too3?IHdNC?*PnzYF%i}#USB*71D$wNNWvhKu`qruUGqblG|O(k%1%F zD4+z4&w)uWMxu0$9<9eY*#+8JuYQYnj2jQDX@OsH4}huA>CsvHiY_0z8t5zBUqA;)A=KKQ3qiaCb3XTr?=Id_;2ND&jBd3 zW!%^m=(2#okO075tQrL|k#l3B^+?+Gwt62%D(W3I+NSDqbRvec5qn8UA=)<>alHdj zga^P+4|n@iJ;Lo{!nf5sl5BhZfzil7RqxF*juQ{Gj>%aaX%u&k+A#C%)>^g*sW^)6TeAPBM4#`4-=f5fr4#&QVGOeeWg z^++IpC%&a_cR6_B_mJpY;$uR5DUq<$;Tw5j8h_@e=wG2)2Srbn@U51ZZ*M%?ijon*x# zgBKIlUU-a2vUb5EP#P7}$FkXIn;yX5MA&dtiEpuNdNNIEklz#KHK?OI!`c!Wz17JE znAo=ozV*_#+W}n&RNtV^u{M54{XbAsI(`j?>^`vX)q0ZbH27eisy|Q%c3>Ut{sUd zrh#Yko5OEt^ig&4m@hwKMJ#x4YbYsTMG9<{d};x6VYRbCFi8VTmoW-n+~e{i+qzJU zLo!1Er)2ACicvuy9K~ynlN5SPjpq;khaXdKvozMNJ*IAlCA_+kpQzAt`8nOv$nRz9 z@*35TETP|FaJBPxa6l_wHsS~8w{=rLQ=@(OQU||)MXZ?pu`lI&gk4|a zFT3$lWpHYkP zRxJFiS_5sVJI<=fYNZ1MyOf&FVmVn#A>XMF1g?-D-|%e{ym`Ap^c~Qt!aXS@EH`M+_ZXf_6#9c&7W=4!U(kYmf(3&y|IP!%ENPEAaNnnLB{TrM@dH$xz#PdB zP`Ge`{LiT=ewXlq8n2+ApgYc~qtMb#=dft4q}}JhQI)Dp28vc8?^q!p;F@KDhG3yP(wu>aP2fEx z2oCxi>yf2gX2Ag!bVTu_aUQ&Mk$F^>6mZI*;wIc5xMY}wh;g8&ekO=(B+LVGO{R)t zp~D1PCmm2TEWuiULCEW?t>##MeUE0j0o)E^jimuv`5KNq02nPqRtfG!Rxm_}PHQ=~ z0bl@H7s#1erLvuqar8P_FEaDR3RPRr(NLl45smu-XaOS785Cnf8)T_myF;sXXu8^4 z+09!hR^nvSu8_|q6$;tph@pMeoD*uekgLXl%-Bb1)in7M*31p`;3d4W{XIQ*NsUui za_g7U2bXY3YB^oGq`GpJ^V<*uB)!WD5hXx-9A!Zg#ycD=@m5TcRZfJN(;;zB#$zaC ziWo)XBG3Ue&h(o@WkDw$oF5kyANduc#gnxCSG8;OMsrz!nK7%6MZt=UoS*>Uv{hS4 zKmDqP_xEZ;ODy`UE#*PQ{TFUya~q&SFX^&c033bhvbqU98+8Q)dYLv}QAdSrW@KPJ zVC3Kr;BC;A_~R9|Ti{bXXqZzp5^=Qf8uZ7Ey{Zm&)V5@R3N+jR+X9B+B8!LH2Lz zzR1gVUN8f#RvTE8**2L;+dw0(sr|TNrV$_6+SJw_$lg)IHFb=mwYL;~9m*7{>Ce~I zYxsih#TyWnm(#Hu>Huajj+>zA4YcZ}n&Nnxr9~AK>aSN@nh{VW^ zQsJ=Kd`7ODSmhXZ(DaiQvCZ*}*=?SDbUTb*unH%TW|vhAbUe#(*z%d(>_U+?kzfX5 zbB4eSo7jMhzdzYTV&W5~X)H!cWD#J>;9R_BLTMbtHNIzuN{`r3BJ-AwXf;a6^bx}x zPjEHdHli&);(mPX+1^*=qY>r4B0QwEfz9JYTYW_@uf}C~wriLw9_Y|KE>;xYIxegv z^c_`9a5PV^)keiZBAONpAv#Hs9vz0np#g^&AJEU1dhZdUC*z+xT+TiHRfz5mkWq8s zX(3Y8i@Z=TrGb88kN}pEL-j0H(V%r|9m#+~E%q3)^O`lEym4D0LHhgdVJLiUcSQ ze$6Q+w0{nBh60+iqae;69w=h`P8`Q=F??@LMj(`DE~V^1F|HeyTJ9Ck>}InijD}`_ zJC12~Gc^Q?SO-FIoe%I+bUjcMLuKc@AP~!D+8iXhS)X#yv@W6}eG`NMyhzuAL~+-x z*cw-@tSiY{p{wp$yPQRgrbYi(Rc zW5Yxj%kz{UCUTuk7-o5@;A>nyPM?Q~IK)`O#qfUH94{@#-p&UqagVKW5-|KRQf8)PzA(bSmzplrQ&cAYuQ$}HXPMiw$sQ+5rvOw?}!xr0IiG^>3~i~ zigtKhj1+kxFFpWz z&?$bSlZddM`U^#L7D)i7bvD7d03%;=NQ5i@_YvmR4B} zEDT6+JOpx%uOX){1_vM>CRo9)LXH2XTXew|j|%XJdhxH&z81(a%{oFrwKCnS^b`^# zzR3wdAgu{-A}15P#WCRNtueSSBx4TKkI0&Qj1#ocKhmtbh`ot^b0!0q<98DIMXwJI8G;BBGTGePuE>yl=FJ4GKsVGG%-f>hwZ7w zF=80*Z@wA>GT1?jj6p5Q}ZtLbl`|5 z#t)0PwDM$NM~U0Jl3zfqKS-f*pq7J_5(i3piyn;=<8kNjaGV(2rm}#pBCSop?5?5~ zGP8&movmncw|LRRdaj-_;>8#=y(V7tX7EtF=mv?TDIWB>hoZZQ*VP|k-x;USu0q^+ z`g=DKI`C&1fU8=@-%X$DZ(KBezW&CqrVj*k#q`q$1}L5mng!xi{7B}nMp}=n^mH`lyRx@f4dt!v`iKTZ zo$4c&Sx@YwqP}7zwu=ANSNzEu_c^Z9CRnU&5^o0%r7YNtnjbxB$9S#6ex5hv5B3)` z&MZm_9R@UV(Yy4$^SYY|3Zq7jQwQs-|uUXTu6|UH;`0uNm zo{V-|GU~1k6E;D8$BHEp{S=tLg7bmv4>tgApki#Lx5tVa>)C3`9VZT18*8Y~c;ILz zEgBELzLj1aFJj9Z12m;0(x>)K({oEoic6Ap2L5jH8mC?^q5i`zk~tKwN#k{3J} zFo$(xYm|K)rHV5JNBEG!>?PFKcMQn7H zyQIx{+7Mfdr!Ss3joA7!-IpQo?g%Q|@x&ftYlg_P*1Tp0Uw(~JZxd71+Sk$kd+C#4}_vxeW z5E1^?rf(=|wm5`~#y4k+dP@b>=ZQQ(33DWLWsZch@zk)qw!}XdM=3WD-=!CSRkq>Yo4fW?};Lejw9d()`b;`H!Sx0VVXpP z)VeQ=MViH>kI*D~O&F>vR-|*e;ryc6`9=9<3y0NBy-$Q&>^(+mN;kycN<}4D%?jx` z>=`QN4Xr-?lurq9bSEoJPQou6Bn zqu;B{H#8*(nKPa>dz$Y?LKFLRrOF*2k9a1!oCWg>^CPme%5qzZP?Q}=6wHO-lO_=x zYrs3TxF|QhcwVk2VU0$(k(~{?Dx)0>L_}S6nfT6PvDa1HFUD9?%O;xRFg0sl?!Dv9 zi8zO`@k2JxV#WX-i?jmIoLo5(`Nc(`0EBTXd?;X{h_{TTfeSGg zw5*cS+;PmaN^-MGi;Fzdry_oA@w}}3qSPGE@QDa_k5Fn3{Pgf55n!1_%NB{)ev>(} zv^2L2QJ$HmAbeVGZVBh`44+D0ED}+PX^6hHxG>i{dYa5uA`yaz&oiq^y%vk8@>`IE zDXSULPGE%D@BMsO*Y(8+_nBmpiHawu6K?n}u+)`q1nc4s%gV_q$t^8aZbdrge$08( z;pWQ`zo!60KD|wwG7#z6#@jeUadts&nSr8Gic8Dpz$wV3NR;6MXTZ%bE-CZOmq{HT z5wnx0E|`~FlAqnSOh&Ervf`55$@%lZnX|LzXJv!T+tfRgY9E1=okhDJf$V)dop?k% zL$&21D>P%_{9F{^S=k*FQGwO$PD-f|ohG(v+g;qYtc8WeS#78DZiJ7UH@|G*w5+l@ z5Bgk{voP`wmUZ|5zODe^fa)c_}BmUz;X2bn|;RS_-ZOX{=DsxUNTrMlkZw-*} zTrar53oi76=Xt?E^)?MC_JZfPz~yGI?`sJ#;Sw*n)C&d|1g00ui_+IYL zr6Ov|TBMu;!t_kJj>B@xvU0M@vOL4rBit?2wa}wye0AM{r6NzDhF&X0dbDzfrgTRZ zPQq&*Gcbbt({xQ~M?0!SB)z;+Bs%kvt{1|0Av}z#s&Vdxa1HkS@RPVoggNVxqAyas zhZG%XT8(H=t5%61TC_?GaCW~_QxXt)29c3w&(aj$7bH;aS~0_ZKR_P3Y1Qk*9nNEb zxDm56c_j93z%VUdC;Di8XK6}Tguj4r4Nv-F9mInsZp*jp(D>zu=X@0uv0hBDf8$R6 zB+Xebvh7B;*@9Q;=z5Xncm^O3VPhust`^fBN{%@<=Q3$!wYb}!4Va}nU%F5Yam7Ww z2-ix+(H!iSVXmf%M3V2~nVRCF1QK1SiA0cPOLdKi_1lY3*}Riah>j|A{f3z|rAFN9 zh@NeB^VCe*RwJfs<$!tKt|CW!JSm|@gwo!%!iVx}cuH!}H3>deBRbeWM{-{FgJ{kM zG0C2oX9~CRw41@@Zg2?UyOwnO*8q8%CsE;(;tsnp#~hnk)bON;4_$PawPcav4G~>Kok> zZ4G_08QYG=PYI^3c4515cngj>E9mMLam9M`c-_UPL}vT)ua>&Wf=``j)j*jQ^6pxe6u>b7+DM+$uML7e1To;K%+d0B_)agwLNcEZosyZFm9i|v>OJHEv ziv=AO<1+@-iW5l-_XjJ+_Y$gYTsmVQ5?+;1{nWg9`=YQTe4JAbUw!YXOr+evkQnvE z-yV$qGq#J{Bsk4}{_BrVMI!Mlbr~;<_U&$Yy~dQXTLu2ITnG*Ny%^m_uej_v5F@f7 zMIiP9;{1`OIiGu%s%Uku9u}i5)^B&#-8dpXvfDdgP6LrJo<2J&qU>VskbE^v+z_?>y8w{pH=q+$f5<)7;ZnB$%1PCR>KpDVL`Lnt-} z5FOJy7z~(>=>|;iV8E0lKnR`C;r|=y-s@{HyPI#H=l{O>o{#MM97&_mXfzs)Mx%32 zXGR}f7@gtb+F`$g#&di@*-*}y3IC~o@@Y1inb~A2X~GNl=cSAw?JXlwt8R?ZCYm{b zjV9&+f8q3xnKk+3+<~XXghFmMTWw~>nTb+_iW)E@i*oP}s7+>o%FN<=pv`2mn5+O~ zMu^4vJmY37H*sFMTxW+ZjteLsd%M$USY(qmXRhB65 zhceYa%EmvLQIM-LO(s7-3;io2|H?lB77OJC)5Bzuy*KVzqKX5B#RB|pMi`OS*qR<< z8Tg?7MHrwlW6Rn0SC?|U_Wa893kzxUanJ6Z+qLQVWykiPf7ZQcn{FR} z)U(}Z9ZkQn2zSvxy0z>1S)2CVKl!X@yY`>8Y1g%D_x7f9|v zPw_MS1kd0PZ5M3kY`@zMvq6?2mc=}o_vQ~-24BdR@+Ev3Uy#JN@&o)J&()Ujah6rK zb9|+3uzjGtH~-Ccmj7bAYrAK=Z+l?7YP({)Y#VI3WE*R}X1i#+WxHwn!T!DdNBas} zZ~GnFZCi@HzkQHBgQr*rI{G<;V}gB@{f7OL{g{2beYt&}{TKTT`vvJV1ADS#lYNyv%`w<<$o{KsfW4o+ zuf2~w+5X5j&(CjNe&j*F&pAtCy~>(gdY4#U&cvHJneG?Mo;NphnjjC!$zRsxrU2&e zqm zBx`JiOwO!HS~FKNgiQXaYBI%|UCe2YXlODy&E{sZ(D*jsMc!whu{mHCPu^#I8rXnR za|5^3E>w}DB9|4pyW)Bi5C)q3L9{;zVtO&Ok~yQ8!GiPr!ks0Zey(_(-by%&yRw;{ zXSC9XIVr<|E~+9BBj3K8Z3h9a91Cm=+eL>yyCIg zjA!azV^66J%$x6nI^pm6pueK(v!zEdcGWl(Jc~^9WFxJFatJCg*-4vYvB04HawUW;h(FOoi@vP`(6%K>qcs>*SjOTOBdZz%6e(T2_Qrcbd zM1L~J$m`D1EY~RSEDMA$Ia@jiA#>XFL&i8~RmXA$ac|Z|Ut#QZjw?IV?lQ-iU6>%i z;!0(DrX$w;e4rU(#9fhzM5&P$lf!Ns@5a^vzSP)oHq@9C8&hf(b6UXk7>kr!$eq60 zI2qf9r5a7k)~<+BMx{(ibv$=EP4PTbUyat|xt;z5=$-six%hOvwW)EeY<$ag48mg~ z*;?;;i^2T%{0DrjOEI&Fam@@k-AT}Tg8ciH{JTL`)9Z_!Vb*4R9TR%EwGP{C>?&80 zWf^zM^<)`F*SKd{zA-1R5gTay64$s1coU$J5C%YG(6(#8iH43?3q?SA_C#U}<&jeH z=A{#-+m;UnPrfSu$O^7nz|vk7Dn${yxoZ^0&oeu@D;p_`8p+KS`mj6^-HZjJ>WA^~ zvirvB_-LLo$~X}p!{?4NSjBLbV?9;G{oU5eHmu`2h~2{ zF%uoU8A(|)QmdNo6%rb2*KU)ZX&kSS1g-FX&95ODhiiTUnP~CMGi;^t^)n;^N1u5a z@8xU#1zi5R)?UE8TDv*R&P=Nfb12UkStk)KvAX3MJ7L7vyMwIQ`p+Qit@<+S+Xj^N z&xVvWt6@VxWu9#mLp7~UkY_Y#QWGUznj9yBTQ=ny9(*djXZ!A=FsVG7OMgTf*2nVQhbivfK6yHI}|i*}Gqs*?V81 z?3%4Yjn%JG_Mum+5VZMqqVM7BL`%(9L`(Zt#XyA7^DnO;vGy+&(7N%T^R-@j{ZAT?1 z+fhl04=YhgAg3{MOx;Iq&lTB4@=v?*ZiD>*2=kFT(IvvsJiZ{*oFi^JN{vF|k*; z(d{cL>i-qdyyB~T{B1Km+*tB8VR+vH*NxZe9kYNPQF z)JFFosEvuef{o=rP=!O3o9Wj_%2d6+)Tvti2;`%FR4}Gr2SV|v|44d_93a_qb|7I2 z`H{eOeI0IW9~fXPpB@14UO!4aa|RKf8G}6lHwP1AiVbNFB*vRV_oJ{vDxrTj6(e#Y zvsW61I4?8WxXxwYiWwiIhGteDS)2-+irG|nVbpa9bmob%QsNxra}-lb7?(!9l*P9yoNJe}xkBmYu2=1mW^ z(p2^LH+Hs&H?B{oxw>w~ehryMYS&OBVD6ITX|9=CqEvVt79NS6ZzH>eVG+_ZYyq%Fp}FsY!<6yw)L)k{yYk>LVBbFA5eZHiGnvvSldYKbQ~ z&7?&orr9=HMC9un?rv<6*!Ef%rN6brafe$Euf@3 zKfR#hWaB|*NM+Df+@ID;ss~bNvBXx(gMEAf`~;)v;;0a0cyLW9D4S=rTM}#xTzrtx zTL)N7o0qgV!^8?Unk^|^951C60c6h2HQreI7Mm-ptX|rf&6IC?)+jbrzOBug1JjTY z_FguDjgxP6mv?f%WiIbWh^w~A9+z3upfr{| zTKmpvWFVz7w?WlqO~r5aqdE1L@fhaMCJ!>7b968sG!0q8Y-zGjC!>aRR7Nf+bBrMu# zo0{WqRBl`RP0EeN--)@Ufhz3>R-R=WdAZ?LQkSkXxvct5{(PX-X%4i&p5S^0OyYPR z9|)dQ_dLiCiWz<2BnW#l&KY3m&ap^#>ui- zDHe8QPIgMT`m%4>n(v7|jNH zdcA7$kArARw4jtzF#CXoi$T`Aa1Xs!(G=dx*A`2FrKB}h~>*G5(# zwhwnVuS~gCr$g_AvfYqAEB2HSX@YfH>S6<|kzH$*V%~L68}_@AyQeJdM`EEeeU-)2(0@4t;wWEY#t>O-a`{Ehvi zuuO@lzq4w_g~MamYVmC~O9f-@kUJHVj8e$JETQx{N(WP# z%k)D^hf$ig@tRA_M>?F+v>(%43n?8-X^Twnqck-@^AP2~P`WhIvcV+e-1p=JR+JEF z3jk4;YQ)R*VoHZl+9A{1DJ@&{lj)x*9ZBW>GTl1^>1av^$aFfTB}IWUy`IuhR9?)P zL?q=?hLbXiOMv8sNXstkGCh*gvcVEEo#9QFl<94hCP4@+CDTW}=^&ZDKxx@vX_-!0 zgtTNyFcw}AFpe@LPeWvS38iI^LS=dnrOQzRVKRM_(s7ioAk$+qk(Ofy9SnT)C>=xP z5i-4#(vky_GJS>8lHjB=G9!60G9*P&GCiEqk^|8)J)6=rXn{_dUQ6jvO2^3bAxf8| zbgWFD_omCr^gT+;AuK1;!dkQDz=@h{ow49I1sV-kW8Hq*0`1s@tq;nUZ?1joT@}I-s&+`e< z&-vx?H}F&h{#HCy1G@O#Q)Plvp=(_>5b-=jS(D;z*Vh|^PnE@feBr6ub~nKN%->EO zbnsCQW8L|dMzM?U*oMH#;ksfn7G4R(y6TkTD>?HLwi1PrbkJ zJN16ged>L^TSfF9(-pl>yhXhqa_d>P#@KPIvX=+LZucbhRpMTGH3kAaT zhn3i=VRzmvfhEwaybo6xdA8OW)gINB-ZeO^V6Ny7jlE+7mCa`3#F_{&ZnIdxSZQ`Z ztSipqV3>@IVl6bYzE;%bthsr!BOqS9;b5VqrbE*7`T_AUA)O3<$9kGwtY)mL4K5$> zlU1uxeJ_w_cc8)hjRSvFYL~GmB(Dir%5H$wGZ0 z11zjLsBUFp5diCI0oZ&ZzPwmqVHV~g~mdFc!OliS@vAw6m)0p@La%XRUz8&ml>A%^^ujMCaHrNx4|-kN~=$LgMrw z>EQ>MdkV=WKM51;uVA7*F#q%iOrC<-?k`~?17t&O17t(r2C(WFMq-gI1(I#i=ZS2) z9EP%i3RxKsvL6BgJ6a;MjVcUVshEO|^uP`*2H10|;rwFE%DiZ67FVDV9?-Pnth$)$ z&nn4AX}WC1ldkU^vPQ}*Kj5-c)^1Jo_G6{}a$w53Qi1rS>a|uzPK3XfQJt{MPB^8S$w4QavbI}6 z9ro0nNupGNX(GeIUc-ESDN5D0dAKz@3IeiOwlFeUHt}?Ce#MKa zg;Rl9JYX}N0Lzt__-!v(lNdQ~d&kImJ3a<5ixo_=*+W#VScOXS=~6N}USE3L-Catd zg9c*9UR6ECTfJggRh`S~YFJZbb?Ka^vFW3R5FK4wmbGIiL})qoH5(`%mSf>!UO844 zMC~aD`IA}iLRk(eW{DDC#9;!0+&I>d9T)fGSUGk&E2ccV%UB=b`os!bLM*JzoQ^^1 z(n8YLiHSX}5s#S^ntn1_zW@Nk)uJPjiqR=7CSC%MfL5K=ga!&)ycl)`uC zn+z(PEaj8j>LBl+2RKPbWq1-jX-Y!1dXs>r12_+rNJ7balK_T(^(IjY-RhfE$KHyy zDE0Gqg~4M7CxgDlVMgCA4v6BEnUIG|qHS|_yYva#(NxlFA^Qd#6VM>~VY}$|9BX2| zH48<*h>Yi0?e^f7&8MYY2b{tM4WrcJlSC;UD|-5XB#s4rlX9lG1puXR8JhH+qQ&zp zF01mhaA5rBM}T5zQ#RCl2AEa18Jo)fpNRd>iWq6TrQ*Hj>_Jh|^{bLDo;FL&eU8=t z|4Xt~u$w+Qw!HOzfs%E5a%V34uaxZnuqT&PY=|iPGW!Q+!^7Kb2o}ysU0FrzMd_Ik z>o&6&**Y=d71q$24UZsvi6>rRVdS)KdzZP$tCxQrmF4cd86Mb~cfw=sJ?R0AzR9qS z9=VlO#=@Wd8Vi4lTS8oUjX7aMlz5%h@NUXQ#(nl4TO&$rW6zPd8V$yZz*a0e6fSE_ ze(r+Hx;`FQQl+aKL~MhL95%r%)U#eu*d5oy1c9 z!E%qO3>;b~dbDMm*xo{OFHef3uYogl&wn-d{^t#xW}R4j@i3G92=>U6qCo|HbnBO# ztpBQy{|od>dpIS0Rm(Ve8dgZP@&ACt}Y~vdGZiU_!?=eHvgHV@dMtwaJ)-FO6GtYPeQ3=BZV`kRfy9&l4b}44H|AmX2|1+5!v$8OIvtE4{P6~-i)Qis3db!A?n;4vP%(4x zXXBg@Np;&t#Qw@YMEGeqBFf+&QWrCjNU+t@Ov<~o%u1RDstdQ8&f)k*Ec}&)$&fvY zlFYXzx^gJ@=&vk_;$VRYr#(!b^a$HU)~wh@d0nJ2-5F`7ZxU}^WG^^YAkP()sBaci zFS7Q0Jrhw^Va+*zW20JZU;#J*U{qWm4}>@Xn&A$RzJ~30p+;H5@T+_EC{k=Ia?;wNr}RpW8EN+#(f{wdNLU%GgPt z-d42ERR)@Gm+$BPU(n^ZAF@?!Y*wj9tS*blvc+&Z>85*OI0-_6j&AU#FB#E+|Gfml z+i`fqbVS?Z)Q0KvM(p4bHiYe%a9wc34ZZ}f$JvaRW#5aPjJIIFi(t;b)h61RvG7ii z=n-$VWo2-_i}8SBS^dqtH7j{dUKc}q)Tj=e*ThW=?}lLW_EuhjT@gQ8d1XAZtlY(p ziaS=G%{Gb^Hnf!@de{*(v{9tl`8_s340iA@kh1vky6{If_T!(1q}XB|u1D-sm;M5x zGr8-wiTuC=#YR8eOxq~>`SbS>40PHbHGULf0eGAftpa#79zE!>QKSX{WTUtkz$@Vq z637$K(z}5?vY49hVdnnChM{(W^9`KingAL2YKZ|o$@slWYU*9w7 zE1CGX1g}|2UDu*e(`#O7R*Yi>X6Fi7}*D{rw$4?wZN<;v(>8Yp8fFh)=UT zWaefj(Jhjf6%nO*3=Sijl;$(o?W~_l^CX72osJ>Ac^ED$G^Tq3bOc<{L^06zL_Fb# zUKavJO%Xhl*JP7K?NHv_4B%%(Y6OoH>7l?lNvub19pqN=pwO4wTr5#vAnzWS3ofrh zN|xCIDtW=Ch=ySjZ`Uwho=p}89->1CFCn&t@n%F7PMeFMDywWbug9nyr>{kni+@D$ z&mrFDBY1N>szzctI4!P3@-TK;_?6+fE-T(D!y92LrIq2Oz?5la_)qMX_%VvdL0K=1 z;=rF7+wS9zZt`;;E@!=p9?<45+Y;NA+Bq; zys0VI*dsB}Ai3f}4A$69X(Bq7R}IDPz>yI7MxY51^d zPpLd{Ar@RYFUpkV;cR?X{j$6PT^I|onHVa2(UJYgSEAz$3{H-#dQ;?ZcMP`0i zmCpyVD%E&ZfGn)dON;K+xF524f~Z-YS4XN{b-oN3!)x$2fU0W^nK`Zo z-+;`vHIcbMEUL+?l{_IA{$vZ{aHS&Dw`5(b$=_mVr;YwNCV{#rpuc zUu`sXPSmf>%OLY@N?j0rYGVu~cr-Hi)aJv{RHr&<%8g@39f{*`9iHcR-qS2%$ZA1? zeVXCxa4=MhM`x9+$M>_S0!X@pQjzzu#QN3KZgUJd)6WTW1GIWV)NCLrYSVys0x6r3 zS>>F&iRTdykFIgpL+T2AvIP-psQjxJpqS`U2Mg0V(WxQopBFnC%AQ|n$X{XGM5QMD zc{I_Z3GY}y4QMGu4Iw-+vN1+_o2c+CDx4SHp5=++Y-7CtS2%hD)#Yb-4L-~!Vw&=4 z?&omPx*0FQ4V&oRjDLU`zOxx`!M9r|Sy41|p=_f{WPR&`kkv}FOEnHlQCK~1)4gvq zyl*qTZ;Qlt%`MfK5ObSb%8FN-Lw>i2>SL`n#Qf%bv}V|giw9$^?}+`+S)5rLp5wJ~ z%TL^X9(w)p>2Aj*5vKnnn!W&_Jn`8Jn2C8}#tXa&`&s<-0=Skd!dmbcetno|+yW}$ zwCL6XB6~)RZ^8QmH10*YijRL0y6=QI_ad(qc9QXCP8;28GC6G(wHh(OQY1#$MD3Ok zhSB1~mi(Q#3=6^R*AVRP@3gsa1x%j>YsE$uzmCu#i_@;35&12F{!G^2U*g~4-l918 zGM^kP_YJNbsQ+SE%%Kfc22N=bow&(O7XFx5F!S=V%D&2n*xh%`a^evBMxlVW01JO3N6eF1BkN$w)!BjNb zz(UCrYuj+#sTT*^@K{8u$y@v4Q5!6R%SFAmc;t!hZF!lbj7uQop2nMDXn9rB?m8~s z0!xM!izF=q6hue)hvP8jxHza!04MNB!(4P7-bQRdhied^EBO{sP0?t@(NrQ;#wJn^ zC7}ebV5zJ47zA@g)X=HtFlA*uLPcqk-BeM&9go%racbE`bgGr+t#;7kH^dk1c*CZr z8DjQ$GuN_fXnMXTO-%NJxtS~fX0|ED>Z%)Khn?d}QK`eG7`yB6RY_%_$(3?VTxrKA zffK_%#LAv0c7Dj`;qh&IF7OEIfE6N7H1EJ`l#vW~+8dfOp2tWsGGeV*&TGi-h|~@| z3Xlr`iAR117{hsjb>wg2@z;+09r(27cjWz$s?&+TR7cQ)FL`Id3&dTQIV6r0PA`Sa z3=>(3KXawu1;OLR;!Zq1faow|+f0SxTqnM%G378<&Ps46U)2C^2t+oMjKt=6AMlb? zrsEq80OqdbgBS*+j*9ai@z!D(1Vy~pnU@BApLUi)lhRoU4OI~fJEL36#p%wxF(9Hp zhR~#50Z9+NLX%O~BQ&5yejP#y&9d?sIvUD;@2!7}@~M70gmSMF|kmEU6Q>Kb8U%p2!<`1!(3CP<7yO z0n#8qR<8hQE(nm-b&h0hmIeXJxh{q!^2s!=U7%O<#6P<5wQem&^bptO)Bs&lIXTU; zXX3A2`CNdrZc@T(bdz$^t{c{NSY+L#Fik+FLPcVi^Bj6qOdn4j!=a(lM{;zobmNgp z?)-@~DVOD7yaU1OBcvOom=!~v$yCSg5dxaRW1u;dNHEvTQRq{Dd9jeB2X}tKU?pst zK7$ZJOnqf2d#9ADK-s?}lBz4n!Q&j7cXyhqjoRu>;&yNxLF5!<(J0+6NCLt}5Hkz( z1fpF%q(D{HA@7izGI)^c5=ltbCrYj04;X_^<$@5aw{Q9c$}}}J^@(%xgx>T~Bzrx6 zzZ^1`iG=RF92+A(>MqUIq1}1ix6~W~6Lf=1MdTJ~x;;h>(8q;5d;<;=TOE<;qz1j& znm&N$IMx#6VkYK^@E-i{N)0p>i+b?#9D(6SdthgqC+_y(HJV@qX`fmRwPt36ex{Ek z41^sIs0Nj$wUI6pXE#kOP!Q+DN1salHRV&j{ogBu^j(iDgzP(8h;fd4Qg_rZ@h~Z$-*+(1=sGZo}crE?ESfi)|ud& zfHw~kIJF?*aE&WSaMy58;&wT(E!UHxi0q983A1ZeL4vy$3&$5c**^noraqY_++s2O z3;t`NjDcVBH=CS0idEIERMqN3@=25yP~i-4rJy}kEa#vfif2+5isgVJgqlWt20{C~azxPA z{FpQU7$ERXqf!vycn^b1B7rN%(s(HT4IdSVcxC?`g)#0(dr z?Jl@mSd9I7d`t^1-maDC+I`r~f-K9o*x%B~e#hS|sYaHB74;JdMOKww{4hQ4Cx;-#?|HDiV{OAH0+e7j20?K@K)>dR7C-RkV^Imd z3SBuYC_z`+olcWJ+>UqLiQgjT0}dAEjUS)|Pl~ucd}08$NT}t+hs*+_#HoQiOq}n7 zh3Uk|zA$ahi7I_Dna+#8eR(YGotb@6@mF!AFLxmo(GRI};+1|VJ0ZIF<8>Vu6t=)% zk@Sgg+aE^ruVP_;{wi=i>JLBI1<@^q zS42vr0P?(8mLjX4OhNT?;%*8os*B>80obCR5UB&;z`7{5Am!T?Kh>3%17-WI2lDcf z*lJNn1HlaJ(s{X9M?Ec{IiVM^(V8$2NKc4^1A*cN}IxlMA;fvHPk!F4IBX6#e zT}WeXYC+y3d~1?M1T1+rz-X zlVa2`EMmDLYZ#B_i&MqnVZ36o(`<&5_k=}Y!u``TqBztmJ1i<0yj9%r2j8C@b@@=A z@kt367M<9hvE}rdlKLfSBfw0PH@e2##RP-L*C`4V_%_*~oj2jOkq3Sp$rmmb!c5aM zM9tN_L(u&Lqec(8yEDGaOiTTm-gpg!y{AupN2Mdf%ri69t4*Yy~#PY$-{wPIkp%Rj!a6Ofl`96&4 zS~6wgxSz)D8ec!*&fxpgZsZOg+FcS+-hESCO6tw27dHL$=!eO}liZ?uyw9oK=N61u z?5{+1gQTLt^k}ZS75)Ndp*pvR?=X(Ri!ihZo50P?4 zF{B7wNl&Hav=2kN1Z_Js_->!xcQ>_5IGb}|;H(=1mz-1b`iJOvB@WZjAQ%8@xlUC;sj}JF|HqC)_dmUDc64b zp?^}s@afyP-^e_@Y1$tjqWh9Hjfz6{^f9{kByZLn+;(vIl>O;1CR~}b`_hj?e%pKG z|6rhwD}gBr*;Bca=PNL!POn%xe(j_I%l?_Lc;AX)8S^Kto~W4O{!)sZLX-0H&+a|B z?dO-=Gw8srb@MXUte!qRNlqa?-e-s!7J;!aXLk6^q;XHGmVwij49Uw#p4cxbVRzq2 zza^(nnB3G4T`|{R9cSNo>+v&4Lq@Ub6TI2d{e@d zZ6n8D8g^lDKRH5i?u#8#cn9VU&$_gD&_ugic(-lY^81o|y~lp#alC4sB2X0` zpq)NaJJFXfK|k-`aCr2w{5dC03CZ7I95it4rF6Gq`2&N4s3sEFMnxejOo;CQt$0FG zg05beek%Xg!^^i!30eJ*{hsyP{B;ZdxY+Ji)2Aq8Pp4*=FI!69*>P>hi3H?94R$6d;Hj`zf5SI@bG3@=8dcw#&x#|_Xnip zXGuxzB2X0)SYJwh^5sU*PkFhiw~fo^u@+{o&)7CBXThdfe|T7g7{jYJDhgF$hWLue z=qEI6shsnBcci6fA8V4ZaM9G%C2PN*R$flzKQL{0s*lRAT?E3XvSq06qFnmNd%bUO z{`q{)K~uu@oTcNZ?C8BV_m7XxbTxO1MD|odradVszZf&Oj>(^p-z(wgv^(P;?d&tJ zp{TNym;VnL^W{>wJ(h`>HT;>{MWA{rC0QOx8M1cdf-Pz0Q6ffw50r4$FnunXIDY8(fg`sz zu1fN@F;cZrhuSC-vZz)@ct(}F5IxbjyZ_PE<2#Ed{4(+Qka-&~ADLHx|GM0wmTN%x zivlbP{k1}4MV*MAJ9OcmJ(JEZZDdeY#K-U{UCgJlTbxmMtD8=Fd9!z?5+J;g|!L z&Yu}s!P~|*pDq*ySX3KZJzbz3bo9-GD;FL*{&2~Q33t|>9dLH^=uO88I3y(c_&P-a zDb$4>1tSZQFC7Jkx24}3w0e8L9j1hB>-wIbb>O#I&Bd(MynK!SZ2MJDgO3Q&5vD}Z zdnpfdw5n%XOds7s@C9a2oubeePzK+D?~d%GZ_i85zm~gX?~eVC`XnW+S-j!ivHm|? z+hY>ewY+?F_cbSJ8Jxd8?%2qKi%$o*ErZz)hF)AV_-a~fH)Z)A%G$aqnjBo_d*H7BjF)0T zHr!TQ6z7UUUx++k&TaPPT=a-#3vUlPxb4d9q=W}IR}Q$dde78Iw@AWe#6*d;yp+ga z#~pG15hI1Zo>$@D%eA6r!=jKEqRW?Uy$k6r61dW%A8j0;v*ec>KbaDCuFE@q>QcYy zKbu6%2DqmFGithTKupFC$)vhPB6}(|xxQR-F1U3odCkaM1I8pJEZn_0@Jds<{OHDUd-nR{OBlPs-WM2k-)c&~?{STNd_#gSS<+Qo;1 z5AHql>qiL>X5AUM>(SEG%O0Lu^uB6Q5}$10wpv9&s)hm_VmS!HW1}cLvfM z{@C?g@melCy1C+qT>f%N)Ijv4(~dYY`lAD3el7xb5FD1v!>QQxSaIYo9*W|G9lXlF zs6Bqi(`%Q@m7h!WclzOXDdqiQZb$fqmNhq1tJvJ*#(z+uJ~~mABF*n+RaBIEOW_jD7D4n)NTY;E*1m!@NOY= z3S*_P^-|72S3uW99N+|W#c4|5UL3(J5ijrMW7tyh^IqOtf@%a>24OJ-YF41V_VLy- z;Dy2S4L5y&o+ZxhshE`dG|}V)y17<-d4iWKR*2RqV)hAM z!G4qow1B`PCp-kUC%^#e6#m%tDPq`3Ubg0JipWI6@qD-$^Gn{`(r4j_!|p6Q198R9 z*cq6W%(aZ@qVFgb;=@U52FL!QM82n)5YZ!_4}4`A^_0#&Bi(#(dV7k)8H(I1mxxGZ zeGa-#87?<#{GD;ma+pv)?4KlFIK^vJ{8t#meKCrOr*J&9R-8Ho#4Eaqn^V;}#_8+aOy zKF{lxS}Q*^MZ-?=D92q~{TaQ!>BF$s3QOHg@$D}>-V6Z=74uH;G9_@RC+oUydn$qc z&hO^R6ja{7C4HCdw}K2MaMH5ALQzC_n)u@+j6@j0PHRQ}xxyU_M#u1ttU?{b*Skck zQ@m`f>mIdd{TGypjPtx{AaKxc7PzPB{qwwSB3OiY_=HUW|Eew`1s+OVQQkt)@SDMFWOlmIy-vFNTp`iuF3o+{Prt{}TEo5l|! zC>$!w-x&-|0i@{6@H3x<6xdD-(-P#akli1(oQH;P)3F=S+ZVTnLKSdE{Aa@r9% zh}aoG;hHnTSE+WQ2LoC`CN4pEGAO2@e_INmlW}y2&_bjZ`c=46I^y8LGfyRo^oq`t#i@&+Q(N3%U32wjr;%BPlM3jH95Cvs8o(~J)ONce~w*e-aB5!IdG z15F<c+wHdfmvRN6^O&4FlISK5E!$o zMv|(7o>F)-S>wpihshCA2$ck?_Ek$>T8QRby_GA5PBQJDf5!SYzvk6|J@*ovBmip(FFhoc;a$VEBIs5;9N>tDKNT-tUcBgmg&T5Y_024qVjE^njfy2ZCoDW;58@nmambzha2I)t{ z#u8db)xRsKZ*hhxn(^UaIDiX{5J<))X^Ru=B|KNqEAtb*N=4Y9#TlVMXp3cjqC@!- zBvOIwCJ-^Rq!v&|V$HyA&f+Yi3bSSX$LP;j^y{&HlK%50wKcn4N`%Q$A{sH>PBd6 zaoLT(25DDSH&Q`laZfkM+IwOca2p*E?rx+?h{wB;0UC>Yx{)kF3Qr=aS&&%V>Fx&9 z1N74q-PkQ*+@q0CFpqa58A1bTa>kaVZe&@4wR-F?YI1pj@J~mX+eLndZ{6ui&H4z#R#q z`haquS&$VKuDxo3j_Mk%l_MpW=G5-i#afJ|B9Yc)lYa>)Ho2})4y`Z#p`_|SElitF zT{XJ84v)x2%y*hx@bPJcSOmf)$cA!pHAai;+*dA`R+MCu z?V~IXEKCFBHyOw(kw3bXuM8sme3CMV2$;fr-T7_DP<$7&4KY=Mb_U4$e7t5=HX z6{`iq{-A3qCS7<81XT3kkV`+^67rZVr0vlg{4a)VAu^O;)Oo-)gxyP%P8n$O;vj%v z0=a3@RO7LBYK;)ZXh}c=^+F512MPv^>Jf$#J<{k-h%(2pq{A>X>!Y#yqB|pHKH(xW z0S`N&B(sm^vCnM-l65b7w1;2F^$<;$!YuBVVLeI<&mjpuD(05eV%_|K`hw74?<2dG z?N_MZ(hTub1-+xm#3oZP-QR69DvZQxZ%4wN^rK7ALWI%=!sSo3nsBv4{ywV*?tSza zNeO&plFK%_G{AICKHLIkE<-QCVhkjLL!`TT8QKrNlXmldP&Uy$jf|^N{k-H z24hZP_a4b08vwH7Ak=0IBu10WR+1AbW`3xM@z$iU0Kikx49=mRUCD$E)swJl04rTF zB7A5KBBQ_+Q4B6kpt3>CfZoTZw<^K2(qO>A^HY`Zb73|DB+HmaA5_U1K!1hYOo1q{ zf*4D^NkYSNvXZ5p?=66cD|}=yk;J26&;#S&%>v0XD{q#-^|9^|ASM-J9+%yuZb-gJ z-g+cinxvq!3@g~$kd;a-L{n}ZB=(foN~s}2Ci+9OTlU9I2br`qXy~qoGU_=%)VN{% zeORV+6pa*65tNUF6PYm7F(JThve-ch{n%SRtYzBu0A8|H&30H;1#A^RRM5)v)VpF% z1+BshxJ?P>@?N|d1V&lc#GnMsbbT;>a*VF6zAI%X0lQR+9FP}*Tdk#Kn_oVVjs(UiZ8Si0_nsL-GHRCvm17=)L#*@lY zVV78j9Rlvx-N{bE$mHH$WTGiIhnGr0Uw zc`(Rxg=#KDH=%cw`wrDq()P=iWW&Lc&b4N$|9ZM;Q&Ecv8-t;NQxk$QN@+3=uf*tz z+Mp`R27!_Fgnyv8dcS% zDhF#6TF-BwdQ5tF|JxmNuA8%F3vvEj8oEqCTpxmB-zyA@#NRV5mGOerPXv zCZtP(G)TIBa@3^gH5X&qSuNkuCSx5PkDg+Yb0x!U?V@iG_ukb$#<^+7_q0lg zgGqf)Yos0_;tbw{w$Sfq(yz3E6c|HY;2T{do@uSs04eQTYwEwfJgWDwFbBmHj5tX#F_WC7(6T=Xg!~# zu>S{IE4E1-{y@8d4{z*fqeZgq;zAp(InKSSwbj1hDdWYAwpuhIRJOF$I-;;@J1q&1 zdF`|`wo^3y5C+69(e^`tp%%m8Z_F0Yb<_siq+AagFAjIq>fmEA#X4!#_|Wm<*-lzj z$amLH+S|pq(zSHEYcnWyaeM)4PbV!LLVvN7_B!#a$wyip`;~FokQM!r`1&L5?Z51E ze+KNDNyjTj5kCPVU+I@yTzT@9ezgS(1Lew(oNWG-R$-GXmh#|hB%OsUQVSLIeWGk< z?L|I(w&>PbdpTk_dPCF5b;uH9;myz`=L^yUK5Dku*IBE@Q)dhN$68}PYL0l}W34WJ z6yUp$wRH_fPRusBs<6mjf@PrCEEWSv@ zkV`BPS&I_2F|6h$?q3YV)nanG>qtVbnQL_>*t86PMtt(AHlg}P zu6__m-z;B<9)|ca|4nW~t45btGiD>AI1*ju@L7gNJ+-EMZl?IQr`C|3%X(rO=VhJh zsnxd!%FiCqrASviK+AuleU74W-)Lnl(EBTrwPr}(OV*lO{c$Ha9*Z^L@|9_0q9OI1VBCcEOT%{-T)z4R#zt%qWgd0Q-K z<7xd_l&UptMqS1Rl_kob*QRNb9YFhYPycXbJAf3n_fj@i_CU%2R>|O+Y0$WN;=?qp zW!z)P{QV)d^7Av;OUw6Ue4InjkSDCewDFh_Q-?ug?-hI01M#(J&&}6s-|5!aFz?|U{VEu6I1;9B*NDOt=qx}d8 zK6C_nyH8|{fTG_g_Kwi11Co!FWibMcJU3D+jjVT7R=<&&Gisk7R=-eZ38&K;>kJ|T z&Iykl9`UikP%axsN+dT%%I1KC`t+K5d?RFY;{+CqePX!)_x6elsw`xbgsd?Zt-d=- zQvT^E%~@797vzLWCkJ_uvosuyvP~FT)MgmkTs%s)d1|y4RV+N=*un$9^gA?mZl&+= zi+cKK*%_dX67P=I0?}aS(U@8LMA~Smp?zZEXir^YH^8Gr zF_Q9WVX-CBK`#RSiZJcP5OPyfu65(H#>WnurRZA~w7~R$}Qj zR$>`DR$|FjWp~DU2n`mE#!0TfG0wy8DD*!Phs-J_0mm4!>pHqVbetrA?KoLGe*(D2 z#>?7hGgMR`ua%13i&YG)B5M_c6;lG^7Y%elFdZVm&tgE+VZ4-pe&Z#!Srfs?G70+* z_8Zu@_pz~2)Gwfp8aY8SP+~4WK`VtWHJkv%a*Tjm2hL!eewUUF#YQVKBZ2>i30}m- zqZ77|=r?Bm*4Y<#N{#_DF-KyJn+O8{SSLzGy*E)Z>dT3eQJ{+8h>+qD2}5SBzOv-O zsj>Gw3=S0$>9TT-bXob0bXob6bXj>~x~!b59%w6A6rUvd6gR1W%cZ~;-6LSd75ODW ze)~z1d?1M`Ry^U(z57=O|FUOQH5%HrlO*SVRgaL#vhDhlB|G1pEUOKiEJ2p4$7%H_ zHbqKdy(v-(|29QJ_MajlGu7kd6iIWyREe|dRN0@Grpo?&GgX$&RF4Dd!KZ2WumcE( z3eT3idiTkiQ$Ha}P1nAGt{OUBqmS0?n65>zN8PIk3a729WMt32;ZW@@qW zLp1nw5A+mQP6wsp;9I3VOg@|z;?7JgnR()?S=vW1-U|$7qhc}50673m*>!|2IM|&H! zPs{=P(#69$+Up^-NOJn%7&%F#a|6fxIA!iISF7GylA}-5VrWMK=D-dhuUo;%xs3|p z+C#S5d%+t3djKcnINyryIFL#pStLgxpD5$+1sGbo7kP8~|Z^ zX&#Ra)s@G=?o(!Wi+(yJmb{8|f{Z?@<}m2A8Po`+89qhIg~QTDP-f7EG7FWt|0GE; zP{Wm53j1(CdpcvL-oce7yRK0-9T0f>1xE?|=o(;RJ=U2M^V@B30G&MNFGu>YMz7hk~XRnqcYVK#^`HAS6Kv zNhvrD3O!v=*%poWReW^}r3Zq>SW-p!w>uk3CfgwZwB5id4uWLJZR^Gf;}Kl-@I{J(SCNSG8QM$jylN#@ z^4gmuCF0gH@Q{dDW9*rl5 zBt=GHkQSCObo7m!_*k1K2d6_so+_p|5IRqgu-Qmp4yXhoI-Jk|lt^MO3cDb+pm5?y z5MM@A35o=unIKE(SQ;@zDv>Qq+zFh&08GZ3fFHnS@z9fx1m?1;lMXO^MNB1jBVh)% z2#Na&QuyAWDx%|U8>ZF~F=Me-5kBrci?tv+c?WXvfIsG%#gBBz+`_I|bPJAZ{+NFl ze3iLAu36D!iS{8HNnfHI=@<;su1_?QPm)r|`6^B=QI2$m0$+^wrP?@h=Hqi|vb91% zEa-&HEad**y;QmXLA7kWutOPC%Us_!N@Qt=6i+f_*<)=$qKoK5s?2?yQOPpbw@J}# z8EnfVS#K@V{3!&f-Ez+WWJoUf(k{FC1aIVE$y{H&l$$JbeY%phW4YFpy(RfY8(3c0 zAJ1HHg+DnQP*7p8B%$$dgZdasbygy#*uwS<0jR8*rLe5vrH-yXSMt57G6j1ny0 zq$iYOkxCcyKrSMbD_1}>g~8cDGpQ5Ndc78Ar52!XzFDuumCYtIF+yKNG{UcoPx?_v zFX<7uSK!{&P-(+@t#T>oBvQ*V@B(l7WUI0bS{Ocih80;JUs5k+ew7W{JCVc)w+iD4 zte%!m#LtB1n*1%3HfZ4?<3M~xHL!bRp3lL^nK}|CqnnRz1Qbc&TdG9&BO@O<|?q3hT#)0*f5ox08Cap9+ zMCa)%zI`WN-vnm>Ws%wRc*~;yCat`@xkL*c+2`(4Rmu2`o3uI+3LCV25dcA(wWfa3 zUgp%|aQjxYr>ru)hXc&B~d9s=a%F*6vtTqQEW&|v|K#RQZ zxYGhEkAuAsSg!F70m#uB*aq#uA3E63d8e zx7bRK!;6H2esAOszS>FW`v`FNK$FSfZkyIU;3ik6%mE-aaj0&Gy(Y87(Cu32OR$c! zG-*D-43Uu7PLT=WLxShX8U`7C>e5?A?PGSh+ZR{2YY|ebP`5peMC58^A7waR}t zxWX;Jx+yWqH=3G?YX7=0893R>B%#WK4O%1*61_Q~K+%C5x+cTLr@Ig#`iq$bkiC)Y z=n|{J;Glj=E@G2|NElB_`T()11!rYggX}Er2D}`XW?if|azqUQ3}^*T{ijd(`hZiG zUs6GiVp4#Dr(p(-1*JZS{oJt_y19_X10WK6RgH~0%4Gba$g%8Bi z9YAl;4yizQb;W<5b_zQ6uiEhlmLyFE=%9ltAjX3k_cv8+h|QJc?NA`(@+lp`zQt1& z7lb^oU@WS5Qe<7C7r5f<$?=l{DCZ+6aFA_V1_mwSP_XTQe9CZ^XW-pM+?R}O@vlJk zE+aG&z%9TsSs=Zm#i(6cnNnDzh*NHvmTiihUC=i0x9oDS0;=QqEThyY?tmk@%-|ME zn%Hm>cnFpZhrD| z>gRK2rx~AZesabWLnZHh^ri2NSNA}u+nBsQ^8rI4mr}2mrGP_%kph_XB=2JVV26OK zV6fa}d&Qh8y7@yt-VG3vES&4p?gI0NyhE}cO_-&`5?p>g$=p23kFZ(pnx`@ zG8K%p&uW0LnkZ=+xL1pXG|k%!k7AzKwih9*dE)Y3Tm{GzwtZSmkz?YWz5i-V+V0aP zJv+iJI#4{g2sx2z(UZV%@+5h5 z2u&7GBTD6X37~*d*$B-!4L}H50~&1EERrY>7Od?vWDJ5-%2Kn^Ak!>!%N9vDGRQpUrZ(SE9jv-#5k9heQ;takQ3y*2#BW_|zM*INeB-@0uTD0y=bS1ApR9*jFTsx-q z$1Sz5^RySk363t#V66gtIqW0!+mvTLlFT1 z5h9|Zg8aW{cK0UHAn*5=kGZ?EGiTaqbIzHWt$Z?c)Dd6H+9e->3^CD6l`d`RN9I0A zr8|!J9w^^*r%@P_9p(@qQxBUGUHnoW0WvFO%afbV0#?%uXcsi&@MRr+>)=`#f8`a0 z&csyh@Iy}l$xfoF zpEABMnOCH}iZSZY?KH7#j#Cjd_a}mhOb4m+EHZtw@hn)sGqRp+=15*FW|?dq-o!Rq za1b`AG8n&(PsgF*4gjbV+_>&qfengxG`1qAWZ~{shx#LcneHnLikjjh^>BPeBfs-? z>>CU^N4U3MGa>lgD{hoeWhf*I2Al)VxmO6fc-ghQRtP*V;JYK@j``{-ZTcHUo$(CB zy7!o`qjPf$dWWk8D#%xe1kf8u$M^NjS{ zt0&oSeK>xBeAu6Cm;OHFlzP}I&(w*^e)3gwAly!Op4HDDgif^GNdTC~JjjE7_T6pl zqRxN#22k@~d=}E}U&=r4{Ka=WJ~#PQCvp9B?$>gtjn3)Mqt2CozVSEj^NT2W?M2^! zxcByb^QrkTIy>&z#mxvm(;XZ@OMmypdd)cay9R`2aLdqw0Tgjww??)%KTK`mH~0^ET6U(BV^eJ7U!OjZjHCo2Y-6m-L`RM05o7~ir}8>y2_g}fIc;NMCG^HJN@QDnJz@0vwXS?&$SqQFrmC%U|r2fg5;uESK zEo$KwfELjrtM*)8w;G73V&@=2tD+_NJJXyUf=IkKC@)&zRzj^O>s0LIM(T!W!Mk>O z4KLc52f-ZtvW>ZvnZ#kX7u$`U6~3L1-5=mQ4o4k@EhAu~c&&VoimG^z%4W!W=4{C9 zkuGd+42ECX_92|>SE?fu(!Eq>mao#YF`}(|%Z$S~XjP0ztvOq>S9@i|Kx?*XW|P=!RI)wY?qy+xb%7TwV~5ie*k! zqTMVGa3_&vIJ*?K#ER5Rr}!~wSCD!D54n(1-sP1D&+*wSId_bOPhU|p3)5Cg*H|K> zmA)z^H`W;{6iyE^P!_*nOE7pjccw@ScXP0ve>lyzL|-^M*yaV{=0ex6fMm_2*f`-C z=JIuS55`uQ1Dp@Q1;KY5hRo*5i0s^#hWW7*(ik>8pw$nEr=V4fD=PGP<}k$Cqf5GK zs3hh1fu#JPP>bvXae+$&_|z;Y4Z4h%o9|EJB(%*NCcY7elhC&EBDUpgZ3{ELg*F|0+Z5d}h2St^o6->DNqZPwZS}eNi;3Y4IDuASc3Sc95 z(ALJ#SfONO^|?1g={nprRAC~Jc}l2gbDJ|AI17a-!-b$69g`b?B@d$`yRYgYgQ&L=AWTjzN>+dxem?F-(v3cVVIyA|?VlaJ557A&ARg zy{&IEDg-D@7XrpsQbxF_TdxwL6yOq;U;<9{GHvX03{!$k@#kz>LIUqMwZLbTVj z#|8pDQ3Y68ga-#N9CBSJ@6-zp=Y}6P0!DB$FV^+fT+NH(yb*_rf@G!3f;-^WRmY*t z`8{v;Qe6ai6`teGH4hqgQo{D2z1jzn10`Ib+D{*hR>%X9LOFK7h4K{h!ji>~eEG+fdLHCwzlPn2tq? z^xlkmOiqaXa_8QK=^!caO&g^(hH^anUSzgc2DdJ7+gNKo#@KaJlt2tAy%Z(*MxS|6 z;(F#}wsx9?0KrUQ8<89)k8z8l(rV&*aLlIFMI#shxD^OCfL*kW2|Q#D3H49%&JjH& zF2b|Z6uK);?b0Mb6RV3PzG_c9<%4vgJ@cFa)Qz6<7uUfhb|eKua)gr861#nsI!D4l%hT1BOk?-j48bmE4f->64|c&_F!9l3+S z(Q7EfDq{v!xQ0GY5bbeAV{8q<_xN2^1GO!sIWo93oLdyLbIrCs94P0=CAi2U5CX(x4KT?6a4nI{%DFGgZ(v0R z;@7J`69xoe`HWhkW_PDU|<2ELtU-)K0&gCq|%>tXP2Hss_vK19c4p=X+Y zt0g#m&Ff|i8hIg2@LjZ5)E3k5v!%9pn5Nbh{v1?j~*%T_BPEc=t(QX&AzB`g*X@Wmk6afH0Rt zrF5Wyc+%W`p3d#@Wzj8lMLbSXdbF;{q}F~B=;+`L^BBO$`xba0tlzl(2;0v)idUcW znh2skR{k{uuQ&rh)aDzd{37wj@3{=@)Q*C!DG#9=!RgltSX84$4r!dlvuXXrrE=w8 z@*#|c^HFL*+@#&HoD0xkoOvlAQWHF!i3nKuFv?LTiDne}wmlH4wBdpMBUlDLnu97`A?)LHa+Ooq79L`Qbv z*Vs)p>WcmzV(e-tY9#TMqAr#>GIhcr##Tmq8xNay1qo!`Jh#L zcKPVrQr*mKs6jS|LsTIy=JhaB$dO(@rke8Dj;)KtOuH}XX0Hx;$mi{{nj&V|M>7lRyh!wfRSgCJyH zyXkg0Fum(_yK7<3Q_5&lUZsOk++Y`b^iVNMFhJy|R?UP}%ZYO2)?&at+C&-sh?~|$ zLmUk^wwb7J%%&C1#624Qpy4|x$_Ur}ju z(bTc1gM_it<9lg6uIBiVmDu`{%=g-C0ly==#T-EciS_9@^I2AE&L zg^@jmIS8_swGinhF3XK?DQ+n>(z#%NV@V(%eM1Mfck=dSQln5U@_+4wbnE zAY^vC>D}(@;I9Kw_oTP;MT-|U(Q|SB%(RP<;Qj)d<8IJO27lz%p(omA1w_{_JvK=7 zY9$)OA@fWt;rGJOuyA55(fuuK1#={p53NK)ZP@0W%w9|i>%2NsY-^E$kf{KGvi+eQ z3L_Sf5m4JsO6l6xq9e#-bZhabJ9vz>jM;kT7_%$6Vca8tIHZiJ0-jZOOc+I2in{AQ zV36|x*o;ij5V<|*o<`;p!$WwT>g3_gksdr6(neIrYHw;AO#5c~qz!1fl+Lvg+5Lj3 zjD1NaTTOzvjGmR-RcsKl12DaYQ@1vE7;VgxnE7n)ir>SG1}kZNThXItfn)43ufk=h z&d%6_I5ek#zHjSV?0isfwW5G{Ul<93su^r@)+(M{gyceLiFU^hh#u*Wb0$8LeKgQH zc3r4;j1UeK?e+&M;d^WaDCN3}4?38xh^-sd z%d^1F#0^D1$}5X=bHeJtoWh+ZK-Z=e7Z37sVwj}RKQBYYzTit95ZEosq14(}#-<$0 zUFSQ^_p)%DkIqsC{9>&=SSuTFqM$DV``CemA2yO43~^3f)b;$e9kFh0+U{AQ9d4ur z?zQ&74d6L~@M}Z?%wu+5#?r;fzjQ6O$`3{9$76L-ngCKCf zFb_!>CPWiF#_zA=tKE1S+bXvQ^_15h>7Xp|t#T%B*s!C^Z8T$X4u*}*V8Nu=^2h3z zm=p{k4=rnXn42h%zpy~7qR~2bE~dN+1kiX@Aismnz)vrY=S?HzPHf=S0KG4)U!k=? zYA?mB59H@1`TPk^|Nk~=E-@sOlL4=fxc|H%BiMiK;{|>FwRW$rN`zPK5_P#~8()qf zUUBd%uP$JswIITWQ}`ov68+vud|AOJqA0nGHvQD?A|}FvTHHmvVlMi)IJ>L(j$Qr@ zZSfPbr)7(Fc)K}UG|S$+8fy!$D|T*mEy`HE@I(^qIhyzTv`&l{=ObUFjdefY7qB^7 zbn9LbP7I4fCtE=^X5=o2SblKQAWC!IILtCB?C4rYnP5X;nsX*s$mV?MrK>(sVwVBt4qaPk7M1o#5NfqSyIWulC z4}J>=hu1``c{iK5J@f$xrwsu|4R_N~5(yFI947(&$(s z+*6lbl|T+x5PH0_(-MK>KzM1&wbQ3pi3~l3Y-M!Y!vV9JhJ&MrdNso?s1qbL_6_LH z9IRNma$1i3xGN(F5C)G7UYTh$52$Q|wHsF1ax;JfMos4fFJG1Qt|P%YD~;_boRb43 z;}l23v}CF~z}Zz(81|&~(O%`cx)>T(l2= z;hXiU(G&%3g_`sd96s@EFVS4vf_1D`sLn_4_JT`cB^~G`2J1mIpaF8wi;m}Eceox= z4(-FrG{{EuE7VZ!E6{3T#d%^?%bf^(gU-c5AvoRWKdbJViWw7vj2p3+nh=O6W6^dvjDo968mw=dDL?JT}K|eYl^c$&b1@FxXm}Ztg#Mh1mB(c2!agpJWbNI~-4@jI*p)7V?+kAW} zuUTErf@5z*y01H2?wrJI(fy$L4-m4Vrhr~EPja*cm_g7{jqfN50{~v2El`{51&6~w zaJ~2t%1gr=#A0n0V`ij5YgPtGv6OnFXi8^p5b0rBs>51DJ#G|@x_usj#$fPKxlqH5R%V)I>?*@2NF-tDMilC`H%t_qb6Y>r7agm0lX#%c7ZH4# zB99~2Ev?;s?Vtd2PbX z(zK2ir`{<(3=2Df)5cKoiQ=OVh-zUd_uJ#*W-fQbAaOOSm@!D)nzM5+&hI+MYzj;S zv9)%20>>Gbfwn5A9K))=atavCUsCppzozVj7F@X$dDZRp`r`AzkH||R9l<;5Iktw6;D+vKQ$Kj(*FLDr#RmjbS>l|}=|3WQb%YTCQMSch}n__hrsh(Myf z*G+&F=j%t3>{2%YY7cyxfn@ujn*c@z?`9yyKI|rdvExv`VR7B_&$YFVb)HyuGzp|nwz*MT2{KAT(bQNlFQPDk>&*Oe?~bpm2fM{B{6sTDxHaN2l!dYWjW zQP059atNh2?QM>9evgW$X*2TaX(IJ{o&K<7=MdcVd0oIpq#X+KmF4F)CC z)&l_PhXDW?aWBBXw6T~qm-%|32IWGRa$Xm)_GVi1C?;P#8l`ifUD7sNchdy#ejt2%bg5-NDb~{Vu3Pz zIn|mjTDRb%hG7tffBDU9$x%ob147=TQg?x-S_!EhoK z%n|Y0Zr~Q2r*qmq`f;|nj%v&mRycD$dpGm?W^={OdSRuw7Q;!LIv4B9l`Einz>{tk ze=t{!FwDZe#ogzNBA?c7a2w-b>nO+nW5WQ>phIAK=t9xb#Jy1+-V$F|pNCUd+aUbI z%oc4;oD^mk{z92WXzWVrRU{f=FAY6|SK3k};`n7@kqA`Jt)kGrBFJ)#;vzAS^G#VK z($%}nJR)gGcxW>1StPbsG%!Mm3j2PHCLy(_W0zUov zjyMM)TlTK#X`Cr;UyPZ;>(N!>hKMr;j(-Fr0i5jBB2NH7eKJy20)4+)^ly4bb3_A+ z_hpz)w?-ohhkD|CSe?dk7?3uQM!4$h@ihoSI9%@Qf-mkMC!Yy=$ny&{vouTX2!{%2;-8P8h_-XPH z!pq9&fse$ykpSZC&_}Z~H;Rr4Wrp6_ibm|l{v|%Wi+l9kMls0Ao9ZOQZ4%WZbq;J& z;v7h*1)w_p1eatNDblamB$68dDBtpfgyZ}P#E4J9G@adro3{z*TSm)JDi%3L8Yt#9 z;;T(!DmpW0v#5pA+;sqRqF2t)4444T3%D1!gHfAKo|Z9mZJLTC`(rU4s~P(0V=#!a zVq=S#Y}AcIOZZ|cv|@||szl;6VB0$-StmzFwxWqmRCUVxQL36##(|K5%p3xgKLl*( z3m}kf(X4<@B4M0o9#4e1hr0B?_O2#rPStUA#b3 zwjxM#DXrQny3)n%B7o<>4v`%nk1j*$V9~D?f<$Ygq4AFkL(@|*Ae=U z)u!GoGwmD{fLYY-oOljAV$C`5|9$lHIaFOhiNA@om@zWF8VWH43^-l+8+?JY>G9uC z`y6`XH!$}(lD=9lYthfYiMsrfwnF-;)9+Xr&82a_i~HKnlaYw&kp5T>b%^FelAtcz zY+DsiVGh&7x?@KMZZ<}O?I*%5X(zoY~tcx7M!HSwaDVeFgQOeW%QPl={a9V}DeGKN>n|=?C0aLd56aoey-=mOmwjt*r$CajR zU44;mPZV!gU@cv7zsH*LHGHq{lTC3?Z-1Z6Fc#5&eDcaK3SDn=2KQIU7=(KWt@S`zgfxa0?s623i*0yHpN5n!9c(OiqYX` z8hyL0m6nAFVssrh&+18c^JBQ2JZ7k@$FiEEmXQ@f+X0i#{UkO;*2P9yAn|5|+EA}h z`6%$aI8?T-@wSYt9pZ+*y5XyAQ8B}0H)AyQ;GYsI`&pz>VVGQp>!HB~I?)^9@+o84 zv^cXV9rVkH1fIU7nDDnHBIvMx2$xqv{B}A7Bwb4V4~grH&uR4`@nFikn3*OaxrQC; zP-nP9on;|tR+n!@F7A(B`>l8uwAl8rm|_&uw!7L5uQB^q@G=zazrE>AhI?` z#eL8krXLll$;cVOvskc0tX0ML9v2T85aioWh<@QyCEGn<(WZvqiyLaZuaU1G zqh25D111F=?X#LDeJ`daGwLdwgUzwGk#;;35q9&&KVt18`=lo9fhVyOqLfCS6emEP zgMUCELMe^-LF})-R>O^F#e^4@+)8@pl=v7oU1yyJH(pEkpN3wD>Z748m2e8N555M9&bYed=$N`@LPd3o=pFxOhqPd@mZD#H`8oV3Y$Yz?h zTMSGtgk0pa*lj*{+&z~ZEY&U?Ldl;4Gd7d`xkxgnjHBB>7irPIj9JI4GP`lWXYZz$ zKZo-85v~1PJZesxQQUM7>y+=&<9neDlv3VaaZ7Q;0WsGwzNWO%;I1fHKLzJmVTH)&S-Hp2nRbS@<6Fn+ z?oYAhX)C?-sThS`hJGe)E`B*mE;cYGKc>ngx-Ld`!I+MZk>JGCI986s&#G8?yO*K4 zC6mF=dRy`>RQsz1F1?@pamZIni{oU?^iBGVbc_x*UpR-l^Ak&qT+sX~gwxR2r=-6) zw3_T`7#~vK>aw`n2@DdVk6)D>r^L&$Qxps|s^n>3`FIe_Y0 zW_|Qj^Q$qI`INB_{HhxbZ7Zu&$C|R4aiI9&nliyK4%3iCIRZbSNwNf8-<%|0G`19X zPnItj#z`tkk=J`e)hJaKrj;>sfGLA7lmOlHP}FhI{vg;`F$NvmZjV!Dn#=;whte>f zdudXdY=@g}x2DN^vG>1uZJ7|hilMX`Xlab><^~*=lw7Uc4TzY)~!s$E>NtaDies-7-j9O3{SuNv1V}j3) zr1Jq;4@{Hup;=4Qfn>SL%rYVJSt~d60Nc&muwHNPE593VTbjCj>#wd+we-l z|N zwOjnH&MCnxQ&kmu4^d$!D13{kv=j8VmD4)QLB=#1+*w``^^?JvrbQUh(#{z5i=Abl zyU!;gnQD0KV}uc67;LSxo{zHl=WQ9q>uPM-v7UGIfObe-A^9qK(^_LhMf0zpp6nvi zjTJPl3+VV4`l^d;)+%2`MY#3h5%-(JtE{5JIEf{;(-=IxrW}sUkJPyv8vF_fRMP(<1+0cBVTbC*v)Ogz-CZR8!)gL z)VwXaxrUxHen@G(#j697mdvVcb!e^ zv*g_gbCgzGqF@Ado}gdMrS>-V);XVGdmL)Z_Qn&uvaX)0FXo7e!r72vLP`}D78VLA z#yE+~P4+{XHAzvuY}u{41J7HdLlKJ1rZQ6Tu^MHu%PU5N0F0o;-DHhO;@Smic-j^$cNdk*w7(Qs zo$N72umTFtjv# za%1~I>Z8aK6MWlQ=97 zfRBLbdkX#woEJ(3y|IGaN85YLHe_@Jml#bM9m}Qt$d0mupUK+eyTuryiu1k3h+Iuw z12Ro)7Es9#wnf+6^_<;Keod?T$h@4@3foe_T6}gyhmhu)ouj8wFAJ(r<|i&A zoLYF%8}j!OdM|_5E+1Nkd#}(SMk61i5!^!P+FI@!vO*??QO|3^?Mvv9Yh|m>y3Y`H zKB!>nZ12NeRl2z46ol#OBMPI1a zN9Y3Q-xk5%8=oD`=5r1KfU>xnZn+*x$~Ibmz1$Mm5y5?fEXUdvZh7kyU84MbJ1xEe zi}^J)=tlWi+y@bC$%Xd9OCTH^xtUJi2qO7_I`l)`Yw50j5Q8POtDn3B3#?{0$<}zg z?(ys7Iu5zw z1AGAtstV>Tio+X_!!c`Nk&+QYt#6Tb!U@C7Vp`5*pr+l4ZMhq1%q?K9C+N|C$s0lb z>;5IPcxx*+3S2hbpovF~1WLbE#^Y<-TVXhY{q0uto2&L=M>_9YgtIM!77oDVj;7-S z(w`9&|`do4w6#925^>%q( z?e`R$^(t6|*cIm*gxE3$dr-ajN|~4<_{)adF>j@G;&$0J8J;Wl<9L<1W}taEoPfIB z0W;9AwCoOfW1ULoBC1W+zb2Rk>W-7V$p`w9rr<;uBN;0 z$Kqo(&AMM+i=R{X%jWp0{Qy>jtEu$^@?ZFw@Bo&Gt7+{6a%((L85GA%)^BPeK^zXv zd{7g@?gurI{QjW4jZq#A!d-3%CS;U@)E5YR~|3zzF>Xy^9a{ z{@denv+pI-B>RwvH_s}%bDpfvzoX{K&b}wy4=`b@8;#Ws(Z+f5Zg@2^=YuFl(>3!k zoM&kId^r-GtMi7umo0bIVN&tT=TqOns&jVnnm6QVqwSB{E*|QSX35W(9SVA|5r|xF z7iU{1Vv0SxIENR{rvDbAGxO=~LdkaV+ZW2m@UwLxkhzrFzljR=(OqxKv;-8wt@hLb&Nh+1bq6Qep@8%WHc=nmg%F8W%_2vGQAhd-URBm zShhERQ8Zz(Y>3tMs>PCUu=5Q|FbY@&FOlt2&et%Las=Cq%5XKW3GNDmJF0;ni-wVW z8sg+Pl5gXuC|}P0tE1z#S9zvr=&Km(!&Lk#78Zx;n^&>AK1|84LDbBp5w8K4af-uh zQrlgl*zOvI-SJ`Gbm0-x6?k1wSO3>}x~5IXSRSSZ)8#D~(xKC#(Hy4v)8##Q3!9hAFzgKpWbp6v(-H zim<%_T7wDqz+uE7MC&Pn)SU{8SD1?}rod_eKAsWu7p>`!taoJ1aK`Ow7{J-o z{2eSy=F^?;$oZJ7@gK_6*uFOFX3ZZ4=WYHltkKQig%t^L893&|J;*@%BL@Z&ffYCw z2VHsMU9ba3WZ^U`c2^}ir<5;v7cIs8NbhP4ki{~S-dztjXs=x|E|lZoLSPQLu~>e9 zepg#5yW{RWEo(+0Xmkfoh+w{nn>!$U+L)s_h!o)j2wuSvWt6)Ta$q=}Tq!e}o>z{| z5q>97us*lmY#f1&e0bAPo-PAq~pXtdSf=}pyH85==Dr61X zvYk@ihx}Yg-QJg1rlMo;y`e)I^Ggf|_0NLyO;yyu-j~m{+~8OR(fgh340L^} zj3_vB#r3ITLxMAijy3>{4bapNAQLvwst@E);B4o$vRyA`o~%m@gw-pK^@KQ9fZXx? z6>JrL6yRfood6pG5HZ3wo1jO;G8Y4`l;H6QO;Tu{{a&;$XY6UIv}B4z{PHI0MvnJ&Y2iGmfB8GPpT(qUs zW|O=hhjd_quu03_z<$Stn`C2r*|P~e1@}^H4&oz@;nMgx55ab>2R4DO*(}E(+n1Yx zkAG;%+8Ay~G$j)!YoLdLkD>YCXrGV4O?K1qkAaVWP}~-IWeVCI1AN@&;Nwpf@bNbq zv;{3+Pcd8JhaFAzwn8qir+2o>mw;NWw#jkLE`W^#fq^}79`?jxR_%iqFJ25CoSw)C z6kS0PDcgqnXH)G@WGjdPPtg`xRPc#RrsqF_YT_VN3eEmRW>iL~)1P25HkaCMhy2?@ zGq*eP57-No{X6#T-mbAHe1}$7mhZqY&Y}G~xVUvuVXvPX4HIu?Caw!^uY6@5%YK9iqUe@9Pzlr!96f#^tB zJs#RE*TQ|(;B(aT4qg4ZOiS9Rv#rqhQDj;ldH4Y+pUZ-HCQ_W%2!SbzXev- zdJj~8phYa+!`zSYh;u?v*He371`qn=EsYV!z(S!H(Vj2lz!cQS?)8tHc|GgSE5}sL zq}%p_IWM72dtut%kF%3yXQMN`O}w7g-X>-aVC3v$s+3lSw3%9uLcljnlbnzJ&(rD2 zujB+AnGAp035qQR*kfduYPow`sn$7Gl*-O2MSMR@mHxE-WbOz5Jx)#cgK_PrW&35z zlw(>s?8JcqEc>(4Ra+k{6_EYw=+FIfFZ8u94q(-Aj9MJjb@e`oew9-3LD_|R43Wnn z-toU0aah@69Gb*zK*K^~v9O7Rb7N8^AdCQh;>*KYNUMc8c z>#$d3Hl>ciV)tblG)C594ukR58F*R!`WWsq{P!HB1m=Gp4IT>{S1A>t0IOgQ#+K=*P!0bYb8!UK8z&#Y0FECg zw_?t29S>62PkYBh)j3XAO^{9LU*lyg4W9rEK1uT@fb{jxb5xWk6U-r@v_4NRLEa}P zVwjH8oQX2C4c6^w)Nw3t5P1XU(^s1{dG7l0F>(>i_oHFd3UQj`W~ZknfjDQ-tV!~n zPA_9@n}jsCwXiTTIT^HMm?E!27mrMVwefpuJXPj!^A}B(_trsE(aa1)CqYeT_Y7Le2mNU6B*RhKTTPRJ zU`BK;m@yO?S$~BQpLWF+DS4y$ ztD@ac$&rA2+taeHIW?4qJ}sXI#Pd(fxtOhjXJE=79!fQym09M9P`c$==Y9LLK#yS* z{+wLPZQJskoM05ut1g1OEdf z?g^UlANdHITOwbCWF+ePqP!9XhrcKX0L-^9YKL3KfAvH>`Ct9E;=l4aUez{zNnXRh z|9uInG10o0WV341Fz?WH94Z^dyobyjd9dCRjo~}7$Ax#qKskr$U9%lLY4xW74+|+Q zSLy2a& z2g~?KyY#8?2yl_nRAVHB$wBHp5+qtm_l<xjF~DKKr5*93gBJloPZe3#PZ zg1|=7HFISeNBDB*HC5?QQ)w=f)*c^p^>xQ&zAKHo&Q$Wk4SSN!f!O;Fx2U< zzm;+3>`*#*3Xu~7PXTPA(*%DXN=cqTSqblqmT@wj=*(z#s9g>`z+{gG!gs@x!p7ahxeQ zmCZgC?mu*7s(u8-Ih*<)foxntQ;q<~=hEgQvKd|dt*lMI9+3wi*}pg{U+cLjlqr;t zY_t}KGDFgjOG9}Zf__{U$_zz6z8%UYEd$a6?}<8uVmaGiQ11$Q?>k`GB0BY*Y>r-Q zCWMC9KPH<*&2=*I;1|(d$FOFtm=YR^CPziltW&U<&N?Qe>K5vHOlu*RbC@w3o=oda z2M`;t-=dwzWVa^s+=jxOHQ#M09^Y^p%AH!^7D4Jf$~rFFH%8-li-k4IZDfI4+niu4 z(YyG84Gsq z3Tu2o3+;2S(Y-&)mdRs>BTuAF`~!Z-S*PRK`qH4KfT4=`gP0s>kP@?0KRS6f45#oj zvK~%ypcZGqftS(~XJoIiyj5JI^(Xm%k~PEf-o=~3o563x*K-x#x1As0&GNpD{lqQT z^(WapK5zKsSBl?wbwqwn_Gb&X4Lfyq<xUv}!7L!X~o^&DGl zjO=%p7N7n3{ZFR1qN6{_fLSz-!p}lJAEHKQW#%1Kfn)U*_XSzUVYmlxV!x0MWGDxf z9jpTfvg%bV%uUwDPy_}BA0q9O#Y@jhM1qwT_xnZeF(Dco{U-laJ=mafC`7->H*j32 zA?eNpGnF#>K$@MSBMD|(>ioORK^XM=zssJ^Mk8o5|H2n|R2Xf)~ zA2PEUw)sV{ij4Iw^1w_HgTJ~EPP*x6z^jilo3X@Hh)cvVn3Q!MvUL|dc^)HEN>k56 zCVxut7chA^sP}>cP%jhEzX%O5%mWzdk97g&@|x9OUAL*|g6ya@Nj~`&78<_C{pSm? zv6oWaKM`TIo1XnsyDet?DLX>r;8V6ZhO-bW5k5=+`i6${88Dbu8^u84BEF!jNop1k$?8lOsP7-UHP?CNodT^$P(|KhFs||WNNCEpTeZFXn<0Q zh=Y4psir9LhEg5lt2_?*7o{G*WmIl(Nc2bvdm^WV@*tVzXDu`PFuh}#QL&@XWDYDp zU0J7O2P>lYL)BGj#{jF1nT5XMdYwLgOcKHb+8~4hMi%Q3rH83{4XPSJj2E!P2P|P; z4%$T^pNpo!NzM*V|Nj|HS5!jNu2q1njHU<#z&?K63XU+a&+NhwnHZwTeJ0pcmZ56I zfBx&bMaw^U{|%ftJ-hVa;ZF~2IeIlWETcXq{1RBpBowTiawApZ|43}_N2*5V!AiYo zQ&j^hbz^HNl(6*``cmpOzWSC;n|^uck0Gzu%pP4jrTEl}v9rQ-+cVMj-AptQ4$%aA z=8%7Rl}_VbsiuiDNVmWh?q`sqNjH95rN-B*q5+lK{t35z3*8>2^196pMhtx#$__(o zQ81wmzq7uCs4V@M2k!U^`<#(BHkj=vY8I{TyZN8Pk$QNr%Hx+_4MJGs#Qp&4FHXb{ zp5E3^)_nRtTJ=`%FGob3S6ra>k3u=rH0|UUivQ@c( z1c&w0=$fhs*Rr-vRAbU7fVr@lltW%vQEn0vD>z(5TJTXZt5{8k6BS=`c4d-!wwfFK zh6SnFyR#aApSUiHz4P_EsOB}cvH^!178XDtmeVeO2rW*AlvqvQCqq3x z{~_(XQl)|Sw@$&l?x$N)uwN+eQ+ho`b%{I#UD!&&|0_&7+goKttajqJ5c*6@d#Yr* zrH_hHg@|dw@_&C%mC^(uCG2R2Qdgqwr&hq{%xILiQpRpW?cj~KM$(Et>e0wyDv}Ql zz}T&$L7h}`Op-I0_LL7XH}&akimKCL$`qa_dnW&|B^Da>JUm0A#tX;9L`G>`M^Wp% zQQ_q{U7xCY+;yH%5J$Un!NT!+p7oN*50QgNG<#G&zVlg?tg7RgwR$!x0Y3$V5N9dk zEWDaWmX&T6UK=vvZ=Rgmz#sD|=ivJ~bR|@`mb&xSvGb9}o6xZnIS=>rv0@b<~P#0TI$i92{Vw-U206hZbhyps&X|` zI18Vyiq@Uyu|pPpeRp{m=W-TzZL`PIDVrLV?<V{z{xZP7 zR)BKQ&EkvX{s-rAC*eHpMEjyg%tR7j<%7!e>H0>hM$DI!%ai62)%2^(=!$8F zsSjeTq7Hi28J}H76a1=6_&My4w-%YO=i)RmOY9e^7)V3<#}9tu|fBwD|Wd}Pgl1g3iKR) z8g1ZgG4`kY!;yY)81LohV@`s`?2~xr;xE-vUCp9tw6>0#2w`-62DEf+?#WOuVOvjZ zU3E+AUG6dELku`CHCHn1DKko-B4PcJ3u=DYS`VsX2PRXs0##e>sBHjD)7@qpsHYl3 z<-N9^su{iw#gM!z9%FaQS)#^RaL^e;p)owK;e?Xd>LqF2PP%0x~VGgU%PkT(Fq zJl+763&k9cGn>J>6IA5Z{1*aQ!&y*-adfkr+B{CH=Ausc^uA>S@HG{G@+ro79Py~4VAyew&{TD_H-|vc^cd%dc8PSDT~v@pEwOy zcW@KIi*yr*Fs+xTz1v*XZSKJ+V1*#uUdTVJ3ohk{66Z|=ISUrRsJ^9l)_xBVMOhg@;b#fQHkaUuTz62Dz)K9 zoRe=`D4!7?TP;bOy7Ko7^S{INcoWsRQ2{^4+DrHc@#9c&>=J(7$$#MOV>r9<%zgc$ ziRzc*ke&0vlM{%Y4&wGUCQFyOdZMNx?jPgtu0Zyrm4o{Z#*Sr<=CXZH;5mq|zvtKv z%X1pwi4I3DH~<{h>3sL(hJ#PecZdBt-#wuLoDFusITOJ7ejbfsd<5pY-z~#-c)XJ# ze;T!Kru@+*pSosyV9BR+e>3&3nBREG#A6S>I($40YOWHRPJxDE^L=Ab8a#R_hi%v^ z`MXPtYsQn+T-^};CC?}$HQ*eh$D2c1o#Uih4w(Gu4(=B+JwROZgdq*M-z0M+2c?JE zM0D26_>ULZsAPk^4wSXQuik@qs1|Y~O9gf$K?8c7U z6~VuJ2oM78U^)A-h5FH$O5e7Gh}cW%SEwg_Sgesz2m1~OWvWnm`wG=O$6a>8`t9xl z!IQfS1W(Sg3lHwH3s3H{3s3H{3s3H{3s26nix+qkb^Ius)g2%ZH`Y;zA9fLA4y{T0 zdk$v}E)*w+>4jpZImKZ2Nv4^PJCL=lGtU53kI|2~0h>P!vYdTZ58}f_{oy(1!;97= z{rVI>Ox91sU1+0lQLRpZ7{smGynal>ybQE{G9n91(|{))lYe7ysv-=4qe8dHScJ$7cjru$i{rIwCO;kT#;LRG&<0|^`N23YW zhhc40vufo#hQ4&x&)-n5HmY;Fv)Nf2c*8gO@(b>y>zy*xcNS!J#AF& z#JsS`suov71-444Ud7sqnqR9j&BASZsnYHcM#ouVc?*S6+kmhB3JkF-@ULA4d{K!8 zU-$3eH?IZwdX>P_)D9~1(oG%p?xmXg!8`v$Q|DZ|sT(_}zF51x-&VD!z8zJ#v3goN zEF>p%RL{cSwWu8ym~}d-KFETlRFkl|4wi>dT2Ga3mag{}dvA1sZDBQ)by2OtkAd2) zRfrO&16a~UR#?H&4P8}3Ggr||T~!NQGPJa-su%kSu3@&ZA=BpF&h|k%(iNa~QnM_T z)eK{2VyiAM(7hALtdV*h*a~ZOr1sP+WE0b8`RxNVGfQ2Cz}BN#sy-atF}6y9b)%uJ z`qq1e{Tj6@jrre~<8NGgoCW+^Kda4#`vmS6>FW1Eu577&%<_N0SOI`KXrEmg` z>!qUWP5uO}#f@Y^d0!QJFZ(~W_U%foeOtE{OnX;fRU4*&ijCd-*Tz0nbt|h+e-Eu} zP^p!)sMkMG38u&HscKh2&u4c4R9Yoaf1mu7m+r9tMoj+4mzw-Cp8PtOfxi0E&^0qE z*>EZFhZ%DNmjVC5Wx#LPcq#DbKLYrgmjSbqn)a%7_{xeLBm+3Tv^{Y8B7NFkrPmq; z&JyWY@YnOfr&?#n`F2oPwZSK@gX-2a$yGRs9i1tc>D#8u4c+!j4c$qmBODU;k94%< zGT?JBDTNMi1^CO6=_i)~e{#pAT3^6Kk#w2X@4O87vmadwd_LpV<}&%qFft7%yy!ykUKK#MmR7iT@8QsTTl zQczNLeCRh6`?$Izz6xXSSC?r`>DEhiwumtShTwlhw0)NWzxjhpfj{~F|1g#ZF9UwK zBbutFTp3)bn@ zSAl0MN&vorgJ&lz<5}tdf@ek_s`IaZkcs9z2dS#iLeFkN)lDiP74~3W0v1a^+Hs|- zT?L@?Oe>Y=m+rjv5`b9PA^yU?rAkoSxJ{KgDqZ*|Q0CH=dT6U?*4|>ks;tD*>$m+w zv&^xM@1hDMD_jRybt{e4-xY}Sm%)O=?_Uas^OyiHr=MKBH2Az*p`WbL(A)o=mu*-L z=$E6Aq2bySb?GHYz9UGgfWK`!;9pLVjJO>9-43g-ibmMsou+97Dy99Hdd_3T=N&!a zpII?Tr1O3MFzpNz*jPo!_I`|tn_p(u$NoddcwT7sU@TGpJ}WC%0(gM7->2%C6T&HO zzA+Bnnl;~OtV-vxgrQyYjowB9`END)s9fln)=%{K8^&7XYPP`Ob;7bk#)J4Nc@Uu@ ztLfqbBMCo$J_u`e2{n31CD(9+xwe}eJnMrQ0v947pzXGYu)=zoN(znLUcA?N8ZuBl zV;%^lW&brMVE-JAeptH(cf4sNnFm8@$HQtICl7c;{R`Uy2jv)}E$jq#uS&+wD2~Y= zbeGXCp$f^D_YY&Fwck1zPL;brD{+GXHF(`6K@ zVwUrmp|zmKw`0-zYBJ3I)Rfx`FmQ!yumS83^ z%QYtF?q=B+)z7#GKacl=ro5W+`WZFw(|5K}A2Yq9pOIYC4b*dHTI$n=OlyDWw401p z9HM<-w((Y&o98@z^R)2*rh0POo`-l!-|ugv1Kh#>Ml#Rz`TqEd<7rh7A&|< z;8pV31$50bSpLkR$DV<=e=aS3MkT9x*zSs$i=EG4rM`f|pT#P^knVU^y#~kkxo6cW zoHz2_b1FZcL$mo_hA=x3A%GHpVX&P1yt)@>%ba^&eUC`u!!M{poe!9T9gP+875qmH z(-D07L~88yMa*i87qQmIKBgB{_rzixHIZpyPPK-iu!?;nZ zPV9&1IRf!8*1Ye0J*^#us2QE%RuD5z3rwSbzoL2t^YNu%Ci1O*1%r)a_0mFXP}FF3 z6Uy8(T6GNObKreQMWeyDm(!ln>Sn-eI!4_W%;JFhkmigj2ldk!^W$qGJ1#o)kSSo^F~h967#wq_JPmTIO`pYiHI!hW`NHngsQvGy#YDiQNxy&O(i z6VzC9#9Op|0s>mFKe~yLjGvu(DxLb~Ar56JJ)Q?kS;a3|INl|0V#UNKCaSE^p+$gS z5<<64QXFhs5mMVpfb=2tpH#6>@g&%`PSF>W)a%ygyzQN%d=>Vf3S9a!bh6sYsZOXa z;%G6~d+3fSdf@Y?s632pgQ==VHEjC>mjQxvY_Ly9+76kj`bK^k?nQuoMay1QDfH`9 z)#88kUaWTl#4;VjeslLQu}~#9yFyWY78w^smSE9xr^we%FFdCRb16oGZMdC=&P-EvbEdG9b0v5V*Uz3E z*IQB=?0!|wlE1o201{{LyY7<8&Juij#PgT%mvV0jUY=_h^qBCsivAM3;w*XXGr=l? zPktyN)y(*Zt1qaJV?tSzm?I_9T^Mt~1C=R%zj$N$n){n+e``fridhJ=Cay zX6u}Kw0)+!3!9{x%~Jk^c20C|ejMo7E{x?pAnEPt-dUW&9R}> zXtuhh`ybjX;1p#qu2YovPemkWN1-hHdbw=6KxyZQqx@KGZ4c&UiTVC)1Uqtx7?fb= zZm`71)8?p}9QL0bi%;y=bsI7|@K(APV4nWs87a0d%g*|3l4iz)QJ zl6{zU1u2kzAO)=5FKHQSJGv zRaJ$?y{A@?;b z=klwSa5Fi#%F*Hl2wWUZ(S@p0#1M>hGXq0n(T#B|)a1G4of)wG*lnlpei(tTuvMnx+=w3hl`mI9tR(Lo$wvr=-)`&6k-`p=poBu+L$HL{`!Gre`X*hDuK(;(idbrtzHZo7!o>diE7V#b~`Rn9YWjM z;QFL23121cO)fTspR{j~xJ@M?`p{C)Ipl0n0Ur{}Z_^zkwbofS?kV;YhnZcdxK3hxc;TU)^@;B(`72W!~YJ`2blHBVdm1{WvY4(`UO=b z7JdBxY^&4Z01j#f{EQ0lHS$7Ah4zR>91S#~SRTZ`RF?C99GPHk61CMSug#NkJf*4J zm4Czs}91d>(#@`3R6o>eUxTuq&7Y?Gks~A z4gP;?p9@}Yz1RD`KYaV1z4kn;z4qE`@4fb)Mt35*yisk|R%UN4Ge-dw2mNV$<}AD@ zsu|ym4jTHW(Orlhb+hz0PkM^;S|6Yjuc$FoyqfT+XSDNJm)(3c*nJx(R~zh(<1bJi zw7<1=Pq2Fc!=MFnia@z!co6V`?2l<^Fuu$t^?WuSPaGmWn((R`IlY^Am!0zN|;VwRsSXD30Y+7_u6nSvoyD8k2zm;yIN@Y1 zH>io$T;#JsW-jN0++7VD>wQYKUJlX+*5hdd>*$>q&`Hjzzb_v|F=p$UNcgLX1+vE^ z64eBk=>zK1cHheBps{cy_J5=F91hc#zf^32l|w!A=baCbEfqcSpRy_YUuKksd{{vw zmL(?h+^D^QfPd27?|RTj@;I1Pp>GF89%?qeoW#)h2-Dh%#+O}u8J%H36$iU*4t8S3 z8-O;7Li^n2&eTId#G7KmisNMJYyPuJ2ddSWvP>>A@Kcgt;HRYbp!>3kfuCq%+36To zJYM3vy1TP&2N-vE7RRj#j`wrRj@=p@?{s4p=Q6~1bNA3~n3}x^(>L{K3U1F#)9^0? zE5S)-q0A9dH@Sx`zwU(rU=&+3QzIvGj0xEW9yDjx3~j(;#GPiS$dRvT{6Qkj@%%oK zmgZn-oQgmyQaKo}mHdIgP|5Qe_Uz<9XhKt8Q$t&&8F<|1X3^b#X5CXU?DU?!^@q#3 z1p*`K>DSaW=mPoVH3%!eAs{JS^r=%URRqAX$SxfNIn4& z3IZg^V|mPZuYtVV3tIKKvX#Mnhf1Rxud5M8JwG#qeRvWCdkK7zq|$3m>77jA?~`fv z`(&UhMkYfY-cTdJ!BM|ARK4u#f39Og6*wAt5p0WOxZC2rNv}m^1Gb>!xXc?+oAW{P zgj_@aUaQZAYbJd{@7_Rzco^6& z1_90S#ehsR0)Y_C-7aQX>G_?IGoagdLO}Kn{cL`s-&E7VvATd>VKnwlHNkpCr80bz z8et|B{inDkq2BK{AuVK7`B z#)4Jf*4g+WE!#G|-8RNd_ehS1@zjAcKo5*!7>sc;f01EFcE@-ct+#h~(uccq^bzhc zx&t)l7I$YSPV)1OeKXy7TQpWFs@_?*6-J|!z4cK#oOKKf|3^wIn3BiYioF*W^$GTw%;=oC$O zTa9a$2HNL91ND*=2O^;Q@&662ej8%?J@ob4>WGXqeJm%%`SxT>FBTDTOSt0el}EWi zok84OOlpi8JkHGr!m+M4m*n@?sDnazjRdI?X09PWG-~7-Q>jyz) zSuJXa)avdhm7|j1Zd`^;r*6B|UR_%1mJXIX;zJB49sxnZ`y9L!6dJe=Fy#D-B)+u{ zbA@uy;dW|={o^C(#ocPusFr#Z8UWcwP16GgxR4Y;Gh00ZK$OhXqt6iY3%t8q?$84` z!w4fV8!@2%bQ)e^i$E&IjT^RENQGke;PyPU0q()bX+op;W21Zafcz%XrafvO)K8Y# z&v0hD66yOrYHwR88a8FGIvoh{m%VDd^K;c$$jZP5xDu-WxmV3*S$^~PuxR~)GTu|~ z3jb8qPGN)?`_RxBWyVM21yq9qtVWQxq-E^vjQ&XC@AGTOh@Ku+w!E#M0SE8Yj0s-xZSqaJm1@qNry zc+T`7cBBvnf+++UeGnqNFK8!pcB(N`<74$0`uw0e%N@#hbZrV!ti?D9&_f#FeSq-< zE0rEXd)l-!Xm>rr;~Styd2FG2Q+nx;8g4@f+J8uG%M!FoO!ZvG5Zs~K8mt}hkH6X1 zaTIn~9T$e%xJ4JVc8snW4W-ypr ziEx4oVitv`W=!z)%uyVly0*I=EM2T;oCYG@dVgk~27~K}a{`S)M*U4Pnua;pWC1vF zzcO$^oOoC8?0(?m1$g`b@cWtI{nNqEGe;B(KL1wt0KPV7N=suw-@Io++1_8`59yN$C9MFV-))5%B0g2(4Y%U0S#DYhu$4xuXIpjKal23NSSVj z#K{GE-2*f?03=<2zJsc@tc9?zjxuZ20UaZy9#!aCFOAprNc`)N9O5e_hdR^+7P`9t zy7bv@kp)WOj-;AewT&ZE?*alS1(TO+)$Acg8Xs_nm<+N`o8FACCffAqF4lB>dZ$@g z6=HZ7Ydd@(H-aJ$y-%7|$EPp9>}%5lSwFi??}dFde9~z72XX`ag%8x;&GC>As=LL- zZ~L%q18k2=+fE0x7Es`a>J)3m5xVC?H8bWj&|RJsA+K)7Z#kIab(fS&)5#Cjl%`N$ zgNe{NFd9P#DrzAgRdFk)&>c#xj;LK@LUpMm9>P-WR0jf)@CjgHDKxgyyd&zZVN!xD zH=$+XX3~d`fN?xQmyf6!%q?^|iVGk-1$jipEU}+_R6W_`3%k_i1b3+z3QX%4H0&c> zr8VEz1uF!n&*|Zh)Ioig9%Zc{3c@OxIIyYUp@~l{pja8x5|v;)XkuhQKNEH$6(f>g z7*LF>M>s+thve6;aD$J+k3p7yhH{Rnt@vvD!eiKu{kZz$W9kcdfUNq#<7$W{@+6*s z1Szx`H43X`WLi-J(RTF&JJTcsq?fr1((2 zIfDYS3djSeLHFwDm(#fFR9k)Fj9O<4yDlZrtWp=5`JtgL+D~-aW^>bxFV*Lu-v-+5 z+tabHu+0oLvR~ss>kT`7R)!7ItgmrwVF4}r8awU}(Q99;V{vIB>|g43=xyHnFI=O# zPJUb`^b78ZFYrn&a0*RLI-a;f>2@>2H9QY1)}S; zg>?QrZtK=j&v0uTb^H#SEk989cWP$96>Pg=V|6iY`VM=x57U|NFc&RZa{;@x<<$Iw zdb!!hcAk>J?o0lc&o^NE2m0=`lhpoubsx0m|ML62lXy^_qwdkvS2sir7PIW zdz{W(Q6nNAhbBkek?jh?#sjqQ__Od#dz=D)RBtJRpDJIx2!JbeJ(uEDb=@{ilkR8a zRyV)HzLbMO8&kXkl@2gLY_DU$VWewMurCyjKzpnMdc!4H1uz)H(qCJ~zPvxps^Lul zSLaySaG+MUoIUpdMhOvBf;EWhfc6Watzh3;fGqF};>fHf-Oj<-d!@`5k#Vd+SG85_ z4PCWf-q;XF3E+Y486?9h;$^CwyF**;&~&xEvJ)~I!~~ayO_|KAYMZz8Tl}syQ;QOmvHIJDf}7^?^ICFYpOe>f@S)AglC5p zEJq+7-zd7KM)Wj8LRScI4i~{*v7+ku?y$xy8b?8aQ5e&1HjM?90#2aQ*3vuIz%Z<( z@2{yX?_Ou_0^ngPtDi-|HFLxS<|AFJwnV;4QJ+29Up6rcfeLY^W|m&TQNwa>RUGB; zE)=va&izT91|Qy>@UCjvHz}UbVw${kkWNg}#)bVFEDQF|N8afrF zh9AB8E3~~-{H&%sHZ??`1K2c$+SPC23@x0Azo_X0O{7+h&4?-EYrkTFY_a; za`lHI(^18J&7@)tC0ax)G~OVKh;}^1&aCMLkIh*`$1n-YU>*`?)hg*97SYyP>7bfQ z+^D{45#12GlU2mGxtXZcj^nRA$*V*g1{|musN&7kIQ4j{vI>W97NB^@;w`I)L`P@= zB8<*ig}d20sRp*`Ha)ZC<;aJRR zav9d(S!Hn#iaACV1#KGjD?fzK9eGy_n}oB+`^9KFw-iMrHhfp({0e-T4v0YcTd{cVg#o>1KSP}mtDk{lQn z^^UFWB1^r@({MT6XBTfdf3eGrMx^^I84eMJnQ^Q`G!L&}_4smzUH}$Z;qFCSEOm(X zmMhge9U{Qe<{?Q1f^bL*Bmk%TSbHk)K)ZqY345RXqoZ{KFp@7gMNX*cuCY5aXe!)u z0>vwqN2*;eXi9BSA<>V=8_$Ooj8Z4MHN>UvZZ6+0XxlJR)NjUX`~{24SZlBrJw$#Ej%f<=75vQxX54_Z$T1w)-> zIXxRJ`Xym<<;rrWZZONk_-HzK{CG%ipfF7&IN*ZwY=AeCp@|~P26{;o9q{=~6G_&M zP}Y>~A49D|(5{y$BLpFyrR^aiBK27ZFQg=jq1T>uICISdVR&%Y4{Vs9+;2u@PJk}( zQ3K$Hc7lEmLE@iK+feZ+Zg{>LD%#+4CKTNLE~vhm+CfpeD@fC@PUAuuUn+&u*Nb%Mxg6Vm; ze6ZMNEVN|d>>N5CozO`02#29J!bJscuJw%&Gnt+KM}&C6y5Lco6e$v{6^~Lyq)4>< zm9|BSJXaNZf#nv!pe?7Ud6Z}YpMFuIXU8p$ZS%33^MjUG7HMc(94@QW>J701W>n+M zOYbP2DuaKRYJ5(Aj{;TLQvGohvWtBlJ&(5^c##Ee4GqGPrn2=jnrJ zF+BV^9#INch66IHv2NwAF(N6W5hOSRh<|sdIj$0`QJQ)xPxAZ zMN>+TX!;>mJYxEq#}9YV!*QUY@+2dlg1f!B_y?F&Fa_z+TOCp=#msyFYkG$^WK$i> zs+VcJF48yvKk)g70se*n%@6>*Bm#hY>w*PRLkipJ26AA3eghNB6x{!WA9MO4fxR^--50S7u!27K!8v>;wg#sSB# z;zh@{t9S?#ejwa4*7Mgd8iHF-3qV-PP09K>D)y6+ATnGxq;?6JRONnJnjkt^{zkhJ zL=Px*`z-N=#B$``My22#U z#=2oYRVIl(C}mxeXwRUtwMar%DXoERZ&Ge+@uv03{iL@MZBw4w|BfObQ8b=5ZK~6F z#Uh+g=-bc=Wf+Ga<05Ve4kl0}7e*{k$&GJ974J6SwqZE+H3N0ZI7 z(A#kq+5&PZ6^~lAqdd=HdCy|5ot?#)7E*A_RKUjSr!nPB<*7ifFXgLq5U6U$sauLj zh3<@*DT1HedniR@LNC(c6wx`=6#PO$%d-#!hb)QVmku$5;mF!02wjn=4H-_AnL5m@ zyQGTQmP^%JQ^n{0fva{}vlX2Ftx=qps@HW#1uW&&8Mg|XXx~v$lmHk%m`*Tgerad8 zvk#m?8U4f~QK@ha^aSgIZyHRx0!31%`-w_xCDEMz;yr7{TIxLjI9ox>24KQCPBjBW z!k7S;ro0}EzM?uxI)V<4L@xe0tuGV*CRypfMswESB%%mHBuzR)BtiJ%prVj_}1dtBty^}|gi&G$R4i;ACGyo}Z=+ljY1l}SOj)Br z1!`&DXt&A#q)|$O$CROiJ z>KH)~k{lX?{;1kd`C}z`V=RLQY3(=$t2>StQBG^smozY6yoY?6OcDD)((0y&d_a8* zB;=YZq1jW#KC%4*^4;M_eW!^%A(d&GatrGGF1{+h2dQbHI4EG_Kl*gKSZ0UznI8~k zV-S5;C@#|U8KNrOyF(dydc&kw#}|pWE%s|YG>Ln2s?W_7*%tTETQ!Lc_jcD5E5Z%) zzy&kzE|^hJI;XIDY%#cZ``BKZk_7)nbbpCR1LN~@iD;{P=hO$jxrO;f#Ra8Prq9fs zQ&^NcnSLx02{t7;gQ81CoAxKNG{uf!#k2Er3rq5H^^(%!f*JXZFpdk{7bcyGOGQH2 zzJWL& zZZ=quel&Ephzv=Ai}#@JUp-~Ea9RV0^)(ySC@IOKS+hmc>dJdT^0Ri{X12qS-068+ z`kNh+0yicS-subgyaevt<&*PdhZGdeP?RZf<5CP-b3aylnUr)tx+IGx-Y-`Ej&j_F zaOp5Kf1W6z>2t+oDw!(`x_z#2(}VNygzO#jL<@?YCnnOxc_Pw15P`i5F~|q*Pf7Dd z^QMF0+_z|YZo!PK$=<<-(8T!|)Y&v|J{o8!Rm~TXO@|@y(7e3jtjUejzMX0jICVI@ zZ!ap$^YtDfqZP}ZEb_@`BPs z0x02|9?U58xaCfsT%1=@qKroPFc_xSIWRM4-&I&J>CS0+a};|00pZFT14r*RV0;)} zG-+C1sevRii%LqTz$l9ML@<^UDk?7ZjyI09GI4j@pn~ZIr6rScXXZ}A2=qyNJZ&#S z`#w$w%h0|P=wg|8I(EqH>3PKklNuF*k!N^mQE?uvTp)5IN97jI&KogjW?rK}cTm7W z%p7-8`a%&G-*5WN(m6wOOQ-akQCd7_L{U-ig8W9oCsNfykv}9CNslPbol%lIsgx1Y zyAF53kGpzAaY255UNLv;(7gIC9GY7UlrPOIPH5<`pllkvNa(HZEakF!&rOq%Qh^V` zOr~XvM4z%ec-;-df86u=F#lh8c41+oG^Y5ZS#T3BlbKGv=^){0K5(HAJlzMzKyH*_ zkqP8KJYz0@V!3peLgUwqHJa4FKc{%y@Lmy>jTg8 zfq4LWchdttFsJM7zrY7x=z%$$EWje401x`WsHIs%ZJEMSbLgqf`{Zi%qdog|W7$&=02kAY`X zZi-l{BhynhMO*tygy0&duBin3FpSbGafo9!l~#hMSVtS+=)Vn--PEH}B+@UHA{Y#O z;9AT&7b$tIXk}H#(wMd4cE{km&Dw^IrB~OAQLYyObKkWY3yz*LR*6XJuuk-_JM&F` zwilJI69Zj&0Fw}GG=hcF#bqL#X0H_?bYh(drt7ddl-E2#3Mgj1814$4Vs`Ib#E{(^ zOWoEZ#`Eh%Yx^vCGJdU~y7i(}$W~4jU_E2-4ux$HZ9^_26fch6#az#PKsgPCvn#1U zlk2S%d?RRQUlCPZwL#dd)>R+VGaE&#$j!&WRQhvbLNTr}U}2ti9#WQxNcZ3GEw_KYdp;R%;UKxqRZ6IS9F*A(64<)%#*!#8U2r1c%zc|NPjO z%@FvT>WS4NyveZdDoytHCMRB+2UY<*I&gVyW4}pLz%on%#{l0%_&K@HJbaqDdeD`O z>UR%_-WKbcSF0Td#Swe^ECdKbzriUV+&Qa}?$)m`gC%VH`mi zk1%eSwlHZhyi_@5+(&E17;A+aF|gr<6(^QBb0YS%>O?pRt6pb diff --git a/configs/swarm/genesis.json b/configs/swarm/genesis.json index ebf12587bb7..7da97dce6c7 100644 --- a/configs/swarm/genesis.json +++ b/configs/swarm/genesis.json @@ -41,7 +41,7 @@ "Register": { "AssetDefinition": { "id": "rose#wonderland", - "value_type": "Numeric", + "type": "Numeric", "mintable": "Infinitely", "logo": null, "metadata": {} @@ -69,7 +69,7 @@ "Register": { "AssetDefinition": { "id": "cabbage#garden_of_live_flowers", - "value_type": "Numeric", + "type": "Numeric", "mintable": "Infinitely", "logo": null, "metadata": {} @@ -114,7 +114,7 @@ "Grant": { "Permission": { "object": { - "id": "CanSetParameters", + "name": "CanSetParameters", "payload": null }, "destination": "ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" @@ -169,15 +169,15 @@ "id": "ALICE_METADATA_ACCESS", "permissions": [ { - "id": "CanRemoveKeyValueInAccount", + "name": "CanRemoveKeyValueInAccount", "payload": { - "account_id": "ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" + "account": "ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" } }, { - "id": "CanSetKeyValueInAccount", + "name": "CanSetKeyValueInAccount", "payload": { - "account_id": "ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" + "account": "ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" } } ] diff --git a/core/src/query/store.rs b/core/src/query/store.rs index be9da50dbd3..8e4912cea3a 100644 --- a/core/src/query/store.rs +++ b/core/src/query/store.rs @@ -8,7 +8,11 @@ use std::{ use indexmap::IndexMap; use iroha_config::parameters::actual::LiveQueryStore as Config; use iroha_data_model::{ - query::{cursor::ForwardCursor, error::QueryExecutionFail, QueryId, QueryOutputBox}, + query::{ + cursor::{ForwardCursor, QueryId}, + error::QueryExecutionFail, + QueryOutputBox, + }, BatchedResponse, BatchedResponseV1, ValidationFail, }; use iroha_logger::trace; diff --git a/core/src/smartcontracts/isi/account.rs b/core/src/smartcontracts/isi/account.rs index 09afde491a1..22b67c04888 100644 --- a/core/src/smartcontracts/isi/account.rs +++ b/core/src/smartcontracts/isi/account.rs @@ -25,7 +25,7 @@ impl Registrable for iroha_data_model::account::NewAccount { /// - Revoke permissions or roles pub mod isi { use iroha_data_model::{ - asset::{AssetValue, AssetValueType}, + asset::{AssetType, AssetValue}, isi::{ error::{MintabilityError, RepetitionError}, InstructionType, @@ -78,7 +78,7 @@ pub mod isi { _ => Err(err.into()), }, Ok(_) => Err(RepetitionError { - instruction_type: InstructionType::Register, + instruction: InstructionType::Register, id: IdBox::AssetId(asset_id.clone()), } .into()), @@ -243,41 +243,31 @@ pub mod isi { ) -> Result<(), Error> { let account_id = self.destination; let permission = self.object; - let permission_id = permission.id.clone(); // Check if account exists state_transaction.world.account_mut(&account_id)?; - if !state_transaction - .world - .executor_data_model - .permissions - .contains(&permission_id) - { - return Err(FindError::Permission(permission_id).into()); - } - if state_transaction .world .account_contains_inherent_permission(&account_id, &permission) { return Err(RepetitionError { - instruction_type: InstructionType::Grant, - id: permission.id.into(), + instruction: InstructionType::Grant, + id: permission.into(), } .into()); } state_transaction .world - .add_account_permission(&account_id, permission); + .add_account_permission(&account_id, permission.clone()); state_transaction .world .emit_events(Some(AccountEvent::PermissionAdded( AccountPermissionChanged { account: account_id, - permission: permission_id, + permission, }, ))); @@ -302,7 +292,7 @@ pub mod isi { .world .remove_account_permission(&account_id, &permission) { - return Err(FindError::Permission(permission.id).into()); + return Err(FindError::Permission(permission).into()); } state_transaction @@ -310,7 +300,7 @@ pub mod isi { .emit_events(Some(AccountEvent::PermissionRemoved( AccountPermissionChanged { account: account_id, - permission: permission.id, + permission, }, ))); @@ -333,10 +323,8 @@ pub mod isi { .roles .get(&role_id) .ok_or_else(|| FindError::Role(role_id.clone()))? - .clone() .permissions - .into_iter() - .map(|token| token.id); + .clone(); state_transaction.world.account(&account_id)?; @@ -350,7 +338,7 @@ pub mod isi { .is_some() { return Err(RepetitionError { - instruction_type: InstructionType::Grant, + instruction: InstructionType::Grant, id: IdBox::RoleId(role_id), } .into()); @@ -359,10 +347,11 @@ pub mod isi { state_transaction.world.emit_events({ let account_id_clone = account_id.clone(); permissions + .into_iter() .zip(core::iter::repeat_with(move || account_id.clone())) - .map(|(permission_id, account_id)| AccountPermissionChanged { + .map(|(permission, account_id)| AccountPermissionChanged { account: account_id, - permission: permission_id, + permission, }) .map(AccountEvent::PermissionAdded) .chain(std::iter::once(AccountEvent::RoleGranted( @@ -392,10 +381,8 @@ pub mod isi { .roles .get(&role_id) .ok_or_else(|| FindError::Role(role_id.clone()))? - .clone() .permissions - .into_iter() - .map(|token| token.id); + .clone(); if state_transaction .world @@ -412,10 +399,11 @@ pub mod isi { state_transaction.world.emit_events({ let account_id_clone = account_id.clone(); permissions + .into_iter() .zip(core::iter::repeat_with(move || account_id.clone())) - .map(|(permission_id, account_id)| AccountPermissionChanged { + .map(|(permission, account_id)| AccountPermissionChanged { account: account_id, - permission: permission_id, + permission, }) .map(AccountEvent::PermissionRemoved) .chain(std::iter::once(AccountEvent::RoleRevoked( @@ -436,9 +424,9 @@ pub mod isi { state_transaction: &mut StateTransaction<'_, '_>, value: &AssetValue, ) -> Result<(), Error> { - let expected_asset_value_type = match value.value_type() { - AssetValueType::Numeric(_) => asset::isi::expected_asset_value_type_numeric, - AssetValueType::Store => asset::isi::expected_asset_value_type_store, + let expected_asset_value_type = match value.type_() { + AssetType::Numeric(_) => asset::isi::expected_asset_value_type_numeric, + AssetType::Store => asset::isi::expected_asset_value_type_store, }; let definition = asset::isi::assert_asset_type( definition_id, diff --git a/core/src/smartcontracts/isi/asset.rs b/core/src/smartcontracts/isi/asset.rs index 3c75c35cf35..7efd4c22ca4 100644 --- a/core/src/smartcontracts/isi/asset.rs +++ b/core/src/smartcontracts/isi/asset.rs @@ -18,7 +18,7 @@ impl Registrable for NewAssetDefinition { fn build(self, authority: &AccountId) -> Self::Target { Self::Target { id: self.id, - value_type: self.value_type, + type_: self.type_, mintable: self.mintable, logo: self.logo, metadata: self.metadata, @@ -32,7 +32,7 @@ impl Registrable for NewAssetDefinition { /// - update metadata /// - transfer, etc. pub mod isi { - use iroha_data_model::{asset::AssetValueType, isi::error::MintabilityError}; + use iroha_data_model::{asset::AssetType, isi::error::MintabilityError}; use super::*; use crate::smartcontracts::account::isi::forbid_minting; @@ -348,9 +348,9 @@ pub mod isi { asset_definition: &AssetDefinition, ) -> Result { let object_spec = NumericSpec::fractional(object.scale()); - let object_asset_value_type = AssetValueType::Numeric(object_spec); - let asset_definition_spec = match asset_definition.value_type { - AssetValueType::Numeric(spec) => spec, + let object_asset_value_type = AssetType::Numeric(object_spec); + let asset_definition_spec = match asset_definition.type_ { + AssetType::Numeric(spec) => spec, other => { return Err(TypeError::from(Mismatch { expected: other, @@ -361,7 +361,7 @@ pub mod isi { }; asset_definition_spec.check(object).map_err(|_| { TypeError::from(Mismatch { - expected: AssetValueType::Numeric(asset_definition_spec), + expected: AssetType::Numeric(asset_definition_spec), actual: object_asset_value_type, }) })?; @@ -372,10 +372,10 @@ pub mod isi { pub(crate) fn assert_asset_type( definition_id: &AssetDefinitionId, state_transaction: &StateTransaction<'_, '_>, - expected_value_type: impl Fn(&AssetValueType) -> Result<(), TypeError>, + expected_value_type: impl Fn(&AssetType) -> Result<(), TypeError>, ) -> Result { let asset_definition = state_transaction.world.asset_definition(definition_id)?; - expected_value_type(&asset_definition.value_type) + expected_value_type(&asset_definition.type_) .map(|()| asset_definition) .map_err(Into::into) } @@ -403,19 +403,19 @@ pub mod isi { } pub(crate) fn expected_asset_value_type_numeric( - asset_value_type: &AssetValueType, + asset_value_type: &AssetType, ) -> Result<(), TypeError> { match asset_value_type { - AssetValueType::Numeric(_) => Ok(()), + AssetType::Numeric(_) => Ok(()), other => Err(TypeError::NumericAssetValueTypeExpected(*other)), } } pub(crate) fn expected_asset_value_type_store( - asset_value_type: &AssetValueType, + asset_value_type: &AssetType, ) -> Result<(), TypeError> { match asset_value_type { - AssetValueType::Store => Ok(()), + AssetType::Store => Ok(()), other => Err(TypeError::NumericAssetValueTypeExpected(*other)), } } diff --git a/core/src/smartcontracts/isi/domain.rs b/core/src/smartcontracts/isi/domain.rs index 34efd4848b8..747431a8432 100644 --- a/core/src/smartcontracts/isi/domain.rs +++ b/core/src/smartcontracts/isi/domain.rs @@ -59,7 +59,7 @@ pub mod isi { let domain = state_transaction.world.domain_mut(&account_id.domain)?; if domain.accounts.contains_key(&account_id) { return Err(RepetitionError { - instruction_type: InstructionType::Register, + instruction: InstructionType::Register, id: IdBox::AccountId(account_id), } .into()); @@ -138,7 +138,7 @@ pub mod isi { .domain_mut(&asset_definition_id.domain)?; if domain.asset_definitions.contains_key(&asset_definition_id) { return Err(RepetitionError { - instruction_type: InstructionType::Register, + instruction: InstructionType::Register, id: IdBox::AssetDefinitionId(asset_definition_id), } .into()); diff --git a/core/src/smartcontracts/isi/triggers/mod.rs b/core/src/smartcontracts/isi/triggers/mod.rs index aeb80783ea6..ae67df17f00 100644 --- a/core/src/smartcontracts/isi/triggers/mod.rs +++ b/core/src/smartcontracts/isi/triggers/mod.rs @@ -99,7 +99,7 @@ pub mod isi { if !success { return Err(RepetitionError { - instruction_type: InstructionType::Register, + instruction: InstructionType::Register, id: trigger_id.into(), } .into()); @@ -130,7 +130,7 @@ pub mod isi { Ok(()) } else { Err(RepetitionError { - instruction_type: InstructionType::Unregister, + instruction: InstructionType::Unregister, id: trigger_id.into(), } .into()) diff --git a/core/src/smartcontracts/isi/world.rs b/core/src/smartcontracts/isi/world.rs index 0839db60a3b..815f1cc8632 100644 --- a/core/src/smartcontracts/isi/world.rs +++ b/core/src/smartcontracts/isi/world.rs @@ -43,7 +43,7 @@ pub mod isi { if let PushResult::Duplicate(duplicate) = world.trusted_peers_ids.push(peer_id.clone()) { return Err(RepetitionError { - instruction_type: InstructionType::Register, + instruction: InstructionType::Register, id: IdBox::PeerId(duplicate), } .into()); @@ -100,7 +100,7 @@ pub mod isi { let world = &mut state_transaction.world; if world.domains.get(&domain_id).is_some() { return Err(RepetitionError { - instruction_type: InstructionType::Register, + instruction: InstructionType::Register, id: IdBox::DomainId(domain_id), } .into()); @@ -169,23 +169,12 @@ pub mod isi { if state_transaction.world.roles.get(role.id()).is_some() { return Err(RepetitionError { - instruction_type: InstructionType::Register, + instruction: InstructionType::Register, id: IdBox::RoleId(role.id), } .into()); } - for permission in &role.permissions { - if !state_transaction - .world - .executor_data_model - .permissions - .contains(&permission.id) - { - return Err(FindError::Permission(permission.id.clone()).into()); - } - } - let world = &mut state_transaction.world; let role_id = role.id().clone(); world.roles.insert(role_id, role.clone()); @@ -243,16 +232,6 @@ pub mod isi { ) -> Result<(), Error> { let role_id = self.destination; let permission = self.object; - let permission_id = permission.id.clone(); - - if !state_transaction - .world - .executor_data_model - .permissions - .contains(&permission_id) - { - return Err(FindError::Permission(permission_id).into()); - } let Some(role) = state_transaction.world.roles.get_mut(&role_id) else { return Err(FindError::Role(role_id).into()); @@ -260,8 +239,8 @@ pub mod isi { if !role.permissions.insert(permission.clone()) { return Err(RepetitionError { - instruction_type: InstructionType::Grant, - id: permission.id.into(), + instruction: InstructionType::Grant, + id: permission.into(), } .into()); } @@ -270,7 +249,7 @@ pub mod isi { .world .emit_events(Some(RoleEvent::PermissionAdded(RolePermissionChanged { role: role_id, - permission: permission_id, + permission, }))); Ok(()) @@ -286,21 +265,20 @@ pub mod isi { ) -> Result<(), Error> { let role_id = self.destination; let permission = self.object; - let permission_id = permission.id.clone(); let Some(role) = state_transaction.world.roles.get_mut(&role_id) else { return Err(FindError::Role(role_id).into()); }; if !role.permissions.remove(&permission) { - return Err(FindError::Permission(permission_id).into()); + return Err(FindError::Permission(permission).into()); } state_transaction .world .emit_events(Some(RoleEvent::PermissionRemoved(RolePermissionChanged { role: role_id, - permission: permission_id, + permission, }))); Ok(()) @@ -342,7 +320,7 @@ pub mod isi { if !state_transaction.world.parameters.insert(parameter.clone()) { return Err(RepetitionError { - instruction_type: InstructionType::NewParameter, + instruction: InstructionType::NewParameter, id: IdBox::ParameterId(parameter_id), } .into()); @@ -400,7 +378,7 @@ pub mod isi { fn revoke_removed_permissions( authority: &AccountId, state_transaction: &mut StateTransaction, - permissions_before: BTreeSet, + permissions_before: BTreeSet, ) -> Result<(), Error> { let world = state_transaction.world(); let permissions_after = world.executor_data_model().permissions(); @@ -428,7 +406,7 @@ pub mod isi { fn find_related_accounts( world: &impl WorldReadOnly, - permissions: &BTreeSet, + permissions: &BTreeSet, ) -> Vec<(AccountId, Permission)> { world .account_permissions() @@ -436,7 +414,7 @@ pub mod isi { .flat_map(|(account_id, account_permissions)| { account_permissions .iter() - .filter(|permission| permissions.contains(&permission.id)) + .filter(|permission| permissions.contains(&permission.name)) .map(|permission| (account_id.clone(), permission.clone())) }) .collect() @@ -444,7 +422,7 @@ pub mod isi { fn find_related_roles( world: &impl WorldReadOnly, - permissions: &BTreeSet, + permissions: &BTreeSet, ) -> Vec<(RoleId, Permission)> { world .roles() @@ -452,7 +430,7 @@ pub mod isi { .flat_map(|(role_id, role)| { role.permissions .iter() - .filter(|permission| permissions.contains(&permission.id)) + .filter(|permission| permissions.contains(&permission.name)) .map(|permission| (role_id.clone(), permission.clone())) }) .collect() diff --git a/core/src/smartcontracts/wasm.rs b/core/src/smartcontracts/wasm.rs index 716153983b5..dfe3f32e4b2 100644 --- a/core/src/smartcontracts/wasm.rs +++ b/core/src/smartcontracts/wasm.rs @@ -12,7 +12,7 @@ use iroha_data_model::{ executor::{self, ExecutorDataModel, MigrationResult}, isi::InstructionBox, prelude::*, - query::{QueryBox, QueryId, QueryOutputBox, QueryRequest, SmartContractQuery}, + query::{cursor::QueryId, QueryBox, QueryOutputBox, QueryRequest, SmartContractQuery}, smart_contract::payloads::{self, Validate}, BatchedResponse, Level as LogLevel, ValidationFail, }; diff --git a/data_model/src/account.rs b/data_model/src/account.rs index 101581312da..60a839db856 100644 --- a/data_model/src/account.rs +++ b/data_model/src/account.rs @@ -239,10 +239,10 @@ pub mod prelude { } #[cfg(test)] +#[cfg(feature = "transparent_api")] mod tests { use super::*; - #[cfg(feature = "transparent_api")] #[test] fn parse_account_id() { const SIGNATORY: &str = diff --git a/data_model/src/asset.rs b/data_model/src/asset.rs index 6b3972c1e49..71d8a4cca62 100644 --- a/data_model/src/asset.rs +++ b/data_model/src/asset.rs @@ -114,7 +114,7 @@ mod model { Serialize, IntoSchema, )] - #[display(fmt = "{id} {value_type}{mintable}")] + #[display(fmt = "{id} {type_}{mintable}")] #[allow(clippy::multiple_inherent_impl)] #[ffi_type] pub struct AssetDefinition { @@ -122,7 +122,8 @@ mod model { pub id: AssetDefinitionId, /// Type of [`AssetValue`] #[getset(get_copy = "pub")] - pub value_type: AssetValueType, + #[serde(rename = "type")] + pub type_: AssetType, /// Is the asset mintable #[getset(get_copy = "pub")] pub mintable: Mintable, @@ -164,13 +165,14 @@ mod model { #[derive( Debug, Display, Clone, IdEqOrdHash, Decode, Encode, Deserialize, Serialize, IntoSchema, )] - #[display(fmt = "{id} {mintable}{value_type}")] + #[display(fmt = "{id} {mintable}{type_}")] #[ffi_type] pub struct NewAssetDefinition { /// The identification associated with the asset definition builder. pub id: AssetDefinitionId, /// The type value associated with the asset definition builder. - pub value_type: AssetValueType, + #[serde(rename = "type")] + pub type_: AssetType, /// The mintablility associated with the asset definition builder. pub mintable: Mintable, /// IPFS link to the [`AssetDefinition`] logo @@ -196,7 +198,7 @@ mod model { )] #[ffi_type] #[repr(u8)] - pub enum AssetValueType { + pub enum AssetType { /// Asset's qualitative value. #[display(fmt = "{_0}")] Numeric(NumericSpec), @@ -268,12 +270,12 @@ mod model { } } -/// Error occurred while parsing `AssetValueType` +/// Error occurred while parsing `AssetType` #[derive(Debug, displaydoc::Display, Clone)] #[cfg_attr(feature = "std", derive(thiserror::Error))] #[repr(u8)] pub enum AssetValueTypeParseError { - /// `AssetValueType` should be either `Store` or `Numeric` + /// `AssetType` should be either `Store` or `Numeric` WrongVariant, /// Error occurred while parsing `Numeric` variant: {_0} Numeric(#[cfg_attr(feature = "std", source)] NumericSpecParseError), @@ -283,22 +285,22 @@ impl AssetDefinition { /// Construct builder for [`AssetDefinition`] identifiable by [`Id`]. #[must_use] #[inline] - pub fn new(id: AssetDefinitionId, value_type: AssetValueType) -> ::With { - ::With::new(id, value_type) + pub fn new(id: AssetDefinitionId, type_: AssetType) -> ::With { + ::With::new(id, type_) } /// Construct builder for [`AssetDefinition`] identifiable by [`Id`]. #[must_use] #[inline] pub fn numeric(id: AssetDefinitionId) -> ::With { - ::With::new(id, AssetValueType::Numeric(NumericSpec::default())) + ::With::new(id, AssetType::Numeric(NumericSpec::default())) } /// Construct builder for [`AssetDefinition`] identifiable by [`Id`]. #[must_use] #[inline] pub fn store(id: AssetDefinitionId) -> ::With { - ::With::new(id, AssetValueType::Store) + ::With::new(id, AssetType::Store) } } @@ -314,10 +316,10 @@ impl Asset { impl NewAssetDefinition { /// Create a [`NewAssetDefinition`], reserved for internal use. - fn new(id: AssetDefinitionId, value_type: AssetValueType) -> Self { + fn new(id: AssetDefinitionId, type_: AssetType) -> Self { Self { id, - value_type, + type_, mintable: Mintable::Infinitely, logo: None, metadata: Metadata::default(), @@ -356,12 +358,10 @@ impl HasMetadata for AssetDefinition { impl AssetValue { /// Returns the asset type as a string. - pub const fn value_type(&self) -> AssetValueType { + pub const fn type_(&self) -> AssetType { match *self { - Self::Numeric(numeric) => { - AssetValueType::Numeric(NumericSpec::fractional(numeric.scale())) - } - Self::Store(_) => AssetValueType::Store, + Self::Numeric(numeric) => AssetType::Numeric(NumericSpec::fractional(numeric.scale())), + Self::Store(_) => AssetType::Store, } } /// Returns true if this value is zero, false if it contains [`Metadata`] or positive value @@ -446,7 +446,7 @@ impl FromStr for AssetId { } } -impl FromStr for AssetValueType { +impl FromStr for AssetType { type Err = AssetValueTypeParseError; fn from_str(s: &str) -> Result { @@ -478,7 +478,7 @@ impl Registered for AssetDefinition { /// The prelude re-exports most commonly used traits, structs and macros from this crate. pub mod prelude { pub use super::{ - Asset, AssetDefinition, AssetDefinitionId, AssetId, AssetValue, AssetValueType, Mintable, + Asset, AssetDefinition, AssetDefinitionId, AssetId, AssetType, AssetValue, Mintable, NewAssetDefinition, }; } diff --git a/data_model/src/events/data/events.rs b/data_model/src/events/data/events.rs index 766872cc0d2..faf5f540a0e 100644 --- a/data_model/src/events/data/events.rs +++ b/data_model/src/events/data/events.rs @@ -244,11 +244,11 @@ mod role { #[has_origin(role => role.id())] Created(Role), Deleted(RoleId), - /// [`Permission`]s with particular [`PermissionId`] + /// [`Permission`]s with particular [`Permission`] /// were removed from the role. #[has_origin(permission_removed => &permission_removed.role)] PermissionRemoved(RolePermissionChanged), - /// [`Permission`]s with particular [`PermissionId`] + /// [`Permission`]s with particular [`Permission`] /// were removed added to the role. #[has_origin(permission_added => &permission_added.role)] PermissionAdded(RolePermissionChanged), @@ -280,7 +280,7 @@ mod role { pub role: RoleId, // TODO: Skipped temporarily because of FFI #[getset(skip)] - pub permission: PermissionId, + pub permission: Permission, } } } @@ -345,7 +345,7 @@ mod account { pub account: AccountId, // TODO: Skipped temporarily because of FFI #[getset(skip)] - pub permission: PermissionId, + pub permission: Permission, } /// Depending on the wrapping event, [`AccountRoleChanged`] represents the granted or revoked role @@ -373,7 +373,7 @@ mod account { impl AccountPermissionChanged { /// Get permission id - pub fn permission(&self) -> &PermissionId { + pub fn permission(&self) -> &Permission { &self.permission } } diff --git a/data_model/src/executor.rs b/data_model/src/executor.rs index 4e030b1c3b6..448f849ff2f 100644 --- a/data_model/src/executor.rs +++ b/data_model/src/executor.rs @@ -13,7 +13,7 @@ use parity_scale_codec::{Decode, Encode}; use serde::{Deserialize, Serialize}; pub use self::model::*; -use crate::{permission::PermissionId, transaction::WasmSmartContract, JsonString}; +use crate::{name::Name, transaction::WasmSmartContract, JsonString}; #[model] mod model { @@ -82,7 +82,7 @@ mod model { /// Permission tokens supported by the executor. /// /// These IDs refer to the types in the schema. - pub permissions: BTreeSet, + pub permissions: BTreeSet, /// Type id in the schema. /// Corresponds to payload of `InstructionBox::Custom`. /// @@ -103,7 +103,7 @@ mod model { // currently it fails for all fields impl ExecutorDataModel { /// Getter - pub fn permissions(&self) -> &BTreeSet { + pub fn permissions(&self) -> &BTreeSet { &self.permissions } diff --git a/data_model/src/isi.rs b/data_model/src/isi.rs index c7024cb8d2f..e8b9dd5fc36 100644 --- a/data_model/src/isi.rs +++ b/data_model/src/isi.rs @@ -1250,7 +1250,7 @@ pub mod error { pub use self::model::*; use super::InstructionType; use crate::{ - asset::AssetValueType, + asset::AssetType, metadata, query::error::{FindError, QueryExecutionFail}, IdBox, @@ -1394,18 +1394,18 @@ pub mod error { #[ffi_type] pub enum TypeError { /// Asset Ids correspond to assets with different underlying types, {0} - AssetValueType(#[cfg_attr(feature = "std", source)] Mismatch), + AssetType(#[cfg_attr(feature = "std", source)] Mismatch), /// Numeric asset value type was expected, received: {0} NumericAssetValueTypeExpected( #[skip_from] #[skip_try_from] - AssetValueType, + AssetType, ), /// Store asset value type was expected, received: {0} StoreAssetValueTypeExpected( #[skip_from] #[skip_try_from] - AssetValueType, + AssetType, ), } @@ -1504,7 +1504,7 @@ pub mod error { TimeTriggerInThePast, } - /// Repetition of of `{instruction_type}` for id `{id}` + /// Repetition of of `{instruction}` for id `{id}` #[derive( Debug, displaydoc::Display, @@ -1523,7 +1523,7 @@ pub mod error { #[ffi_type] pub struct RepetitionError { /// Instruction type - pub instruction_type: InstructionType, + pub instruction: InstructionType, /// Id of the object being repeated pub id: IdBox, } diff --git a/data_model/src/lib.rs b/data_model/src/lib.rs index aecffef2df4..e271c27ed1e 100644 --- a/data_model/src/lib.rs +++ b/data_model/src/lib.rs @@ -688,7 +688,7 @@ mod model { /// [`RoleId`](`role::RoleId`) variant. RoleId(role::RoleId), /// [`Permission`](`permission::Permission`) variant. - PermissionId(permission::PermissionId), + Permission(permission::Permission), /// [`ParameterId`](`parameter::ParameterId`) variant. ParameterId(parameter::ParameterId), } @@ -974,7 +974,7 @@ impl_encode_as_id_box! { asset::AssetDefinitionId, asset::AssetId, trigger::TriggerId, - permission::PermissionId, + permission::Permission, role::RoleId, parameter::ParameterId, } diff --git a/data_model/src/permission.rs b/data_model/src/permission.rs index 253c1784d37..4594af79296 100644 --- a/data_model/src/permission.rs +++ b/data_model/src/permission.rs @@ -21,35 +21,6 @@ use super::*; mod model { use super::*; - /// Identifies a [`Permission`]. - /// The executor defines available permission names. - #[derive( - Debug, - Display, - Clone, - PartialEq, - Eq, - PartialOrd, - Ord, - Hash, - Constructor, - FromStr, - Getters, - Decode, - Encode, - Deserialize, - Serialize, - IntoSchema, - )] - #[getset(get = "pub")] - #[serde(transparent)] - #[repr(transparent)] - #[ffi_type(opaque)] - pub struct PermissionId { - /// Should be unique. - pub name: Name, - } - /// Stored proof of the account having a permission for a certain action. #[derive( Debug, @@ -67,11 +38,11 @@ mod model { Getters, )] #[ffi_type] - #[display(fmt = "PERMISSION `{id}` = `{payload}`")] + #[display(fmt = "PERMISSION `{name}` = `{payload}`")] #[getset(get = "pub")] pub struct Permission { /// Refers to a type defined in [`crate::executor::ExecutorDataModel`]. - pub id: PermissionId, + pub name: Name, /// Payload containing actual value. /// /// It is JSON-encoded, and its structure must correspond to the structure of @@ -83,9 +54,9 @@ mod model { impl Permission { /// Constructor - pub fn new(id: PermissionId, payload: impl Into) -> Self { + pub fn new(name: Name, payload: impl Into) -> Self { Self { - id, + name, payload: payload.into(), } } @@ -99,5 +70,5 @@ impl Permission { pub mod prelude { //! The prelude re-exports most commonly used traits, structs and macros from this crate. - pub use super::{Permission, PermissionId}; + pub use super::Permission; } diff --git a/data_model/src/query/cursor.rs b/data_model/src/query/cursor.rs index 3deaba04750..d87632e3d81 100644 --- a/data_model/src/query/cursor.rs +++ b/data_model/src/query/cursor.rs @@ -16,11 +16,13 @@ use parity_scale_codec::{Decode, Encode, Input}; use serde::Serialize; pub use self::model::*; -use super::QueryId; const QUERY_ID: &str = "query_id"; const CURSOR: &str = "cursor"; +/// Unique id of a query +pub type QueryId = String; + #[model] mod model { use super::*; diff --git a/data_model/src/query/mod.rs b/data_model/src/query/mod.rs index 1c89b0afa79..f7b2126fbd2 100644 --- a/data_model/src/query/mod.rs +++ b/data_model/src/query/mod.rs @@ -106,9 +106,6 @@ macro_rules! queries { }; } -/// Unique id of a query. -pub type QueryId = String; - /// Trait for typesafe query output pub trait Query: Into + seal::Sealed { /// Output type of query @@ -137,7 +134,7 @@ mod model { use strum::EnumDiscriminants; use super::*; - use crate::{block::SignedBlock, permission::PermissionId}; + use crate::block::SignedBlock; /// Sized container for all possible Queries. #[allow(clippy::enum_variant_names)] @@ -1556,8 +1553,8 @@ pub mod error { Trigger(TriggerId), /// Role with id `{0}` not found Role(RoleId), - /// Failed to find [`Permission`] by id. - Permission(PermissionId), + /// Failed to find [`Permission`] + Permission(Permission), /// Parameter with id `{0}` not found Parameter(ParameterId), /// Failed to find public key: `{0}` @@ -1575,6 +1572,6 @@ pub mod prelude { account::prelude::*, asset::prelude::*, block::prelude::*, domain::prelude::*, executor::prelude::*, peer::prelude::*, permission::prelude::*, predicate::PredicateTrait, role::prelude::*, transaction::prelude::*, trigger::prelude::*, FetchSize, QueryBox, - QueryId, TransactionQueryOutput, + TransactionQueryOutput, }; } diff --git a/data_model/src/query/predicate.rs b/data_model/src/query/predicate.rs index 87b4e80917e..e1806ee9639 100644 --- a/data_model/src/query/predicate.rs +++ b/data_model/src/query/predicate.rs @@ -601,7 +601,7 @@ pub mod string { IdBox::PeerId(id) => self.applies(&id.to_string()), IdBox::TriggerId(id) => self.applies(&id.to_string()), IdBox::RoleId(id) => self.applies(&id.to_string()), - IdBox::PermissionId(id) => self.applies(&id.to_string()), + IdBox::Permission(id) => self.applies(&id.to_string()), IdBox::ParameterId(id) => self.applies(&id.to_string()), } } diff --git a/docs/source/references/schema.json b/docs/source/references/schema.json index 3cb73c6c563..0214ef9a632 100644 --- a/docs/source/references/schema.json +++ b/docs/source/references/schema.json @@ -157,7 +157,7 @@ }, { "name": "permission", - "type": "PermissionId" + "type": "Permission" } ] }, @@ -266,8 +266,8 @@ "type": "AssetDefinitionId" }, { - "name": "value_type", - "type": "AssetValueType" + "name": "type_", + "type": "AssetType" }, { "name": "mintable", @@ -512,30 +512,30 @@ } ] }, - "AssetValue": { + "AssetType": { "Enum": [ { "tag": "Numeric", "discriminant": 0, - "type": "Numeric" + "type": "NumericSpec" }, { "tag": "Store", - "discriminant": 1, - "type": "Metadata" + "discriminant": 1 } ] }, - "AssetValueType": { + "AssetValue": { "Enum": [ { "tag": "Numeric", "discriminant": 0, - "type": "NumericSpec" + "type": "Numeric" }, { "tag": "Store", - "discriminant": 1 + "discriminant": 1, + "type": "Metadata" } ] }, @@ -1209,7 +1209,7 @@ "Struct": [ { "name": "permissions", - "type": "SortedVec" + "type": "SortedVec" }, { "name": "custom_instruction", @@ -1496,7 +1496,7 @@ { "tag": "Permission", "discriminant": 10, - "type": "PermissionId" + "type": "Permission" }, { "tag": "Parameter", @@ -1728,9 +1728,9 @@ "type": "RoleId" }, { - "tag": "PermissionId", + "tag": "Permission", "discriminant": 7, - "type": "PermissionId" + "type": "Permission" }, { "tag": "ParameterId", @@ -2376,15 +2376,15 @@ } ] }, - "Mismatch": { + "Mismatch": { "Struct": [ { "name": "expected", - "type": "AssetValueType" + "type": "AssetType" }, { "name": "actual", - "type": "AssetValueType" + "type": "AssetType" } ] }, @@ -2408,8 +2408,8 @@ "type": "AssetDefinitionId" }, { - "name": "value_type", - "type": "AssetValueType" + "name": "type_", + "type": "AssetType" }, { "name": "mintable", @@ -2672,8 +2672,8 @@ "Permission": { "Struct": [ { - "name": "id", - "type": "PermissionId" + "name": "name", + "type": "Name" }, { "name": "payload", @@ -2681,14 +2681,6 @@ } ] }, - "PermissionId": { - "Struct": [ - { - "name": "name", - "type": "Name" - } - ] - }, "PipelineEventBox": { "Enum": [ { @@ -3247,7 +3239,7 @@ "RepetitionError": { "Struct": [ { - "name": "instruction_type", + "name": "instruction", "type": "InstructionType" }, { @@ -3398,7 +3390,7 @@ }, { "name": "permission", - "type": "PermissionId" + "type": "Permission" } ] }, @@ -3735,12 +3727,12 @@ "value": "MetadataValueBox" } }, + "SortedVec": { + "Vec": "Name" + }, "SortedVec": { "Vec": "Permission" }, - "SortedVec": { - "Vec": "PermissionId" - }, "Sorting": { "Struct": [ { @@ -4214,19 +4206,19 @@ "TypeError": { "Enum": [ { - "tag": "AssetValueType", + "tag": "AssetType", "discriminant": 0, - "type": "Mismatch" + "type": "Mismatch" }, { "tag": "NumericAssetValueTypeExpected", "discriminant": 1, - "type": "AssetValueType" + "type": "AssetType" }, { "tag": "StoreAssetValueTypeExpected", "discriminant": 2, - "type": "AssetValueType" + "type": "AssetType" } ] }, diff --git a/genesis/src/lib.rs b/genesis/src/lib.rs index 2d972d0bd8a..f72049e8e3b 100644 --- a/genesis/src/lib.rs +++ b/genesis/src/lib.rs @@ -210,7 +210,7 @@ impl GenesisDomainBuilder { } /// Add [`AssetDefinition`] to current domain. - pub fn asset(mut self, asset_name: Name, asset_value_type: AssetValueType) -> Self { + pub fn asset(mut self, asset_name: Name, asset_value_type: AssetType) -> Self { let asset_definition_id = AssetDefinitionId::new(self.domain_id.clone(), asset_name); let asset_definition = AssetDefinition::new(asset_definition_id, asset_value_type); self.instructions @@ -267,7 +267,7 @@ mod tests { .account(public_key["mad_hatter"].clone()) .asset( "hats".parse().unwrap(), - AssetValueType::Numeric(NumericSpec::default()), + AssetType::Numeric(NumericSpec::default()), ) .finish_domain(); diff --git a/schema/gen/src/lib.rs b/schema/gen/src/lib.rs index 27816465c97..28fe8299228 100644 --- a/schema/gen/src/lib.rs +++ b/schema/gen/src/lib.rs @@ -82,15 +82,15 @@ types!( AssetId, AssetTransferBox, AssetValue, - AssetValueType, + AssetType, AtIndex, BTreeMap, BTreeMap, BTreeMap, BTreeMap, BTreeMap, + BTreeSet, BTreeSet, - BTreeSet, BatchedResponse, BatchedResponseV1, BlockEvent, @@ -224,7 +224,7 @@ types!( MintBox, MintabilityError, Mintable, - Mismatch, + Mismatch, Name, NewAccount, NewAssetDefinition, @@ -270,7 +270,6 @@ types!( PeerEventFilter, PeerEventSet, PeerId, - PermissionId, RolePermissionChanged, Permission, PipelineEventBox, diff --git a/smart_contract/executor/derive/src/permission.rs b/smart_contract/executor/derive/src/permission.rs index 0cb6f5c3a39..c062a068186 100644 --- a/smart_contract/executor/derive/src/permission.rs +++ b/smart_contract/executor/derive/src/permission.rs @@ -18,7 +18,7 @@ pub fn impl_derive_permission(input: &syn::DeriveInput) -> TokenStream { account_id.clone(), ) ) - .expect("`FindPermissionsByAccountId` query should never fail, it's a bug"); + .expect("INTERNAL BUG: `FindPermissionsByAccountId` should never fail"); account_tokens_cursor .into_iter() @@ -34,11 +34,9 @@ pub fn impl_derive_permission(input: &syn::DeriveInput) -> TokenStream { impl #impl_generics TryFrom<&::iroha_executor::data_model::permission::Permission> for #ident #ty_generics #where_clause { type Error = ::iroha_executor::TryFromDataModelObjectError; - fn try_from( - value: &::iroha_executor::data_model::permission::Permission, - ) -> core::result::Result { - if *value.id() != ::id() { - return Err(Self::Error::Id(value.id().name().clone())); + fn try_from(value: &::iroha_executor::data_model::permission::Permission) -> core::result::Result { + if *value.name() != ::name() { + return Err(Self::Error::UnknownName(value.name().clone())); } serde_json::from_str::(value.payload().as_ref()).map_err(Self::Error::Deserialize) @@ -48,7 +46,7 @@ pub fn impl_derive_permission(input: &syn::DeriveInput) -> TokenStream { impl #impl_generics From<#ident #ty_generics> for ::iroha_executor::data_model::permission::Permission #where_clause { fn from(value: #ident #ty_generics) -> Self { ::iroha_executor::data_model::permission::Permission::new( - <#ident as ::iroha_executor::permission::Permission>::id(), + <#ident as ::iroha_executor::permission::Permission>::name(), ::serde_json::to_value::<#ident #ty_generics>(value) .expect("INTERNAL BUG: Failed to serialize Executor data model entity"), ) diff --git a/smart_contract/executor/src/default/permissions.rs b/smart_contract/executor/src/default/permissions.rs index 735ef253942..4d2e6dd69bb 100644 --- a/smart_contract/executor/src/default/permissions.rs +++ b/smart_contract/executor/src/default/permissions.rs @@ -46,12 +46,12 @@ macro_rules! declare_permissions { type Error = $crate::TryFromDataModelObjectError; fn try_from(token: &$crate::data_model::permission::Permission) -> Result { - match token.id().name().as_ref() { $( + match token.name().as_ref() { $( stringify!($token_ty) => { let token = <$($token_path::)+$token_ty>::try_from(token)?; Ok(Self::$token_ty(token)) } )+ - _ => Err(Self::Error::Id(token.id().name().clone())) + _ => Err(Self::Error::UnknownName(token.name().clone())) } } } diff --git a/smart_contract/executor/src/lib.rs b/smart_contract/executor/src/lib.rs index 78b34b0f198..4e9e0b4046e 100644 --- a/smart_contract/executor/src/lib.rs +++ b/smart_contract/executor/src/lib.rs @@ -179,8 +179,8 @@ macro_rules! deny { /// Such objects are [`data_model::prelude::Permission`] and [`data_model::prelude::Parameter`]. #[derive(Debug)] pub enum TryFromDataModelObjectError { - /// Unexpected object id - Id(data_model::prelude::Name), + /// Unexpected object name + UnknownName(data_model::prelude::Name), /// Failed to deserialize object payload Deserialize(serde_json::Error), } @@ -188,7 +188,7 @@ pub enum TryFromDataModelObjectError { /// A convenience to build [`ExecutorDataModel`] from within the executor #[derive(Debug, Clone)] pub struct DataModelBuilder { - permissions: BTreeSet, + permissions: BTreeSet, custom_instruction: Option, schema: MetaMap, } @@ -225,7 +225,8 @@ impl DataModelBuilder { #[must_use] pub fn add_permission(mut self) -> Self { ::update_schema_map(&mut self.schema); - self.permissions.insert(::id()); + self.permissions + .insert(::name()); self } @@ -243,7 +244,7 @@ impl DataModelBuilder { pub fn remove_permission(mut self) -> Self { ::remove_from_schema(&mut self.schema); self.permissions - .remove(&::id()); + .remove(&::name()); self } @@ -256,7 +257,7 @@ impl DataModelBuilder { serde_json::to_value(&self.schema) .expect("INTERNAL BUG: Failed to serialize Executor data model entity") .into(), - )) + )); } } diff --git a/smart_contract/executor/src/permission.rs b/smart_contract/executor/src/permission.rs index a6ead932324..c11375903a9 100644 --- a/smart_contract/executor/src/permission.rs +++ b/smart_contract/executor/src/permission.rs @@ -17,12 +17,10 @@ pub trait Permission: fn is_owned_by(&self, account_id: &AccountId) -> bool; /// Permission id, according to [`IntoSchema`]. - fn id() -> PermissionId { - PermissionId::new( - ::type_name() - .parse() - .dbg_expect("Failed to parse permission id as `Name`"), - ) + fn name() -> Name { + ::type_name() + .parse() + .dbg_expect("Failed to parse permission id as `Name`") } } diff --git a/tools/kagami/src/genesis/generate.rs b/tools/kagami/src/genesis/generate.rs index be0804fa88a..e260b259965 100644 --- a/tools/kagami/src/genesis/generate.rs +++ b/tools/kagami/src/genesis/generate.rs @@ -99,16 +99,13 @@ pub fn generate_default( .domain_with_metadata("wonderland".parse()?, meta.clone()) .account_with_metadata(ALICE_ID.signatory().clone(), meta.clone()) .account_with_metadata(BOB_ID.signatory().clone(), meta) - .asset( - "rose".parse()?, - AssetValueType::Numeric(NumericSpec::default()), - ) + .asset("rose".parse()?, AssetType::Numeric(NumericSpec::default())) .finish_domain() .domain("garden_of_live_flowers".parse()?) .account(CARPENTER_ID.signatory().clone()) .asset( "cabbage".parse()?, - AssetValueType::Numeric(NumericSpec::default()), + AssetType::Numeric(NumericSpec::default()), ) .finish_domain(); @@ -138,11 +135,11 @@ pub fn generate_default( Role::new("ALICE_METADATA_ACCESS".parse()?) .add_permission(Permission::new( "CanSetKeyValueInAccount".parse()?, - json!({ "account_id": ALICE_ID.clone() }), + json!({ "account": ALICE_ID.clone() }), )) .add_permission(Permission::new( "CanRemoveKeyValueInAccount".parse()?, - json!({ "account_id": ALICE_ID.clone() }), + json!({ "account": ALICE_ID.clone() }), )), ) .into(); @@ -248,7 +245,7 @@ fn generate_synthetic( genesis.append_instruction( Register::asset_definition(AssetDefinition::new( asset_definition_id, - AssetValueType::Numeric(NumericSpec::default()), + AssetType::Numeric(NumericSpec::default()), )) .into(), );