From f67e173b9f095390b2e8d830b30b23c8c3943b3c Mon Sep 17 00:00:00 2001 From: root Date: Mon, 6 Dec 2021 11:14:36 +0000 Subject: [PATCH] v1.6.2-wax --- README.md | 4 + build/SimpleAssets/SimpleAssets.abi | 239 +++++-------------------- build/SimpleAssets/SimpleAssets.wasm | Bin 245974 -> 226268 bytes include/SimpleAssets.hpp | 124 +++---------- ricardian/SimpleAssets.contracts.md | 132 +++----------- ricardian/SimpleAssets.contracts.md.in | 132 +++----------- src/SimpleAssets.cpp | 92 +++------- 7 files changed, 134 insertions(+), 589 deletions(-) diff --git a/README.md b/README.md index afab5d6..b8d10a7 100644 --- a/README.md +++ b/README.md @@ -667,6 +667,10 @@ to be the main image. ----------------- # Change Logs +## Change Log v1.6.2 +- deprecated sae* actions + brunlog +- createflog and offerflog added + ## Change Log v1.6.1 - support for token-back NFT contract - Changed map structure type to vector in `saeclaim` and `saechautor` log actions diff --git a/build/SimpleAssets/SimpleAssets.abi b/build/SimpleAssets/SimpleAssets.abi index b7b4dac..37b421b 100644 --- a/build/SimpleAssets/SimpleAssets.abi +++ b/build/SimpleAssets/SimpleAssets.abi @@ -167,24 +167,6 @@ } ] }, - { - "name": "burnlog", - "base": "", - "fields": [ - { - "name": "owner", - "type": "name" - }, - { - "name": "assetids", - "type": "uint64[]" - }, - { - "name": "memo", - "type": "string" - } - ] - }, { "name": "burnntt", "base": "", @@ -203,24 +185,6 @@ } ] }, - { - "name": "burnnttlog", - "base": "", - "fields": [ - { - "name": "owner", - "type": "name" - }, - { - "name": "assetids", - "type": "uint64[]" - }, - { - "name": "memo", - "type": "string" - } - ] - }, { "name": "canceloffer", "base": "", @@ -387,6 +351,32 @@ } ] }, + { + "name": "createflog", + "base": "", + "fields": [ + { + "name": "newID", + "type": "uint64" + }, + { + "name": "author", + "type": "name" + }, + { + "name": "maximum_supply", + "type": "asset" + }, + { + "name": "authorctrl", + "type": "bool" + }, + { + "name": "data", + "type": "string" + } + ] + }, { "name": "createlog", "base": "", @@ -766,68 +756,28 @@ ] }, { - "name": "openf", + "name": "offerflog", "base": "", "fields": [ { - "name": "owner", - "type": "name" - }, - { - "name": "author", - "type": "name" - }, - { - "name": "symbol", - "type": "symbol" - }, - { - "name": "ram_payer", - "type": "name" - } - ] - }, - { - "name": "saeburn", - "base": "", - "fields": [ - { - "name": "author", - "type": "name" + "name": "newID", + "type": "uint64" }, { "name": "owner", "type": "name" }, { - "name": "assetids", - "type": "uint64[]" - }, - { - "name": "memo", - "type": "string" - } - ] - }, - { - "name": "saechauthor", - "base": "", - "fields": [ - { - "name": "author", - "type": "name" - }, - { - "name": "newauthor", + "name": "newowner", "type": "name" }, { - "name": "owner", + "name": "author", "type": "name" }, { - "name": "assetids", - "type": "tuple_uint64_name[]" + "name": "quantity", + "type": "asset" }, { "name": "memo", @@ -836,80 +786,24 @@ ] }, { - "name": "saeclaim", - "base": "", - "fields": [ - { - "name": "author", - "type": "name" - }, - { - "name": "claimer", - "type": "name" - }, - { - "name": "assetids", - "type": "tuple_uint64_name[]" - } - ] - }, - { - "name": "saecreate", + "name": "openf", "base": "", "fields": [ - { - "name": "author", - "type": "name" - }, - { - "name": "category", - "type": "name" - }, { "name": "owner", "type": "name" }, - { - "name": "idata", - "type": "string" - }, - { - "name": "mdata", - "type": "string" - }, - { - "name": "assetid", - "type": "uint64" - }, - { - "name": "requireclaim", - "type": "bool" - } - ] - }, - { - "name": "saetransfer", - "base": "", - "fields": [ { "name": "author", "type": "name" }, { - "name": "from", - "type": "name" + "name": "symbol", + "type": "symbol" }, { - "name": "to", + "name": "ram_payer", "type": "name" - }, - { - "name": "assetids", - "type": "uint64[]" - }, - { - "name": "memo", - "type": "string" } ] }, @@ -1235,20 +1129,6 @@ } ] }, - { - "name": "tuple_uint64_name", - "base": "", - "fields": [ - { - "name": "field_0", - "type": "uint64" - }, - { - "name": "field_1", - "type": "name" - } - ] - }, { "name": "undelegate", "base": "", @@ -1372,21 +1252,11 @@ "type": "burnflog", "ricardian_contract": "---\nspec_version: 0.0.2\ntitle: burnflog (internal)\nsummary: burnflog (internal) \nicon: https://cryptolions.io/assets/images/sa-icons-256/burn.png#76954820d84563187e968b461a706ab089a9c00f5332df96a4e5bb2e69ed5e84\n---" }, - { - "name": "burnlog", - "type": "burnlog", - "ricardian_contract": "---\nspec_version: 0.0.2\ntitle: burnlog (internal)\nsummary: burnlog (internal) \nicon: https://cryptolions.io/assets/images/sa-icons-256/burn.png#76954820d84563187e968b461a706ab089a9c00f5332df96a4e5bb2e69ed5e84\n---" - }, { "name": "burnntt", "type": "burnntt", "ricardian_contract": "---\nspec_version: 0.0.2\ntitle: Burn non transferable asset\nsummary: Burn non transferable asset\nicon: https://cryptolions.io/assets/images/sa-icons-256/burn.png#76954820d84563187e968b461a706ab089a9c00f5332df96a4e5bb2e69ed5e84\n---\n\nThis action is only available for the asset owner. After executing, the asset will disappear forever, and RAM used for asset will be released.\n\nInput parameters:\n`owner` - current asset owner account;\n`assetids` - array of assetid's to burn;\n`memo` - memo for burn action;\n\nTERM\nThis Contract expires at the conclusion of code execution.\nby CryptoLions [ https://cryptolions.io ]" }, - { - "name": "burnnttlog", - "type": "burnnttlog", - "ricardian_contract": "---\nspec_version: 0.0.2\ntitle: burnnttlog (internal)\nsummary: burnnttlog (internal) \nicon: https://cryptolions.io/assets/images/sa-icons-256/burn.png#76954820d84563187e968b461a706ab089a9c00f5332df96a4e5bb2e69ed5e84\n---" - }, { "name": "canceloffer", "type": "canceloffer", @@ -1432,6 +1302,11 @@ "type": "createf", "ricardian_contract": "---\nspec_version: 0.0.2\ntitle: Creates fungible token\nsummary: Creates fungible token\nicon: https://cryptolions.io/assets/images/sa-icons-256/claimf.png#80086207646470fa9cbaf4638ba0dedec96ea0e84d5059b567adc9e4b8543c30\n---\n\nCreates fungible token with specified maximum supply; You can not change anything after creation.\n\nInput parameters:\n`author` - fungible token author;\n`maximum_supply` - maximum token supply, example \"10000000.0000 GOLD\", \"10000000 SEED\", \"100000000.00 WOOD\". Precision is also important here;\n`authorctrl` - if true(1) allow token author (and not just owner) to burnf and transferf. Cannot be changed after creation!\n`data` - stringify json (recommend including keys `img` and `name` for better displaying by markets)\n\nTERM\nThis Contract expires at the conclusion of code execution.\nby CryptoLions [ https://cryptolions.io ]" }, + { + "name": "createflog", + "type": "createflog", + "ricardian_contract": "---\nspec_version: 0.0.2\ntitle: createlog (internal)\nsummary: createlog (internal) \nicon: https://cryptolions.io/assets/images/sa-icons-256/claimf.png#80086207646470fa9cbaf4638ba0dedec96ea0e84d5059b567adc9e4b8543c30\n---\n\nTERM\nThis Contract expires at the conclusion of code execution.\nby CryptoLions [ https://cryptolions.io ]" + }, { "name": "createlog", "type": "createlog", @@ -1507,36 +1382,16 @@ "type": "offerf", "ricardian_contract": "---\nspec_version: 0.0.2\ntitle: Offer fungible tokens to claim\nsummary: Offer fungible tokens for another EOS user to claim\nicon: https://cryptolions.io/assets/images/sa-icons-256/offerf.png#a34462918e536372610a523225e5221cd2685eff3c329499ded7298907f8524b\n---\n\nThis is an alternative to the transfer action. Offer can be used by a FT owner to transfer the FTs without using their RAM. After an offer is made, the account specified in new owner is able to make a claim, and take control of the asset using their RAM. FTs will be removed from the owner's balance while the offer is open\n\nInput parameters:\n`owner` - original owner of the FTs\n`newowner` - account which will be able to claim the offer\n`author` - account of fungible token author;\t\n`quantity` - amount to transfer, example \"1.00 WOOD\";\n`memo` - offer's comment;\n\nTERM\nThis Contract expires at the conclusion of code execution.\nby CryptoLions [ https://cryptolions.io ]" }, + { + "name": "offerflog", + "type": "offerflog", + "ricardian_contract": "---\nspec_version: 0.0.2\ntitle: offerflog (internal)\nsummary: offerflog (internal) \nicon: https://cryptolions.io/assets/images/sa-icons-256/claimf.png#80086207646470fa9cbaf4638ba0dedec96ea0e84d5059b567adc9e4b8543c30\n---\n\nTERM\nThis Contract expires at the conclusion of code execution.\nby CryptoLions [ https://cryptolions.io ]" + }, { "name": "openf", "type": "openf", "ricardian_contract": "---\nspec_version: 0.0.2\ntitle: Opens accounts table for fungible token\nsummary: Opens accounts table for specified fungible token\nicon: https://cryptolions.io/assets/images/sa-icons-256/attach.png#0b039adbbe1011a494959963917df4765dbae378004e00911464f865e58ef452\n---\n\nInput parameters:\n`owner` - account who woud like to close table with fungible token;\n`author` - account of fungible token author;\n`symbol` - token symbol, example \"WOOD\", \"ROCK\", \"GOLD\";\n`ram_payer` - account who will pay for ram used for table creation;\n\nTERM\nThis Contract expires at the conclusion of code execution.\nby CryptoLions [ https://cryptolions.io ]" }, - { - "name": "saeburn", - "type": "saeburn", - "ricardian_contract": "---\nspec_version: 0.0.2\ntitle: Internal action used for creating log\nsummary: Internal action used for creating log\nicon: https://cryptolions.io/assets/images/sa-icons-256/burn.png#76954820d84563187e968b461a706ab089a9c00f5332df96a4e5bb2e69ed5e84\n---\n\nThis action is called during burn in deferred transaction \n\nInput parameters:\n`author` - asset's author;\n`owner` - current asset owner account;\n`assetids` - array of assetid's to burn;\n`memo` - memo for burn action;\n\nTERM\nThis Contract expires at the conclusion of code execution.\nby CryptoLions [ https://cryptolions.io ]" - }, - { - "name": "saechauthor", - "type": "saechauthor", - "ricardian_contract": "---\nspec_version: 0.0.2\ntitle: Internal action used for creating log\nsummary: Internal action used for creating log\nicon: https://cryptolions.io/assets/images/sa-icons-256/regauthor.png#c6a539be8e7dfd1a4c466ba9cabfd13571cd77d5c988c652d2e8f87096f3548e\n---\t\n\nInput parameters:\n`author` - asset's author, who will able to change author name asset's;\n`newauthor` - asset's new author name;\n`owner` - assets owner;\n`assetids` - array of assetid's\n\nTERM\nThis Contract expires at the conclusion of code execution.\nby CryptoLions [ https://cryptolions.io ]" - }, - { - "name": "saeclaim", - "type": "saeclaim", - "ricardian_contract": "---\nspec_version: 0.0.2\ntitle: Internal action used for creating log\nsummary: Internal action used for creating log\nicon: https://cryptolions.io/assets/images/sa-icons-256/claim.png#8c3fdf140ea14a3cb9762a0f6ec0f0d73f8c2eeeec3ea2f109f394a9f35f472d\n---\n\nInput parameters:\n`author` - asset's author, who will able to updated asset's mdata;\n`claimer` - account claiming the asset;\n`assetids` - array of assetid's to claim;\n\nTERM\nThis Contract expires at the conclusion of code execution.\nby CryptoLions [ https://cryptolions.io ]" - }, - { - "name": "saecreate", - "type": "saecreate", - "ricardian_contract": "---\nspec_version: 0.0.2\ntitle: Internal action used for creating log\nsummary: Internal action used for creating log\nicon: https://cryptolions.io/assets/images/sa-icons-256/create.png#db2bc53cef5dbbce5247543a91234373ec4bd1baf743301a0d92a35b053eeb70\n---\t\n\nInput parameters:\n`author` - asset's author, who will able to updated asset's mdata;\n`category` - assets category;\n`owner` - assets owner;\n`idata` - stringified json with immutable assets data\n`mdata` - stringified json with mutable assets data, can be changed only by author\n`requireclaim` - true or false. If disabled, upon creation, the asset will be transfered to owner (but \n\t\t\t\t but AUTHOR'S memory will be used until the asset is transferred again). If enabled,\n\t\t\t\t author will remain the owner, but an offer will be created for the account specified in \n\t\t\t\t the owner field to claim the asset using the account's RAM.\n\nTERM\nThis Contract expires at the conclusion of code execution.\nby CryptoLions [ https://cryptolions.io ]" - }, - { - "name": "saetransfer", - "type": "saetransfer", - "ricardian_contract": "---\nspec_version: 0.0.2\ntitle: Internal action used for creating log\nsummary: Internal action used for creating log\nicon: https://cryptolions.io/assets/images/sa-icons-256/transfer.png#23227a4901414db5cd0973d1cc5df13f9b82375b21c6315fd3402cb4acd50cbf\n---\n\nThis action is called during transfer in deferred transaction \n\nInput parameters:\n`author` - asset's author;\n`from` - account who sends the asset;\n`to` - account of receiver;\n`assetids` - array of assetid's to transfer;\n`memo` - transfers comment;\n\nTERM\nThis Contract expires at the conclusion of code execution.\nby CryptoLions [ https://cryptolions.io ]" - }, { "name": "setarampayer", "type": "setarampayer", diff --git a/build/SimpleAssets/SimpleAssets.wasm b/build/SimpleAssets/SimpleAssets.wasm index 1ab36dcf65bee81c961e39d436d0e4b8d51474e6..c222674bf2a940c03f570dc0b428302bb948ba5d 100755 GIT binary patch delta 43367 zcmdSC2Ygh;`ZvBaXE&R+$q6C7on1l-5C{k%fDsl&P*4a00-_W_AQS-`sFw{2ij{JN z!5&2gkxLOY*ki{I_J)Gjf?gExTCauo`#f{DB!K$+-TQw2?_WRUoSic>XXcq_p7Nb% z=DfWi^}{cG$*%F|%@8h^OYD=!EKBa++9l?XlcA6ZjT7_nhi>ODn;cxWX}Xwi7l^Zs zuf4}?xm;`!$C_tfFlWxBndgt4GwJL}Q!kt}$CYeMnt5T;#0g_(PMUlE*r`=rT|P=l zoO<5a@n@fX?gcZ?ccoB*b)G%eu?}vD>pC4)!OII z%gf2}`3xh^oi7SRA?}L|%kOg+x-G-V$Vm?5xleLgF%IL}w&Gek*ou~C|8 z2t$_eU| zhG^x>^X0W_)yiksv*YsY`ncrwKA#W8d{#n{g3b0{qxRHH2*dBH{Pt!wfgC{w-&wj`6GRgO7d5pZmCITwf$RiuIOfG`z{q#_6pyiiXH*c&nIZA zR7qFRFuU0)DFvn70g~ z5x=UEbZU(~G^M@hY0ppb<8MPsNlx#U`QniuGc>s6OiN&{zUiRn3pNmuMSK4mJ{mPQjqQ*X0@*(bD zEnSZL@nz47AzMnz0|H4Ww>tqzOWIlDczaX3i756}`x*9S?I-iyUi^Kd!?VWm=4tlL z6-CJNNJTA5`8qy{C$Dw9Rt&bsbQ&T~vj5(xUDjYrR=7;RkxX=uL9@;>f-ZBg{Y|HV zobP1s7Mh3VU&~!-59nnv%x$_)+;7k8u~2NWfA7(2Fxq37_~Q;%))l*w78HoQ zP#afpx0n`)D|T6Nmh5h97icrFM~)R2Y!Y=r7x>eP>+9-nY!kAN{y+F+lgm8bUfQ$Z z*lhy&wjrOG^{oRxs5Rg$t=@l~>kuHGv7sQqQn^43dH zHonfO#1(w+1(!L@E(&JKrNTb0mp`;rfVQaCND87IWpWk0kP3-8R$PUPALp4eDE!{Y z?|wcsg7ca+l!!NbXZs}T(C;x%cHz!RXF?-$6UK_3Z;Eupu$>u zzpJNfE3V7~-HoLn42bHk3nXFiEjRuIyeHDM46c=R{$yNHso#g|ZdaW@1r_|{Vv42W zHlFWH+-37!8t%&Yt`+X&4q-obs44^zk!$op!d_RM<+XBy#`%G~IQV1SS5ANVW2qZccJ&m%p&B}&o$hhzh z(6UA8#e&8UV`3RrB2gfnh`WOZF3+48W*X2aoC?z5cCH>+3>6j9BSmREAo-D`DU>b5 ze1$^vOOF^)0=?sW;Awg<6U1-mH(D7;3M5#q>Egn0$UY#TD>$Vt;H9K^5YIAdA%wkt zmz7|7`}oZY#b_T2@Mb=IEf^XL~{@6D72P@+;c`hM5f_xdxz$6w7N)3g{vy zV&>8S{KI7u8`99kG!LT{CbKK}`q2leC7orTkQEOZgIRDGjb%~{aY+tof;y?1rY=j9 z^oXR&)}+e%LsEtQkXF@}&!LqIbKXb9&2i}Uwqv8j(8~vUokR3OvA;?$%z@yFXO7C% zhZF3-L@&sOYaye}-hShcNAu%9Zk*lm;mi=Gh^RfvC`RT7ztNfhSzoN=Dme~vl!Pt*LKEQcc2Q?e zCX&*)y@_$7*&A0*YS>$D#1Exk^m~U0KpBm+jK0?5HIz#jeV`I76r_B*NWh@{_zh*E zc{ZC9DqPt?SAV|+dCZM}*EG}5h zO0h^c#}(WkWsR0Pu{z8cAc)q9U^-Hsg(!?_#;<;|rA|aEwMrb&yli-eLx9$U^yvu@B z12%+Q60-xYJR(g#jqZi;aLl32ObsGyh)s(H<1%U-KH!kU)7gwln zTlcp@Tz?r#L{tX-VA17FQqD_L_FY$KHv_4SFqML2iK9=2Td$n5MZ_jDPH4h~S69HOj3Szr&UT?@CY@;KQZE|h=hVDYFud+6e%i>x>% zns&)D-R#;Gp7wywTkhTtkK7i+E)kE}e;c+q`6dX(nEV~W-rMoRcZ(mk6py%2h#%~m zPah9wt@B>LT{!Y`@r2qD5*euP&`ii#$=K{Lg~#0m|AGhIa-|ZS z@VMPD>E3WZcI$qmtB>CoUUjBlwo;83h)nyTb0&)iZ2#oNN%NZZEHi=LoXg~RbMk&M z!+vJUAoMD2D!HJ?P3<9O+HAcJ z1{B>IaPN%2_qDF@3%sna%TE>}-g%zAo7dHuc~KcAa6Rn3(P5#yGZKg71Gu;wD&$saG_wNQ_py<7MBj z3Do;U5?fv?0V0bo=s+L|1{mLGLugHe9D%^Y-vf|O7upZaD;AsVkLLBu83}12WBoi~ z!CgUSyXNA8F8b*Lf~mC^7=Bu3wt>wO^GbL>0ny#qWM6-AjWrVD32kv%kW+BOJVzBa72|rtj^}-K(%1Z`529K>5 zFF`rzD*+c;iyE`&MLk`YqJe~55tWHB9>!z5mb*$mqtcUPF9;4ZR}D{+9o;Mne!k>{ zUT9a99HJX#C78eus4r`2kP@6;!UnP+vWF3o?}9$yS>+9WXV1H|typW{ere{gwSrAK zh-qphN+)QQgc0CzfYf$g;SJt}F_}lbKfI7b1Be_D!d@^xGY>7ZKP4R{sK9`)Uaiq-<{4Cpkuom^?|Lg-ZxY%;#yia+uy{s_EXu1P4;-C1AOaXV7m=t+ z;w5Of8k{0?X;#$dW`?uP3P5GJB9uF~z9K!W+km05Zo`}HjrBRn!~wy2Nos7d{lVCC z#U-j>hAa}7s^ezJ_V%iA&$j*>L<9gY31JUyz-Z-s`@Hc%y!3(bB`K&u26wnngJmQ= zsy1I@jA*P+m4ie^FTYz0HH;H(wP0)9W1_vHM%~d>v_=(=Tt2RKSfH|eZB3Fz2JEy= z>2}|RqqClf2-fUCvLjNGAyUTuJyYG%S+uf0SU6NP*&P>khZH$y(Yt^2+BmIW!tYMG z`gGAtE%OUI;W-K5ExXQKsl;hSPu1{~$nDGoh0zCtj>zsNv=QbU%^P>HiTVt^=O+C! z%9Zq-A>!1M8rh&VV5VJkZ3e1;Qp$Gr*lUv^6sBLhBzd!JuJue(c)(K`O0_&mFWD8> z%@mi|w_Z0ZVVDxO~*ek{s{tb8|1WrLE}iXU=`l!0JuhQsdNBbcp#9f zJS4&%l?O0mp5 zzJ_!j6biARmN*898q6Dmgv>&Twy=~zgLWg)!s6#D8A#}E?8Pr?%TIRoGXI${#DH;6 z%Oxh`ERbj@$^rhg z=Ep-Q9|Vottf!Yi;K5nI)e&G+8Z0v`5JyP0BfyN{ujE{kTJ)fJy|icFktcT8hj?gygGuYo(~PsJ_VF5H>8(>QV(?x0R6u@!DX1iDSf z?P8S2ZEGhL7G#EVYt{KPak~)ycNQffV}6|CNz2g7HZ}$6&j0kfnL%0`-1d z*(S$voRF*?C$LJMma&;7vMflGuuQ&803DR6W}*VTWEC1nq_Vhm+%_-_HLg%UMdMb$ zXm=X-Te&o;qv#jqDZ(vfZ$J)iXQukClgzgJtZ=JuO5_sJTFoz&#rDA!>509FWoY(U z>WNZ$irwcHcPAo`CNCwER?_&pcg{0AR{Mo<~-1MOw8Dk_&=$468h z%4IGogAAI$=mprrzC~sCCyK^XN|pvw^n@m>g8LOiTP*X?$b;ZSIT~PMD_8Ktv{Gx@$v{CXRy)v~{9U|JO-4(K|vokb!4e>PI z7$EY3u`65yVyQc*IdL(3rn1SFQ!+!^mDuB>jslmSiyv6j)g7ta&h z_p|A5~cbY>zV$N0= z9#jw60OGYFQlzQEjxtYua)QWG&4%ik=<6{-@>N4ed5ththfdOOFSs>^^@~+qCpj=P zIyM^mfmaP|MSXmVaB9aW98*wWB@iwdCV!aI^{A**DrIh*!>tQWg@U@eQkoge&1)kh z*TbMTR?6}i0TDqqs8<-VgY-B$83wc%(BNRv)~n^m82h^0vrfV~p+PV$*8E74;SWg> zEy5>Yn5S)VXUyo@IbVrwf`$ntR ztU1Y9Wk-<@%q`@>>GTF)bVV&7LZ*!eVlpW*u>UYD?#!n#VJT!@Z z4`6HeovZAIJAKKm(pzU_W@YE(<>#i^58de(UF;9;%;{E1HlVu>S)upcWP9g9y_F<) z0)l|ql!FV{C=ll>3}zv@A}NSvdeyV542IeVvylRT+91;s`k!+8-N78Bw&%$YE$%ii z2f@e|po!*Y6cQj9j{&zlITtMm=$FvT-6&lS?MChki(Vr}%62D|A38XI#;TvYN?%T1 zFcSsJ&`f4LlGPp>usl`NP5Mg;k^$+`qB0Moxe#qBH%0~ouOPU6xxoySF0pIx$_%wd zJ7D_gjClbMAr5&#FP;~}N?ilLX`yOvUd!0#4lheHlR$zjBj8{3;B2 z79L;}(~z1C2g_pZ1M@7{3MqJ)Ll|a`#xTjY2)H$dnT6~@kUTkq47rlz)=5DFm-M7y zJ}#|vVwz4glX#p{^(7?`MxIkTp3e7>7$z5)V$I{*{o#w2w~;5+%J!!6du< zo)eRQVvv(ip5U+cCHM3ZyX{Bs$&Dj(JGj^W@SXw_MjI%pu}viIwiDL0KL(>`=0Q&~ zsDwnF2b`$y;kx*5R+`}Xzg z!hRq4siog{G2Fd#-ywHz%{#N~%QxI1CfxvsvH!;LnPE>do+k-rW6-JtK==5@a`A$_ zcVk=eqMfp78W7T@7ZXBiFWrR7l>ZVzwaxhOye+#%y(rZX!AtG+ua*QqwuaXMF z>23EwZbE00H}KiY?8^5u?Xw^7Cw76C&q*DSlw+@Xps=)yj!uHV*2hJUNL{$d-*bVS z`p%6zyLMteDIjts?RF2f&l~}t+#+#-D~upl@ZV$>*wY^B4)k#KLp9=bd(T71h@p1I z!&jm`w?5n*C?Z0lDlG@n2Uk`D71{f6*Hicb+*FPA<3Tn|LdWHY`|I2#ZE5c*gd-`# z&g20^19{*~dI&-y$wqqRU3W2D^CDU(4)4RV5Tb=BD^0-dbR~2OY#B#>E8gn{yP`PW zOG|)|`z{p3#qB5SQ5&Mpi#VbvACWNR?o+^lZYq?vL~Efp-D<;`A~)nFNSRGKG>T)5 zAeS4cxl|oujlz$0tWh*O#~N{7kQbTI?y$?uUFBG#a5^h6WZur;fv4PfR|F(Ntvn%G z;x%)ie-fNmf(@LeVjQR;WS_64E84w@8ivk4ifaVULuWh$r4a{3i_X#|>z$H3WGHz9 zl|%!uu#EAY8z=i9q)phtWtkzagan5_fpm+9y;)E2T}TQpV3y=L0OAysN&su44Tz1y zg+N8NK#*}(EJVxoltK4>%I~FSR>|G^o-LTY0(u1|tGlmyva>9Q+wL@kfJcubrmm&} z;DrHnaoWI@koF2d6Ib(0^aQVkoTjk`^zR8SWkER@?c@kI%zIMWCZ3?x1Bj7`dy(vz zC>WmsaP2))^mB(xJ#3$V-2ox!_IO~;!%7KfcXGF|QE0dTL=zd&PsgJNjUX?>@nVL3 zaCufp$B4lWB5uapc_iW6r|P%SjG-nweta5k;c6qXRpc%mlI&&p>#cFcq=YLE=n2Mdr0o<5~5aJN5fDma(4mujRC&l?Vp;T51We$f@g+qfRLaA6M zNrY0l5gMe6Gz$%)mx6F)906FF3(Af)9A`8g~C9l26wxoOL7$9b9^{(12rRXL!BEZ;!`v~#s%C!zOn9i`@f3~ zaJ5}~d}~Z*jmX414I$}4tj=K@5U?zk{RPk=cb_81@|X8aoxNZk9p+0z*0Q0Wy>|%bB~;N}FCCRFcVlWd z=V-hUnh{EaI)wNMbYVBS=glKN!>ObsKx`B=WaGgN`<5i}~5n$upL?St=yqw7y7dtuQB9pVFq-3sCvl0*~VznWm z+?-J`R~Z)4bCuZ(qF-|o&z30D#N#QFSbFOjO9I|uAe~N))YCh{R2ti(Y_-l5bt<4= zP6aeko#33}NDVrX-q38mMrWvBs?(GI2O83f383{h514tgjG$;h<)D3LjKnNr z_)I`*r9d(XxeR#wX2K@T2JeGDRyekj0v+y1(;hH_O{g3q@v?xql@bW%A!Gy_OpuN# zKRU5Fr8PH2Uf#5Rd&cnu!+KIwy8P zMh`N!CL5DxDRCJvK1@VLHns6f(a&ylD*-vvfnBx^l>%R5_CZ^;`49VM07&RX7LZM@ z0rbQ0WofdBrnA-J2FeA81~Q;fqj}V}Fq&tg7!4e{5fr!po1;+$HfQ1jY>pCv%~4`P zh;Y2pWPo#YA#e_txFkTErO6n7YNwlEyix)c=mO@5$3-MDF)?>3MuePbte0EbvqB?* zg;R@QQj;%BweOflTC%f4_!Oafb zfd6Q_lfCJ)OncC$3F^8`nGaa=tUafQiT3(EWjY{oT-X!bq~q~SW+7j?QDDRu;x*|%33Y*?bVjkJzjS&rw8SKyy6|8^=CgE3~&ra95>^S>p! z-~H`X;vBovzm8r}0kvqL-T&LbQ7X#+F1Jgrl?tI)tChR%o8yyXeN{gqIT{;*I_0}6 zG1|WUy9>pITQa}zBl0dH;Z`r8@Yp=74~K+fQrokCIFI-RF=_T!KhXYQ^T%Vw@f?w5 z*Zo+C0lMnP;W{46KI!LF^~6^q-Ol={XM0`<9~Z%xv1)?_9oo-|<#bBs!Gb!YxpV1H z6U0dS1_~j9cTJ04 zRvf7d4*7sv4At+1909<5H4?*M{TtIxhck@+H*E~>{>vhcFFVdQXKX zA1fGc{)dpbO$do|7sG%EVh65s4a@4_ERiXGQum!H0->L1&cJoyRRkDl^;A2R z!YTsndVZ`|5n%T^zj+mb^TIzxB3|ur<~F~GM>w3W%~iz4%JB5o^;_K25PD5(HuPFr zGoTng>iSY@1^~8OaOE`v1mVGfL*ibv4WVX;P2KCjJo|9vbsAkIYV5o8-lg|nzvAuJ zkLNw&&3-pgDZGi|;QG1{w*9VJR*Yb&iHEX^fMo$ihPSG50)(njye3EiU>j-nEr+I@ z)P(l~>CQ*Ou|S-0=}_k{gppE2${!|Z5uj&AKP?Jz!1D%}@)lT-YQue4?5G7}MP@OK zre;tTzYu)tM`nN(Pm>hkoQMS$COkq4xMm7k7Ow;&Gzg?72fsO(THNyNM-z38X=X2Xw*2IZbOTuOsOS?C}>TTvH~ClDWPyQ9}y!$ zGHA9VPzSIEbpqr$VOr30L6kZ{H^QX;h&oUHKTVzX4s|GU&)*hwfodQxmFZNhe@Ey< zQ$@)*0fj)5Axrg+!&alM>Wny1h*-o+;>2oLQbk_T0lzv;h6jtoLb|Af(~uP$2_?#N zi1_Y~(-GbI&;H=j^mqh^bK(AKR=gO48eWNy)DWkqt13$X6H-MYp2`-hr3oUdk|s}> z$%t!!DT56t6~Z!n%S`5IiFXo2VR3YNIp7}iQJB@*FsrGYM9~p?4v!G=tTkk*esV_S zNelK=wy45%R{M8qCK|f*uN%vtV z5}zdE{LBUrsVx*R4-E@vBn=M#EmChH^e%1c#TFN}Fctf|R*>_I`qZnbq68D^`&7{} zpLRk}x{tbt_$OM{hT#HP2b->sDKfIcA|eLgf zLgj&31jr}=$iNJ=)d*EN#biN<641m5Ra?sfLZwbk6IpEtkSf=Jl&1wCRqg;%YH^yV zuG$NVMj)qhf}Gq0Il&Sk0LkwGOj1sm6SWd}6M;^!Sk(7v!Wu}>QaM3O3@A~4gz1L? zCB~D=2~T3IQPY)7aR*vz)=5*1Yb8qBgMN8|2!2#f_>mRCkID%@(sqK!T%_)AB?8HS z%F;C320v6YbHwo>5E%A7fes$VBiyvO%snAIBHr(T!Jwm!FeVylD%VI;xkj4GHPTeB zk*0EuG?gbK3XD3-KvTH}n#wiMRIY)hat50EAP*x=mpOyrvi z#0IfKom42Q1zh_=Q63K(3qS$I>bihfp0I(o+T_=n8&z2waW*`uYukupshTzd+geob z4$yYh#bV5m8rrS33Y_Ga*Iohy*}M*?vyOo_Y2Y9o0+|+b^Z?YTi=q#3&A}YQ-6mn? zH-1_yZh%Lu=9P#_xWrz@I$&-V;kGI2601WcXu^9Xf)p<9_oH$9OU3o-_Y!E-+d3kw z8n#xZdbmu$DN;X_i4IU%Xj23bu|R)Jj7L`Q>7Xn50tLi4Jh4 z{b&a4fQa7bX5e*cYEC;SYi>)Xy0x7+4R1ZzPNd`FX)lU!K}ET$cYATAI7dC-UL4b` zwy$=Qv&VErZHcOV2NbQPgzHi2)ehnqczt46QHqaN70^PKpEs&b6@svrrz%9TxJi9c zA==ZxlYGkVDB2vk%Y!?LvLn1a+!eA#_#VATQ%|@>vfAHK^u$}*brPM9T;+^T;L4lT zjh)09zTp<4S1iO$!X3X#foZY9O=VUJMs#Su>exz%*cx?3rI>;}ru!>Jl^CQ-I*YMj z@8onu&TlwXR;rzyMMtr7Wf!n$Rb!7XP(VlD)0QPv<#NNV9?y`i!i=wX)~N@(if*9b zzOG^;pY4^W8oP;!VyAk%NYY;L>MGs~KDSCtz?Se2s>D1%ZEWj7vf)NUZC}1l!^1}2 zW!;(Q)^-bv!ju;F41k@JqM|?Nt7a*gNkmZEDR+78V ziQuNiZ_o=eMqmfenra^UN2&#bZ#`&+_5@QmoGug8l%66N<8ygWL3rZyUScVke%WMh zW~o>EgLo$%EBb-D*B&bfjf1r_4wI87q0_K;jul<89}Q0sX5c)5BGuC&P$LMQ!^6tR zLk7N7T@7>b)ivT+?`@L zKt0%7^!)?UpQf-HaDv8dNZMQ%Bx%E&=r(?Z@d4}f6&dXvcxE>m5y5BnvUI^F7R(ER zRcL)99-iOrePOaVa81YCO!Xmt$A^Q3RKr&yN2MPxI$m>hM2Q}JuEY0pD+QR6=05#ai-(FlyYl8Z)$K&_XmoE>KJ7snr26+4 zJ@r15um6dSKkNEO3lF4YP zc{1{(Ed0dTm;=6d$_xlUp_O8giC`{N+HkTcfGZj4-iOTFPWMb7ZJwZ|@J(-$!5-U7 zw>oZ^n4scM6GiI5ff$uu>h#l)Fkq0#k95;izn&)IJx$Tl+|}m>i3gB>|1dFJ?L0-4 zH}9`~;4_~(;Z*3b{~LWS#WXi~`#U3gnGCMvfCL3PIifANvluF;4~JUx;hVu?6Z&xb z5a|3*X!j6?D_!-k1xx8IRTtI5Pj8MeYSP=gZ!1vOj1Z~%>6Gxm(84bUW^XOe-T0xR zG>;LH$E@Qp0FLFfwO-e>C8U5$cE0qHFkZ@C;ThW6ls$p&k$h z?+O!GLQ&~feRu||2Rs}SUcCVoMxu?yV_4tdNuQV}1MuYBG2t>+%#$)aX&fU?gtP}} zOwzvBnQU7!;Yx)~8i;OIPsfRh+#0NIGc0|0we82VPC0eF*a|y0TqTZs;`gA^ zLtJUIrY5L?6NC@%Kx&B!O~4ROR1FhEIaqA`bk;Q=O%P@HA8?cbm-_Y4? zxNwD!oGo^NUuFBklwP%sWryv*F&N!k5Ao zc2pmnCz8Tk{M&hA6zF+)b=RJcQy}hANf(GdAoQRM#BuC*wK%`2RNSpTzCbKQ&WRUd zzRgqDUnp{Nw74cdM0Mi9nSCdb7f1Z8p}fh-VLfKuq}DGwHD zu)U5~Ir%s3uh7s3O6rr57%;%H8lBfbfPo5JB*xHgvX&r&S~f#qJy_j$krr#0V~jSv^vnwH#Itk7cG>vi$JD zN>$gd6lbdwZ7~&H*kl7`!LXg7maKxq)p&z23rNQ^$r>W2LmZh3T4H^AgXkKiYEv|e z-nOQ?tl&lsUx7wVQu|hj{0MP3g~yDzFT5ZZ=C%k|fx}Go{&F#09bCz6JVWU=W+^Zn zW$V03)JL1JBen_5Sud>;-J{PBZ({z9qH~znVwi$>t?}#|0iTHVjjL~h(IeKYgExz> zaryWb(O>*smEH6F<&Mtipa+D-jI)>8)Y}!8Xab?{gdE zN{yO)o5qVMX_HQR=QgoQY*w>w7iWq0)N8i`m+YmEX@DR zmm2|Ao9$Om?-&&&9@YI$jQNWsPui={oxtdt9TG@FrO%P%$?frvir{aUGEb_BcZoB^ zQ>y7M5u{^2uusx~r7gAd7q&>s?iQ28qw4y*VQD_5?!H^JFMS;96QSjScwSQp2Ls2) z?&zaK*VK=9i!0Ei`S*xVs2OXxzKhqeXn14|R*vyTjuFC6*sVz(5i+71O?N~#ni@S_ z2$i7~kGYL0YsKZFoI{Ct-J&nnO%P{<1$_gsklyR))xp@vKSVuzFV<$@oWn!eEXts+ zIBGrCmkyyu)NbU-*PJgXB6WS4|6D z2HjP1gfH3_NQCZ-Cp3an=vkl0-CXJ!MvR}La})%2QBRkJ_7&GzA-4(j$-6yKk(C&( zgX1J%3Sj)9RRf726wxA4pT-B;(s~?1U!HO3-$YmZ-cDD%A1z@9!7a{YpoIfUHT9lc zYJ%0%wF#*qB+KINax3n^t+E&a*7fy~@6z!2>*kqT$*e-jty-`Fd}hh(1gAFPsAsar znH$h5A}X^Rh>afXNJOKhQW0UsIh5#~_0-zR#v#*pw<_e5vX)5xlW7%Ya|gF95} zdIFj0u+vP{!7tO@%$@tzV^+Ve&ilJqn2b@6oMWnt4Ww`>qL2ogW(Pv7JV{N4L1&T~ zD}NQaskB50LdCN`;g3`EHi*);upyJt_@1;;oeWAkd!Ke(iC|aShJh5*9HgG!AP7-! zvr$YJkEo>^#i@Y1Ki(*=|8pGu*3F_Bj!wd~UX87l!ysgFQrv7+HdJ=ZDI=m0cvy@z zSK2fPa^?kO(67!NDv!YeQ|V7)c)}Y9HvkVcKUA*6A08?PXCU@axyF|^!*qx2f9HN+ z+YhROErLG>5)b8Y(H8hWHR{$aa2fc#&J6X<7C1SB)S)eKQu+ATW7JJs0X#pVc5OxU zM3qW>00MTg`uYLru5FDK55g{l-Faan6v9UJVk4~4fl6$HYx*#TE6OD>gy@ZM{#jd* z=DKy8D528>d7?lnKTC(;c2K`;6Bl|n3kurr!^hyN6%S!GBUiQkUbIu+JS3h&!!mym z7obho{=jW|=m%hy3my?&0CjGC1Y@;M8IOuz(9A=R!XMqBu6hi1>qhm;V`4b*n-6a< zdz^G-!AMN%$_20 z8*z+kihyRj?FCU?@n)twE+prBz~gOnXrcaG3KS5c(OQJpu6z;hRg)@zQ4AQu5rQOb zc)cGd^TmgcOONM$w@8VjgMBC*E`fpVSC|Y;x1(_XZVc`KG ziu8b_RRdkIY<>$WNyNSeKlv+(&~VTMY(%TXmqfb}&`jE>rkA>cdp>|s9Y{n{h=LkyLGyVU-p^khDt#BSAYMn2PjEjd@u- zZ~~NH%P+b>gdg@n7bhMPfZP}BQ-0!AF{2|h_Hs`S@HbzCbX z`vLZV-2oUoFiG5WvYTrfTT`UV1I6Yi1AP zRJUHx-=IdddiyouF9>4skUD^jq{A`R)amZn;+6B14QSy%axT$ zWa^2XA|td)`V%1nXsbW$9f*lUJvW$xB2+-PabFKwJdgS?!wxIO(+r9O2oZIe_?*{( zAu{;r-((uvIF2wty8Z=AK4gqT`_N986=rsPJjL7~c&1S`vF0HU9Wy^0h&0H=EDhKl z=`rkhAtdBe60L^a)m? z9`CX`i|DUApgA#s#?m{g_4)HGx|;#~f>>#d3`^8fbAD2S@Ao!>HXs zgM?&Qy6-x-eR#tor{aX-17w@?5yUL+hggEh68>f(kBn}txg9f)WS_It3$jMcKa5*F zCNbHJJS))7MA{NX1*p$4_5dyU>2fsMYXu!k>_)s0c26amF9`a66=F3I*#_kh-YiBN zM$%sL46#KDj*nX^RZa-Ewvmf6&lKqIt3iOI>Uj|bV zi2=erzbv1p!Q9agq!~B1GXwVeTa3y z(dyC<#ZvK{^6e5MfT2&^#StUV?-Gl2#6p3p`-tK5t3Qf_E&TiuuVcYP-h^>e7EA264;B;&?0#Ma}}HogvT^;G4%jB>0Y3lj(p-)qOWs z8F?p)!W&I>9?s50blB3}q8-*`@Rn8DH^KnxeIRtYCM^^Fv|AMNE5OMR69GE97LGJt z5j{bZVh~c*@IAmYoK;~g0@JP&eRk%pd&E=l3dVhcrKC@2(HbklsVd_i(d^FhZ#)Gx zBl6%M;y&ch|1=zvfF96EoSD2vzwc8~gLYxd3I&`F{7ew!IP)|9g*`2lxJh4j>dUvE zkqxYJKF6SJRI@%8U9uxPTQX>8%L~HU+VYBe_;c|*;N;vw*+$*{1=eTzI5U)P(g%{o z>;#R6JU=sq#&=euSlUrQ}x)#qd8(9hZ>>w$YPljx^3@c8a#}A zvGFBzWHHB=L=Wc0exX(>>+5Kk2*sDEF<*-(F(ifGgonf#;4HQ08$h{{;Q-0Q8;R6e zdW4*ikGuDa;UNDn`$gv{`O}({A3KW>wsJtULX_Tl2gFNoZF(OBwzaLX{vcpNu|w_n z7GBy0mHsc`M{~OU3rm;-Rp?*h*3LUgUc<+Cj9Z-hACcEUQ2;9P{#8CO2bdyxKBs(# z1@0O(^}DFE_Uv~|rhVT5NM~2&PL`FJ(ExcB}j{ucIO-#L;D!UloAEQ8c%KOug9 zo$C9um<_*Z>(7XD%2hxAjPST#s@=aa8Q)N+{aY;0hxkX2>VYP~sf4Xj56D6@3_1mW zuum-Ph^_cx*m24)+ApM4vZsHcjy8Vv3z78+)$=!TA0e1qce%{B)YrdZ$^RJ@_+6YS zo>ld~i(0Hg0)(QkV#qbXM;@aILmoR8XWmx(euwC&Q5_G7w&YYIAkLn@VX@kC2um-I zsY8dTA9nDqBpn*~T=zCAPRgO;T{Q}qOf1a6RA^@J z68`z5l-D84U;`^2n^l=xl8CBx%gMmoA9BkJajEpkMs#VfN0!1-Hsj<@(C?EtEQStK zwO-i+A_|vGb%$5hp>T4%tnhPm=KzL!AOI1HI)oIPfkjF$OjBT&YIMBppT%FosE5}> znmPI@47DvD@8WM^Tp&JZ9FYJJB=qF@hr%S5FbotKF4Tjh_PPBGshRhD{7#9kIjg1k=g=vE?PyC|cqL$VYf5K>zcwas3my44>iZz)| z56BMAn5FA6iv=~estp0zGpsuQ7avIgN471NmS6>^4@t^_expE~mdE1Lnip&%J_|oj zd`jouJNt5h6X`|O9G-BBj=V>kdzZ)(wu088HdsLgsF3RwCx&$}-uBqsWTX+dyWuLAEVokU3#3;gjT((H=TP9+&>*a%imm zM*)@E{%d{~e2%C28So#YF}vDHC*(7HQoBVH!8w<`We}lXlLKw&)Y4vbLOWqE=Bptc zqzCO9(Lquep&!j*^CD_0@?qlZcRGxcj{EM|SAmUWRqJsI6mLGF%DMjU+8c%X|sNuVT-xSk>}7ix7^ASMfi z8q!Txmpe9U5zbX9PHqPgN4C-@g3g65rc;*Uor8v37$^Heh zC*e2Fn}%XG_bLHtmVRmngyow8g^TZ+&WwFV1lc<^DB{1`Hs4j^{4z)@STI#shM z8Bs0o6JL;?Z=>4wkmHVWwy?Un2MK$eB%G&?>nTr%U|HFd1^%l&vC2nwHXp))M$9}` z3w1KmV0Y`YI5aI2qO?qi(z4kZ9XLu@&99N0qi8mLQ|<%$rd%?Va>Rp+;@G2mOKbq3 zbBpnE$Iw6Q&t=|{xtw2ciW_er*ea0#EZU-SXtK7V174T3Pkc$8$-XK8!eh64LZLGru zQLJ$88QjJlTu8c2ME+ZlpO8hskO0wuCgSR|=o2S?+BcR8+*-#Yd8|}Abu^1G#6UL3 zUujGsfX$%{Iyq4W*z*iANSH`ScL$4cKz3$@w}Qh$;&g5W1l?sxo{c^$Cicv z>+B;>3m2{jT;?W;h6r4G7cfom<0g`fc{pvGVczZlFUZJt(m@~G(&kbJf8)6vPGcL4 zU|O&iZ8)VxR9XzQxX1o%u92$arQS4lB3gXQ8n(A9Kwnz6vH^cv9zT6+lQwMu2~WZ; zf6E%$!=mG^!|=F^&zB>t>G8K7*!j?HAuAha{&<3eVN?@b>M_3%0bK}S5S?@31g7Fe z@i;NoP1tUda1GmWcCZ5$Q>=)_Sjw%dfhYvNy zF!9%Dv8RrC06b%1PhTDSk*%-^rZ`ATpGgDJ(d@pSE2tn4Z{FAjM#Bs6u@W9bEL{L> za=uOr=H=xU6JSxAn%hGZg%bF~eHI;wi-P#rNNa%CX?pnaVL_~{fWhcgW7nW(1 zBi%q-;sI)yCw!P`7H0|QopPW!V&bS2W)8904&C*1+=2@Dix;**Q|Y_pz_h>}CMb{N zOz~M%z(cL6vJ3H9RJEWd7F5D}Xi`%Gt(?m4=H0ZH_Y_rre}rI`AZ|G_(T+PR(OOW9 z<}x1)8>Sdme?YMwy+nQpI~QqfB}%cpD8=%aV(2VUjE}1O4=Co$Y;+c_qe+RKhVF_i z7x*AbB{**}REpE{Jn|{l5VmqSU)iR~1@FR{gU(KJz1N!$cXb}bOhn47m)XM^^e=c~ z)EcZdA;UN{#R->){6dCSIztF)Lz?B#zmOw6Qia(pgZ_mK#1{G;eVS#^zmS1GYp*j@ zHp`%YAwwqoP!cHE|CCpQi3&P$5%T>pr|BR7urD^cfbexrA?j`t@u>N`x z$X2_iW3C(gAA z-1K$7fd1CJl?Dw0u65C&W+YM(e2%wZBBB+vfm!xBi(r%v+*RUZhF~?iO~DtD^oUDJ z@uej97%O(uf*Ds!SaBLn%q)xNIcKBY-DeGy?ZgG@s(~@~?4aBE){;AAC za+TPp?j0mMkz0o{>Z3stSkKB+5H2uKbv;GS>-aSUKiO;JoVHN!bprvA&eGekfsItj z^SOc#PGMX5hf`!NoSXrt%9FLv$-4-9ix1T|r%LP~RM{Q!)7a=}= zp!WO#e35~nVJd#8yeSL}?fQ>_q4B55c9|3k4N1;xL0~ag@bWz*@9#JbK2xpw@H9C{ z>{sQ(*pI<%h%hI30f$nB_vS4cCdu~S+(T5VcBjiCwRN~G12D2{I83ox(jK4UF*XhI zrZ=?M{Wo-^?53X}R7m?!cy~75ee+0JBMzwdM#>G| zgBBshU2* zn`RNeLbT%#%{cP})#VKNgEsoGE(EM-_!!XSBX#E(_@UUz9&7mJXX@z>(+ntQ&-R41>!U%^k|D|@F1$&!~UiJG}ebQX4xf`bzj*})$0obRQM)c7qAAfN+o>T7lVUyn)if1zcw{(<_*a*i{u5{uNh8)b$X*Ud;IT3&x8KHt`>advNTNA)(t4|$1$VGKV;yxiDs!0&Yk zxQYnq2NwYdpk;27tiiPg#rB@9Y8z!bF%LZ?!aey6^XtYZ__FV6gpFR&c*ix6)HGh# z%Kmip#dY#V0+7E@W4{2fqbb_BBiZl>YFIGc;K3fBZsaI4#dtqF()p=IvFtby5wA|m z&9QW_k5nh4*mGuT?9sY~~f+6a-zZ#csWVR;1Hz@E0A_!I7AgJgWLmgZv z3;y$_)hDU6D`fj%H}n2HcM?O55tqI?ry@FUA|2Ve1>4Qlbb zs`gjeTD?|d#CHJ?;3HlJ*}XjD!2|KS@r-#mRgkybMEyjNwA$R&$UCN4xh632QOj*} z%1u*EHAYtR7eb~Sz2K(U7xrrQ!cBivZY}ys4Q^=m;?B(~X!xTF$W)__T35=9c1#!y zYPf$v6eUv&liQ-mAX?O=l+)98pl0wVX4LP9pF{Atn%&JP^3cllZgt>JeAj+A z+7~>aQdY~#l-))EEv-Z?xExUH=U`z@%i}-iT8h#&g7rKT_N;uCCqmi_vX`3jEbNL! zYWB9Ma3AuJY$X#y$d9mP%&aH2<5Rm_9_Kh)bmWp0q!Ed`-&=>cx(P5;xD=E_Vhbuoxq=F;FB=CVI(H5z~5ZnzlT)E`nb zaXF;?QAql{TJ{K!iQh6-YNf%1jCQfecQ{Qft5&Ow(4lLexMc4_s{%=-rwH5_aNGP z+r!1)M`QNA0JFMRBZTk(S$qd&Mkv=If#Z%z>eL$n2?rj$51F(Oe_=rULHX5xrF_NC zFfmHhSstTAZQcpA-(lP9Uzb@j@fNBFUv|eV*!U(qBvzXxjj3=RgNn|Lsq8BQI( zWySyNC*k+DQ{(<2AERoDK5aI0vUofnIO2Gc1xa$}(L*r99E%H0+Opzh<3Xy*|7D~_ z4}K+kQiE=D8)c%AYirA;o3Lxv88blEhGSo|J;;uzx^-W)jW9IR8Xx%h?PV$)@^~t`08jCcPeXEW0qQ5X52_M)>jzKO$K}tnk}OvTj6Nq^bUWu zDmA{+$Y#=h6VtA!Nsr1NtTafvAE=DB;?>SZlFaxv!ro+{)w5Y~NIh9;@#m`np3&mCfH7v7(o8Fk#yBUhh@C?#k1G)^0CJZc;rp2cLlB{9EaB*kFWqb{~E7AVUeUh7zh9R0X1p7@d`9Y>!n6}b=Cyq#GFT9+ym&Le7Y8i zUs%X?HLg0_I91?;2KqK3JSP6;2To{c{Ba^QVCqBYxz3u@AQ2N=dzleXA5As_Cv!-f zphX8>Kc!$yjb{d_FVtDL{&XeQO3(o}I)v{7@rpM84ugPjBaW+rbgXf-4f za1Y=_1V?H-S52H^w2kMFlT&=dvMI*ZV7~mR#_90%&!1{+j;l#cN_ttUw70RXZufL! zQR91c#@hxaTI1%K#!Lgd*{nInL!$lGnBi<~#{SASpNx5yZ$8!NJ|A3%-DtrJjNcK2 z*yln(1y?UH8d@>GpiBB{;Hr+j%$SXSY`DxI#OZaAip&d&Wc&AJMj<#Y=W^pm0ca|1 zkug9#-#B`aktWjV{cusMBtBt9cCIkDtNB+LZNb=gU14mIPrKEqD~-Gmub0yoc5oay zSO-Y$OEjokKYuxAu+Io?!PV~pL%C21e>#W@IIJ05wdM2Vfow}+$L9F}tpHn{lt*4I zEeU}E1NeAw0NyMrCVv=%hb&(BZN$#oda++Kw&&}wuyKNIipWVMSe5j&mV*$XVLkZXk^Qi7i^0B5L-Bq#EUJv z_(7jyAqyE17c^nKh)6xmgv|5_kkkNq-PE+^$Gc!h zw?6KLR#Tn1%wNt0V1pUwO8Q6&PlzUwROMG2-M~X*uQtY$guU8$#ET3{;uNFQ1)|pk zo_#X%9V5NYhbBmxeb@*>5`jZY9P#0Z6G$CLoS-q(1X?e5j%D%qv5N&1q0SLX8ax}e zQjNN7fe5f#CScA&AkihXCW5{K3&s{@;0O{88@t5VDqbalGh4i-u2^c!Ke8lNdrbMN z`eK9U5!I8*Xz)*2c9r8AGLyW~YQx1rL6+L6YGt_4FcRS)MbR zm?^xkU$5vfPsXc{10t^{GXMxe7!`#c666yp#FK&uM{EFl&Fbm$()a`8wOnf4O-5_A zd$F9V$=rCxH2dl8k#{X5kj-RB@fTwego*jFYAOgyk2v@-~AGr{2EE z7#M0UAKu2t=X9T*65tqsu=u)^Bx#Q70tRM_-;L&IPNX)WGx(a=w4nE74s^ci6F$sA z>m+|1jXFXFxQEn2Y^|aef;RkFXAHXu%vBQy)e@ScW{ofkOQV#D6bVyCcM>2aq+4Un z?HEK1$*Kn99GMy`Zy|jfeXEUuBKO?x_hQ)x`!!XmY$8N?%8J;7J*?2jx-8l+(6NQ8UY2x0TmPs+3Ybf z1{D=8@e)_uQDZ_x#a&QT+##YtLlk#RTp$|tiQD`CpIg=4GcHe_<$Is+``%Z7OjTFi z_3ZbYb8l^byXb{8ierIUr=F++fq?qR8h&AH-x4dGR_U4id-}`({;AVd`oiN=;c)u& zbo#>UPgZHSR2>^UBQkvLPt{swIj6c81|9dDU{g94oO9A?Wv9+rG-JUjCoeep)H$L}wo}cBo?Z!uB?p3g2C!gjT)e8aqk2Z$ylg1ln4e(EBn+{R|e~24GoPA zu~?$IAsB2bYN!rY$0}k$RngE8Y!0fRYHEoEt@?NnuY*m&R{X`Kt)VsEKNhUS%Yi}F z(B9AxFCEk{=vZ{tP@Sk8JOtN4L)p%thSr8eV{ngHBB+KmG$yKpD%KEh2*z6zEklEY z8iEZCwbD;pLqiPDgRx-$cu=(r!q3uRX+sQUh6Po>SaqzrU%!5_pqt8T?Bor8^^3(~ z7-B3av*gh5AD&?t_!Fw;&jjX*Uy3c8|6=Y%dBdwl6hu@YrJ~lp`xV}{q0ggMC}59@ zepV2$hr6%lRi)3e!sENUyPtdi$va={aI7hzaZbQd_PKbx>dhN&{zuQp%kX&DA8&o( zyhonC;o(5G_<5$4?(P+r{q>QY=gZCWYp?C~{6eq%%Jikr{HZhB&PDQk*?Aw{*WXh{I8yU>%eT|m-xk3Tz1o8-s2GFsxOL^SFGgA z?SFk~=jyAU+mO@NZ`>h~vWiPh)y=m(eAAXEa^7C%&WM!7FZUW=f7WmA&Vk_-?s<{& z^p$wI>MvWj_O5!BSLubGl~!dRznI(8)!y?->yk#VRi$auldW@!E&Qt{`#JvU+q2bUgKe^*3i>U+2=Q3pVR)$ z?uLT$id*FEs%LKOHM!rqyYco`Q+LycH}&l6cW$DvEdG11<-hkNnKkagh2<50FfVuP zTzUNs7v*$&o0~2yPp>s^H{W^l&FgaC-p=RS|N794AHMZODhrD{yq?~=<*MArcS`Bo zpSOj)vW~Xoou5Jtq3sa7S^}9_>zvRjLkme(Yyzr29_nfb^K8noy+3!yQ&26-Wf5 zPLKtgtw3~?veFjtk;40`q_R7bfucZg97>^Nv$b+u(qdh!Z-62IZzmK5qEROh%?mgI zdu+5%fVJ@uzeYyQ)6VETv|1NP+4GWCeZalFsHX0FC}NFc!_p{fphGrlrD9!eSHE5`M1F@l!S^Z2#H`Yg&U1YGZpVGH=_1_U(e#L#vi7IVNrgvO zw(L{iiTOEJhZVskl2WGtY5K5lXQ6f`-jeFNUq4O*rqyK4qbR^NBk;MVfVj@2Hp6Tuk4X{GEgCzuM@ zlU--X{!;Gy`D-b2?0>EF5cl#S&cEAogIhOrfT~$LerSi)d_V$dO~tz$%L%ju1NKa7 zoTJ(UpoE1)Cx-+Au{+&W!=~l|Bnr3x9M%AUIm5fvEcfc+b?O-R#UEFzW8K$={}vQ? z!H70Y_udglTEDj3c*nBX!@qv-SZOR&F z{!eXKAF%gvw~wyL+on)%oBP%1ikh*B2-+wRBH&{u(qZl3HNV5!?v5DKGO*j~N=3R@ zfeoi#d^}(umdwYaWFf#O9Xa_e7W(S8+;hex(%lvyTm;P>O<@qt)=~?V*@`;F$!ibD z>na;DQkD~A%>E_u*gCirek~m0Pei!0&z6F0~q7`H5i!VPufWbM+Wc0 z492HN2G{e7k!`{?6&MrP%9)WEMh4gLHZQdbbwj5lqaD^NQ`Wi;5ChahUC9{c=Y;TQ zBDp`c+UiOa;fn4OeQ@0o=t>mJdrkxZ!2}bwlg>+xlH0y`xG5mF{cyX@-1f(<0Y;(( zjeL$qN^$)Z*D_pp;#!XDQ|Kg)>n2<)aJ>uHN(im0;5am}OLaNc z5=1yw+8IE&m1J;RWzX?x5RmmL03gLJqz_32$Y&*kdp;8s*JK{;Qkin7B)<$15E7WP z6a=rZ0rkJs=y>PQ+%kCZy%R5^(I0#5Dl*fY|=MI zYQ`u-1j;;E2U36hc0>`{ZsAu|>0F3f(Hu}xni=qUPYnbEjsc(tm!4p$Fkp%Q>tJ#J z{#CzppBzZ^AtWk2NW9>idRa*H0U(YiAVxWT{$)U{*!Zm!3qYv|rzzDE7%%9DCRvj$V{mxouTef-F%KtN+j$RI;d z<|vTbcZ_i9BN;G#T?+f$Sty*H!+Q~@0OXw+&LEGf|0_d=fXj?|pYI;?1OE+U9&Dt= ze-g}2QHQmhssI8Qf0v8U+NrwixdamR&zV*d3LPM7p;FCn2}T6P{M~IOp=y^Z#~SY} zy^+Nft-VANHCfQqNm{Ic-!_{gt;NgbNqZok3hbLmf0AZt5LUSDbH+6`GX$r#aWF4h@^0`iqu^;U$|FiOVP<_&P{w++xAA84LZb%1N1 z2O~BK76gk^JUZYbV%ecZOCg&&tfib+vz5MFOl4Gqtm?43VcIyT1HbaEV82*;b&)kX z?bP?_6AD=2!dOu>FFz7g1qC2*w0)J8?A$kjFkvGGnXJdsEit4;gV^%`VlD_k z$@ww^h&ka1NSm}u6vhfM{G=Hn8x5hl4Qg`=A^%6h8p_LI53YwW;%d*(#4xc)LAM7N zg;V*cSd6(Ey~3Iibm|NMPWZ#?+-B!o0u^8tn>MUw&rju{a#0l4KV)!~lUbxB^XH|4 zi}x!kGBZy`oan@&KBiWxzAHgq#R36$A#)e+N>B=z31cxLukEe`WN)guE0M%y8J0Y? zxL#~^osg);4OcD$yAoX5+>Uqsp&_`ON;Ei;B!B?B>f1=}TS={vq*j(_6jDnxMuV<8 zZ+hBk>=PGii^lpC+kN}>FE1%AEBX$)V+(B=x~qy+dURKnD#e?YuhCsO=&mu=Z0N2u zLw6Oaet6uN&Jy0gOLwpedQn`z2}Sj({%EIx6xT18;!5zeK9}N3oDvX)Av9qRp|3Pq zqZ|a*7)zow5yv$+tr8N5<6w~sQxlAUOVU$U4&IT>Kysu}AsgD?fqCTo@>CeDB?J(Q zlZg~pFY4f;80e`n=8%f>!D?VBkZ~%F4$(|MvKTr5MJ7_AMZyfGX|$Rwn3s&C)TE-a zR9`evi*{i zB(gN^6fr2O4YM24tL`$tYRsjtx%BsnIM(>}XYQH45q31CB&K2Xs9CAqaqn;TAhdi3 z092y4P)0$cWnsDqtnCxiPPG{gFk_#@)dKnmeoEO4bfc=T_t1l*;MY3YJh2y4Iw6=z zBKS)o!y02X9{vWB`Rz_fqQ+RYQBg!o34~B%tja4?4KYrLr}I%ViWeYbXsQrPmO{2R z#wc5j2+D_ah48}bh{1Q^M6_0nGLW)`pqE5J%Em9qRuX|&2C&dYxR@IILi!e=1j*lt z?pst!(i~tP5r|GoS$N(r3MWlttZx(=p%IcURgO!sdDzE1EQ$(|#>^!e74|8N3epR3 zaknflNwbeI^+{ta6ixNP1->CZ1m|;vP%`8TI0~bHMtuwy3OO_r#s$q#7ev@aeJtNx z^4NVnTUEHA)goNbs;9d65UpCc1fppy=S9v@GG3?bh0ve4+oZ^3a0u`x9WLU~g5)p2 z!XJVy-**yFTM0FwV1z0(VxLlpKX5()ocq!WhJ~hxU+6HJ4m5}hja~vG^Z0(fYpv9a@mHNYo%J?8(JYa|VYVAD-o~G1S?$Cp0saic{u}ZkN zAN)(T*zBcuBKb*kRoYg46~p!eKI4Rg=iG+^y&{e-2) z>cbYPdUb@m^3pTYozdu-VU-W>I^Y7YcZh!i$?&{X^NGnkYN!0v+fV&w*ugMW-oiBz z@k>S=Qz)Fe?X9OO_UD4h31c+_odrb15hj^nS&V;SLN`DHb;4AL z&GWmG;7Ctx<~c#RgIc9TfaM6inGE`3#fEr;)7y4}js@{zL>(6KUTupKR^gA|TB^ij z#yp5Zcz9p1oUn`ujD@Dt(2-(b!8;cs?m;;M0E>PjsJnRy4qJhe@*DueO3f4-4Z<0B znNFv5q0MR8-*dZ?VI$A1)Pl_D*)iUPXv{-A1o1PCw_$WkaS=9iv{H+5YX6LVn%5|f zH$ks<$ZH=@QHJuIZFoztpm_;*I7XFJhPpBS1mvcfC!`_gnKsz45@ALY^4J6m(7@sy zfJwUyqyexAL-7{FAf$wgtke?BUAiVKS?G@>f}6Qg2r(VNF*P4pVIgt$M$kE6!BG{{ z*%fA)FsetFxv$SV+4`l@GbUQK)|pDDCt7XpmGd7d`;{6mAt4J^4YZKN0?tzIk4{Ws zEphjWjUZ%nvpE1ayAzDwrc{uj9cNxLR39MC!5ItyMI3?+`a^!%xWLQ~*jueip=!7u z?Iaix@0~pRaz#Th#JZSnB9F2N7b-yjs>EE-h7<0v;%UFF=dDUd0bHz;6wfn8I}c%i zp_r+8Xga`f@P78onxbTlc*w$}uAbriiYVqT!T)NBrnkX5NQX#-l7n%twvG`~nFA;jfwnZiZ%-={Ryb~=Iffa5Px z1K^jj+xa-#Xqo zE1@7vAkY8-NM!q`ZsW}R0q+ZECfx9>!BFrsu2OOLz*$8Z2t+u+PzC}89zfh5&)VOI z0QCsmj0OUQfWV(;83=?4frvmrZVLc`9~{#T2>j}pLxAAPch|X}9rHE@{ra(WJ&`bY z_Al_@w%L6Ag24?;CSAN;#Sa@|?-6~*w(=0ogs5GESY|$iZ$52nP!=2+;%G%o6C{sC zrT99|drW*CLHLKDXkl`nM1SlO{J>gh0Sf9JucMsEd~C}DbmDC zZ?cIL%r5utIko8{Ww|i^EBsgd%aOr2n#z|YgM;0%B&}9-D zkM0BNyH#?fb%BWDYV#wG!oS5WSK9as&yM|b7>)t=(BmAn%UyKbgwd!5?{98INjXKP zhFynHwiAK90M*B66=IO^(un=AO1Zm^E2~DkEHyB92zZ|a6nD9a4M_J9SM1~63+9d)E4akS1v>?H z8tnj&JJ}PVO&}ViHd|AP)E($sv}=Cq4L5W`LmEXr7gP*36p;-|Zbl1Yv3dY!Art4! zCuO2LxbnPC@dOC$MvvcA%UHsh1&4TB1SCWUfSTrNRCqwZ3hZ=a$b?#IDWV)9uDK0W z*F(w5FDGwIV6}k0CAb9B!!1b9%i0+k+`;zH#!iK0Ior8Ubs3{jfCT@K|7$B=q{Sc= zppnR(f-!+LxU$IY-gP6NtDLnt0h+rgU&#WT8BuGX0zVaQz$^G`Km{P-9vHUIU~wP` z?FUk6uFu&XDoZ;;AEptn1@H~l=Q4P#&p|r*?SYFePlp=Vc#CtYSiD@CeYxE7)u#{n z+<~uFSg8|Mt5k~13yK3W$Z9+i2W1Q1@Kz8c0)}X#n+8N}P-SCe@V3M=xEh#?Cya*$ zmn0$NMxi9;50lSSfjSE`+s1l_Kor7D?Q%zVCDRvsAR;))Y62Ow123hJ3vO*gC2Tz| zzDnuHf#fAU0Gf_;Z4Df0T?~ugYoBw{w1lo?s;OZA(mmct@sxh{V znM^##SV2u6+^p4XEjLSa^aFHbP7p+T!%kHRm2%L$$}%yDP;91H-WjeueO`Ni7$agA zA-6@$STLFUz`Tll3Nk1hofsHw)SIUTyVst7l0sgTRv)PT>WFodf2GQmEWGv1U8)2f zZCx-kqdUczD1r5`&%%Y}n={r!JQ?$JXAHXYsf9nu+k$na6Vfjqtg77i+;Zs4^eNkV z^^&!jq^tkq*3&Ql-}SWk4gO!Uo{mxY`Ri%->P0^Qx$ZhkEp)pUCkue95JZ%Hg&wn1 z*l*2ZFri+sRFzkNr9!FoTs~vj5Tc~wMFF%c$bDK`!{GX={qSePinH8I9wZlVvnV}JZ3wsrfD>(mZ++mCAwe--(dXc8;u+sEY7 z3hj@7`S>SUoy@HZ(ivd1Aclse7R=6I3OdNhL3&BPmRqOS-=%8ux3TSQ%02lf@c~#O zpcVMSkYdT_w0@vogA~czmD~10a|t6VP#Ua)woQ7S`|3~1U?sVyztAh24u(9Wb5O!C z$fgVS$fgTreoHo;lm$3Y2wjJ~Y&z*jvg!Qif(8`c!R0Ev6j&~#HfQEJ#7m=t7fsUV zg2tGG3WJsp(&4rfGFme31SXr@$A6mm;Tp*QkbP<;-E~p~8X7ej(ZrP+Q7m)3TBCXx zacI$)eJ~AqkA}ov#62ooV!-JkF>9cE!F6RPc<(10h@eMl94Q_3Rk1> zhmQsHtov0QX`x>$#;n02D9UPp-ocPFr$t^nDoEvzDQ6;|~F?Rb?JY zpx?uhWDHLAR@w%bnUq0b$s~kfSxj0+m^3KSAbOM>nY>ILYY|R=fO(7QuYfaNrmwGT zQ2qOX0QkNZ?^$%!CNpdOehcEo0Y*JmheVw#9SSrbzb5#NQFrWrC6sQexB!_?#>{U(VmFnxPqaxS)}_QV!RkV0YymYqgK6*!Wo z18L&r(jr6GP2JjGUtXd5)J@JXn8Ag#FQ@>6u}g!VG|^)i%*(bxYX)T~m*q|7$Yl61 zlQ3gY59)5VW&?NdOL&YJ5e9@ck%Kc}EQz7xArN(;_hcQ% z_9rW)b0$l8VzMmJYqIs($=1tcQIwNK068mZawnUmUNa;FU;{|*!epJ?$=3IptjN!F zp;ed8%9^YQNd>-6$|8Gu3l!WoVS6G9pPHiuCe?&$d=oQ#T}2 zGE3onCIyKz#b*Om=#DtI_OP8a;(jJ0 zgb*@=Maf-I@^H_7-3at-4Ei%N-NEugtFTn?w5JugSJn!IVRepJen##ul2uA- zBtoeQJZ%?r!QKoZ*Uea*5QQNLE}9f1K_{{pkarT2@Uj^L6Or27bI-4AM5vdUL4YR> z=e(4c(^e%ZT&)@zWP*DvtUKovsH-A10WM5TEepWM99;x5I1@}Cz z7s{1sNlh3940qIWk}xhO0UFFEYQ);^MmRH1txPe)23b}{v4!k&fu9!m0oijJS=ylE zO3ApPTte(J+ft?E-PCz49akyYHpsOq0&I|jnc(~c{LETOcs+3DvSdIUcVbbs%f=L$@P81D7eWo#k&^*ZrtYGWR=qWeJJ7p$$r!<#Id5EMRVjD?6ykwJpm_3H1AEE_GKTN7a(hq+jTZdRcwhohckgXHN1=%_gUXiX- z=)SUiVr-M-$1whuddeMo;kbjr%h(kHbj$7-FG5b1;i3?wu;U5*E8f;!zkPLE3QO=f zG=+r2gyk{wQk~*TO0vU)+WR+e5r4$0Ci9ADrf|S@ANN!K4l!GLjVs*Yy zX-q?SB8vuN6Ht*QDkl^rK!8n5OAI=dxdNsio{~|RVB z=&Xs^gIr%aa3w&e)4Kwcq#-fL_eK+lBp2aRNdlMT9_ni(YA`u2j8?!~nC;?ZRm#h5 zEChu%F$J#{BO058Yk-(WSa<+kFkI}1kVxxgHkxKR%e;B$R!vGvK3x-q7Z@HKjMT;f zX17dO6j44JN9taXRLb4WPox-;3^J#2sfnIA-spvPut<~jiN#ev2SS4Ka~i!w#|rZ< z$x9k#dIV1B%HWC(kjf21u$T#-z#bq8n?)ToI_{a;7_`q*4n!-b9FUAg5GaBCDX!Go zv?DkguWn6>8I6EHISDC^TnP}${lV!?ls$x@fgr_C0Uny1Z?QF)(%3{g^pG4X>IZQ` ze||(%ijzN45)Yf0n#kZsA`gAWws+O_hC%`a!HTF`FFxx-VoQ3fI!n zNG74MQn)}^k%5XSo|-7E_z=R14<$pfiNcEH24O`~XNDp!5LUcER&gdsEo4_nE!>y$ zKyG0S7vvW5DVUQ(1#^!ajm;&bAGp2Be`xCXrecBzVMy?HC+*jotN6F{tEqhos?&uY> z%KZEWq$vS}F#4dF5vN$QqD8&xI`=iG*Dktbp5Hu17zcryaDUkD&_^Gv4tKX*Qjb2q zxCDLZzLSxuSbJG3@(H>-tq<~`zmS%p7wlyn&wIvUepqG2qf_lYWRfbi?UIeE+P;M;e&lCFG%03^3txt^#*X91=D88 zj!Y?(O-GTQDTM{nI|?D^PYUH_QVQ{eDTM`)h7qI`dXa3CQiugPGQ6>!6aSc;g;)`D z3b7kSQVR1kDTPp1P(l)~BSSJ)mrW_mmzbZV6iU3a8gJ`;M-A8wSpbsW_Ki7)h?_#h z<&%%35I12XoiR~}XYkJDD7hO3KlNDJI zOe4VO6u_m=v`7TdVN&)=iwyNji$oe9rKY4s%2t_x13g32%TH`1w2&1^OPIrjalwmZ zMP@1^<52`*g{h6S$UHx((raILH3h5F(4tI$^rD9tAGVbAOn{V39LM4s2#7SI75R_Y zV@M$jT~>%Y2mqiTa}NR`G86&>qLkx8(w%4_Svg4lV@L`iHx5-LI~k>r94FA1EQ}Cv zjaf6MNfSmA&?GZ5464CV6icpZEBgT|$s!w9s+`n6=`(S6UsdKldsPCdNV~7vQ%!RR zuNtNfb&p;3YXmv}wrV6Yl5k)H4p}g3RJhDW!PC=m_3*U3K!hgqB90}pmobSji+30O za72Esgiv}NQviMjtswnl2i77~HakI`m;`r9VsLjq!K56{+e`F$ULH8KY|lrH)BuT$ z5UNa!4Q}>m+ZyMcXs~-z&7PZCa5EGm9Nw^tjl(IAvj@>fkVFh0DY7%@5@k`M3qcX_ z@o!b`#K$vn7}JU$hv|M?;xPL0UU3-MONhgSMSmj>gG{b&3oChZssRiI@3+KZq$~i2 zhv+)bi^E7i5{L1h%R&-`w;6OwV8uezDcl0U+35-}aUr@~jY$HzLfHb^NOk~SqfEQzk$cuFPG0tiLNxrE^CXA57_lc z@fKTL+J$yFHG$nxsKy`}{$kPZ4ZX3-8^jW{QwYMxusW=1xL{xb@d2Q(?w)}lHnfe- z0tAA1pT^)N5`-U_NKjICWxzt^;34mMiJRna$6T7tWr(?qGM91YGKnS~fx=`j!6jxv zP;gzfORnC)VRohQlp!R@YH_Wg!sS?OnT-|ru}YRVj2}UHnEVbDg^(ns(3rPaV>*yY z5dx;+T;T{z0gqZV@${E1N{Nbx7xaib2$68>t zurB=5ETH*&oo2BEd2&3>0?RSRm+)Q&1+ZYCIL<-_ky2?!nqU(%$`tkvxagm`<4G1g zv7!`LEcE0g3#{MdBnzH!!ILathssG77+M0!8Ppn8xL`L~H9Ha7goDf6LiG&*!Pi2; zm^ne;KAFM>`ZarS6(%tCi)ZpRS3H^3Q5;idPgN=p;01ImH0b@yv9` zdn`J+(l%!@P*b5Lq}N3dT=qyFa*5BHt+5=9tR+2Kmv&(O79%I}LMThRt|dT$I|#@_ zm@Fqd`3(JABW)pmn@38ZtxYt=0bxhx0=Kr%I8;S4Vcud~Ca(1Uma;}{$tFT+Bp7b@ zEdQkA)%yT~@(>qALm;p`w|GNoJNI`B(T)#DTs48Z&DI;U5)o@0U@6ma@{@T~x!7&~ zM7!JcTRUww@5=5Ckn9fC*X(xU+7m?1QBcbeee%U3c?MRcUr+ zgtg~F7WAS<)}!oXicFLGehKpn6hMcLX=4%!7+r)G_`?W!Z#%aX16@$m+uYKU+SQ18 zXDLLEbqRBBL^)uROCQP1{4(^xK<)Ai=al3Z+pEr>jiEr2XWZ@mISty$ELGN=?O zfG+Wi@=mZU_k6)2_23_rsPms46YzM%Yl6SLCJb{3D>eAVzm;RM9OCN(N6xb;aN=2A z;7;AM{}24*X>t$h5m~MrY>mb_Js7Xk`*<27ezKiFP=5peVFA&TvB-9B`fLY%bk*i~ z`fL0}OV|IOpcA(HFEN-wiVtPr1B`_=jqJs49w(7lEFPH|k%ZqR0IdoDBqFjNfmK3v z0aY;h*{U?lz))sni)%j$RoDU%I+d|N!-h8TB~wskyFf9j<$7M?WM(nyaKSPNCZ70| zgd5>K6T=Cb71eRh3LPZmeb}e0962P--+Y3TR+_{m)g<8q6jU-=mXcKi%Zs`N3b2WS z4dIF7)K4u6i5NAZEcEk{IATPz!*-BJmKa2LT(!2&t z#Q2B#nzddh8R`=+CR8oY*!V`PHO)3Ws})VssmgM9A9=wjstDC<7#O z%l0-_0q2B(+~^u)nHZAbAr#oSJlNPVg6bsP*&-UE=o{}-!9+7e2*N4N#!cQVZt|4n zG`mwiC`&U9ANyroi~*Z$A@6x$PhOE63Xq59;f4?nVY|iB3LMAcdW;xXrQ(Sd{ov_q zHi0WdA;)xFOVnyVMhCm`Q|jELpmcy(NN&qaxrzZ>EFQ96Uwh<>@TuM2a48 zwBaUgX1M6{Hq)PL<01UH3K#fuNfYqrVzOzoSG<`HUE%}|-9lX8(B-({ z&&|UH{#;%_MG;)EBp__*&-M5Nr-ncr0V7}%Y>k&Q>ad!2jK;yhu}%|Y;T9`F-cr2M z%y#d4)|T~1;$W~l)*Ap+PLKc!vO+aMF8rE`sy!Aa z_z8Osi*PJX%zcC~^~cXOkEz1*Ke*n)1^F6W;=yDP1FQu<4K>M14^gmUJaHHS3rhs7 z53V=};e26g9tYCO<3RElX3sJ;j{|AtaUf)BFpJ03 zJPxEaa~#OO#MICUJ=xhYr-8Ie%*}C_o50q=&LwCYf$0o8_jUT>g~!F<^9&QGIv@(tdnF1b1s0{z101gmC z1@M0>!*j^Q;2xx$vxd1XEbP={-34TbpuvviW;)PLG5VpeC~m3T!QD`%$> zRiC$P?inyMt}(GP$PQ+`X_OdOAz>T4O_F9PKuB8701+SAr{F5Wm-^qcZdkcVB4+Z0 z0W)OtpcBE}?!PUw@8>BSSK+@*) zk5)$6Jfg@mr+?r*4v!<4acTum|7fLx;69`Td;$2yla+`jvF4zF$P%W8IsKzmsNJ0Y zfwEOzOs&-%{?SU|8%(5IO(H<6IsK!RvN(vw<@AqM6I*MgEGD-=78BVLTWh5#F2FAl z#jO;@Mfe3#9K!{oxDPH6#e4|9=YS!K$rln@6Nv==sIunUE0hr;NbcbA0hB8M+2zU| z_x!*TxWI7G2Bzxd$#x%#XE*(PJT6;=z+mfp)Y|xMwbn~5M&!c(dPL5>vwNL4bz`Itm^dqsEW8V?kz)D?6iBka9HrG_m<#q zkH}q_d(?f0eOL63(ZQU^-TU`1&YsnA_5+LlkK0@H22I|G1l0cTSsnlLXLYo~s>U)S~ zafAIq8w>T=-Kt&9(erkzX0x|`roS+z5roDTtgjtJzHYV_dG-m68)QaIhvugneu&qH z!!CaJ6eDJ6TNnOaCB1H98(zUCrgt}Jgw5FPr4Mmm{{s*01h2jPky@?}<)Ap6pCP37 z1bGWVop{B=b%JaeBwcif04tcw~^$ zZtmK+Jb5gJ-|*BR9IH#Gh|0ko5@|Zup72zcLPo;Yr(4u? z_sgf_(n^!t`An(T!j+r*x<7qp5?a~#%%Cc1Wp1Vs&#n~+uPu7ESgGUOn$3-Uc>uF9 zdb57_!Qtng_T1_iDq5>a9C!9Bis-E7IwF8 zt{L);jdJGRn4t^(U$ETmTKB;}#w$9JEX&iUr{EDtH0LmbU4QIQN4ibVou+=i_R8nR zDRsL0%GL@D@ZYwc%5)8=M)#EGd9wY==f|pjWS^S*_vZ%yBYj^u46ww0Gxz5&9MvYf z#b)Mg76a$`o5lE8P>jVH_(^|$w@SK=e;QZ8ok6gfxC})i5?zyllzztF9rIwLvfbZirpQ5s#0gWpZ|%B3PWjr5#P$@8E{ipC#w*=3U-}+eTK^IcJb9IW^#zZss=Q*uYjuAn z62JfFRJoU3iiC8gl^#dC3wG)<_nJR9j=g?Nel^0{A@84LsqDfI!B9OS)TxzN2Z_Nd zrvojQ)CZa-CN_Q1_L}_V+&a13(#wV_ZU|&v6YOOKqWOaM-b!BKEV|gz&IA>&N93In z36~HSC?V`tCIqAr0zeMncXz*1X05T@-)&E%*H{1`7N{_zFrsGbE_TRDh)jpt1M=EL zrjfDX{g%kIl!dbv4>6Xo$JQLILAw83u#UnjEt**5>=47d5TBenlGH+83R#H3WEjW- z3z*)>z#J1;#_5^tw4Hc`hm7YVIEkc&ZKf>tLUPENCeh;f*!lBAFi;pSrmW&D{S43K)Ad)F(~HLJP7510pVz-&p}!k>_t=k8Zp`(xU8Q|A>r z`&r6J5aGyGnYo!T8w%{g0*Wmox7HkKPNh3)9<=v~_B0QO?oW3N1iPXIK(M$7i%S97 z1%A6E?%g|vP4tNyivz4cF+nVQF(sd@0EDydG{5Vqf43ocf*s zLmOU&RhIkm>y?oGsJuL*jLfzTx9E*#9wQ*I%YUt=L}2%IkTtn8UW-BM{R=>X^yJI{ zrG4h5!i%#&y8E@dZvfJU|8D@P%>xoQ=Or3|UnmpqJ`s3vpAUX#NNnaC-_sY3R^|HV zwu(bekuaZqV*ttE{Wq?Kc)#e)fohE&GFmmeZ@sw(phD&w{8o+B3Xuxkp|_Ukr|(yV z?yue|F%|c9Uw!K+RPKD+ubgLi*jXbn(v z$Gmg8I!^E2OO;nqAo-B|7NOMF6Ez-V-Lu)qq7Y?~oA`a1d%#}{0no2HRoUT&$^P>K zruRg_931e5zn-p+cgOuLUilv$?(5$)T;lZQzg6u0pB!!v_8$GN6Yn%Wn25u~?<6*K zz)32ExA5KB<*QY~p(5x1CWt1w*nRiiy~jg`cphQQliEmhmz*34FVm-6S6%w>rqR$C zOtOXZ8$`nbuq-Z9%{=`Nn~oN~R|#@k_Fl~dYA9riGTZ|fp3xz2*LgvGVAnrRMzn0a zr)mT?k>!T-tp4_1s^D^ZNZ5co{QX880(Rv4gTiRt#y8pCFK-7oiZ@h_c!1q2UN$Op zP8plgGn2*d?e3QMuSg?BfH4#dV3kTb5=04`6TQQ*PaG#d2?wN|Y&fE*29Bo|y7wT$ z;0G^?(^1vnI7i@Y;68W*cUPGHR*7-QVYb|C-a@Ze9*&VjoI{3|FInC#5=6nA-uqzG zh;4uve2f!{3g9tnk)(1)PhdE(Mj{N)Q42j@95g&~h>5_yaF5*O;LD3Y+f~zEh^R)3 zNgK}qlB+#Anz+~0^4v#vH4Y@i9OHuz!jaX&sD*Q*_}1aeYhl#FDDJR*u3Nr4i8J=$ zdh6?94t{kqBn%LkBG?ngJGj!xg*1C$mBes+A1n@2*5j`ZG$ zr6awK=W2V16-T-tmX7o`I?{U~mX7o`I?{<)Kchb%yHWb#aU&dmIM5xKZA`Ffwtf+Ps-+M1msZzbk|09f+LyU@{sth zAe;Ik=?CmQR_RoRYn%UnPz=YNXVyp3XnCLS?EuX!8ghX?nJJcHxBjgE6Ty|Mko_|4lWjywvX z1VfB6lBOG+G{f&a(Q)2JF~a0M#FuUS;@%YLOdbJGU;$IZIL_OIx_P`*DfcNRJjZ#P zah$gq$9bFao3|Oid7JT@x6yB&4xta(l+tD#=WWJu-ew%r+Ly;*h#!1h$o#2{#uDZ=J>p;D5mh6y_kQJmaXaGhog)R;p z^OudFQu8Uo5WkaX$la5Rh`e(5gJ6kl5r5J?jvP!B`uVO=0S8MWJ(t3 z3a*FIsTCV(-G^I}eavyv!c!~dQ>;Re9wlBSO0+$2A1yjcS!2)9fr;i;Sw{3qx9FZ5 zdiVxo_sJI%GFvvhSF#%@6R`-%u`{4zcmLgc_NPv!3dWua30s6xo7~HGS2W>~=nJFP zOy~o>BQXX7E{xRM(_r82ddWwp!DcS{$6h$-`@nxJhmYjtfBa5e?wx23E*k(2yjru|JD=0-vz=MRY+r>4#Nt~|3fE$V`nb{sS)mVpEGQT~r5*DZNi9$%Ml6@PH zQrxwIyqUY`C^Odz@GI`tC_AzCpntoVp6u8EIizwrtPSrdms;Ge&sh%d{<6&7`?ChR z4{(?M>_rS>`se4<8Gzqkem)BWnfb*)tR^vxnZ7@R;dZ!sSAEfr*Ux-G5AX$FRl3%f zi{bEI^5sDIrxWNXcinB8v)w;`Ne}JrFHeBe15K{aI6bIv(dNlt)kR(u@?i;705ms&PF>>k81B9*dMe!mTdXsB^5!2IyY7Ba~IH(4Hb8~+R zsy20<4u;f`$-^DwK04e3n{Qu0!H=oKcJbvt&nxZ@slDk#=l$a$1&^`b6;gB6k$QR< z5t#$^^01nLQ?hr3)sNK&x+_nO!v0D4bDH&&dFoS4J$tfbjne;!DBF{>-T{-^DNrK- zsKX1?@6G2Js`QurRZ{O=sK%qkA^%iWXfa))_EHn{gC*)1TqZ=(+jRY4RF#1+;R?~W zI#z-HM^sg-Lv(GsRYpfjp}uRPD$;w!5W>1a9}`n8#{G~X80Zwb@~?_1iH+eWVq+0x z28AHq5w|h1F@Ay;$d!k1*erdH;kQ)-tUBsvZ zx-Bm;Hb>VLtJ_dw&mq)mU|-9@8B1e zL9;TwUw`$R92Cs{4(K1M7niDiyjY4xc%v3``=nG+P9V;qFMkwak7Y0P*Jqchy%6m~ zoMQ);(wS5Ec3^G2zka1mmC;RRj*+9|AI1yzt1<4eOO}h~6`-CyZ;a?Cfq5>9q z0@yf2|FB#g3>4p5u38a7Luc9T3JBMH3elwBD+d*HYCEppg5)vBl!0S;035dF^yq;n zn(5IM_`~>$93Z6^Re%g{(90`SD?|i($R3bWZh-%6g=!qh$(SS6B62>$DDNPrGCI^{ zUS6n(r>l=*w?a;S+{V_2RH{gn;@1htW`Cbb!M{L$vggJqHC*Jm-!4NdA8eVYR&&dk-;HT5bITyIJ?nfVS$s5?-6dW$;D%x>?bN_=g0zf1l< zJi9G*suYr$N9J+AMJ|y7OEU5paoMO3u2*+szy%H18)~KoBn(z_a^H2rM>bOba<@ z)YLeqT}`8wr6sVlU9@cRAk`#WnT_(Xpph{83tpr088ldx>0<^#pdDiFFB_yB^#gt1 zAT<)|M_v~WR!Gm_{ZPD_Iam$%-`p}7N7x>sA04btz)Xh>QTTj>o;XBQ2ev>@_A@Ua zkEdZg=MPcd=IC)bZzkc*i|kaoe+;D z!--TqYq-KO*7~&Js9MKu+ucH6F&E2gj0J`Ep?IzhGhw8pE*lI~_pH99=jP^0!kD-3zuMB zT@;ed%w8~3FC3}%LoNZ9zz`)+OpMHmg1G5VWL?@g?~GIpW`Yf))L+1h!O@}?`0l3B z{<}93M#9j(7>)cO3GwKI$3O&0bZOZb^)l+s`<^-r)PP|(>ho-syl7{U{=l;G^+97{ zi*>qZzh2X@nsjR9i*W%ka3c?MIr-7C!sB?A;qiJy(vdxdlkq0QB2ur#c&CFuhYTc?CHN0>MD)U4lq2??g_aOcQ`Vya%w69i&mY zRR3%*wa7$~dbV)!Hm`-j!QXDnqHmm}!E>z#qP}mOpdPqma{$j6b&DRGQhQW+{&J-J z7)LqRSDQd)aFOe?Q)&iT8$JsCeoE1RE*-DDM5VYsemt7FRbMk+HK^a~P2<%$Jrb4l zs=bw;sRS$di@n7P##hOvs0;K3`@jMRmkrQw?4yv)qJtCE4`6_i%YHvm6}a|S5%+=Z zeYHD5jXpr&x+<6D5QO(xPM-TLhX^G(g)26kd|QFZtR$Opoh?C_Zl(K7RQ0tI(KM{I z-e*X&xLQwe3e66lq~iKqnBl%%j)4saKU_LV)m72|Xkvxg1sCkxP3Rw?KN_qw&&Thp zt{HJWz0#w+<2?K?%A1(#H;&-R+!53nvJjXw{odBUn54$RP6Ta!SHGW5g0{X@|7bs8 zpjO|tpX$UawD{2Rdi3{IU-dh^|M%6Ic)$7ks(E-fjN4{wGXw>o1xRfMoXznE-q~kx z8R89~gQeE*ai4FWqTBXYhsPv-hUfMlRHc4te|3~kEMpH4VmbBzHMI|%;M^+iDEzSx z(2pFTCIQ`j4pe)q+w>s^s#*AT`+;g^l*hOPQXA3S5xVvuHM74Qj5Cls*f2h}VIQb3 zItVSls_#As=*77>|9W=qI-HBssPN^VARVFjsu*VlXOx~a1(bN}y7Uy4XB9qyPX|$5 z)d#e*SPe0&i-G#xL-BRJSCQ86XsaGJRZZTrSh?861(s}C257ydvUohHPUfp{RgnqNAxw{ zJ7%dJc)j5mbunIFc)V)TKR*^=fpR-mjRtq+$$=k*#)t!_^I#7>Xg2%j9?GL$9GeZrm zq{c2Z1Mu~TKY(Lrs3bm|!SLyPMiy~r;y5tsE}H?v$OFPtGi0i}XQ(g#2Z8YPY_KRi zF0<7oqmNG_Z*LSg>jp4)bAAH`zs5iZ+!(_zPY%oDjA7*C&Iw-%hzVxPw0)d<6Epkx zICZJPACh);pSd7|PTe{eGP+aGm@BsSlDRU7%jT*}1{}vh$d2J2gMcO>iuA!J_z-N= z%TIve<#h(av9)uYny*K8!Rj2VukP}@6-p}9N6mxyTYfz9IJts&_js)FN6%2vTHt9i z!e8Ht&%X0v@@9s5%zQP}C#W3Elc3h!G#|QCty}lbi7@TdIz94a^&Tz_3)H^qE`8zx zco6Q^_b*U~s(WYqs?-<2?34QDAE_hNQ#x-6tdmYXX$g#qPJPl6H7EWkK7Wpc3}6l4 zQ-ipWpj5zqO#f|(YHQjAbp^a)8z)o1{4;4Hx!)$>XT$WKKZfD>xZe0<^;+cqAY;^`UUAj%&ZbWHhX%p~7CnWww^jTWcvqg~eMs=RQgYUs-&fi&pU!rRG zLH5k?I}7%cEs%mbs3gh#?d8Qg#&@0o!xk4&ac^qK^cF z{Mbn_t*`EHRp^di!WRvzD3Zw66Mm_h>X36}pENSq?1(WJgD;#1ohyDu6rorgKL^|C z!e5HJd-pHZeD#Pv`b_vlM(SJ7gs(r>)7>sRp{T}Y;wws4XLQ|VOI1`sO5Aw1nxNL} z_s&*RDOn=abms`0o_G!xZ1VlWQvJX=%7$lwK#vwaQcbyA&_#^t(a}h`wsb4x* zy{69B_b-D?duZJk%V3?ThxJ56NFco~Js;NC0eZ{%Sb=Q>gtAV3NK^LM_W~o=3UPnp z1*$P70ADUl`iSdH8mOPVK%JIYcPojcQ%nA2ehk9lkCAe-P4HKv{Vr3?wr=XU~UzZk1|Q-TL!YI7xMf zzkrfFHzf8%%=tpxfUXve2{6@1GNf?AQ~^XVetoS9;{QDh7P26ZJmM*DQJnIIpsa%g z1@pBXNQ7`Vb&{ zNDsPB?E>pL*Q}T|p>s9}$XDZ50K!77Dgel5H>9IYPN5S#f zIZy-+@y5XoC0RA4tmAaxy3$n(lp;aZFIBfzn5Rc)c2x*B6f+TMxZK)yzdsp8c$XbAsuENgPfGaFF(ZaU_~yG#ob*(eRMl z+0hzy;Xq*qay1^{fHW|Y1@y99;&6Rp`lB!~3z<+w`qmp%f**SJJ}-`9(jar-3O!$K z=0l{|Oofg~5u?!eCNmEF?64@z%&QJ-y*EBS$7(wd)J>%;!!9(rb9jVA8J`OZaWXs# zykW{V%O^^AnjbvSULdTK}n_d67`ES=C*$W4&OY{6v={Wy;rkQHyd!|4+tDS)~qHn6U z4=3r*4E>Nwx@7_}v(JE2U9a?<)oNIpBF3mwiU_0hf#q#tNE5&8%#gnjQ)co2H15{} z1Y6K{?;65IP#fYN0(GINL`DU#NuCFTCr(!?ji=@pWut?U;}UQ@a>qBp?7OA)xjgM7 zgzPFMQ!IsR?t~6JQh#u#TCO(h?sf2aPSAf^rx+j~bC>#+iO!BigJ0a03CzyF z8}H!^y<3&WnZ|+e1wBw^l@2=-X&bV)?L-NZ((eZyz};sMFhI%u+v(U#{JKfsd=KIV zvZ+m@O)^e9fOI8Au?*eYZ&vlIYJK#*Du(Xo-Kz#j2aKDc1Ae57esAyl zHWDF3Ot4sQx|fj-Mqv?_l26&hH0=3@FsbM6%fv*-;hRNz>HU6DiAMQ>(e)^L!2|Sn zW7v(1_tfbb52`&e3T%esp121dR9s}g`XGN{pIlX5KOh)jIEkC(`kVVTxYsk*t1wE= zSx>7)FIx|Y-=kk&ul9&%cF>h_2i+f)w}tKn-M&FRX8lny&Yslqhm?P$H0ozhhK@&j zZIIWWty59G<6)#X$Ts;DE~7WX&tWz%YImbVRn~6I;I&7<9pM$=bvf}0>m1A#q@M71 zGRkv74Dh{@_`dBCcsi%+p^q|};YXR7edC4l2LiE(tyk93mG7+-1T5?(uXNsH z0-g59RCVs&NPO$Y#51yyeD00ZOCQS#cvtCXA5$BEu?sf|#=L;HY-cRfhdvIv&!7z$ zA@;VIix+T?KY?_Hd-O?9sG(V$^zDU{bx**QU7_E4LOluV^tLClSbb>Shfl%*pkCB_ zKMgzkZhh9%DuHpVep>AZeg5~S)fMU`z5E$figg79I2JjZ%^~LyJxIOW3N{5G*FPiv zlkLxB?dws`3OHsw3&)q3&%3_Kay}h>;cJtp=$b#OpQ+3B_Ft>R3jY4@<#6rb!Y1?8 zNj>d3n5}o{JDyVuVZAnOMS@1Hp1&0?*s=PGt*TjV*N<*h7gd{;d$;n}e~_PC0Lt=B zFM3|q?sq&dcK4s3H^w^Iq2mS4WZe&6AfO)CxBf}pLeInPe+k$x>zUi&GI~a@*rtA{ zp4A_2Q&SKXF$-}XdK9!DBTq0@1rFm^^o$oF9Xj>ZFRBJw`k~Zjef9UOBitu09;Bzf zgwIGmCTkCK!nWBWKwy6#JvX=p%PQCGEEV+)-17A_6;d1RO zY8_Tp_32wqKUxmDR=~cxjEAG2dIsKYyPe=mUBwzL+Y61Th zL7Vw*yMFpLwQsq6n7tb&D3w}vGqY}c9eo|?zBp&RUhz6|$KF`?`0H?%t2gz4H^nJ6 z@=bLv@cQtZSmce>|9lf+iMRCVx72T}x0Sx)EreU%#UG63z;{$Rfg1(1EN?fzR=t)X{J17A;y(qP4TP;wF+ zn$7tbG5Y&tCwQ+%x4P>cA(;!`QMZ2g!s}vvS%0fmU;i#Xb?TqxFKcdmZCHQ&uKG2Y z1}SD$`Zw<(#PyNh{T^0#BX!IBhzsW~yuB2&0mh}?9&iK?bhkH~94T=M_^D@$cd7s2 z2@CJ&uHBMG#)A!f977l&PWAtz6Bho86BY*O*`J87{)$fw8Bqk>^9k{(U;RYgtp28# zeF_CAe$2T3>{D>zfx7J9)U`m>hGCXu@m1+v{{|1mM}8I`;+KQOszCdWz+wDL1 zCrD6pm;S`$r!6rVX-gqrGYS%4i?{c87yPsgB2Iq^)gsCZAD)DHQh|2w68mS1|J6_T zsM9O-S6@L(-)32jD~4EA>b(^QSl*s~Eb5Kv!*e-78eg6c*|OpfR-+g_$UtDL%p0PC z<>d{n*lmq9rq0QQ_*CZ1d@JIscU zhOIvj;~2$<4290N&JQ=kHf?qz3S|c%Xe8zWA^}aqShA+Fnt%F5Y%1EtHmbyb(sfBMO ztUIR2+7DtB-#bg`_xe~(YMwj&`~iA+v2{KoD;tZgQ7xVwT8kZ2^)Y;oOuiHLH^mQy z)pNI6P@K&n`vcuzgMJ)6)3!?NT__Mm0c<>jF1B~;Gi_@wfbyPgC1d=&Ry}uPVF*Y} zwHO(i+!w^M5ILmQVMwY0OMdI1v0}m+x$7dPOg!1ox+NcK1glCNyAp)w(6QaggQ!fAf@~3dXv8n_ zZ3k58KbBkgl8gSZ-1-B?Fn@%FgEZ;3k6Q<;k9DHLS{i#ZM?z)Yj?Y$rEX`MAFypL= zZ$AE#(7&m&2FMp+lKLgw=6nWbYyYr=dK0$Yf!xgn3WT z)GA)#bXbimJ%qR8YT_he?vev?kjRBiMt}-8`9inz+%`E{Bi@yU*9{+AA))b(DK+3l z+!f-EA`iEWkYA1(F}gl*Ey5Mj5^gAqn_7$EP_*Gtgbhd6fn#IaUozfB2Sr%Ytl}c= zxI+{Ld}${KvL!3h7?qikIkY_PA1aLRJ;-wzgot3;j;V*my-24+l8dz5s&@e&#xvQ^ zuZuM+dd1QQMmi-isk=QOLbA$!2cWUio|VQFsKcAR`~A2wZnP9OZC&*_2Z@7Qwpm1!7w-dUR1=LBW|NLmC-;ijFDC6EM03s<5!vJYs*25~x= zc03&tLZm-GZN8YDZShyJ*Q zV>)#`!fU!&wk&78)5 zZlWa%^y)0ot0AB|tY!oAfrK9X;Qv{edm;+pFaxB7aSFx~*3Ez^KD}UIJ&@ge7pSvR zOz%2MHK(f_^K}1sfFSJK`GX>^K9lwD2g#!Exi77CxM*;H-19$+T5z6!lDq8P4Wsn`YVKN~qpYs= z{QFEYLneVAh$JCFCPRSmGJtu3Jo58~1PGwTq^)2tpoRc)h1GhCH>ej8r8L#Tk@^a2 z6%hsD0y4I&`ag61<2(#*y2@7smN-16wUqiKL0QM+Bx1$=l?(i4hc z9h^x(K)_-oLAzL5A~0Z&=P+G9K7c0kf_L9EzjE*{4nN%B-30WuX6;YTzxLiys3B3i zh7Mlv?mllDZ&*YCTBE^Anl%P1dD3R^?z2{;%lKH#?KV(St`5$q33q`O@-!BY64@Bc zATg^jSwo-k+1o(j3E2H{iY{!xO0jI-o z-2gDLFX$mSxd1rDD376)CQ)ze;fleQ7|$U9$nfd@K(u1>yHS@8pkH`4zl&ef=J(5i z)V~|MjhnL$KOesMocm9)nV$W^7v~`^P7T8LRN~^wtc$vOkZe;S69#)y01BiSqm7Fa z+doLQg9vCFtQQT2Y39Oplnbj@IFE`LMkp55*zz^6oCsa>f4JbH(&0COZUhK^c03DL=Z&~KN(=? zei31d=QakruZYIMIt@(0G7DQYzkQiy7W;x;(cxnBmyMmD>xsh*-Wjl@1U4!K!>Mn}zW+C~L9FjR6XbB7`#(q@AC7&I4 zPAWY#FqTbtu(tNW3i}RoKxPT?Y01zMnrhvySC-IstvmGpl+Z|t7%@l|>%`z#Lzy8C z_P{fBwL{}Ui(QVlE@G++>tZfw4b6q{U)^yG-H?ADFHpD$u;HCrJq^d;aM2`02;>8{ zO3GfW?-_%szn}D$F|-7ie?-&AV)D9U)M(&li8lo>y*bVbUp9`$cq?G@I2yo(-ycV- zQCNR>Je7jgw~VK9>q&iaJT0L6Ej?!f^`!r>bj<{0R$OIidm@cPpKqE-Y_wl7k$PSI z3=;4CVG1lFvfJ*a2bR)kG^H1n(lgeGXlfbYctTmkZ_m-^&QRARNHP|D_JgDw9w9!F zter;JS!?tg)94-+3Da>TJ6*p%oyHHGj#mYAdpA&G2}G2;G~`4I0aENy2d^)kS59m} zURBP0*4xTy0zS^;8#l@RHdXdRy4MVNqBavw4VzYuX}xtAqQ3 zN9i6nF}2oPs=uzSq-rMCmz8v_T20;ckawsD|4{x8Z3i({*3uB2caUao_yGl?b7s?C zs~2b~S_6OfD>(Gy5^lvJ2UbS;O7=2cc?$(b zbHUJ{?U7YO(pH=Lq_zki?9N`o|G)16iO*W;DbvjM2=K0rK~nuM@D1jr^eRdOpUW+ zo+TVJy8jC83F@V*y!q01YpTX{O}}EM%emNOy8P6+adNmT{Zy_#98lL7Dbiv}Qh2pF zpDE^xZ?heCdGy*jr|(=9o8^j!=y_do7bWW7{gCd^-@l8>c#1bYKzaIuyF|WWNw0Y6 z-{=hsF!IeGQ&w|<$N~m+>m^6AE)DOTtrH^6xQ}H*bmz}$EG4am@M7o)ikBZ1W}LqY z_DxgZ(mJ?etkWwWFjPhJSOihDoDWeGQUSeY4W&US6M{=mJwmC?`vA5%xkf6zuqIY1 z#`Xmdrr8|juyiMTLtI5o=0&fI)o|5rl~On1GzP>LBN?ZTSEl_~T%}D^2KTO=gxc7Y zP=-Yg3ybXi8m!onu4zqN{35Q0O@{4Ch`Eo)Mi0@nLXUa^h-;nx@e{O*X_@yVZFX0j zhIpD8z5EjGvUE}%4G^ksYPEWEs){YgP8A_+mas$-m9qzbA>h~6#ae8QZ(!(c#y5BV zGQL1(owAjlMi;kl1>!OqC_3jEN~5IbxF|fHz;Y{}74B$v(QPe??%U?J+DE_n2kN6I zZKvnG<`$-?An8FnsZ*!TTrkLOavFeI{oWqnTV`@8=8q0~QBF0CqVy;@0cHjpmTXUG zAJ{{~zOv9HN{TB|_DYN>klYLO`UBX-Ogl?yddjcpKme*5wHNE~N&GzQRa)asB6M|W zbo6WVF)#1j*P-ZNl__kZa;uLB^&WklyQQ6=a&*Tx=ov7?`i-iYx_as@vV|4iXq6SP zQvdjt*VQPxdWXe)m3cA-AEK8}(r`j=3hJ>3+Z)%LHw^%|r(SxKzuzU2ppwqft^2{6 zTvr?viDGzTxvs1u*e>sjtIGuw?#NEQ`*rJjxAnTr8n4qot7}sj!XD9#sjH59MA5CS zf}<@8OgrHfXa^OK#r3u+6?MH^jqqogc24m=H)?-KrPSpFTJ<dJ z+Q%}>&7np-#`p#l$mgv#f@SS0kOK{FZ#T3i9=blu=&TVVK@p$7T7`#{0zP1I^8qjG zdOwRA0}6tuq?VCptB3@h=@7hXSq2p8BB3tCwcJEo&q`J-=zfyiDBK|8L)7hWF}7xL zx>DA}`(FpoD=O@#_N#1$42@La3~P2qyMeqxb1P*xabG-|yDDBOq#-X$qaNMbZm|h5 z7`nvsP;29T`D*)@Z+yI0^u&4eaE+fYkU<96g^qtY?n6{tBDmBH)+KnXCoZ&K!Ev@c zh9{Jt4Y3iwIXVQ1ao56BeiIL1amShNvZ@HYs^J_A4=l+F%@NWO?4#Jm>%%N%C#Vt> zWV=2pcLJp;z8aXyYCqv{I`bYEhV7g)yPBU+jB{4{nw4u=jJcrIl5kst=^TAx12OCY zp)0s>3enc`zuqvPx=!#f4_iEH*j;3dLJaKK;jb^rYw?hr2KS6m@Gi7g{>PukQN zEq8#5diPVu%<{5h7KZpeAv%Pm_Er1R_U#Ox3hL31#&(8K+k!=>LOAh2Yn7g{4;I<* zCJO5E&AO)-7})rARKRNM7?Vr)H||OrhcTC`cBOu=C^Pa zY?3BxBv?0$?KKwA@%VHFCZ}aY$wd{gSI9zQ0pee1A0Re%;#A6lq`*IzKM(t=At%Bl z$3VQ8-1G((Z)b?p8%RzC>sr{(LJYWJN?vb7>XkO z)qf_8>J$nc(x-;Q8dyF+73lgGtc)oBmEwn%j?T$bi~ry@V2K!ooR7FX1Gy)B*WIRiKzvK*`w( z=W@g+;h6a`fd?a4ee4K(Vg1j37g~7P+MtH$lRcCzrBN z59-GKybG^d6UyX5>>F+2j-2OIe80@Fa$>`3y)$m9_)*n-JHu-CsNmJp`mp4565@@;I<0T7}pfELgN|DI7(7cyXk1%dckI)Ez0H6UOvZ$ zie+hoMSq+b+%T4~6*HB7Dh=|vqqYlF4nDp}Q$5Non8ld+5H;qqA>S>GenR`&b%Iv4aWzEX{=24pc2f6$+I~g^-e7g_BH;5Q9ho zgL*kVHt+~sC>GjJSb|KLG6oK12Oui(YJgW%ppY1d-~&P-tn{yjtE|vbKsC_~p`Yrd zvsJcUS)qzj8JB0rG!E2N5LfQa_|!_(DU&If2(qIlz4ucq?HbYA?Rz(iCy7BnETG3c z!KW}oEEJe8>=$-)DAVqdajvZWR=(0wV@R*~bKv4tJ5p(mFJml4_(dP+Y7N z;;>=59>#c|eQC|_S=Q*u0r z+2a9|(-F>?+#I*m7vlw}m81@dEZGq@0c7b7I#yR4#r&qUp_3@SSPh~Ngjw6{WvBM^ zvQu0y-A;CAf=DmjRpbkuCnFzpNjLR#PME~JAj{osP7nafe2j?8vhRmJNn6IDUeReA$$d@Ot`?0+dzVx+~4OIW(ZW^VKxrq@v}^8qTz{v zq`rqV$@*RN=y289>dKG-j8TYH z$Q}wPRImSbgX#?wnmt18u6aAb3dU%GH!XwbL<9t(_he%P1%cbh43fZTa6sGL0?9m<%VqMY6Ml>Z#_-tgkCJ)w#Cek|tz~Eg@@;Y^ z`|L2?02Cv9rM9e2EGL#cvNo}mGxvRjEryZk0MEDxIXtoKUGUbBC5S4pGIi}pb*+`4 zcZ^iw8fI7A9fAdp!uT+rQ`{UP%-B^}JgN9Qc0GRliG2snVsYsF90wNcHN#;?i5wT@ z=Zs%dIkjg(*kV3RgiADjm24&W9KkwdxP6NEb4av?U+@<{;U6%eG6_EfW|7q9kN`}h zDmQkR`-@DH4~|kO!-BO(0q~z)CMhNoLM4n}qX?CUi@O$iwD(A~wcAj(}oCsfYXc^uj`{OV% zzv4n-Y>dGr2z@m091geWGL8s28C=?E#j$-Aqt&ed%CC-AuO=W#+HOlb*Q=ZKixsLe z1p>canpCx4lm6(RN|T=c2WryZahmj_=9)CLHcr%bBek6I){0)uJ>mg%Qs`ZK4gx)$veaHG#zdS~9 zl&jfd>+)5I7R?x^e&7kdd&jBN1Q3Z}i?5kXcm^egbjj+pkj@`p=WpP`zZb`WI_o^vGm2ldRRz<5SfXvQF@R z{Z_qwruq!eo|>f=kf>H(7_10oZyq|vFc@)1v(>C7CK@)_L>JFiXRJh~bG&SW9=0ph N4&M3ityGyA{|}~?P8a|H diff --git a/include/SimpleAssets.hpp b/include/SimpleAssets.hpp index 49f9f5f..725e94b 100644 --- a/include/SimpleAssets.hpp +++ b/include/SimpleAssets.hpp @@ -1,7 +1,7 @@ /* * @file * @author (C) 2021 by CryptoLions [ https://CryptoLions.io ] - * @version 1.6.1 + * @version 1.6.2 * * @section LICENSE * @@ -189,53 +189,56 @@ CONTRACT SimpleAssets : public contract{ using createlog_action = action_wrapper< "createlog"_n, &SimpleAssets::createlog >; /* - * Create a new log entry for burn action. + * Create a new log entry for burnflog action. * * This action is doeing nothing, and it can only be called by SimpleAsset contract. It creates an entry * in transaction trace, so that that third party explorers can retrieve burn asset IDs and other * information. * - * @param owner is current asset owner. - * @param assetids is array of asset id's to burn. - * @param memo is burn comment. + * @param from is account that burns the token. + * @param author is account of fungible token author. + * @param quantity is amount to burn, example "1.00 WOOD". + * @param memo is memo for burnf action. * @return no return value. */ - ACTION burnlog( name owner, vector& assetids, string memo ); - using burnlog_action = action_wrapper< "burnlog"_n, &SimpleAssets::burnlog >; + ACTION burnflog( name from, name author, asset quantity, string memo ); + using burnflog_action = action_wrapper< "burnflog"_n, &SimpleAssets::burnflog >; /* - * Create a new log entry for burnnttlog action. + * Create a new log entry for createflog action. * * This action is doeing nothing, and it can only be called by SimpleAsset contract. It creates an entry * in transaction trace, so that that third party explorers can retrieve burn asset IDs and other * information. * - * @param owner is current asset owner. - * @param assetids is array of asset id's to burnnttlog. - * @param memo is burnnttlog comment. + * @param author is the fungible token author. + * @param maximum_supply is created symbol and quantity of fungible tokens. Example "1.00 WOOD". + * @param authorctrl is new owner of fungible token. + * @param owner is the owner who offer fungible token. * @return no return value. */ - ACTION burnnttlog( name owner, vector& assetids, string memo ); - using burnnttlog_action = action_wrapper< "burnnttlog"_n, &SimpleAssets::burnnttlog >; + ACTION createflog(uint64_t newID, name author, asset maximum_supply, bool authorctrl, string data); + using createflog_action = action_wrapper< "createflog"_n, &SimpleAssets::createflog >; /* - * Create a new log entry for burnflog action. + * Create a new log entry for createflog action. * * This action is doeing nothing, and it can only be called by SimpleAsset contract. It creates an entry * in transaction trace, so that that third party explorers can retrieve burn asset IDs and other * information. * - * @param from is account that burns the token. - * @param author is account of fungible token author. - * @param quantity is amount to burn, example "1.00 WOOD". - * @param memo is memo for burnf action. + * @param newID is id of offer fungible token. + * @param author is the fungible token author. + * @param quantity is offered quantity of fungible tokens. + * @param newowner is new owner of fungible token. + * @param owner is the owner who offer fungible token. * @return no return value. */ - ACTION burnflog( name from, name author, asset quantity, string memo ); - using burnflog_action = action_wrapper< "burnflog"_n, &SimpleAssets::burnflog >; + ACTION offerflog(uint64_t newID, name owner, name newowner, name author, asset quantity, string memo); + using offerflog_action = action_wrapper< "offerflog"_n, &SimpleAssets::offerflog >; /* * Claim asset. @@ -730,87 +733,6 @@ CONTRACT SimpleAssets : public contract{ ACTION mdremove( uint64_t id ); using mdremove_action = action_wrapper< "mdremove"_n, &SimpleAssets::mdremove >; - /* - * Action for notification after transfering one or more assets. - * - * This action will notify author with help of require_recepient - * after transfers one or more assets. - * - * @param author is author of the asset. - * @param from is account who sends the asset. - * @param to is account of receiver. - * @param assetids is array of assetid's to transfer. - * @param memo is transfers comment. - * @return no return value. - */ - ACTION saetransfer( name author, name from, name to, vector& assetids, string memo ); - using saetransfer_action = action_wrapper< "saetransfer"_n, &SimpleAssets::saetransfer >; - - /* - * Action for notification after burning asset. - * - * This action will notify author with help of require_recepient - * after burn one or more assets. - * - * @param author is author of the asset. - * @param owner is current asset owner account. - * @param assetids is array of asset id's to burn. - * @param memo is memo for burn action. - * @return no return value. - */ - ACTION saeburn( name author, name owner, vector& assetids, string memo ); - using saeburn_action = action_wrapper< "saeburn"_n, &SimpleAssets::saeburn >; - - /* - * Action for notification after changing author of asset. - * - * This action will notify author with help of require_recepient - * after chaning of one or more assets author. - * - * @param author is author of the asset. - * @param newauthor is new author of the asset. - * @param owner is current asset owner account. - * @param assetids is array of asset id's to change author. - * @param memo is memo for change author action. - * @return no return value. - */ - ACTION saechauthor( name author, name newauthor, name owner, vector< tuple >& assetids, string memo ); - using saechauthor_action = action_wrapper< "saechauthor"_n, &SimpleAssets::saechauthor >; - - /* - * Action for notification after creating a new asset. - * - * This action will notify author with help of require_recepient - * after creating a new asset. - * - * @param author is the asset's author. This account is allowed to update the asset's mdata. - * @param category is asset category. - * @param owner is asset owner. - * @param idata is stringified JSON or sha256 string with immutable asset data. - * @param mdata is stringified JSON or sha256 string with mutable asset data. It can be changed only by author. - * @param assetid is new asset id. - * @param requireclaim is true or false. If set to "false", the newly created asset will be transferred to the - * owner (but author's RAM will be used until the asset is transferred again). If set to - * "true", the author will remain to be the owner, but an offer will be created for the - * account specified in the owner field to claim the asset using the owner's RAM. - * @return no return value. - */ - ACTION saecreate( name author, name category, name owner, string idata, string mdata, uint64_t assetid, bool requireclaim ); - using saecreate_action = action_wrapper< "saecreate"_n, &SimpleAssets::saecreate >; - - /* - * Action for notification after claiming the assets. - * - * This action will notify author with help of require_recepient - * after claiming the assets. - * - * @param claimer is account claiming the asset. - * @param assetids is array of asset id's to claim. - * @return no return value. - */ - ACTION saeclaim( name author, name claimer, vector< tuple >& assetids ); - using saeclaim_action = action_wrapper< "saeclaim"_n, &SimpleAssets::saeclaim >; - /* * Action for setting a ram payer for author and category. * diff --git a/ricardian/SimpleAssets.contracts.md b/ricardian/SimpleAssets.contracts.md index 7a173de..fa2970d 100644 --- a/ricardian/SimpleAssets.contracts.md +++ b/ricardian/SimpleAssets.contracts.md @@ -576,15 +576,6 @@ summary: createlog (internal) icon: https://cryptolions.io/assets/images/sa-icons-256/claimf.png#80086207646470fa9cbaf4638ba0dedec96ea0e84d5059b567adc9e4b8543c30 --- -

burnlog

- ---- -spec_version: 0.0.2 -title: burnlog (internal) -summary: burnlog (internal) -icon: https://cryptolions.io/assets/images/sa-icons-256/burn.png#76954820d84563187e968b461a706ab089a9c00f5332df96a4e5bb2e69ed5e84 ---- -

burnflog

--- @@ -594,15 +585,6 @@ summary: burnflog (internal) icon: https://cryptolions.io/assets/images/sa-icons-256/burn.png#76954820d84563187e968b461a706ab089a9c00f5332df96a4e5bb2e69ed5e84 --- -

burnnttlog

- ---- -spec_version: 0.0.2 -title: burnnttlog (internal) -summary: burnnttlog (internal) -icon: https://cryptolions.io/assets/images/sa-icons-256/burn.png#76954820d84563187e968b461a706ab089a9c00f5332df96a4e5bb2e69ed5e84 ---- -

createntt

--- @@ -758,141 +740,67 @@ TERM This Contract expires at the conclusion of code execution. by CryptoLions [ https://cryptolions.io ] -

saetransfer

- ---- -spec_version: 0.0.2 -title: Internal action used for creating log -summary: Internal action used for creating log -icon: https://cryptolions.io/assets/images/sa-icons-256/transfer.png#23227a4901414db5cd0973d1cc5df13f9b82375b21c6315fd3402cb4acd50cbf ---- - -This action is called during transfer in deferred transaction - -Input parameters: -`author` - asset's author; -`from` - account who sends the asset; -`to` - account of receiver; -`assetids` - array of assetid's to transfer; -`memo` - transfers comment; - -TERM -This Contract expires at the conclusion of code execution. -by CryptoLions [ https://cryptolions.io ] - -

saeburn

+

setarampayer

--- spec_version: 0.0.2 -title: Internal action used for creating log -summary: Internal action used for creating log -icon: https://cryptolions.io/assets/images/sa-icons-256/burn.png#76954820d84563187e968b461a706ab089a9c00f5332df96a4e5bb2e69ed5e84 +title: Action for setting a ram payer for author and category. +summary: Action for setting a ram payer for author and category. +icon: https://cryptolions.io/assets/images/sa-icons-256/claim.png#8c3fdf140ea14a3cb9762a0f6ec0f0d73f8c2eeeec3ea2f109f394a9f35f472d --- -This action is called during burn in deferred transaction - Input parameters: -`author` - asset's author; -`owner` - current asset owner account; -`assetids` - array of assetid's to burn; -`memo` - memo for burn action; +`author` - asset's author, who will able to updated asset's mdata; +`category` - assets category; +`usearam` - flag for on or off author is a ram payer functionaity; TERM This Contract expires at the conclusion of code execution. by CryptoLions [ https://cryptolions.io ] -

saechauthor

+

delarampayer

--- spec_version: 0.0.2 -title: Internal action used for creating log -summary: Internal action used for creating log -icon: https://cryptolions.io/assets/images/sa-icons-256/regauthor.png#c6a539be8e7dfd1a4c466ba9cabfd13571cd77d5c988c652d2e8f87096f3548e ---- - -Input parameters: -`author` - asset's author, who will able to change author name asset's; -`newauthor` - asset's new author name; -`owner` - assets owner; -`assetids` - array of assetid's - -TERM -This Contract expires at the conclusion of code execution. -by CryptoLions [ https://cryptolions.io ] - -

saecreate

- +title: Action for deleting a ram payer record; +summary: Action for deleting a ram payer record; +icon: https://cryptolions.io/assets/images/sa-icons-256/claim.png#8c3fdf140ea14a3cb9762a0f6ec0f0d73f8c2eeeec3ea2f109f394a9f35f472d --- -spec_version: 0.0.2 -title: Internal action used for creating log -summary: Internal action used for creating log -icon: https://cryptolions.io/assets/images/sa-icons-256/create.png#db2bc53cef5dbbce5247543a91234373ec4bd1baf743301a0d92a35b053eeb70 ---- Input parameters: -`author` - asset's author, who will able to updated asset's mdata; -`category` - assets category; -`owner` - assets owner; -`idata` - stringified json with immutable assets data -`mdata` - stringified json with mutable assets data, can be changed only by author -`requireclaim` - true or false. If disabled, upon creation, the asset will be transfered to owner (but - but AUTHOR'S memory will be used until the asset is transferred again). If enabled, - author will remain the owner, but an offer will be created for the account specified in - the owner field to claim the asset using the account's RAM. +`id` - is id of a ram payer record; TERM This Contract expires at the conclusion of code execution. by CryptoLions [ https://cryptolions.io ] -

saeclaim

+

createflog

--- spec_version: 0.0.2 -title: Internal action used for creating log -summary: Internal action used for creating log -icon: https://cryptolions.io/assets/images/sa-icons-256/claim.png#8c3fdf140ea14a3cb9762a0f6ec0f0d73f8c2eeeec3ea2f109f394a9f35f472d +title: createlog (internal) +summary: createlog (internal) +icon: https://cryptolions.io/assets/images/sa-icons-256/claimf.png#80086207646470fa9cbaf4638ba0dedec96ea0e84d5059b567adc9e4b8543c30 --- -Input parameters: -`author` - asset's author, who will able to updated asset's mdata; -`claimer` - account claiming the asset; -`assetids` - array of assetid's to claim; - TERM This Contract expires at the conclusion of code execution. by CryptoLions [ https://cryptolions.io ] -

setarampayer

+

offerflog

--- spec_version: 0.0.2 -title: Action for setting a ram payer for author and category. -summary: Action for setting a ram payer for author and category. -icon: https://cryptolions.io/assets/images/sa-icons-256/claim.png#8c3fdf140ea14a3cb9762a0f6ec0f0d73f8c2eeeec3ea2f109f394a9f35f472d +title: offerflog (internal) +summary: offerflog (internal) +icon: https://cryptolions.io/assets/images/sa-icons-256/claimf.png#80086207646470fa9cbaf4638ba0dedec96ea0e84d5059b567adc9e4b8543c30 --- -Input parameters: -`author` - asset's author, who will able to updated asset's mdata; -`category` - assets category; -`usearam` - flag for on or off author is a ram payer functionaity; - TERM This Contract expires at the conclusion of code execution. by CryptoLions [ https://cryptolions.io ] -

delarampayer

---- -spec_version: 0.0.2 -title: Action for deleting a ram payer record; -summary: Action for deleting a ram payer record; -icon: https://cryptolions.io/assets/images/sa-icons-256/claim.png#8c3fdf140ea14a3cb9762a0f6ec0f0d73f8c2eeeec3ea2f109f394a9f35f472d ---- -Input parameters: -`id` - is id of a ram payer record; -TERM -This Contract expires at the conclusion of code execution. -by CryptoLions [ https://cryptolions.io ] diff --git a/ricardian/SimpleAssets.contracts.md.in b/ricardian/SimpleAssets.contracts.md.in index 6e74a71..0718c4b 100644 --- a/ricardian/SimpleAssets.contracts.md.in +++ b/ricardian/SimpleAssets.contracts.md.in @@ -576,15 +576,6 @@ summary: createlog (internal) icon: @ICON_BASE_URL@/@CLAIMF_ICON_URI@ --- -

burnlog

- ---- -spec_version: 0.0.2 -title: burnlog (internal) -summary: burnlog (internal) -icon: @ICON_BASE_URL@/@BURN_ICON_URI@ ---- -

burnflog

--- @@ -594,15 +585,6 @@ summary: burnflog (internal) icon: @ICON_BASE_URL@/@BURN_ICON_URI@ --- -

burnnttlog

- ---- -spec_version: 0.0.2 -title: burnnttlog (internal) -summary: burnnttlog (internal) -icon: @ICON_BASE_URL@/@BURN_ICON_URI@ ---- -

createntt

--- @@ -758,141 +740,67 @@ TERM This Contract expires at the conclusion of code execution. by CryptoLions [ https://cryptolions.io ] -

saetransfer

- ---- -spec_version: 0.0.2 -title: Internal action used for creating log -summary: Internal action used for creating log -icon: @ICON_BASE_URL@/@TRANSFER_ICON_URI@ ---- - -This action is called during transfer in deferred transaction - -Input parameters: -`author` - asset's author; -`from` - account who sends the asset; -`to` - account of receiver; -`assetids` - array of assetid's to transfer; -`memo` - transfers comment; - -TERM -This Contract expires at the conclusion of code execution. -by CryptoLions [ https://cryptolions.io ] - -

saeburn

+

setarampayer

--- spec_version: 0.0.2 -title: Internal action used for creating log -summary: Internal action used for creating log -icon: @ICON_BASE_URL@/@BURN_ICON_URI@ +title: Action for setting a ram payer for author and category. +summary: Action for setting a ram payer for author and category. +icon: @ICON_BASE_URL@/@CLAIM_ICON_URI@ --- -This action is called during burn in deferred transaction - Input parameters: -`author` - asset's author; -`owner` - current asset owner account; -`assetids` - array of assetid's to burn; -`memo` - memo for burn action; +`author` - asset's author, who will able to updated asset's mdata; +`category` - assets category; +`usearam` - flag for on or off author is a ram payer functionaity; TERM This Contract expires at the conclusion of code execution. by CryptoLions [ https://cryptolions.io ] -

saechauthor

+

delarampayer

--- spec_version: 0.0.2 -title: Internal action used for creating log -summary: Internal action used for creating log -icon: @ICON_BASE_URL@/@REGAUTHOR_ICON_URI@ ---- - -Input parameters: -`author` - asset's author, who will able to change author name asset's; -`newauthor` - asset's new author name; -`owner` - assets owner; -`assetids` - array of assetid's - -TERM -This Contract expires at the conclusion of code execution. -by CryptoLions [ https://cryptolions.io ] - -

saecreate

- +title: Action for deleting a ram payer record; +summary: Action for deleting a ram payer record; +icon: @ICON_BASE_URL@/@CLAIM_ICON_URI@ --- -spec_version: 0.0.2 -title: Internal action used for creating log -summary: Internal action used for creating log -icon: @ICON_BASE_URL@/@CREATE_ICON_URI@ ---- Input parameters: -`author` - asset's author, who will able to updated asset's mdata; -`category` - assets category; -`owner` - assets owner; -`idata` - stringified json with immutable assets data -`mdata` - stringified json with mutable assets data, can be changed only by author -`requireclaim` - true or false. If disabled, upon creation, the asset will be transfered to owner (but - but AUTHOR'S memory will be used until the asset is transferred again). If enabled, - author will remain the owner, but an offer will be created for the account specified in - the owner field to claim the asset using the account's RAM. +`id` - is id of a ram payer record; TERM This Contract expires at the conclusion of code execution. by CryptoLions [ https://cryptolions.io ] -

saeclaim

+

createflog

--- spec_version: 0.0.2 -title: Internal action used for creating log -summary: Internal action used for creating log -icon: @ICON_BASE_URL@/@CLAIM_ICON_URI@ +title: createlog (internal) +summary: createlog (internal) +icon: @ICON_BASE_URL@/@CLAIMF_ICON_URI@ --- -Input parameters: -`author` - asset's author, who will able to updated asset's mdata; -`claimer` - account claiming the asset; -`assetids` - array of assetid's to claim; - TERM This Contract expires at the conclusion of code execution. by CryptoLions [ https://cryptolions.io ] -

setarampayer

+

offerflog

--- spec_version: 0.0.2 -title: Action for setting a ram payer for author and category. -summary: Action for setting a ram payer for author and category. -icon: @ICON_BASE_URL@/@CLAIM_ICON_URI@ +title: offerflog (internal) +summary: offerflog (internal) +icon: @ICON_BASE_URL@/@CLAIMF_ICON_URI@ --- -Input parameters: -`author` - asset's author, who will able to updated asset's mdata; -`category` - assets category; -`usearam` - flag for on or off author is a ram payer functionaity; - TERM This Contract expires at the conclusion of code execution. by CryptoLions [ https://cryptolions.io ] -

delarampayer

---- -spec_version: 0.0.2 -title: Action for deleting a ram payer record; -summary: Action for deleting a ram payer record; -icon: @ICON_BASE_URL@/@CLAIM_ICON_URI@ ---- -Input parameters: -`id` - is id of a ram payer record; -TERM -This Contract expires at the conclusion of code execution. -by CryptoLions [ https://cryptolions.io ] diff --git a/src/SimpleAssets.cpp b/src/SimpleAssets.cpp index fbfad80..64a2fa1 100644 --- a/src/SimpleAssets.cpp +++ b/src/SimpleAssets.cpp @@ -17,8 +17,6 @@ ACTION SimpleAssets::changeauthor( name author, name newauthor, name owner, vect sassets assets_f( _self, owner.value ); - map< name, vector< tuple > > uniqauthor; - for ( auto i = 0; i < assetids.size(); ++i ) { const auto itr = assets_f.require_find( assetids[i], string("asset id: " + to_string(assetids[i]) +" was not found").c_str() ); @@ -38,24 +36,12 @@ ACTION SimpleAssets::changeauthor( name author, name newauthor, name owner, vect + " has usearam = true. Set usearam = false before changing author. Asset id: " + to_string(assetids[i])); } - assets_f.modify( itr, author, [&]( auto& a ) { a.author = newauthor; }); - uniqauthor[itr->author].emplace_back(make_tuple(assetids[i], itr->owner)); - } - - // Send Event as deferred - for ( auto uniqauthorIt = uniqauthor.begin(); uniqauthorIt != uniqauthor.end(); ++uniqauthorIt ) { - name keyauthor = move( uniqauthorIt->first ); - sendEvent( _self, author, "saechauthor"_n, make_tuple( author, newauthor, owner, uniqauthor[keyauthor], memo ) ); } } -ACTION SimpleAssets::saechauthor( name author, name newauthor, name owner, vector< tuple >& assetids, string memo ) { - require_recipient( author ); -} - ACTION SimpleAssets::authorreg( name author, string dappinfo, string fieldtypes, string priorityimg ) { require_auth( author ); @@ -126,14 +112,9 @@ ACTION SimpleAssets::create( name author, name category, name owner, string idat }); //Events - sendEvent( _self, author, "saecreate"_n, make_tuple( author, category, owner, idata, mdata, newID, requireclaim ) ); SEND_INLINE_ACTION( *this, createlog, { {_self, "active"_n} }, { author, category, owner, idata, mdata, newID, requireclaim } ); } -ACTION SimpleAssets::saecreate( name author, name category, name owner, string idata, string mdata, uint64_t assetid, bool requireclaim ) { - require_recipient( author ); -} - ACTION SimpleAssets::createlog( name author, name category, name owner, string idata, string mdata, uint64_t assetid, bool requireclaim ) { require_auth( get_self() ); @@ -157,6 +138,7 @@ ACTION SimpleAssets::claim( name claimer, vector& assetids ) { } map< name, vector< tuple > > uniqauthor; + for ( auto i = 0; i < assetids.size(); ++i ) { auto itrc = offert.require_find( assetids[i], string("Cannot find offer for asset id: " + to_string(assetids[i]) + " that you're attempting to claim.").c_str() ); @@ -193,15 +175,6 @@ ACTION SimpleAssets::claim( name claimer, vector& assetids ) { if (empty_scope) { assets_t.erase(assets_t.find(IMPOSSIBLE_ID)); } - - for ( auto uniqauthorIt = uniqauthor.begin(); uniqauthorIt != uniqauthor.end(); ++uniqauthorIt ) { - name keyauthor = move( uniqauthorIt->first ); - sendEvent( _self, claimer, "saeclaim"_n, make_tuple( keyauthor, claimer, uniqauthor[keyauthor] ) ); - } -} - -ACTION SimpleAssets::saeclaim(name author, name claimer, vector< tuple >& assetids) { - require_recipient(author); } void SimpleAssets::check_empty_vector( vector& vector_ids, string vector_name ) { @@ -306,12 +279,6 @@ ACTION SimpleAssets::transfer( name from, name to, vector& assetids, s if ( empty_scope ) { assets_t.erase( assets_t.find( IMPOSSIBLE_ID ) ); } - - //Send Event as deferred - for ( auto uniqauthorIt = uniqauthor.begin(); uniqauthorIt != uniqauthor.end(); ++uniqauthorIt ) { - name keyauthor = move( uniqauthorIt->first ); - sendEvent( _self, authorized_account, "saetransfer"_n, make_tuple( keyauthor, from, to, uniqauthor[keyauthor], memo ) ); - } } name SimpleAssets::get_payer( name author, name category, uint64_t id ) @@ -330,10 +297,6 @@ name SimpleAssets::get_payer( name author, name category, uint64_t id ) return result; } -ACTION SimpleAssets::saetransfer(name author, name from, name to, vector& assetids, string memo) { - require_recipient(author); -} - ACTION SimpleAssets::update( name author, name owner, uint64_t assetid, string mdata ) { require_auth( author ); @@ -429,32 +392,12 @@ ACTION SimpleAssets::burn( name owner, vector& assetids, string memo ) uniqauthor[itr->author].push_back( assetid ); assets_f.erase( itr ); } - - //Send Event as deferred - for ( auto uniqauthorIt = uniqauthor.begin(); uniqauthorIt != uniqauthor.end(); ++uniqauthorIt ) { - name keyauthor = move( uniqauthorIt->first ); - sendEvent(_self, owner, "saeburn"_n, make_tuple( keyauthor, owner, uniqauthor[keyauthor], memo ) ); - } - - SEND_INLINE_ACTION(*this, burnlog, { {_self, "active"_n} }, { owner, assetids, memo }); -} - -ACTION SimpleAssets::saeburn(name author, name owner, vector& assetids, string memo) { - require_recipient(author); } ACTION SimpleAssets::burnflog( name from, name author, asset quantity, string memo ) { require_auth(get_self()); } -ACTION SimpleAssets::burnnttlog(name owner, vector& assetids, string memo) { - require_auth(get_self()); -} - -ACTION SimpleAssets::burnlog( name owner, vector& assetids, string memo ) { - require_auth(get_self()); -} - ACTION SimpleAssets::delegate( name owner, name to, vector& assetids, uint64_t period, bool redelegate, string memo ) { check( owner != to, "cannot delegate to yourself" ); @@ -639,14 +582,22 @@ ACTION SimpleAssets::createf( name author, asset maximum_supply, bool authorctrl stats statstable( _self, author.value ); check( statstable.find( sym.code().raw() ) == statstable.end(), "token with symbol already exists" ); + const auto newID = getid(asset_id); + statstable.emplace( author, [&]( auto& s ) { s.supply.symbol = maximum_supply.symbol; s.max_supply = maximum_supply; s.issuer = author; - s.id = getid( asset_id ); + s.id = newID; s.authorctrl = authorctrl; s.data = data; }); + + SEND_INLINE_ACTION(*this, createflog, { {_self, "active"_n} }, { newID, author, maximum_supply, authorctrl, data }); +} + +ACTION SimpleAssets::createflog(uint64_t newID, name author, asset maximum_supply, bool authorctrl, string data) { + require_auth(get_self()); } ACTION SimpleAssets::updatef( name author, symbol sym, string data ) { @@ -751,8 +702,10 @@ ACTION SimpleAssets::offerf( name owner, name newowner, name author, asset quant } } + const auto newID = getid(offer_id); + offerft.emplace( owner, [&]( auto& s ) { - s.id = getid( offer_id ); + s.id = newID; s.author = author; s.quantity = quantity; s.offeredto = newowner; @@ -760,6 +713,12 @@ ACTION SimpleAssets::offerf( name owner, name newowner, name author, asset quant s.cdate = current_time_point().sec_since_epoch(); }); sub_balancef( owner, author, quantity ); + + SEND_INLINE_ACTION(*this, offerflog, { {_self, "active"_n} }, { newID, owner, newowner, author, quantity, memo }); +} + +ACTION SimpleAssets::offerflog(uint64_t newID, name owner, name newowner, name author, asset quantity, string memo) { + require_auth(get_self()); } ACTION SimpleAssets::cancelofferf( name owner, vector& ftofferids ) { @@ -1042,6 +1001,7 @@ ACTION SimpleAssets::claimntt( name claimer, vector& assetids ) { require_auth( claimer ); require_recipient( claimer ); snttassets assets_claimer( _self, claimer.value ); + map< name, vector< tuple > > uniqauthor; for ( auto i = 0; i < assetids.size(); ++i ) { @@ -1071,11 +1031,6 @@ ACTION SimpleAssets::claimntt( name claimer, vector& assetids ) { assets_owner.erase( itr ); nttoffert.erase( itrc ); } - - //for ( auto uniqauthorIt = uniqauthor.begin(); uniqauthorIt != uniqauthor.end(); ++uniqauthorIt ) { - // name keyauthor = move( uniqauthorIt->first ); - // sendEvent( keyauthor, claimer, "saeclaim"_n, make_tuple( claimer, uniqauthor[keyauthor] ) ); - //} } ACTION SimpleAssets::burnntt( name owner, vector& assetids, string memo ) { @@ -1098,13 +1053,6 @@ ACTION SimpleAssets::burnntt( name owner, vector& assetids, string mem assets_ntt.erase( itr_asset ); } - - //Send Event as deferred - //for ( auto uniqauthorIt = uniqauthor.begin(); uniqauthorIt != uniqauthor.end(); ++uniqauthorIt ) { - // name keyauthor = move( uniqauthorIt->first ); - // sendEvent( keyauthor, owner, "saeburn"_n, make_tuple( owner, uniqauthor[keyauthor], memo ) ); - //} - SEND_INLINE_ACTION(*this, burnnttlog, { {_self, "active"_n} }, { owner, assetids, memo }); } ACTION SimpleAssets::mdadd( name author, string data ) {