From 14fc1d2f234bae51b3d367315be49ca2cdcf2494 Mon Sep 17 00:00:00 2001 From: neodiX Date: Mon, 28 Oct 2024 21:34:47 +0400 Subject: [PATCH] initial version of Blockchain module; for convenience added: isDeployed(Address address) waitForDeployment(Address address, int timeoutSeconds) waitForBalanceChange(Address address, int timeoutSeconds) to Tonlib; --- blockchain/.gitignore | 38 + blockchain/pom.xml | 136 ++++ .../main/java/org/ton/java/Blockchain.java | 203 +++++ .../src/main/java/org/ton/java/Network.java | 7 + .../java/org/ton/java/BlockchainTest.java | 21 + .../ton/java/cell/TestBocDeserealization.java | 700 ++++++++++-------- .../ton/java/emulator/tvm/TvmEmulator.java | 2 +- .../org/ton/java/emulator/tx/TxEmulator.java | 2 +- .../java/org/ton/java/fift/FiftRunner.java | 16 +- .../java/org/ton/java/func/FuncRunner.java | 8 +- pom.xml | 1 + .../smartcontract/SmartContractCompiler.java | 15 +- .../smartcontract/faucet/TestnetFaucet.java | 13 +- .../java/smartcontract/wallet/Contract.java | 299 ++++---- .../main/java/org/ton/java/tonlib/Tonlib.java | 39 +- 15 files changed, 1005 insertions(+), 495 deletions(-) create mode 100644 blockchain/.gitignore create mode 100644 blockchain/pom.xml create mode 100644 blockchain/src/main/java/org/ton/java/Blockchain.java create mode 100644 blockchain/src/main/java/org/ton/java/Network.java create mode 100644 blockchain/src/test/java/org/ton/java/BlockchainTest.java diff --git a/blockchain/.gitignore b/blockchain/.gitignore new file mode 100644 index 00000000..5ff6309b --- /dev/null +++ b/blockchain/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/blockchain/pom.xml b/blockchain/pom.xml new file mode 100644 index 00000000..bbcf2069 --- /dev/null +++ b/blockchain/pom.xml @@ -0,0 +1,136 @@ + + + 4.0.0 + + io.github.neodix42 + top + 0.7.1 + + + blockchain + TON Java Blockchain + + The comprehensive Java TON development framework. + + https://github.com/neodiX42/ton4j + + + + GNU General Public License v3.0 + https://www.gnu.org/licenses/gpl-3.0.html + + + + + + neodiX + neodiX@ton.org + + + + + scm:git:git://github.com/neodiX42/ton4j.git + scm:git:ssh://github.com/neodiX42/ton4j.git + https://github.com/neodiX42/ton4j/tree/main + + + + 8 + 8 + UTF-8 + + + + + io.github.neodix42 + smartcontract + ${project.parent.version} + + + io.github.neodix42 + emulator + ${project.parent.version} + + + io.github.neodix42 + utils + ${project.parent.version} + + + io.github.neodix42 + func + ${project.parent.version} + + + io.github.neodix42 + fift + ${project.parent.version} + + + io.github.neodix42 + tonconnect + ${project.parent.version} + + + io.github.neodix42 + tonlib + ${project.parent.version} + + + io.github.neodix42 + bitstring + ${project.parent.version} + + + org.projectlombok + lombok + + + commons-codec + commons-codec + + + org.apache.commons + commons-lang3 + + + commons-io + commons-io + ${commons-io.version} + + + + io.github.neodix42 + tweetnacl-java-8 + 0.4.7 + compile + + + + junit + junit + test + + + ch.qos.logback + logback-classic + + + org.assertj + assertj-core + test + + + com.vmlens + concurrent-junit + test + + + com.google.code.gson + gson + + + + \ No newline at end of file diff --git a/blockchain/src/main/java/org/ton/java/Blockchain.java b/blockchain/src/main/java/org/ton/java/Blockchain.java new file mode 100644 index 00000000..f493a6c3 --- /dev/null +++ b/blockchain/src/main/java/org/ton/java/Blockchain.java @@ -0,0 +1,203 @@ +package org.ton.java; + +import static java.util.Objects.isNull; +import static java.util.Objects.nonNull; + +import java.math.BigInteger; +import lombok.Builder; +import lombok.extern.slf4j.Slf4j; +import org.ton.java.address.Address; +import org.ton.java.emulator.tvm.TvmEmulator; +import org.ton.java.emulator.tvm.TvmVerbosityLevel; +import org.ton.java.emulator.tx.TxEmulator; +import org.ton.java.emulator.tx.TxEmulatorConfig; +import org.ton.java.emulator.tx.TxVerbosityLevel; +import org.ton.java.fift.FiftRunner; +import org.ton.java.func.FuncRunner; +import org.ton.java.smartcontract.SmartContractCompiler; +import org.ton.java.smartcontract.faucet.TestnetFaucet; +import org.ton.java.smartcontract.wallet.Contract; +import org.ton.java.tlb.types.Message; +import org.ton.java.tonlib.Tonlib; +import org.ton.java.tonlib.types.ExtMessageInfo; +import org.ton.java.utils.Utils; + +@Slf4j +@Builder +public class Blockchain { + + private FuncRunner funcRunner; + private FiftRunner fiftRunner; + private Tonlib tonlib; + private Network network; + TxEmulatorConfig txEmulatorConfig; + TxVerbosityLevel txVerbosityLevel; + TvmVerbosityLevel tvmVerbosityLevel; + Contract standardContract; + String customContractPath; + String customContractAsResource; + private static SmartContractCompiler smartContractCompiler; + private static TxEmulator txEmulator; + private static TvmEmulator tvmEmulator; + + public static class BlockchainBuilder {} + + public static BlockchainBuilder builder() { + return new CustomBlockchainBuilder(); + } + + private static class CustomBlockchainBuilder extends BlockchainBuilder { + @Override + public Blockchain build() { + try { + + smartContractCompiler = + SmartContractCompiler.builder() + .fiftRunner(super.fiftRunner) + .funcRunner(super.funcRunner) + .build(); + + if (isNull(super.tonlib)) { + if (super.network == Network.MAINNET) { + super.tonlib = Tonlib.builder().testnet(false).ignoreCache(false).build(); + } else if (super.network == Network.TESTNET) { + super.tonlib = Tonlib.builder().testnet(true).ignoreCache(false).build(); + } + } + + if (super.network == Network.EMULATOR) { + tvmEmulator = + TvmEmulator.builder() + .codeBoc("a") + .dataBoc("a") + .verbosityLevel(super.tvmVerbosityLevel) + .build(); + + txEmulator = TxEmulator.builder().verbosityLevel(super.txVerbosityLevel).build(); + } + if (isNull(super.funcRunner)) { + super.funcRunner = FuncRunner.builder().build(); + } + + if (isNull(super.fiftRunner)) { + super.fiftRunner = FiftRunner.builder().build(); + } + + if (super.network == Network.EMULATOR) { + log.info( + String.format( + "\nJava Blockchain configuration:\n" + + "Target network: %s\n" + + "Emulator location: %s, configType: %s, txVerbosity: %s, tvmVerbosity: %s\n" + + "Tonlib location: %s\n" + + "Tonlib global config: %s\n" + + "Func location: %s\n" + + "Fift location: %s, FIFTPATH=%s\n" + + "Contract: %s\n", + super.network, + txEmulator.pathToEmulatorSharedLib, + super.txEmulatorConfig, + super.txVerbosityLevel, + super.tvmVerbosityLevel, + super.tonlib.pathToTonlibSharedLib, + super.tonlib.pathToGlobalConfig, + super.funcRunner.funcExecutablePath, + super.fiftRunner.fiftExecutablePath, + super.fiftRunner.getLibsPath(), + nonNull(super.standardContract) + ? "standard contract" + : isNull(super.customContractPath) + ? "integrated resource: " + super.customContractAsResource + : super.customContractPath)); + } else { + log.info( + String.format( + "Java Blockchain configuration:\n" + + "Target network: %s\n" + + "Emulator not used\n" + + "Tonlib location: %s\n" + + "Tonlib global config: %s\n" + + "Func location: %s\n" + + "Fift location: %s, FIFTPATH=%s\n" + + "Contract: %s\n", + super.network, + super.tonlib.pathToTonlibSharedLib, + super.tonlib.pathToGlobalConfig, + super.funcRunner.getFuncPath(), + super.fiftRunner.getFiftPath(), + super.fiftRunner.getLibsPath(), + nonNull(super.standardContract) + ? "standard contract " + super.standardContract.getName() + : isNull(super.customContractPath) + ? "integrated resource at " + super.customContractAsResource + : super.customContractPath)); + } + } catch (Exception e) { + throw new RuntimeException("Error creating blockchain instance: " + e.getMessage()); + } + return super.build(); + } + } + + public void deploy(int waitForDeploymentSeconds) { + log.info("deploying on {}", network); + try { + Address address = standardContract.getAddress(); + String nonBounceableAddress; + if (nonNull(standardContract)) { + standardContract.getTonlib(); + if (network == Network.MAINNET || network == Network.TESTNET) { + ExtMessageInfo result; + + if (waitForDeploymentSeconds != 0) { + if (network == Network.MAINNET) { + + nonBounceableAddress = address.toNonBounceable(); + log.info( + "waiting {}s for toncoins to be deposited to address {}", + waitForDeploymentSeconds, + nonBounceableAddress); + tonlib.waitForBalanceChange(address, waitForDeploymentSeconds); + log.info("now sending external message with deploy instructions..."); + Message msg = standardContract.prepareDeployMsg(); + result = tonlib.sendRawMessage(msg.toCell().toBase64()); + assert result.getError().getCode() != 0; + tonlib.waitForDeployment(address, waitForDeploymentSeconds); + log.info( + "{} deployed at address {}", standardContract.getName(), nonBounceableAddress); + } else { + nonBounceableAddress = address.toNonBounceableTestnet(); + log.info("topping up {} with 0.1 toncoin from TestnetFaucet", nonBounceableAddress); + BigInteger newBalance = + TestnetFaucet.topUpContract( + tonlib, Address.of(standardContract.getAddress()), Utils.toNano(0.1)); + log.info("topped up successfully, new balance {}", Utils.formatNanoValue(newBalance)); + log.info("now sending external message with deploy instructions..."); + Message msg = standardContract.prepareDeployMsg(); + result = tonlib.sendRawMessage(msg.toCell().toBase64()); + if (result.getError().getCode() != 0) { + throw new Error( + "Cannot send external message. Error: " + result.getError().getMessage()); + } + + tonlib.waitForDeployment(address, waitForDeploymentSeconds); + log.info( + "{} deployed at address {}", standardContract.getName(), nonBounceableAddress); + } + } + } else { + tvmEmulator = + TvmEmulator.builder() + .codeBoc(standardContract.createCodeCell().toBase64()) + .dataBoc(standardContract.createDataCell().toBase64()) + .verbosityLevel(tvmVerbosityLevel) + .build(); + + txEmulator = TxEmulator.builder().verbosityLevel(txVerbosityLevel).build(); + } + } + } catch (Exception e) { + throw new Error("Cannot deploy the contract on " + network + ". Error " + e.getMessage()); + } + } +} diff --git a/blockchain/src/main/java/org/ton/java/Network.java b/blockchain/src/main/java/org/ton/java/Network.java new file mode 100644 index 00000000..d88f0463 --- /dev/null +++ b/blockchain/src/main/java/org/ton/java/Network.java @@ -0,0 +1,7 @@ +package org.ton.java; + +public enum Network { + MAINNET, + TESTNET, + EMULATOR; +} diff --git a/blockchain/src/test/java/org/ton/java/BlockchainTest.java b/blockchain/src/test/java/org/ton/java/BlockchainTest.java new file mode 100644 index 00000000..cb2ec141 --- /dev/null +++ b/blockchain/src/test/java/org/ton/java/BlockchainTest.java @@ -0,0 +1,21 @@ +package org.ton.java; + +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; +import org.ton.java.smartcontract.wallet.v5.WalletV5; + +@Slf4j +@RunWith(JUnit4.class) +public class BlockchainTest { + @Test + public void testBlockchain() { + WalletV5 walletV5 = WalletV5.builder().build(); + Blockchain blockchain = + Blockchain.builder().network(Network.TESTNET).standardContract(walletV5).build(); + // Blockchain blockchain = + // Blockchain.builder().network(Network.MAINNET).customContractAsResource("simple.fc").build(); + blockchain.deploy(30); + } +} diff --git a/cell/src/test/java/org/ton/java/cell/TestBocDeserealization.java b/cell/src/test/java/org/ton/java/cell/TestBocDeserealization.java index 02e9bd0e..fe64c6d3 100644 --- a/cell/src/test/java/org/ton/java/cell/TestBocDeserealization.java +++ b/cell/src/test/java/org/ton/java/cell/TestBocDeserealization.java @@ -18,329 +18,379 @@ @RunWith(JUnit4.class) public class TestBocDeserealization { - /** - * issue 70 - */ - @Test - public void testBocDeserializationIssue70() { - String base64boc = "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"; - - byte[] rawBoc1 = Utils.base64ToSignedBytes(base64boc); - log.info("rawBoc {}, length {}", rawBoc1, rawBoc1.length); - log.info("hex1: {}", Hex.encodeHexString(rawBoc1)); - - //FileUtils.writeByteArrayToFile(new File("sample.boc"), rawBoc); - - //deserialize - Cell c1 = CellBuilder.beginCell().fromBoc(rawBoc1).endCell(); - - log.info("CellType {}", c1.getCellType()); - log.info(c1.print()); - - byte[] rawBoc2 = c1.toBoc(false); - log.info("rawBoc2 {}, length {}", rawBoc2, rawBoc2.length); - log.info("hex2: {}", Hex.encodeHexString(rawBoc2)); - log.info(Utils.bytesToBase64(rawBoc2)); - - //serialize - Cell c2 = CellBuilder.beginCell().fromBoc(rawBoc2).endCell(); - log.info(c2.print()); - log.info("exotic? {}", c2.isExotic()); -// assertThat(Hex.encodeHexString(rawBoc1)).isEqualTo(Hex.encodeHexString(rawBoc2)); // TODO - assertThat(c1.print()).isEqualTo(c2.print()); - } - - @Test - public void testBocDeserializationAllConfig() throws IOException { - String newBlockOutput = IOUtils.toString(Objects.requireNonNull(getClass().getResourceAsStream("/allconfig-boc-as-hex.txt")), StandardCharsets.UTF_8); - String cellOutput = IOUtils.toString(Objects.requireNonNull(getClass().getResourceAsStream("/allconfig-cell-print.txt")), StandardCharsets.UTF_8); - Cell cell = CellBuilder.beginCell().fromBoc(newBlockOutput).endCell(); - log.info("CellType {}", cell.getCellType()); - log.info(cell.print()); - log.info(Utils.bytesToHex(cell.toBoc(true))); - - String actual = StringUtils.trim(cell.print()); - - assertThat(actual).isEqualTo(cellOutput); - } - - - @Test - public void testBocIssue74() { - Cell cell = CellBuilder.beginCell().fromBoc("b5ee9c72e20201380001000028250000002400cc00ea01c402a603420374039603a503be03d8044804b8050405ac05ec065606a2076e078e0824084208600880089e08bc08da08f80916093009d80a180b0a0b7a0bc70bea0c0e0cba0cda0cfa0d1a0d380d560d740d900dac0dc80e6e0ef20f160f360f820fce0fee100e102e104c106c108c10ac10cc10ec1196121e12841306132413421360137c142014a014ae14bc14ca14d814e614f415021510151e152c153a1548155615a215b015be15cc15da15e815f6160416ba16c816d616e416f21700170e171c172a1738178417a817cc181918c418e419041951199d19bc19da1a271a731a901aae1afb1b471b621b7e1bcb1c171c321cd81d251da81df51e471e921eb21eff1f4b1f6a1f8a1fd71ff620142061208020cd20ec210c2159217821c52211223022da232723ae23fb246024ad24f9257a25c725e42631264e269b26b827052751276c2810285d28dc2929297529c12a0d2ad82b252b442b522b9f2bbc2c092c262c732c922cdf2cfc2d492d662db32dd02e1d2e3a2e872ea42ec22f702fbd3009309e30ac30ba31073114316131ad31ba31c832153222326f327c32c9331533223330337d33c933d633e4343134e634f435aa35b8366c3720372e377b378837d537e237f037fe384b385838a538b238ff390c3959396639b339c03a0d3a1a3a673a743ac13b383bec3c393c463c543ca13cae3cfb3d473d543da13dae3dbc3e093e163ecd3f823fcf3fda3fe0402e405640aa40b740fa410441e84200420e421d422c423c42e043884430443c444844ce458e4614462646ca478b4794481a483648e74988499449a04a264ae64b6c4b7e4c3e4cc44cd64d7b4de94ea84eaf4f354f464fea504b041011ef55aaffffff11000100020003000401a09bc7a98700000000040101485c0d0000000100ffffffff000000000000000062b2ca7f00001a5752b3ec0000001a5752b3ec042d722c2c0004ee1f01485c09014820d8c400000003000000000000002e00050211b8e48dfb4a0eebb004000600071a8a03482793f3b50aaf5c1948a7daea6509532374f902fe6abeff45f620cb8c99cb00130443feeb6ff454dd7b749d28f509060c2cc668963d39733cf0e844a2880964938114c1372a89491186e2103aabb88851625b18674a78929f3c357ca78e98824227016e016e000b000c1489b85d301a5e194c97f1c275d3ead4bd74c6e4f42bc74ff8ef930e594b8dd9887900084a33f6fda87b6952196d2ab3a76db9754f0792826c8eb9650220c062ca9afc456d18d616915f7809f0e2a9af47f9b741c0d1567a8cc87eb371ae985206197a819b2896f2c00109010a010b010c009800001a5752a4a9c401485c0c493505d505412a231566c8853321bb16a8d291b5c091b6b89f7fb0f4470293ca35028007ab3f46b45071071ce8368191ef3b54ec0db1ad04e1ad4b8e254c89e4022581f2cf4db6b621cfac0f967a6e06286bfd400800080008001d43b9aca00250775d8011954fc400080201200009000a0015be000003bcb355ab466ad00015bfffffffbcbd0efda563d0245b9023afe2ffffff1100ffffffff000000000000000001485c0c0000000162b2ca7c00001a5752a4a9c401485c0960000d000e000f0010245b9023afe2ffffff1100ffffffff000000000000000001485c0d0000000162b2ca7f00001a5752b3ec0401485c0960001d001e001f0020284801010190c062d880448c7c066d5e7f424d3c899b5b7618f97ecf7c54e38dd4c8b25a00013213eaca33f4cbadbd5448172264067fbb377adbe16d7c4681fb55312783f206756a318a5c723a464c78c863a17c0802276f4114c4c8edf27dd9eb88622de8445b07016d00118207cb3d36dad8873eb00023008422330000000000000000ffffffffffffffff81f2cf4db6b621cfa828008400222455cc26aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac23224a27d088a237e001100ac001200ae28480101553f5abf307236fc3eae3b9829943a1b4f895241d07cd2f7fb7106f492a37a4f000222bf000193a937010004ee1f6000034aea52acf0880000d29bdd9fc8200a4106c7d59f0086cde0d05cc99baaddf7a9c5b890aa805e8c96680523524fb4a5a99ff81257e3afd8721409a6a81f22735c0e33400aeb6e7f0a1a5185bb3a3c9deba278be001300142213c3c0000695d4a559e12000b100153201c47dca7c0afc1021a7f8ac40f39fac4e3a34441c180afd0667ef533f08c042258d60f2282e7cde376f0df9fd5ebcc5d8bb19faf6cc57bbbb662485cd76bdce510010000c20004800492211480000d2ba94ab3c2400b30016221162000034aea52acf0900b500172213c480000d2ba94ab3c24000b700182211400000d2ba94ab3c2400b9001922110000034aea52acf09000bb001a22110000034aea52acf09000bd001b2212cc00001a575295678400bf001c2211400000d2ba94ab3c2400c300c4011100000000000000005000213213b82c6f6878b537db3c16dcd5f01397865949762fc38f51cb6aff56594f1062f1edf7f2f7d1549f1d22aab06d9a81c9d49510c3fa6d09dba89fcddb0b8576e4aa016d00118207cb3d37031435feb00068008422330000000000000000ffffffffffffffff81f2cf4dc0c50d7fa828008400223455ee67dd6327a64269ce346e9b1568ef56241f1ba5179cb6d2ac85c5c18646ae12717905e49ef1945ed5b3e03bab93b347378306bc631945e0355ad7507cbada29001b0010cc26aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac23224a2820ffffb7e010e00ac00ad00ae006bb0400000000000000000a42e0680000d2ba95254e1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc028480101173ea53338a2f89f176ad2d6129a90977e8c56e325d959bdf92b7171d9070911000423130103e59e9b6d6c439f580024006a00842313010217dee532a6595718002500260084331392afc8f7cde2b08b147ca948f16cc575bbbd4d383188441e172a5cbc617e05249b737c913fe069b3ce1ce7d550cb95f27f4d428faee54cd295c65c5b9ad7e3ae0027000e01014dad03493b489b5800310032008422130100ca31e1e96b10bbc80027006e2213010058b525488168d908006f0028221301003e470bb61928028800290072221100e1caf7c460aa04680073002a221100e1c6b40db0b41708002b0076221100e11e73378043a2080077002c220f00c021469bdc5408002d007a2210680c021412935422007b002e220f00c021383dbc6da8002f007e219dbceaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa81804265fa43649cc3b15c891620f7db60a685fb7054bcc7b8817f05a7e9b73acdede2200b57bfa000034aea549538700302277cff5555555555555555555555555555555555555555555555555555555555555555407aec10e79c0000000000000695d4a92a711804265fa436495d0008000812313010069341ebbd1eac97800330034008422130100e478e48d695dd1e8008500352848010199c07995a55880a2a97e2d1c235a7dfb6b24666e40158c97f7fafb18707d9e01002228480101a40b78c2e39cf3658d455ad29ca1f2bf10cdb87248a8d293e625f4ff821d3ffe001922130100cae245aca13c29a8003600882213010094b93dc1fd640ba800370038221301007e0f065474a37188008b0039221100f6aa376d88c09a280042009f221301007e00c5c8df3ca988008d003a221301007e00c226bc22c348003b0090221301007dfeec4e6f29f348003c0092221301007dfeec4db9634c680093003d221350401f7fbb08ed8733f2003e009621a1bcd9999999999999999999999999999999999999999999999999999999999998200fbfdd8431e351e0e7f7559f2be451b78ede8267e7a8cb24cabd8236aa272459ca146db75357e502000034aea5495385003f227bcff333333333333333333333333333333333333333333333333333333333333333340756c14c3f00000000000000695d4a92a70e00fbfdd8431e351e16d0009800402355ec05b6c5a0ba9cc563f4263b03448b2038580c84db168a6ea499c5ee5d19ddadc8351566240da1dbc38a3b009a009b00412179a062b1fa1362b37a13000080001d81a245901c2c06426d8b4537524ce2f72e8ceed6e41a8ab31206d0ede1c51dc00ebe70af3ef33d8313797763b95f20009d221100f6a49bd9e38f3928004300a1221100ea59d8cb334c9c08004400a3221100ea59cff28ceadfc800a40045220f00c108ba716ce988004600a7219bbd62f8f7bea30f8ab5e9f16c3fb8642b118f56ed1bdc49600dbe5220c8b1af9e040c474f8074f1d14ce894ceb17ddbe1eb5416175db816dcb3d9b86ecacfe305fc3df0baaa80000d2ba95254e1c00047236fcff34517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf21881f480000000000000695d4a92a7110311d3e017f000a900aa00ab220120004a00e2220120005e00c8220120004b00e4220120004c004d220120004e00e822012000f90056220120004f00ea220120005000ec220120005100ee220120005200f0220120005300f2220120005400f4220120005500f628480101a54022f5edbf4beba0648deeb1ffc566c63567b51e34ccd918ab339bdedfec330001220120005700fc220120005800fe22012000ff00592201200101005a220120005b0104220120005c0106220120005d010800b1bd24ee866df51003f6b534d22c17f58175a943d247f628a0d355a187e86e73bd18acb16cc00000000000002a80000001dd3de5878000001dde15bcd058acb28f0000000000000021800000014bff7ab78000001718cb2138a0220120005f00ca22012000cb0060220120006100ce220120006200d0220120006300d222012000d30064220120006500d622012000d70066220120006700da284801015dc67661a1c1ef1294e875961eea55bea7054c7101bc975ed0aa009be971719a000323130103e59e9b818a1aff580069006a00842313010217dee546c430b718006b006c0084284801013c24d22fb5e19c4c445ed87fd2f21aab05a39914a685834b6a1d0cf004891430016b33134d60714c9ba1d20d9c30bf39735d0ad7bfca9eb3ced50edfdae92a4c3339ef4d25e774489adf29b089b2e31b7a68d28886f450600fefbb6f581b3a94423ffc070027000e01014dad035d591ffb5800820083008422130100ca31e1e96b10bbc8006d006e2213010058b525488168d908006f007028480101256e458a2d80eecd799b387aa5e91b156bc583f9f095f0fcea7b2d73cb3d726e00262848010107983f5e2ef514d990c22499abec1ccb4fd222f7489b7febb2044fe24e39318d001a221301003e470bb61928028800710072221100e1caf7c460aa04680073007428480101d405a7172eafa75f0e67e1b0f52d000222f4399c5d7dda059af11c73faf135a300182848010189afd21725efab9748b8b6ef6dcfd892c9f647a939c73831d4f1dbc786b9ec690016221100e1c6b40db0b4170800750076221100e11e73378043a20800770078284801012b525231768abd4f2fc0464b8e5be011db5ebdb3a1ed6d61eebf186e8dc197ba001528480101b81fe7658c95d0f97eabe671d2b147f2da908bd4813119d475886872068353200014220f00c021469bdc54080079007a2210680c021412935422007b007c284801018916fffc4697fa71347a36028c9c0ab1b54bf2c278f9171f7837101f990665f2001128480101a248b81f22333cc28f6b6744e4298aefcd9b6f2dc5d7c99e1da1b28c37f3aa0c0007220f00c021383dbc6da8007d007e219dbceaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa81804265fa43649c9d338c13843e706c68e2455ed70bbf93820f28a394eec0b616e855fce8e6cac000034aea567d807007f284801010143b3d2dd671b2559543155e003f847022e510b3a57afabbca05d4069c327ef000d2277cff5555555555555555555555555555555555555555555555555555555555555555407aec10e79c0000000000000695d4acfb011804265fa436495d0008000812848010164a43970f2007a1da6d6fc81773cc095d1cc270e81359e471f3b03469abeb7b5000c214900000027cbb9d1062954439a83a91f27835fb9d2e3e798910356650c3c493c94623464684000ac28480101afccd0b5d74a6fad14fcb8652b14eea3d3d7ad0226c0961aa9992a1f0c2997c1002322130100e478e4a1873531e80085008628480101a5a7d24057d8643b2527709d986cda3846adcb3eddc32d28ec21f69e17dbaaef0001284801016161938bf6cbbbea618b3c71572f00d9392090c9f15e70d1ef9080503b42229c002322130100cae245c0bf1389a8008700882213010094b93dd61b3b6ba80089008a28480101b4d986be6da4a385ebc4d75e7b6864ddae73e6e6431f711cbb3208dfb35945750024221301007e0f0668927ad188008b008c221100f6aa376d88c09a28009e009f284801012234afc4f9aa54d36f371ab851ada0446bbab533a15161ca6f4afd77d69d89520012221301007e00c5dcfd140988008d008e2848010103f584b35917a807e8a2ec65376c8ed2c6ccecf273ba8cb55dbacfe29a84a6140013221301007e00c23ad9fa2348008f0090221301007dfeec628d0153480091009228480101735d9d54218cf8454bd30b70a53ae0de4219178b78f457b844f50dc11b5719f00013221301007dfeec61d73aac6800930094284801017cc50a2d61f5f6979db4641a9451edade1fb234111081a83333a2b03ce9dc373000a2848010110cac8bd77fa246c2bc95d0269759b612312bbc0438ed5eb7dd53116e55e9020000b221350401f7fbb0df4fd0bf20095009621a1bcd9999999999999999999999999999999999999999999999999999999999998200fbfdd86b59e3de15e7c728be36b6cb9aa8d1663f3d4c1e962ab20459e6e56ae211a233bc1e24f52000034aea567d80500972848010150725eee52e86432f846698a08ac153a67bc9ad9c160130af907c3bef05f29480007227bcff333333333333333333333333333333333333333333333333333333333333333340756c14c3f00000000000000695d4acfb00e00fbfdd86b59e3de16d000980099284801016217f872c99fafcb870f2c11a362f59339be95095f70d00b9cff2f6dcd69d3dd000e2355ec05b6c5a0ba9cc563f4263b03448b2038580c84db168a6ea499c5ee5d19ddadc8351566240da1dbc38a3b009a009b009c28480101fb16d1ca45ecb8d4d1f6b1ac903c630cc06f78334bc9b84bf30585e9422cb887000b284801018f1bd34960aa509ff15ef8c648fdcb942bb7a6c14bda5d4988792ce1c7800bee00062179a062b1fa1362b37a13000080001d81a245901c2c06426d8b4537524ce2f72e8ceed6e41a8ab31206d0ede1c51dc00ebe70af3ef33d831379c7db16df20009d28480101e9988188b13457c31092fcc241e6b801ab7dc39b30a0923557a193630fef257f000a221100f6a49bd9e38f392800a000a128480101c6100af2020b8ed627f48ec736f2cfa52e095b513479105a028f40e152c9586f0016221100ea59d8cb334c9c0800a200a3284801011e20584a9cf50091fb4dddfe4d2e98f8c879438cc843e24314604b44cb6f78580012221100ea59cff28ceadfc800a400a52848010141d3f8101f423d32b2cdb23d98d0f34f83db175e427605500093f4a31cd8df03000b28480101e2bc337ece7f3af5171f3265f44c612fc2fcba87f4b4563dc7fdc3285dd6a44d0008220f00c108ba716ce98800a600a7219bbd62f8f7bea30f8ab5e9f16c3fb8642b118f56ed1bdc49600dbe5220c8b1af9e040c474f800b0df7369fde2be70ee4d2e84a552cab4b035685314de3d2e8e12b8d25aa27ae80000d2ba959f601c000a8284801018e634c5cb159b3914109244a95171c97fe56c7ad67ec709cce94bb067893af680007236fcff34517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf21881f480000000000000695d4acfb0110311d3e017f000a900aa00ab284801017269fb9feb45d719ebdbc3b0816b987bab06f43378dc84dc84d55727905482140002004811fd096c000000000000000000000000000000000000000000000000000000000000000028480101986c49971b96062e1fba4410e27249c8d73b0a9380f7ffd44640167e68b215e8000328480101b4ff459f14a389ff7d6ea967ec8d5329f3cff84a787a7c1fcb6e3d447b6175e5001022bf000193a937010004ee1f6000034aea549538880000d29bdd9fc8200a4106c7d59f0086cde0d05cc99baaddf7a9c5b890aa805e8c96680523524fb4a5a99ff81257e3afd8721409a6a81f22735c0e33400aeb6e7f0a1a5185bb3a3c9deba278be00af00b028480101b20e36a3b36a4cdee601106c642e90718b0a58daf200753dbb3189f956b494b600012213c3c0000695d4a92a712000b100b222012000c500c628480101258d602eaa21d621634dcf86692aeae308ff3cf888f3edafc6a5b21848d732f900182211480000d2ba95254e2400b300b4284801014b01ebcf5425735461aa8b83bae89e70fa21e95d2ee85e57b05dad26c1d6d5300016221162000034aea549538900b500b6284801019523e298bdc5f691343d880493b8a6451f3f941c985a7c4a167ba0e1cdb4599600132213c480000d2ba95254e24000b700b82848010137844b3a6262ee12ef028d6b8968b779c5be75d93a7dc1838aba9408a360ea42000e2211400000d2ba95254e2400b900ba28480101ce05363b2c4d123e6af0a2c3edbe06e05e4b55117180062e69624e00f64ae2a7000c22110000034aea5495389000bb00bc28480101aad2366c8dcad53c429dfbea0cd1c479cc6b989ef981314b1382fd58de7c8afd000b22110000034aea5495389000bd00be284801015af875e56b2c21860165b66c58883a203401027a269c372667df9eb27b476259000a2212cc00001a5752a4a9c400bf00c0284801013eb4f392dec5652b5e530a0922b5533c816263d761c0775349d4265cd85bd761000322110000034aea5495389000c100c222110000034aea52acf09000c300c400a9d00000695d4a92a710000034aea54953880290b818926a0baa0a8254462acd910a6643762d51a5236b81236d713eff61e88e0527946a05000f567e8d68a0e20e39d06d0323de76a9d81b635a09c35a971c4a9913c9284801016e527b5263548e810db4a6e4a1f87c5c20d1c7859c8a5e2113127c954400e7b900012848010192f515d5126f2a2fe83d0204780eb95ac49143dae652a6a618f650997621e09a00013201d970752cf49fb39f7ea882f429ef6a8a5ce3eaf9ff4d35bfba6d93ffc9e2a7368180f9da67bd40c08ccea6759238e3e79b631d22aa1dc395bbcec337be6d4e84000f000c2000e100e222012000c700c822012000c900ca284801012a31c24fa32c257e4912fc641c19d5679a5359fb89020b7fe030e3b104be570f000e22012000cb00cc28480101f8b1119a3146337e09b6a8bbd36f93c78f448ea18e0591af0a3726033c7b5345000c2848010136a19e11f370f7b9cf36d83e0cdb68ea6f02ebe02487e3a5ca264a2baa6cd0d8000c22012000cd00ce22012000cf00d0284801015fb934835d63076694fbd0ca2191f6219a2017bfee8370008d48729374463b93000b22012000d100d228480101d98bd6122c9ac0cd3bb56dd7127ca09ede8c606fcb15de38baa4b47f7fe51f04000922012000d300d4284801011bd2caf8f41ad27d29c9c0d34e01bc0457050b3e5cce1754ec06a5fef2e688af000828480101d3073a3cbcbb4a650ca94a719590f8460e5f51d6081fcea01e7e51cfbc60a444000622012000d500d622012000d700d828480101ab9eb8899afa5c8bb9368d94781cf3ebb2eac7fb017a2b6133f9bb7b0e5d7b85000528480101664d4a2f536f0763f76857ceb94de20b4fad7e80b85675b3d02cf79a319b467e000122012000d900da02012000db00dc284801010f0ee7d20301abe555b4a76a6ada745283de3664ecb09ba794fec4d44db79b68000300b1bd1148769c03366e79fc451b06179e791641db92df408fd46e6ffe7ad24d90a90000000000000000000000000000000000000000000000000000000018a8fe848000000000000014000000006740cdc84000000b659904b9a002012000dd00de00b1bce1814fe876c4b4657ef4585f2f9b9158201e2fc77698c43e68104b88fe4ab2314e7cf70000000000000066800000039c368aef00000040a8c4d343b14e7b67800000000000003b000000040b2e294300000028134825e0c002015800df00e000afbc6d1a11a99e030e7005cac69de1a3cdeea9807743355fbf293f897e485ac868c54bf1b80000000000000124000000091627b10a000000bd5670281ec54bf2a8000000000000011400000006eaf842ee000000a8472576d100afbc6f013e1c5535e8ff36e8381a2acf51990fd66e35d30a40c32f50336512de48c56594fe00000000000001440000000ce66b410a000000d9c852602cc565938800000000000000d40000000de9bcb146000000935ab614cd22012000e300e4284801014356834a429921990e0c978c594d3d7734b7cd96dd66c057aa786ccf4f5a258c000e22012000e500e62848010134a3bc4b6c672bb70328222747df9434117f6ee5953dc9447b945d42862c585f000c22012000e700e822012000f900fa22012000e900ea284801016b54a1df1176e4608f655e63cf51ff3deec889dcf9229cceb100c32a12d3288e000922012000eb00ec284801015d23a19db6638756e655885d66767ab5ca9c7044b8d6263da018629630bda2a5000822012000ed00ee284801014e72d9d9406765832f323a591918a7b8cdb1acdbcbdeab3f2bcbc4c93fbc1f99000922012000ef00f02848010138b4953e5411a45c37899ce1936780cec049051f53d3a16bad52de7c7609476e000622012000f100f228480101a9cf62c6624684d83857a4381d9d525efe2e2d5bafd839d9893f80beeaa43f70000522012000f300f428480101d1a07de28968f21c0c3cfe0e69605731ae68b71969d27dd270f99b4079019904000222012000f500f6284801018d455e04c00fba1289866da39c0793758c8d6a4e41ca2dd5ec2c03c76df76c42000302014800f700f82848010122863015f2ff93c8dfe54f980440d8b3b2bd946770d126f32325fc9c8e37cb2e00020073de48c56594fe000000000290b818000004b380fb4ef8000090e500f4af24c56594fe00000000153ae540000004efd6476f22000098db0ac6ce1f00b0bc914560076a5a3e2f68770608073c7920cd095fd22f6624cdc5631150352c9400000000000000000000000000000000000000000000000000000000629df4ce000000000000004000000004a9d9195a0000002b5c8e819328480101d2fc779057e6ebb9d8413f029999ad6426bdc42b841578ba4f1302565b3bb3b8000a22012000fb00fc22012000fd00fe2848010166827a7a38f195b34597175fc019e4dc80b6f714f0b51a2369270417305747e1000922012000ff010028480101cef4f4863fe525820f12b7c79bbc2276d0fdb7e300c55d70d809bfdef1e801f5000728480101c76ad89ed6929dfcdcbaaa4f5720981c659c02b305514971803760369f7017650006220120010101022848010138e8cca37bb83b168adc87a7037092d90c734af074cace4ae828e0cf82b67b30000422012001030104220120010501062848010150d30f1a3fd6f709f0627934b2b31be081dc25bc52b51a353f850efa09ad224d00022201200107010800b1bd635fefc47229e53988915685933558fd7303875055c5949d871dc2688df796800000000000000000000000000000000000000000000000000000000c54be8f6000000000000007e0000000e610f41dc000000593a932aa9000b1bd24ee866df51003f6b534d22c17f58175a943d247f628a0d355a187e86e73bd18acb16cc00000000000002a80000001dd3de5878000001dde15bcd058acb29fc000000000000021c0000001814ffc698000001752c06e7e202848010160ce52c8bd8ed7f87a7643812f7690467a604fcff9ba1811d065a34a0202d78f000201038020010d00010211011366ea62c6b62574b18990480a15bd04daf2d4d5c8e3413a8f62b0ff533b259b00078201150317cca5687735940043b9aca004010e010f01100247a00d9b55c39995181e04934d61a2baf0f5aa35a4e059bb4c55f309227aee336c95200610011401210103d0400111003fb000000000400000000000000021dcd650010ee6b280087735940043b9aca004010150011301db500cc320a00a42e0680000d2ba95254e000000d2ba95254e0850d8a46888759f13cd17310cd46d6e9e821d494944c72f183259690def72a1a5a15278d7e6ad8df707446b0df93af44f8aca68c8a6c286121567c529e8dd7088800027779c00000000000000000a42e04b159653da0112001343b9aca0021dcd6500200201610114012101064606000125020340400116011702037604011801190297bf955555555555555555555555555555555555555555555555555555555555555502aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaad000000695d4acfb00c1013201340397beb33333333333333333333333333333333333333333333333333333333333333029999999999999999999999999999999999999999999999999999999999999999cf80000695d4acfb00040011a011b011c0397be8517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf029a28be3defa8c3e2ad7a7c5b0fee190ac463d5bb46f71258036f9488322c6be7cf80000695d4acfb0004001270128012901035040011d0103404001210082724a765bd03de7e557d03d203239641e4570953914b82a806fdbc2fa10f8c5e3b7e1cb96b8a440f43d5cc8d5334f00711345b647d43e5837cf367741c70934d23703af7333333333333333333333333333333333333333333333333333333333333333300001a5752b3ec0173fbaacf95f228dbc76f4133f3d46592655ec11b5513922ce50a36dba9abf28100001a5752a4a9c262b2ca7f00014080133011e011f0082724a765bd03de7e557d03d203239641e4570953914b82a806fdbc2fa10f8c5e3b78d942e903175e0ffe9857660057e1e7e904397d1bd95e61a0dc318aaabb1b31f02052030240120013700a0431b9004c4b4000000000000000000960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003af7333333333333333333333333333333333333333333333333333333333333333300001a5752b3ec0246660377de4bc319a5038b872892ad701fa6a7f2783ecefd07a68cb4fe32f8b700001a5752b3ec0162b2ca7f00014080122012301240101a001250082728d942e903175e0ffe9857660057e1e7e904397d1bd95e61a0dc318aaabb1b31fe1cb96b8a440f43d5cc8d5334f00711345b647d43e5837cf367741c70934d237020f0409283baec018110126013700ab69fe00000000000000000000000000000000000000000000000000000000000000013fccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd283baec0000000034aea567d800c56594fe40009e42614c107ac00000000000000000640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001035040012a01035040012d008272f46adf2640fb8c30d7d053c9c4084f8daeda7399e261dd404d1578691fcb5bd75f4f3be7c22b3f846e0fc1aa8c5ccb4ed9a7e5acc35369f076448359df9b18eb03af734517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf00001a5752b3ec01e9e3a299d1299d62fbb7c3d6a82c2ebb702db967b370dd959fc60bf87be1755500001a5752a4a9c362b2ca7f00014080133012b012c008272f46adf2640fb8c30d7d053c9c4084f8daeda7399e261dd404d1578691fcb5bd7b43acc176be3014d5645fa082b16fe872be1c3b8428621bc03e49a5bc0cf7db202052030340130013103af734517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf00001a5752b3ec0372f7b0548efa5c07fc58c3051d80c9f650039701e834559eabe556240894c83400001a5752b3ec0162b2ca7f00014080133012e012f008272b43acc176be3014d5645fa082b16fe872be1c3b8428621bc03e49a5bc0cf7db25f4f3be7c22b3f846e0fc1aa8c5ccb4ed9a7e5acc35369f076448359df9b18eb02053030340130013100a042665004c4b400000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069600000009600000004000600000000000519ae84f17b8f8b22026a975ff55f1ab19fde4a768744d2178dfa63bb533e107a409026bc03af7555555555555555555555555555555555555555555555555555555555555555500001a5752b3ec03e61d8ae448b107bedb05342fdb82a5e63dc40bf82d3f4db9d66f6f11005abdfd00001a5752a4a9c362b2ca7f0001408013301340135000120008272010f24a4cdf5d7c0f8497739ff731e5175cd3f10069c838b4445caf821c4cf4e6ca0ffac88c5927e1becceb3949e8aa3388a1cd3e5405413900cce63ed93f19902053030240136013700a041297004c4b40000000000000000002e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005bc00000000000000000000000012d452da449e50b8cf7dd27861f146122afe1b546bb8b70fc8216f0c614139f8e04a5134191").endCell(); - log.info("CellType {}", cell.getCellType()); - log.info(cell.print()); - log.info(Utils.bytesToHex(cell.toBoc(true))); - log.info(Utils.bytesToHex(cell.getHash())); - } - - @Test - public void testBocIssue3() { - Cell cell = CellBuilder.beginCell().fromBoc("b5ee9c72e2020152000100002a490000002400cc00ea0180026202fe033003520361037a03940404047404c0056805a8069a06b4075c079c0806087608c30a160a3a0a5e0b0a0b2a0b4a0b6a0b880ba60bc20bde0bfa0c160c320cd80d5c0d800da00dec0e380e580e780e980eb60ed60ef60f160f360f560f76102010a8110e119011ae11cc11ea120612aa132a13761442148f14ae154415621580159e15bc15da15f81616163416521670168e16ac16ca16d816e616f417021710171e172c173a1748175617641772178017cc17da17e817f6180418121820182e187a1888189618a418b218c018ce18dc18ea18f8190619521976199a19e71a921ab21ad21b1f1b6b1b8a1ba81bf51c411c5e1c7a1cc71d131d2e1d4a1d971de31dfe1e4b1e661f0c1f591fdc2029207b20c721122132217f21cb21ea220a22572276229422e12300234d236c238c23d923f82445249124b024fd251c25c62613269a26e7274c279927e5286628b328d0291d293a298729a429f12a3d2a582afc2b492bc82c152c612cad2ccc2cda2d272d442d912dae2dfb2e182e652e822ecf2eec2f392f562fa32fc0300d302a3077309430e130fe314b316831b531d2321f323c325a3308335533a1343634443491349e34eb34f835453552356035ad35f936063653366036ad36ba370737143722376f377c37c937d6382338d838e6399a3a4e3a5c3aa93ab63ac43ad23b1f3b2c3b793b863bd33be03c2d3c3a3c873c943ce13cee3d3b3d483d953da43df13e683f1c3f693f763f843fd1401d402a40774084409240df412b41384185419241df41ec41fa42ae43624416442244284476449e44f244ff4542454c463046484656466546744684472847d0487848844890491649d64a5c4a6e4b124bd34bdc4c624c7e4d2f4dd04ddc4de84e6e4f2e4fb44fc65086510c511e51c3523152f052f7537d538e54325493041011ef55aaffffff11000100020003000401a09bc7a9870000000004010173ed450000000100ffffffff0000000000000000634e93ea00001d3677b8338000001d3677b83384955d862e00058edb0173ed410173bfbec400000003000000000000002e00050211b8e48dfb4a0eebb004000600070a8a040a13051bcbbbdeccd56f979164b7da81b8e49732e7215334e2b8ce57c41888d03190bd932f59e8bcca9b92cd1032c316407ca6099409a8aedf4146f39e95ffec016e016e000b000c14892736daee89910b52d7041a889bf97c864cfc84eeafba291a1b5b2e931cc1b5e800084a33f6fd0be55a2d75c3eae367b5ba338705f0319041b70e23a5c9b65374cf2739898e58f78b372f9292751451def1be4dc7cf494ef17470574d85c253ef77746b8ea127c00123012401250126009800001d3677a8f1440173ed443de180887d5f5a84d44bd19c87cbb664b0561d5eb81da88c5782b0e36e9a07e4d7fd7d801561f54bffc0cb5c4ec4e855deeeeb6fdf26d4c99a086ffafb93580a022581fa7454b05a2ea2ac0fd3a2a5d348d295400800080008001d43b9aca00250775d8011954fc400080201200009000a0015be000003bcb355ab466ad00015bfffffffbcbd0efda563d0245b9023afe2ffffff1100ffffffff00000000000000000173ed4400000001634e93e700001d3677a8f1440173ed4160000d000e000f0010245b9023afe2ffffff1100ffffffff00000000000000000173ed4500000001634e93ea00001d3677b833840173ed416000110012001300142848010124871f46ee0eb1ae00a27d5c29f6cdbcc378c1f4f1380805ff2297c9ed9fcf2200013213a09776db739953220712f110cafb8c5d8dc0fab70e9391a4894fc7cc8706b210f3282d0d6691f0235fdd6b31911b4bd49619c99ab3dbcb80305cea71d75d2eb0016d00128207e9d152c168ba8ab00018009122330000000000000000ffffffffffffffff81fa7454b05a2ea2a8280091001634558d88cb7e0929c9a44ffc1cf3c5a230c0db9b7ba3f7e489ee00f8289579a5c967d13c5fdbab5e261b0b55885aa0a63abbc4487521903d912f3e35c296ad0eb23d001b0010cc26aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac23305e8350c57b37e003f008e004000410111000000000000000050001532139abefb5447ac011734d52324dd76a05aff0775b45c928601222624dbc2141bf2fa4c3e38ec56db5fc900c7c628d963f6fd5f016fdbf141f3f5ae91c3314e7b7f016d00128207e9d152e9a4694ab00072009122330000000000000000ffffffffffffffff81fa7454ba691a52a828009100162455cc26aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac23305e83a13cd8b7e0128008e00170041006bb0400000000000000000b9f6a280000e9b3bd478a1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc028480101de5adf45c03a745fc9d3a418d9e2ba096db9c1aaa77bc0898b6d9ebb611d2b40000532bfe179ee8495cd144a2f6d30950db2d48088fac5f9a778519dc0114219bf54cead2e7212dcdf398af721e9e425782d575b6c4026b7ec52ea1d3fe9dbb2bbe2aecf001a0010000100f59f3900058edb600003a6cef51e28880000e99c6da994200b9dfdf25ea78c41c94e4584ff2623b917b789f5d0e6a859861410542cb94e76fdc6efde77dc19b6aa8de0d4ad05651468c38cb9f64e1f8cf1351de6d5a7d98d56d6ded0be00bb00bc23130103f4e8a960b45d4558001900740091231301022a87a0b197c88778001a001b0091331367865aed64db08164a3138d816a8cacbb8b8fa46bc1fd1023ef5bd4e8fb6299ddc6201a0bfe76f22f36ca8ad0c54aa645c5739752b0a53bac3e57e9dda18febd0027000f01015ec2a32762fd21d800270028009122130100cbc4fd8a34cb65a8001c007822130100596b57d9c1932d880079001d221301003f0bad3989c46848001e007c221100e0b187aea6583a68007d001f221100e0a7528c0ef9512800200080220f00c141a6498c4d0800810021220f00c02225548664a800220084220f00c0221de12e910800850023220f4030085e7768002a00870024220f00c02170f2272c280025008a219dbceaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa818042d76318e19f365e6f7e0780eb2bc9f0c382940ef38b61bb6257ad617eb36fe8c9f56964f2800003a6cef51e28700262277cff55555555555555555555555555555555555555555555555555555555555555554085ac1288e0000000000000074d9dea3c5118042d76318e195d0008c008d2313010068a1a14c598fee380029002a009122130100f62101db096d33a80092002b28480101357b3e386bb95837e17d8fc7dd37f292efdc3301f6e109d8b33eb8a02afbb95d002228480101df3229c929cdae91378fd16242bda5a97246c54da4e9700d7427829825ee7b5d001922130100dd08f96dc461bcc8002c009522130100a6df074312541a08002d002e22130100902873121142a0c80098002f221100f6b6943101117948003900ae2213010090175c7b3161aee8009a0030221301008fb45fdc97d252080031009d221301008f689e5fb80803e80032009f221301008f677b3e09283ac800a00033221301008f677a70024cc70800a20034221301008f6779cbfeb8f188003500a521a1bcd99999999999999999999999999999999999999999999999999999999999982011ecef393af6d61933fe8eada66c79771a5de359b379b70bfe4414022dee90877585c9818f39dda000003a6cef51e2850036227bcff33333333333333333333333333333333333333333333333333333333333333334081ac1664bc000000000000074d9dea3c50e011ecef393af6d6196d000a700372355ec039e4242ff8cc69bf4260c44ddc7b820f838fa85ad1828d2b83ace409d6c02a3b89a505ac592d94a7c4d00a900aa00382179a0634dfa13634f7a130000800006226ee3dc107c1c7d42d68c14695c1d67204eb60151dc4d282d62c96ca53e26c0100ee542c8b882e30ec339334e5ca000ac221100f6a2a63eab3d4e48003a00b0221100ea5905b0b329bd88003b00b2221100ea58fcd0996ec14800b3003c220f00c035987df0cb08003d00b6219bbd62f8f7bea30f8ab5e9f16c3fb8642b118f56ed1bdc49600dbe5220c8b1af9e040c474f803d1a0544cba813425adf3253dd3727a789c9e418b5e788a4cab5df805caee92b00000e9b3bd478a1c0003e236fcff34517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf21881f48000000000000074d9dea3c5110311d3e017f000b800b900ba28480101db29f7a5808e1a673feb2258d777f3005642991b8025b1f92bcd7c498a8bd8ed000222bf000100f59f3900058edb600003a6cef335e0880000e99c6da994200b9dfdf25ea78c41c94e4584ff2623b917b789f5d0e6a859861410542cb94e76fdc6efde77dc19b6aa8de0d4ad05651468c38cb9f64e1f8cf1351de6d5a7d98d56d6ded0be0042004328480101b20e36a3b36a4cdee601106c642e90718b0a58daf200753dbb3189f956b494b600012213c3c000074d9de66bc12000bd004432014645ed4db913f636932b4bebb489b51112e1a415136d57d6c6735ffc4bd556606e33f960111aa97c043f6040c47d1298da52d6a46a0378304ba87f61f3dee9db0010000c20005100522211480000e9b3bccd782400bf00452211200003a6cef335e09000c100462211200003a6cef335e09000c3004722116200003a6cef335e0900c500482211200003a6cef335e09000c700492211200003a6cef335e09000c9004a2211200003a6cef335e09000cb004b2211000003a6cef335e09000cd004c2211400000e9b3bccd782400cf004d2211000003a6cef335e09000d1004e2211400000e9b3bccd782400d3004f2211400000e9b3bccd782400d500502211d000003a6cef335e0900d900da220120005300f822012000dd006722012000540055220120005600fc220120010f005f220120005700fe2201200058010022012000590102220120005a0104220120005b0106220120005c0108220120005d010a220120005e010c28480101f25a1e1d7f11115186543ff6eb95e3d9b98f71d2c959af6b0dad6b63cd1e6d6900012201200060011222012001130061220120011500622201200063011822012001190064220120011b0065220120011d006628480101a96f5d75bc79b8d1640e680704965baaa2245e4b3a5ad8e980ef5a3568409418000222012000df006822012000e10069220120006a00e422012000e5006b22012000e7006c22012000e9006d22012000eb006e220120006f00ee220120007000f0220120007100f2284801016f2780ba9d3cdce8eee34a23d893d90800da0ac1be8a973c513909136b7f636b000223130103f4e8a974d234a558007300740091231301022a87a0c5b59fe77800750076009128480101827773c365eccfd6cb46a3f783a09f1aba77ce1a0a4d62048569e9b845e955f8016b3313e844a4da57b7cf2b0b52b004cc5886c966478e37012ee2d9b473bf083e1e3072beee68024dd8cc7dffdfde9e114e4818dc10824b446d661453963fa117c1fcbf0027000f01015ec2a33b80d481d8008f0090009122130100cbc4fd8a34cb65a80077007822130100596b57d9c1932d880079007a28480101cf20bddca78403c3e40e2ab1b3eeb526c425b5efb531e6c5bd3d52019c25125c002628480101ff7081e66c7f0d6e868021316b0189b9e67b61284c176cd74f78fa6baa18a025001a221301003f0bad3989c46848007b007c221100e0b187aea6583a68007d007e284801011d818de56750d053b2a227f0da85ba37fb1869d0c774629d04e2668e1204c0a3001b28480101174c3878604468b08b7b76f5349c41201ae28b81ca1d94794ab11a692e4668250018221100e0a7528c0ef95128007f0080220f00c141a6498c4d080081008228480101e00721ae4b2be2ed708fa68e6b7bec2759a107504812069b3b8aa9acea346c66001528480101747c06e45f53ca1dc7d23f39db07d12f2e67fa595a36fa41d26683ab42d1a3040014220f00c02225548664a800830084220f00c0221de12e91080085008628480101eb38ef90c590bedb3ce31140d2d4176d43db6b7aab35df685afc4ccf2a383209000b2848010179a2e20b8a926ab2fe83108ff00f2fbced9958047008e5cb5fdf8c798aab63850010220f4030085e7768002a0087008828480101a248b81f22333cc28f6b6744e4298aefcd9b6f2dc5d7c99e1da1b28c37f3aa0c0007220f00c02170f2272c280089008a219dbceaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa818042d76318e1805a8c67376726b2dcf563d47e9c2ed6fa8fd993942535d6c8ed758902593e99400003a6cef706707008b284801010143b3d2dd671b2559543155e003f847022e510b3a57afabbca05d4069c327ef000d2277cff55555555555555555555555555555555555555555555555555555555555555554085ac1288e0000000000000074d9dee0ce118042d76318e195d0008c008d2848010164a43970f2007a1da6d6fc81773cc095d1cc270e81359e471f3b03469abeb7b5000c214900000027cbb9d1062954439a83a91f27835fb9d2e3e798910356650c3c493c946234646840008e28480101374e198a900e08edc634a5f2ad73e388b0a3019d24269fae8046024e437476b1001028480101903aa268fecbed38822a8972ba42eadb53c0972f11b8486f1534210245db4898002322130100f62101ef274493a80092009328480101a5a7d24057d8643b2527709d986cda3846adcb3eddc32d28ec21f69e17dbaaef0001284801012bd772e408a34578028922281a3e5b5384970a6a6dd741b1cfa3b80a3e5ec57d002322130100dd08f981e2391cc80094009522130100a6df0757302b7a080096009728480101b90ed7fc04a4971294b12a078ec8189e8fdba184de6e23043922a774ae403ee2002422130100902873262f1a00c800980099221100f6b694310111794800ad00ae28480101eda54e0b0237690499c3e159ab800469fdbcb3c162d42181c2c298acd4e98f3100152213010090175c8f4f390ee8009a009b28480101cc6ead611f9fa7c0598d8f88d658fe0b91f5f9c9635c872154234c16c722970c0014221301008fb45ff0b5a9b208009c009d221301008f689e73d5df63e8009e009f28480101c7c146bea2ced23475861d11146c0560a46c3d243563fda0e32bf8c34229d2670013221301008f677b5226ff9ac800a000a128480101ef1aa8b2068cf6a8eadef8197235a5d5976865a32a3ad1fe80db069ddb8cc2fe001128480101c2ef35325f62d0b4cc17d1f5d083894100c3c478504d70b6eb8d3cf26e604ff40011221301008f677a842024270800a200a3284801018a51fe69422dbf7e028fb1dcac5a62064eefeb4c080793e78a24ef22334b307c0010221301008f6779e01c90518800a400a521a1bcd99999999999999999999999999999999999999999999999999999999999982011ecef3bbeb1c21823653419f6ebabf10f7978dae7e33a12d3bbe9815917a62eb4fe902f2a96e88600003a6cef70670500a62848010150725eee52e86432f846698a08ac153a67bc9ad9c160130af907c3bef05f29480007227bcff33333333333333333333333333333333333333333333333333333333333333334081ac1664bc000000000000074d9dee0ce0e011ecef3bbeb1c2196d000a700a8284801016217f872c99fafcb870f2c11a362f59339be95095f70d00b9cff2f6dcd69d3dd000e2355ec039e4242ff8cc69bf4260c44ddc7b820f838fa85ad1828d2b83ace409d6c02a3b89a505ac592d94a7c4d00a900aa00ab28480101ff06225996392d9e78d92fef981828f3459892841111b2d352901236d506cb65000b28480101336df3bd068890e3f26c1a8f5e77c4bf7cc3c81fc88006ab614b6db43647262600072179a0634dfa13634f7a130000800006226ee3dc107c1c7d42d68c14695c1d67204eb60151dc4d282d62c96ca53e26c0100ee542c8b882e30ec389aaabdca000ac28480101b8ad45439ed0f9f1ffb12362a0c0a6f522734feed11dda077d5f6067f1305170000b221100f6a2a63eab3d4e4800af00b028480101e2a96bbff9be849635722263833d77a90f0a832b410f8b73bca56041fd7e21970016221100ea5905b0b329bd8800b100b22848010130dd0d5ef5796dc4c101fbf5b4b083599e509d0f738b07a8dbfad6b5ae53aecb0012221100ea58fcd0996ec14800b300b42848010130219e3c8c788af6da8a296da6f3e9925c909eed9821a0ae1911c38f56f7b37e000b28480101e2bc337ece7f3af5171f3265f44c612fc2fcba87f4b4563dc7fdc3285dd6a44d0008220f00c035987df0cb0800b500b6219bbd62f8f7bea30f8ab5e9f16c3fb8642b118f56ed1bdc49600dbe5220c8b1af9e040c474f804c5ac6247ef1e5d11d080c3d8b21135b54598a72e11fbc6ebe1fa0c4b2a7df0a00000e9b3bdc19c1c000b72848010118dd0a8040c21a2cfb6c0acf4ad636dc67ef3ab0a3e102f1b43ad500c55728d00007236fcff34517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf21881f48000000000000074d9dee0ce110311d3e017f000b800b900ba284801017269fb9feb45d719ebdbc3b0816b987bab06f43378dc84dc84d55727905482140002004811fd096c000000000000000000000000000000000000000000000000000000000000000028480101986c49971b96062e1fba4410e27249c8d73b0a9380f7ffd44640167e68b215e800032213c3c000074d9dea3c512000bd00be22012000db00dc28480101258d602eaa21d621634dcf86692aeae308ff3cf888f3edafc6a5b21848d732f900182211480000e9b3bd478a2400bf00c0284801014b01ebcf5425735461aa8b83bae89e70fa21e95d2ee85e57b05dad26c1d6d53000162211200003a6cef51e289000c100c22848010165b0a85a0fdea0c76a2a98445623ea62427099a6318624794dea416f1bdc6f5c00152211200003a6cef51e289000c300c428480101b5b64686c719580155341cb7347af0405dec7158c283ad30833b07325bdc48a5001422116200003a6cef51e28900c500c628480101fde4f74a9866e3de066d6d27e3b1fe107053ecce8b54d8b05ebf4a3b0789c26b00112211200003a6cef51e289000c700c828480101f7a4391731a8136b142d214311bd2f8c162938f27185d22de576a045a13b1e1600102211200003a6cef51e289000c900ca2848010187c846be2bc06a266ae017ae9a13c66cf156125edd95b8bd4f6cfe3c903e3b35000f2211200003a6cef51e289000cb00cc2848010122da148fcc6a6a317ae3c41ee888034019cbfa89e57f306b85601dd2045d6daa000e2211000003a6cef51e289000cd00ce2848010191c44865f6767ab41750fbf5117df2d8be3110925c7993aa2e03780673c31f32000d2211400000e9b3bd478a2400cf00d0284801016d16afa0d70d41df6abe49636527c0b566bd3b722b731eba03433d7efbcb3908000b2211000003a6cef51e289000d100d228480101d744ca7d3ce6fe4538b3fa6a138971ca129c227d8a6736a9cd1d33c2f1fd06cc000a2211400000e9b3bd478a2400d300d42848010175d211346d824c33aff56800c12e0b320854590aadfd85e3f909502cdb6ec3c100082211400000e9b3bd478a2400d500d628480101322f03bbddf42b900d602199315f5d4befa1a9282a2a6c845f3db6ccd2b6bfc000062211cc00003a6cef51e28900d700d82211000003a6cef335e09000d900da00a9d0000074d9dea3c51000003a6cef51e28802e7da887bc30110fabeb509a897a3390f976cc960ac3abd703b5118af0561c6dd340fc9affafb002ac3ea97ff8196b89d89d0abbdddd6dfbe4da9933410dff5f726b01528480101523e62a3a95932c2a65f2314a8a818f82f48644967cc31dcfda9954109d8b55100012848010177c2748c31a7f78c56862aa9d06df60981de7aaa59e67d4d0360a2903384fe1500013201032a5ac73da06a6b989d158bec539003d36dc087d663eda6337be5667c284f16310ee22bacedde5f1c215edbbbdf7a1c20c98ec248b7893266ebfceeb41817bd000f000c2000f700f822012000dd00de284801019deed5e9cd5995ad6c97a06276c939029a1d05a6de03b6c724a4b5567e9adb7a000e22012000df00e0284801016bc4ad2e5c909f6f452be243edc65694f7e6db5f2fc615f69756954a60a563a2000c22012000e100e2284801016925c827cdb72656785a860c0ed1b94c1ff9f0614b9e2ed1b0aa1ee8fbb395aa000c22012000e300e422012000e500e62848010197d9c97586b5cf9a93f5077cf1e13c91f7a4d5b240601e4d08030ab62cd17707000b28480101f613c63e75ce90bdb3aadf01297ba9a958588392473ea542ef8654f281d2854f000922012000e700e828480101d83f99b6b2deca33e45337ea0fa4788a5590c2a9f88654c24c1e4b5282ec7787000822012000e900ea28480101497deb7f82cc061521c9f6bf58ddd3043ecb1dbaea13352ecb73bb53236a9dd8000622012000eb00ec28480101e86bec3c2e5a0c5b9bad30e9b0efd5c74409fece4efd571f8fe02eccbbd0af1a000422012000ed00ee22012000ef00f02848010178a2f12e152f91343bff8aeda8ca7bab1039578fb6b03832c150f22786d0500c000422012000f100f228480101b26a0cc496805853f303d8a00ae9fc7f7b20dc7cab6d1d1c21f5b86469874a84000202012000f300f428480101a31f27b17ffa79bcaf0e47f55dffa054f825e019e447026255e7e1a8d7488701000200b1bcd91dbefdb40075ad92878e330bb79115bcfc28f3c5b9833df391ce8138514a3199fcd1800000000000006500000002b0d782ed8000003f2a3414d8b199f72d0000000000000040800000038a0ed0708000002d14497b814002014800f500f600afbc6827bcf8957c10b8a5694ecd7f0dd41e6a2cd906c77e5340983b618fb6fb0800000000000000000000000000000000000000000000000000000000c695ef7e000000000000007200000006efab3f64000000450742496300afbc66e5f2524ea28a3bde37c9b8f9e929de2e8e0ae9b0b84a7deeee8d71d424e8c69d27d400000000000000e2000000093197d6c2000000a8632502f4c69d1ba4000000000000008a000000116e3e81da0000006af0f2148122012000f900fa28480101912d60694234d59e4645f5d2ebd90e081979a3f6eaf4124bec3980e4547a5094000e22012000fb00fc220120010f011022012000fd00fe28480101348a81067d100edaf90feeb18db50c3c315a07c6c0944b52368c30e76a6f40df000b22012000ff0100284801018540d2166efad6f7a81289ddf3983d3ed177993dce47ccb150f2fcc287428d53000a220120010101022848010110b3b5e79df7c963efb443120853eb1bf9377e78020993bf79d5aaa9b02d1a6a000822012001030104284801016f610eec3a1e4dc9bdacbda0e586e7a8f6b4734b6599ecc0f8c5d0e9666d0ed3000822012001050106284801019100c451439a1cfdcf444d77bc78d03f19ca5e71b1f8fdae5e9e0ccf3e8214a000072201200107010828480101e0140ab9f7e276e1143af00713243e470dfc2c93c02b124622926fd33551a71b00062201200109010a284801014ef684da255649795b7830d1100f419d8f8a0eeb9ed6ed3610ba20b5d815deed0003220120010b010c2848010155cdb8f72801ef11ba562172ed2626c88208eddcf4a0c8f6d5447a785d02b790000202037820010d010e28480101b6eb72df89b91190ab85640f1ef9817bf00e49c5c11e8fd173b5b382ca4a104700010073dde8c69d27d40000000002e7da88000004baec525bbe000096f6a2fa0e38c69d27d4000000001598a6b2000004da46f3846200009e49d38f1eeb00afbbdc4b61f8041625a15bee3b094ff72034e12e69e8d71521ac6748fe6359832319afc8c8000000000000066800000033ffaa8b0000000419c4a9d68319afccd800000000000003d00000002e72705fc80000026a49c0209c284801018dfe3c99df194f8fec2b5b64b5ef08296b853794a29497c7c425ca62a44695e6000c2201200111011222012001130114284801010c275d6749b7c9102256e4abafdecda16a1697f20d26cd0e711bd9d58ef4a2f2000a28480101c169f7745c95d5f3f6b4e550c15978aaf563631f3a9e6ddaaa361ed4042e4f05000922012001150116284801017a3b4493fefcfd2275fa2f6ab01a8db5d70a443fb48dfb00e152545adfb97cbb0007220120011701182201200119011a28480101b13de2fa76c60764833d05264a2e1081609e2dfa9a04bf8d6c5e1162ac7d47cb000728480101027742b12159d2d1310044b4a94e1eea928905b045871a52b552b4b4841288400006220120011b011c28480101df4611dc79f46dc700809e0c3140796be5ca9572c3f3fab70ddbe6a5460bf4900003220120011d011e28480101d52b65c44fcc1a90bbbf8cc01e8ab9c7b6c51f95c2735d6de72a669c1135a8360003020162011f01200201200121012200b0bc885a77c249fb95f38bb13224853b7944942c4b10b84f1b99aa32892aabd4f46335f78a00000000000000bc00000003fb0146f100000074c1cd03f56335e64b0000000000000058000000040ca9eccb000000387d19d10000afbc60807ffe2b018ea1eb65ddc523f7772fc1e1f16e73ee8905b4b66c12275ca800000000000000000000000000000000000000000000000000000000c67fd5260000000000000096000000081b2d1d7000000064c8dda77100afbc799607d471065ad26b0a721946ed764b15a01cf341e11989f08863962a362800000000000000000000000000000000000000000000000000000000c69d27d4000000000000003e00000002165b2b1c0000002c0b7cc7ad0103802001270001021101918f8df47d89a592d9a8e2220276e210d49d789c174ab2b303917d71c6655837000782012f0317cca5687735940043b9aca00401280129012a0247a00f076afb8843d0d2618df1779691876f9ffd59f9b30f47df60f49496744dec67200610012e013b0103d040012b003fb000000000400000000000000021dcd650010ee6b280087735940043b9aca004010150012d01db500e3a26680b9f6a280000e9b3bd478a000000e9b3bd478a0d73fd8f873243316a5b55a0395be4d1c584d71a7c52116b6379a3e93f9649360375de02eb9865b5786e167c4411e5c415cf6064be75fe04b0f81f0c4b84c7260880002c7d7c00000000000000000b9f6a0b1a749f2a012c001343b9aca0021dcd650020020161012e013b0106460600013f020340400130013102037604013201330297bf955555555555555555555555555555555555555555555555555555555555555502aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaad00000074d9dee0ce0c1014c014e0397beb33333333333333333333333333333333333333333333333333333333333333029999999999999999999999999999999999999999999999999999999999999999cf8000074d9dee0ce00400134013501360397be8517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf029a28be3defa8c3e2ad7a7c5b0fee190ac463d5bb46f71258036f9488322c6be7cf8000074d9dee0ce004001410142014301035040013701034040013b0082722f7566ede0ba3a333ac2ca4e9820a0eb28fa3c675e8c5b7378fbba7d487af6b6d8b330226ee7a4226c9a4e28167203a4dec229d3f51655422b56dd7122352fda03af7333333333333333333333333333333333333333333333333333333333333333300001d3677b8338199ff4756d3363cbb8d2ef1acd9bcdb85ff220a0116f74843bac2e4c0c79ceed000001d3677a8f142634e93ea0001408014d013801390082722f7566ede0ba3a333ac2ca4e9820a0eb28fa3c675e8c5b7378fbba7d487af6b69e73e012c2b93293818802ecda692b6a70c7bc140c3d6ba22159dd15949099300205203024013a015100a0431b9004c4b4000000000000000000960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003af7333333333333333333333333333333333333333333333333333333333333333300001d3677b8338232a2e0d714f1820922c85912266b270b551f97fd88c9ce96b02fbe0b94fedd3300001d3677b83381634e93ea0001408013c013d013e0101a0013f0082729e73e012c2b93293818802ecda692b6a70c7bc140c3d6ba22159dd1594909930d8b330226ee7a4226c9a4e28167203a4dec229d3f51655422b56dd7122352fda020f0409283baec018110140015100ab69fe00000000000000000000000000000000000000000000000000000000000000013fccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd283baec000000003a6cef706700c69d27d440009e42614c107ac0000000000000000064000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000103504001440103504001470082723145f857768776495406acbcd9f6451e43b82a7cf2b787bdfcd66f54e8f61eb2f5fc1aa51cd06879f30dac067b3d17d0571b7c8ef15db6c57ce3e90f63e7d80803af734517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf00001d3677b833817a340a8997502684b5be64a7ba6e4f4f1393c8316bcf1149956bbf00b95dd25600001d3677a8f143634e93ea0001408014d014501460082723145f857768776495406acbcd9f6451e43b82a7cf2b787bdfcd66f54e8f61eb20d9c166ab6df5f0d47d18e86fc45c1e5f42681c1184337189ef2e4aa3f2552c10205203034014a014b03af734517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf00001d3677b83383a4dbec8658831b756fd060883f7d013972d9838f66cebcd2e28d66f2b2d6d46900001d3677b83381634e93ea0001408014d014801490082720d9c166ab6df5f0d47d18e86fc45c1e5f42681c1184337189ef2e4aa3f2552c1f5fc1aa51cd06879f30dac067b3d17d0571b7c8ef15db6c57ce3e90f63e7d8080205303034014a014b00a042665004c4b400000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069600000009600000004000600000000000519ae84f17b8f8b22026a975ff55f1ab19fde4a768744d2178dfa63bb533e107a409026bc03af7555555555555555555555555555555555555555555555555555555555555555500001d3677b83383f9b2f37bf03c07595e4f861c14a0779c5b0ddb12bd6b0bf59b7f464fab4b279400001d3677a8f143634e93ea0001408014d014e014f0001200082720ac47779e474df79ac188caf2308fa7fccf511a8be789a6502f15ca63fba64408669008ce4710e1108a5eee86c282b1d13feaf7634e0c592943ae844ddd4ca0c02053030240150015100a041297004c4b40000000000000000002e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005bc00000000000000000000000012d452da449e50b8cf7dd27861f146122afe1b546bb8b70fc8216f0c614139f8e04d7cef969").endCell(); - log.info("CellType {}", cell.getCellType()); - log.info(cell.print()); - log.info(Utils.bytesToHex(cell.toBoc(true))); - } - - /** - * deserialize cell of code of wallet v4r2 - */ - @Test - public void testBocIssue4() { - String cellExpected = "x{FF00F4A413F4BCF2C80B}\n" + - " x{2_}\n" + - " x{4}\n" + - " x{D001D0D3032171B0925F04E022D749C120925F04E002D31F218210706C7567BD22821064737472BDB0925F05E003FA403020FA4401C8CA07CBFFC9D0ED44D0810140D721F404305C810108F40A6FA131B3925F07E005D33FC8258210706C7567BA923830E30D03821064737472BA925F06E30D}\n" + - " x{01FA00F40430F8276F2230500AA121BEF2E0508210F06C75677080185004CB0526CF1658FA0219F400CB6917CB1F5260CB3F20C98040FB0006}\n" + - " x{5004810108F45930ED44D0810140D720C801CF16F400C9ED540172B08E208210E47374727080185005CB055003CF1623FA0213CB6ACB1FCB3FC98040FB00925F03E2}\n" + - " x{2_}\n" + - " x{2_}\n" + - " x{5}\n" + - " x{B29DFB513420405035C87D010C00B23281F2FFF274006040423D029BE84C6_}\n" + - " x{2_}\n" + - " x{ADCE76A26840206B90EB85FFC_}\n" + - " x{AF1DF6A26840106B90EB858FC_}\n" + - " x{B8C97ED44D0D70B1F}\n" + - " x{BD242B6F6A2684080A06B90FA0218470D4080847A4937D29910CE6903E9FF9837812801B7810148987159F3184_}\n" + - " x{F28308D71820D31FD31FD31F02F823BBF264ED44D0D31FD31FD3FFF404D15143BAF2A15151BAF2A205F901541064F910F2A3F80024A4C8CB1F5240CB1F5230CBFF5210F400C9ED54F80F01D30721C0009F6C519320D74A96D307D402FB00E830E021C001E30021C002E30001C0039130E30D03A4C8CB1F12CB1FCBFF}\n" + - " x{D207FA00D4D422F90005C8CA0715CBFFC9D077748018C8CB05CB0222CF165005FA0214CB6B12CCCCC973FB00C84014810108F451F2A702}\n" + - " x{810108D718FA00D33FC8542047810108F451F2A782106E6F746570748018C8CB05CB025006CF165004FA0214CB6A12CB1FCB3FC973FB0002}\n" + - " x{810108D718FA00D33F305224810108F459F2A782106473747270748018C8CB05CB025005CF165003FA0213CB6ACB1F12CB3FC973FB00}\n" + - " x{F400C9ED54}\n"; - - String bocHexExpected = "B5EE9C72410214010002CE000114FF00F4A413F4BCF2C80B010201200203020148040504F8F28308D71820D31FD31FD31F02F823BBF264ED44D0D31FD31FD3FFF404D15143BAF2A15151BAF2A205F901541064F910F2A3F80024A4C8CB1F5240CB1F5230CBFF5210F400C9ED54F80F01D30721C0009F6C519320D74A96D307D402FB00E830E021C001E30021C002E30001C0039130E30D03A4C8CB1F12CB1FCBFF1011121302E6D001D0D3032171B0925F04E022D749C120925F04E002D31F218210706C7567BD22821064737472BDB0925F05E003FA403020FA4401C8CA07CBFFC9D0ED44D0810140D721F404305C810108F40A6FA131B3925F07E005D33FC8258210706C7567BA923830E30D03821064737472BA925F06E30D06070201200809007201FA00F40430F8276F2230500AA121BEF2E0508210F06C75677080185004CB0526CF1658FA0219F400CB6917CB1F5260CB3F20C98040FB000600845004810108F45930ED44D0810140D720C801CF16F400C9ED540172B08E208210E47374727080185005CB055003CF1623FA0213CB6ACB1FCB3FC98040FB00925F03E20201200A0B0059BD242B6F6A2684080A06B90FA0218470D4080847A4937D29910CE6903E9FF9837812801B7810148987159F31840201580C0D0011B8C97ED44D0D70B1F8003DB29DFB513420405035C87D010C00B23281F2FFF274006040423D029BE84C600201200E0F0019ADCE76A26840206B90EB85FFC00019AF1DF6A26840106B90EB858FC0006ED207FA00D4D422F90005C8CA0715CBFFC9D077748018C8CB05CB0222CF165005FA0214CB6B12CCCCC973FB00C84014810108F451F2A7020070810108D718FA00D33FC8542047810108F451F2A782106E6F746570748018C8CB05CB025006CF165004FA0214CB6A12CB1FCB3FC973FB0002006C810108D718FA00D33F305224810108F459F2A782106473747270748018C8CB05CB025005CF165003FA0213CB6ACB1F12CB3FC973FB00000AF400C9ED54D4552129"; - Cell cell = CellBuilder.beginCell().fromBoc(bocHexExpected).endCell(); - log.info("CellType {}", cell.getCellType()); - log.info(cell.print()); - log.info(Utils.bytesToHex(cell.toBoc(true, false, false, false, false))); - - assertThat(cell.print()).isEqualTo(cellExpected); - - // todo - // assertThat(Utils.bytesToHex(cell.toBoc(true)).toUpperCase()).isEqualTo(bocHexExpected); - } - - /** - * basic cell - */ - @Test - public void testCellBackAndForth1() { - String cellExpected = "x{40000001400000036_}\n"; - String bocHexExpected = "B5EE9C7241010101000B0000114000000140000003603C39FDA2"; - Cell cell = CellBuilder.beginCell().fromBoc(bocHexExpected).endCell(); - - log.info("CellType {}", cell.getCellType()); - log.info(cell.print()); - log.info(Utils.bytesToHex(cell.toBoc(true))); - - assertThat(cell.print()).isEqualTo(cellExpected); - assertThat(Utils.bytesToHex(cell.toBoc(true)).toUpperCase()).isEqualTo(bocHexExpected); - } - - /** - * cell with one ref - */ - @Test - public void testCellBackAndForth2() { - String cellExpected = "x{40000001400000034_}\n" + - " x{40000001400000036_}\n"; - String bocHexExpected = "B5EE9C7241010201001700011140000001400000034001001140000001400000036010CB5ED2"; - Cell cell = CellBuilder.beginCell().fromBoc(bocHexExpected).endCell(); - - log.info("CellType {}", cell.getCellType()); - log.info(cell.print()); - log.info(Utils.bytesToHex(cell.toBoc(true))); - - assertThat(cell.print()).isEqualTo(cellExpected); - assertThat(Utils.bytesToHex(cell.toBoc(true)).toUpperCase()).isEqualTo(bocHexExpected); - } - - /** - * cell with one ref that has another ref - */ - @Test - public void testCellBackAndForth3() { - String cellExpected = "x{40000001400000034_}\n" + - " x{40000001400000034_}\n" + - " x{40000001400000036_}\n"; - String bocHexExpected = "B5EE9C72410103010023000111400000014000000340010111400000014000000340020011400000014000000360CD2FA77E"; - Cell cell = CellBuilder.beginCell().fromBoc(bocHexExpected).endCell(); - - log.info("CellType {}", cell.getCellType()); - log.info(cell.print()); - log.info(Utils.bytesToHex(cell.toBoc(true))); - - assertThat(cell.print()).isEqualTo(cellExpected); - assertThat(Utils.bytesToHex(cell.toBoc(true)).toUpperCase()).isEqualTo(bocHexExpected); - } - - - /* - * complex cell with four refs: - * =: cell1 - * cell1 ."cell 1: " B dup Bx. cr - *

- * =: cell2 - * cell2 ."cell 2: " B dup Bx. cr - *

- * =: cell3 - * cell3 ."cell 3: " B dup Bx. cr - *

- * =: cell4 - * cell4 ."cell 4: " B dup Bx. cr - *

- * =: cell5 - * cell5 ."cell 5: " B dup Bx. cr - */ - @Test - public void testCellBackAndForth4() { - String cellExpected = "x{40000001400000034_}\n" + - " x{40000001400000036_}\n" + - " x{40000001400000034_}\n" + - " x{40000001400000036_}\n" + - " x{40000001400000034_}\n" + - " x{40000001400000034_}\n" + - " x{40000001400000036_}\n" + - " x{40000001400000034_}\n" + - " x{40000001400000034_}\n" + - " x{40000001400000036_}\n" + - " x{40000001400000034_}\n" + - " x{40000001400000034_}\n" + - " x{40000001400000036_}\n"; - String bocHexExpected = "B5EE9C7241010501003F00041140000001400000034004030201021140000001400000034003020111400000014000000340030111400000014000000340040011400000014000000360785A1C4B"; - Cell cell = CellBuilder.beginCell().fromBoc(bocHexExpected).endCell(); - - log.info("CellType {}", cell.getCellType()); - log.info(cell.print()); - log.info(Utils.bytesToHex(cell.toBoc(true))); - - assertThat(cell.print()).isEqualTo(cellExpected); - assertThat(Utils.bytesToHex(cell.toBoc(true)).toUpperCase()).isEqualTo(bocHexExpected); - } - - private static final String BOC_FIFT_HEX_LARGE2 = "b5ee9c7241023201000498000114ff00f4a413f4bcf2c80b010201200302000cf2308048f2f00201480e0402012008050201200706001db9c34f00a5f03802032028307f00580011bbbd182108325e4c380201200d090201200b0a003bb6e53da89a1f401a803a1a7ffe00203e00203a861a1e0026209a8608a810020120310c002bb2fe7c02840917c120c1fd039be864fe800c380c1c200017bb9a5ed44d0d430d0d3ff3080202cb120f0201ce1110005b3e105bc90c0c40b53d01347b5134350c3434ffcc201254452ebcbd087ec120841ca368e840b2333d00104c3c01a000513e105bc90c0c40bd01347b5134350c3434ffcc20125444eebcbd20840764eab600723d00104c3c01a002012023130201201c140201201915020120181601f73e105bc90c80fd01347c02b434c03e8034c7f4c7fd010c2012c97cbd2012d4e4ae7cbd2012d4e4ee7cbd20134920840ee6b2802814032ec6fcbd3e097e0554c1e8483e0454c2e0083d039be864f4c7cc248c083880a94b20083d039be865900720083d05a74c083232c7f274100720083d05b882a9013232c01400e0170038fa02cb1fcb1f17f400c9f00b82101a69387e02c8cb1ff4004130f00600793e105bc90c0c40b53d01347b5134350c3434ffcc201254c52ebcbd08b434ffcc201200aebcbd3c028c54943c02e0843218aeaf40b2333d00104c3c01a00201201b1a00e33e105bc90c0c40b4fff4c7fe803d01347c02887434ffcc20125446eebcbd08e0080a60c1fc014c6011c07cbc94ca3c020a7232ffd50825a0083d10c1291508e43c0240bc02e0840d2212a4497232ffd49032c7d4883d00095110d4a17c01e0841c04df21c0f232ffc4b2c7fd00104c3c01a000ed3e105bc90c0c40b4fff4c7fe803d01347c0288e0080a60c1fc016011c07cbd2011d4c6eebcbd14cc3c0214d2bc020af232ffd5082e20083d10c06951543c0241291509243c025004fc02e084260abfffc97232ffd49032c7d4883d00095110d4a17c01e0840c19b443c0f232ffc4b2c7fd00104c3c01a0020120201d0201201f1e001f3214017e8084fd003d003333327b552000193b51343e803d013d0135350c200201202221003b20128870403cbc8830802672007e8080a0c1fd10e5cc0060c1fd16cc38a0001d0060c1fd039be864fe800c380c1c200201202b2402012028250201202726003d1c20043232c141bc0105b3c594013e808532dab2c7c4b2cff3c4f25c7ec020003d1c20043232c1417c010573c5893e808532da84b2c7f2cff3c4f260103ec0200201202a290023104cfd039be8482540b5c04c00780c5c0ca0001d1c081cb232c072c032c1f2fff274200201202d2c00215fa4001fa46804602c00012f2f4d3ff3080201202f2e001134c1c06a80b5c6006001ed20120871c03cbc807434c0c05c6c2497c0f83c00cc4074c7dc208061a808f00023858cc074c7e01200a0841b5a5b9d2e84bcbd2082c63cd865d6f4cffe801400f880fe0048840d10015bc13e186084100d28f014842ea4cc3c033820842296cbb9d4842ea4cc3c03782082c63cd854842ea4cc3c03f8203000588210982535785210ba9330f00ee08210b766741a5210ba9330f011e0821025d53dfdba92f010e0308048f2f00011b323bc02840d17c12004896818"; - private static final String BOC_FIFT_BASE64_LARGE = "te6ccgECMgEABJgAART/APSkE/S88sgLAQIBIAIDAgFIBAUADPIwgEjy8AICywYHAgEgKCkCASAICQIBziYnAgEgCgsCASAXGAIBIAwNAgEgERICASAODwAhX6QAH6RoBGAsAAEvL00/8wgB7SASCHHAPLyAdDTAwFxsJJfA+DwAzEB0x9wggGGoCPAAI4WMwHTH4BIAoIQbWludLoS8vSCCxjzYZdb0z/6AFAD4gP4ASIQNEAFbwT4YYIQQDSjwFIQupMw8AzgghCKWy7nUhC6kzDwDeCCCxjzYVIQupMw8A/ggEAARNMHAaoC1xgBgAFiCEJglNXhSELqTMPAO4IIQt2Z0GlIQupMw8BHgghAl1T39upLwEOAwgEjy8AIBIBMUAgEgFRYAHRwIHLIywHLAMsHy//J0IAAjEEz9A5voSCVAtcBMAHgMXAygAD0cIAQyMsFBfAEFc8WJPoCFMtqEssfyz/PE8mAQPsAgAD0cIAQyMsFBvAEFs8WUAT6AhTLassfEss/zxPJcfsAgAgEgGRoCASAfIAIBIBscAgEgHR4AHQBgwf0Dm+hk/oAMOAwcIAA7IBKIcEA8vIgwgCZyAH6AgKDB/RDlzABgwf0WzDigABk7UTQ+gD0BPQE1NQwgAB8yFAF+gIT9AD0AMzMye1UgAgEgISICASAjJADtPhBbyQwMQLT/9Mf+gD0BNHwCiOAICmDB/AFgEcB8vSAR1MbuvL0UzDwCFNK8AgryMv/VCC4gCD0QwGlRVDwCQSkVCSQ8AlAE/ALghCYKv//JcjL/1JAyx9SIPQAJURDUoXwB4IQMGbRDwPIy/8Syx/0AEEw8AaAA4z4QW8kMDEC0//TH/oA9ATR8Aoh0NP/MIBJURu68vQjgCApgwfwBTGARwHy8lMo8AgpyMv/VCCWgCD0QwSkVCOQ8AkC8AuCEDSISpElyMv/UkDLH1Ig9AAlRENShfAHghBwE3yHA8jL/xLLH/QAQTDwBoAB5PhBbyQwMQLU9ATR7UTQ1DDQ0/8wgElTFLry9CLQ0/8wgEgCuvL08AoxUlDwC4IQyGK6vQLIzPQAQTDwBoAH3PhBbyQyA/QE0fAK0NMA+gDTH9Mf9AQwgEsl8vSAS1OSufL0gEtTk7ny9IBNJIIQO5rKAKBQDLsb8vT4JfgVUwehIPgRUwuAIPQOb6GT0x8wkjAg4gKlLIAg9A5voZZAHIAg9BadMCDIyx/J0EAcgCD0FuIKpATIywBQA4CUAOPoCyx/LHxf0AMnwC4IQGmk4fgLIyx/0AEEw8AYAUT4QW8kMDEC9ATR7UTQ1DDQ0/8wgElRE7ry9IIQHZOq2AHI9ABBMPAGgAFs+EFvJDAxAtT0BNHtRNDUMNDT/zCASVEUuvL0IfsEghByjaOhAsjM9ABBMPAGgAgEgKisCASAwMQAXu5pe1E0NQw0NP/MIAgEgLC0CASAuLwA7tuU9qJofQBqAOhp//gAgPgAgOoYaHgAmIJqGCKgQABGzI7wChA0XwSAAK7L+fAKECRfBIMH9A5voZP6ADDgMHCAAEbu9GCEIMl5MOAAducNPAKXwOAIDICgwfwBY"; - private static final String BOC_FIFT_LARGE_HASH = "2f013a05f1522b9288e0412c524186f089ea30e87afc9a51395eed0019f2cf8f"; - - private static final String BOC_FIFT_HEX_WITH_DUPS = "b5ee9c720101180100e800020310c201020163a90da09563b6740a4b7f68ca09fbdb76b0035cc101450a16e2e79b985ebbb38a0c5768616c657320546f6b656e0357484c40030119a1dcd65000000003200000032604003e1e68747470733a2f2f746f6e7768616c65732e636f6d2f636f6e74656e742f0203ccc0050602012007080201481415020120090a0201200f10000ba38000002cc00201200b0c0009b6000000c30201480d0e00094000000638000950000005f8000ba6000000304002012011170201581213000940000005c8000950000005e8000ba18000002ec002012016170009b4000000b70009d8000002d4"; - private static final String BOC_FIFT_BASE64_WITH_DUPS = "te6ccgEBGAEA6AACAxDCAQIBY6kNoJVjtnQKS39oygn723awA1zBAUUKFuLnm5heu7OKDFdoYWxlcyBUb2tlbgNXSExAAwEZodzWUAAAAAMgAAADJgQAPh5odHRwczovL3RvbndoYWxlcy5jb20vY29udGVudC8CA8zABQYCASAHCAIBSBQVAgEgCQoCASAPEAALo4AAACzAAgEgCwwACbYAAADDAgFIDQ4ACUAAAAY4AAlQAAAF+AALpgAAADBAAgEgERcCAVgSEwAJQAAABcgACVAAAAXoAAuhgAAALsACASAWFwAJtAAAALcACdgAAALU"; - private static final String BOC_FIFT_WITH_DUPS_HASH = "5049e60708f6f8aefb51009361aa6ad6fc6a14becd8d8bef37d10cf2e8ea281d"; - - private static final String BOC_FIFT_HEX_DEEP_DUPLICATED_HASHMAP = "b5ee9c7241010901006a000101c0010202cb02030201200404020162060702012005050201200606020120080800434801f9c856c1260ecc28bf6928191e2b79c9a64d19c787ccb9d113c6d609690b7f0900432007e7215b04983b30a2fda4a06478ade7269934671e1f32e7444f1b5825a42dfc2404807a00"; - private static final String BOC_FIFT_DEEP_DUPLICATED_HASHMAP_HASH = "69e794b89cef40a0ee3ab947cf8ea70736101d9c86ae4168406fc72964d1a9e6"; - - @Test - public void testShouldDeserializeSerializeDeserializeBocFromHex() { - Cell c1 = CellBuilder.beginCell().fromBoc(BOC_FIFT_HEX_LARGE2).endCell(); - log.info("CellType c1 {}", c1.getCellType()); - log.info("Hex c1 {}", Utils.bytesToHex(c1.toBoc(true, true))); - assertThat(Utils.bytesToHex(c1.hash())).isEqualTo(BOC_FIFT_LARGE_HASH); - assertThat(Utils.bytesToHex(c1.getHash())).isEqualTo(BOC_FIFT_LARGE_HASH); - - Cell c2 = CellBuilder.beginCell().fromBoc(BOC_FIFT_HEX_WITH_DUPS).endCell(); - log.info("CellType c2 {}", c2.getCellType()); - log.info("Hex c2 {}", Utils.bytesToHex(c2.toBoc(true, true))); - assertThat(Utils.bytesToHex(c2.hash())).isEqualTo(BOC_FIFT_WITH_DUPS_HASH); - assertThat(Utils.bytesToHex(c2.getHash())).isEqualTo(BOC_FIFT_WITH_DUPS_HASH); - - Cell c3 = CellBuilder.beginCell().fromBoc(BOC_FIFT_HEX_DEEP_DUPLICATED_HASHMAP).endCell(); - log.info("CellType c3 {}", c3.getCellType()); - log.info("Hex c3 {}", Utils.bytesToHex(c3.toBoc(true, true))); - assertThat(Utils.bytesToHex(c3.hash())).isEqualTo(BOC_FIFT_DEEP_DUPLICATED_HASHMAP_HASH); - assertThat(Utils.bytesToHex(c3.getHash())).isEqualTo(BOC_FIFT_DEEP_DUPLICATED_HASHMAP_HASH); - - String hex1 = c1.toHex(); - String hex2 = c2.toHex(); - String hex3 = c3.toHex(); - - log.info("hex1 {}", hex1); - log.info("hex2 {}", hex2); - log.info("hex3 {}", hex3); - - Cell result1 = CellBuilder.beginCell().fromBoc(hex1).endCell(); - Cell result2 = CellBuilder.beginCell().fromBoc(hex2).endCell(); - Cell result3 = CellBuilder.beginCell().fromBoc(hex3).endCell(); - - assertThat(Utils.bytesToHex(result1.hash())).isEqualTo(BOC_FIFT_LARGE_HASH); - assertThat(Utils.bytesToHex(result2.hash())).isEqualTo(BOC_FIFT_WITH_DUPS_HASH); - assertThat(Utils.bytesToHex(result3.hash())).isEqualTo(BOC_FIFT_DEEP_DUPLICATED_HASHMAP_HASH); - } - - @Test - public void testShouldDeserializeSerializeDeserializeBocFromBase64() { - Cell c1 = CellBuilder.beginCell().fromBoc(Utils.base64ToSignedBytes(BOC_FIFT_BASE64_LARGE)).endCell(); - assertThat(Utils.bytesToHex(c1.hash())).isEqualTo(BOC_FIFT_LARGE_HASH); - assertThat(Utils.bytesToHex(c1.getHash())).isEqualTo(BOC_FIFT_LARGE_HASH); - - Cell c2 = CellBuilder.beginCell().fromBoc(Utils.base64ToSignedBytes(BOC_FIFT_BASE64_WITH_DUPS)).endCell(); - assertThat(Utils.bytesToHex(c2.hash())).isEqualTo(BOC_FIFT_WITH_DUPS_HASH); - assertThat(Utils.bytesToHex(c2.getHash())).isEqualTo(BOC_FIFT_WITH_DUPS_HASH); - - String base64c1 = c1.toBase64(); - String base64c2 = c2.toBase64(true); - - Cell c3 = CellBuilder.beginCell().fromBoc(Utils.base64ToSignedBytes(base64c1)).endCell(); - Cell c4 = CellBuilder.beginCell().fromBoc(Utils.base64ToSignedBytes(base64c2)).endCell(); - - assertThat(Utils.bytesToHex(c3.hash())).isEqualTo(BOC_FIFT_LARGE_HASH); - assertThat(Utils.bytesToHex(c4.hash())).isEqualTo(BOC_FIFT_WITH_DUPS_HASH); - } - - @Test - public void testShouldDeserializeSerializeDeserializeBocWithExoticCells() { - log.info("hex {}", Utils.base64ToHexString("te6ccuICASMAAQAAJm0AAAAkAMwA6gGAAmIC/gMwA0oDWQNyA4wEhAT0BQ4FtgX2BugHWAekCEwIjAj2CUMJjgpaCnoLEAsuC0wLaguIC6gLxgvkDAIMIAw+DFwNCg0uDVIN/g4eDj4OXg58DpoOtg7SDu4PCg+wEDQQWBB4EMQREBEwEVARcBGOEa4RzhHuEg4SLhLYE2ATxBRGFGQUghSgFLwVYBXgFe4V/BYKFhgWJhY0FkIWUBZeFmwWehaIFtQW4hbwFv4XDBcaFygXNhdEF5AXtBfYGCUY0BjwGRAZXRmpGcgZ5hozGn8anBq4GwUbURtsG4gb1RwhHDwc4h0vHbId/x5RHpwevB8JH1UfdB+UH+EgACAeIGsgiiDXIPYhFiFjIYIhzyIbIjoi5CMxI7gkBSRoJLUlASWCJc8l7CY5JlYmoybAJw0nWSd0KBgoZSjkKTEpfSnJKhUq4CstK0wr4iwvLEwsmSy2LQMtIC1tLYot1y32LkMuYC6tLsovFy80L4Evni/rMAgwVTByML8w3DGKMjgyRjKTMqAyrjK8MwkzFjNjM3AzvTPKNBc0JDRxNH40yzTYNSU1MjV/NYw12TXmNjM2QDb0N2w4IDhtOHo4xzjUOSE5Ljk8OYk51TniOfA6PTqJOpY6pDrxOz07SjwAPLY8wjzIPRY9Kj1+PYs9lD54PpA+nj6tPrw+zD9wQBhAwEDMQNhBXkIeQqRCtkNaRBtEJESqRMZFd0YYRiRGMEa2R3ZH/EgOSM5JVElmSgtKeUs4Sz9LxUvWTHpM2wQQEe9Vqv///xEAAQACAAMABAGgm8ephwAAAAAEAQFcY8oAAAABAP////8AAAAAAAAAAGL7u90AABusl7vrgAAAG6yXu+uEpYk+AwAFOWIBXGPGAVw1xMQAAAADAAAAAAAAAC4ABQIRuOSN+0ZVPxAEAAYABwqKBPTVPFzdihzyG0ZA/Z/mBJ1yBqgO+orVswRwW9Ghgz0za8SUx1HcFeKT2oruLoomx5yUkuOsElnlsSJNKY+/ENoBbgFuAAsADBSJmYD0kiPZUykP36g26WWT2iA3GY68wcz8ZL8QwW+fhvAACEoz9v2aCe+A7qvC9i2h3Y6Njxlya+THPWSTqtk2VhEmjFQ8JXqzCxqvVlxyT5lrgSew1WEQPh5vGG5G6aL+jSx7p9yWwAD1APYA9wD4AJgAABusl6ypRAFcY8mtUGDeEa5UtZnyUWZSv8kV786DFV0ENsQUkqouFOLX3rb1GiR3IplBS223L+1UZy+klFYI0IbJ4XbYN5fnBSteAiWB+InEuMrAkZwPxE4l+P/9DMAIAAgACAAVAjKp+IARlU/EAAgCASAACQAKABW+AAADvLNVq0Zq0AAVv////7y9Dv2lY9A0W/TVPFzdihzyG0ZA/Z/mBJ1yBqgO+orVswRwW9Ghgz0zire8kc/uikSA5tJI792XKtIcd16h+cRO+PhEg96KGUIBbgASkCOv4v///xEA/////wAAAAAAAAAAAVxjyQAAAAFi+7vaAAAbrJesqUQBXGPGYAASABMAFAAVJFuQI6/i////EQD/////AAAAAAAAAAABXGPKAAAAAWL7u90AABusl7vrhAFcY8ZgAA0ADgAPABABEQAAAAAAAAAAUAARMhMdtc3JNOOXcP4CUgqFLYe5jp9eFGCXN/2PYC5God0p7ETUNyBAKrRSk9HHSEaboZwqfwF4wdahjVNsDNrEHei6AW0AEYIH4icS/H/+hnAAYgB+IjMAAAAAAAAAAP//////////gfiJxL8f/6GYKAB+ABY0VVYFBXh8evRXt1/LXGzQvukMsZdguMASeBnedPbBTQIbXMJZIizmRhXnEzCtaN1v/eOKo/DPF2/JtB2rCC+iFr8AGwAQzCaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqsIyjH/9rdaTfgD6AKYApwCoAGuwQAAAAAAAAAAArjHlAAAN1kvWVKH//////////////////////////////////////////8AoSAEBDRhZGTMcB5HAoou+7uCSHdojFWI3aVx/gTlOrgNM7EMAATITslv1ooQGvZd9j8gshuttzHXVNdKRRvN/mR9pG838qiamUhqaVKTFYyGRZPN04LZpGPPs+x1U4wJQzWuvxOSisQFtABGCB+InEuMrAkZwACcAfiIzAAAAAAAAAAD//////////4H4icS4ysCRmCgAfgAWJFXMJqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqwjKMf/qDNwt+ABcApgAYAKgoSAEB3lrfRcA6dF/J06QY2eK6CW25waqne8CJi22eu2EdK0AABShIAQFGlzTBTSSwdU7e8/LK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")); - Cell c = CellBuilder.beginCell().fromBoc(Utils.base64ToSignedBytes("te6ccuICASMAAQAAJm0AAAAkAMwA6gGAAmIC/gMwA0oDWQNyA4wEhAT0BQ4FtgX2BugHWAekCEwIjAj2CUMJjgpaCnoLEAsuC0wLaguIC6gLxgvkDAIMIAw+DFwNCg0uDVIN/g4eDj4OXg58DpoOtg7SDu4PCg+wEDQQWBB4EMQREBEwEVARcBGOEa4RzhHuEg4SLhLYE2ATxBRGFGQUghSgFLwVYBXgFe4V/BYKFhgWJhY0FkIWUBZeFmwWehaIFtQW4hbwFv4XDBcaFygXNhdEF5AXtBfYGCUY0BjwGRAZXRmpGcgZ5hozGn8anBq4GwUbURtsG4gb1RwhHDwc4h0vHbId/x5RHpwevB8JH1UfdB+UH+EgACAeIGsgiiDXIPYhFiFjIYIhzyIbIjoi5CMxI7gkBSRoJLUlASWCJc8l7CY5JlYmoybAJw0nWSd0KBgoZSjkKTEpfSnJKhUq4CstK0wr4iwvLEwsmSy2LQMtIC1tLYot1y32LkMuYC6tLsovFy80L4Evni/rMAgwVTByML8w3DGKMjgyRjKTMqAyrjK8MwkzFjNjM3AzvTPKNBc0JDRxNH40yzTYNSU1MjV/NYw12TXmNjM2QDb0N2w4IDhtOHo4xzjUOSE5Ljk8OYk51TniOfA6PTqJOpY6pDrxOz07SjwAPLY8wjzIPRY9Kj1+PYs9lD54PpA+nj6tPrw+zD9wQBhAwEDMQNhBXkIeQqRCtkNaRBtEJESqRMZFd0YYRiRGMEa2R3ZH/EgOSM5JVElmSgtKeUs4Sz9LxUvWTHpM2wQQEe9Vqv///xEAAQACAAMABAGgm8ephwAAAAAEAQFcY8oAAAABAP////8AAAAAAAAAAGL7u90AABusl7vrgAAAG6yXu+uEpYk+AwAFOWIBXGPGAVw1xMQAAAADAAAAAAAAAC4ABQIRuOSN+0ZVPxAEAAYABwqKBPTVPFzdihzyG0ZA/Z/mBJ1yBqgO+orVswRwW9Ghgz0za8SUx1HcFeKT2oruLoomx5yUkuOsElnlsSJNKY+/ENoBbgFuAAsADBSJmYD0kiPZUykP36g26WWT2iA3GY68wcz8ZL8QwW+fhvAACEoz9v2aCe+A7qvC9i2h3Y6Njxlya+THPWSTqtk2VhEmjFQ8JXqzCxqvVlxyT5lrgSew1WEQPh5vGG5G6aL+jSx7p9yWwAD1APYA9wD4AJgAABusl6ypRAFcY8mtUGDeEa5UtZnyUWZSv8kV786DFV0ENsQUkqouFOLX3rb1GiR3IplBS223L+1UZy+klFYI0IbJ4XbYN5fnBSteAiWB+InEuMrAkZwPxE4l+P/9DMAIAAgACAAVAjKp+IARlU/EAAgCASAACQAKABW+AAADvLNVq0Zq0AAVv////7y9Dv2lY9A0W/TVPFzdihzyG0ZA/Z/mBJ1yBqgO+orVswRwW9Ghgz0zire8kc/uikSA5tJI792XKtIcd16h+cRO+PhEg96KGUIBbgASkCOv4v///xEA/////wAAAAAAAAAAAVxjyQAAAAFi+7vaAAAbrJesqUQBXGPGYAASABMAFAAVJFuQI6/i////EQD/////AAAAAAAAAAABXGPKAAAAAWL7u90AABusl7vrhAFcY8ZgAA0ADgAPABABEQAAAAAAAAAAUAARMhMdtc3JNOOXcP4CUgqFLYe5jp9eFGCXN/2PYC5God0p7ETUNyBAKrRSk9HHSEaboZwqfwF4wdahjVNsDNrEHei6AW0AEYIH4icS/H/+hnAAYgB+IjMAAAAAAAAAAP//////////gfiJxL8f/6GYKAB+ABY0VVYFBXh8evRXt1/LXGzQvukMsZdguMASeBnedPbBTQIbXMJZIizmRhXnEzCtaN1v/eOKo/DPF2/JtB2rCC+iFr8AGwAQzCaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqsIyjH/9rdaTfgD6AKYApwCoAGuwQAAAAAAAAAAArjHlAAAN1kvWVKH//////////////////////////////////////////8AoSAEBDRhZGTMcB5HAoou+7uCSHdojFWI3aVx/gTlOrgNM7EMAATITslv1ooQGvZd9j8gshuttzHXVNdKRRvN/mR9pG838qiamUhqaVKTFYyGRZPN04LZpGPPs+x1U4wJQzWuvxOSisQFtABGCB+InEuMrAkZwACcAfiIzAAAAAAAAAAD//////////4H4icS4ysCRmCgAfgAWJFXMJqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqwjKMf/qDNwt+ABcApgAYAKgoSAEB3lrfRcA6dF/J06QY2eK6CW25waqne8CJi22eu2EdK0AABShIAQFGlzTBTSSwdU7e8/LK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")).endCell(); - log.info("type {}", Utils.bytesToHex(c.getHash())); - - } - - @Test - public void testShouldDeserialize2() { - Cell cell = CellBuilder.beginCell().fromBoc(Utils.base64ToSignedBytes("te6cckEBAQEAIgAAQI4l3QgXTJzTGSGBoCKurXZZrCqdShK4T1Fg7dLsxwbqJRoppg==")).endCell(); - log.info("CellType {}", cell.getCellType()); - - } - - @Test - public void testShouldDeserializeAccountState() { - Cell c = CellBuilder.beginCell().fromBoc("b5ee9c724101030100d700026fc00c419e2b8a3b6cd81acd3967dbbaf4442e1870e99eaf32278b7814a6ccaac5f802068148c314b1854000006735d812370d00764ce8d340010200deff0020dd2082014c97ba218201339cbab19f71b0ed44d0d31fd31f31d70bffe304e0a4f2608308d71820d31fd31fd31ff82313bbf263ed44d0d31fd31fd3ffd15132baf2a15144baf2a204f901541055f910f2a3f8009320d74a96d307d402fb00e8d101a4c8cb1fcb1fcbffc9ed5400500000000229a9a317d78e2ef9e6572eeaa3f206ae5c3dd4d00ddd2ffa771196dc0ab985fa84daf451c340d7fa").endCell(); - log.info("CellType {}", c.getCellType()); - log.info(c.toString()); - log.info("length {}", c.getBitLength()); - } - - @Test - public void testShouldDeserializeInMsgDescr() { - Cell c = CellBuilder.beginCell().fromBoc("b5ee9c724102300100078d0001099b2dcef0200102090d96e77810120202090d96e778100a030246bfa9346e9464c7f146a6be4225b1c98e29a59561fbb67319922eda6acc69f6b9130030040501064606000903af7000000000000000000000000000000000000000000000000000000000000000000000000000f42439440e0c397a3b2ee3cbd81ea78021862f892a5a9e779d1fecd55236d6571eb5200000000000f424165a57c5f0001408082f06020f0409017d784018110729009a27c89c40000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101a00900ab29fe09ec98d5f7fe7ba21b174ce0ef21592ce1aa81e6f528916066f754d4b52559593fc0000000000000000000000000000000000000000000000000000000000000001017d784000000000000001e8484cb4af8be4002094365b9de04260b0251bf084dd4db5a349ccfcf293baf5f5b626f4a130856b6613ded62877bfecc2536dcd96e7780cd96e77a110c03af704f64c6afbff3dd10d8ba6707790ac9670d540f37a9448b0337baa6a5a92acac00000000000f4247d59d160ea9c63d10edae2c76ada993f982915bc75f7bcc0fb81280820d15523200000000000f424165a57c5f0001408100f0d020f0c0901c9c38018110e29009c402468bb8000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008272bf8229e6e684701825a6f8e1fb0f8155aba759d58b82e73b8405092874e23fa816617de1e9f3a79e4c7d8a3a51ac0c8b54b6bbcd4f824c9f800aa2f36fee26720101a019010c46060365b9de19020300101c130246bf919848778310ed687087000647581469374dff5e9f0fb1cf744809c5016e12fb00301a1403b57ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffef00000000000f42450000000000000000000000000000000000000000000000000000000000000000000000000000000065a57c5f0003e665b9448171615001f040901efe92001c0332dca2365b9de4000827290aec8965afabb16ebc3cb9b408ebae71b618d78788bc80d09843593cac98da490aec8965afabb16ebc3cb9b408ebae71b618d78788bc80d09843593cac98da40201e01b180101df1900b959ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdf3fc13d931abeffcf744362e99c1de42b259c35503cdea5122c0cdeea9a96a4ab2b101c9c380006cb73bc00000000001e848ccb4af8be7fffffffc001064606001b00ab29fe09ec98d5f7fe7ba21b174ce0ef21592ce1aa81e6f528916066f754d4b52559593ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbd01efe92000000000000001e8488cb4af8be400246bfad8011dbd0ddd5549e65b1288c858e77dc3e0a5ba9eae0d756ca2e8b5731753e0030211d03af7000000000000000000000000000000000000000000000000000000000000000000000000000f42410000000000000000000000000000000000000000000000000000000000000000000000000000000065a57c5f0001408201f1e0113040829a40cd41efffe02230082725828aa96d32f676df2049228847cc42b15b0a52d9ffa3bc66b36fcedeff20af9310a1de222ce584cb4e86613b11d31616e9eaa4ff9ee499f19b104cf71eb504f0101a02201064606002201a369fe00000000000000000000000000000000000000000000000000000000000000013fc000000000000000000000000000000000000000000000000000000000000000020000000000001e8480cb4af8be402302012025240015bfffffffbcbd1a94a200100015be000003bcb3670dc155500245bf2ac017c203ca0d9d008bf543c1364eebf27183668cf1e8b1e0e98af56b2dc1dc00c22d2703af7333333333333333333333333333333333333333333333333333333333333333300000000000f4242cac3c5723cb68f5f7dba257e7f812140298ea360bdbf630cd33c8da2b098829200000000000f424165a57c5f00014082c2b28020f04091954fc4018112a29005bc00000000000000000000000012d452da449e50b8cf7dd27861f146122afe1b546bb8b70fc8216f0c614139f8e04009e41778c0a604000000000000000003e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082729304b9982993165dc7b4b2ccfc64c61bf6455afe7e4fe1233d5f827261360d8ed855aea1ede2adcff55d3d37fcf59c03bd19c39f843a14faef85cad3980cf6920101a02e01064606002e00ab69fe00000000000000000000000000000000000000000000000000000000000000013fccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd1954fc4000000000000001e8480cb4af8be40008272310a1de222ce584cb4e86613b11d31616e9eaa4ff9ee499f19b104cf71eb504f606c97d0dc8b63016a6afd67b2fe52cd0e02a3dcdf71f331cf1e8006ca8e51a323766587").endCell(); - log.info(c.print()); - log.info(c.toString()); - log.info("length {}", c.getBitLength()); - } - - @Test - public void testShouldDeserializeOutMsgDescr() { - Cell c = CellBuilder.beginCell().fromBoc("b5ee9c72410241010008c7000109a06dac2c020102091036d61601030202091017d7840104060209101efe92013212020b4405f5e1004009050343bf084dd4db5a349ccfcf293baf5f5b626f4a130856b6613ded62877bfecc2536dc0a301b290203504007080343bf24d1ba51931fc51a9af90896c72638a6965587eed9cc6648bb69ab31a7dae44c0a0c330b0243bf17c9d39d78e8498a560800ddfb11dc48be1bc0edc2fbf90844eceb5ab4649610022614024bbf0847cbb01de39c3308edf1091131c7dedb780ca3e34d85bdc1a6ab4df16d79e9017d7840060a140106460600280201610c0d01064606003f03af7000000000000000000000000000000000000000000000000000000000000000000000000000f42439440e0c397a3b2ee3cbd81ea78021862f892a5a9e779d1fecd55236d6571eb5200000000000f424165a57c5f000140811100e020f0409017d784018110f2c009a27c89c4000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008272310a1de222ce584cb4e86613b11d31616e9eaa4ff9ee499f19b104cf71eb504f606c97d0dc8b63016a6afd67b2fe52cd0e02a3dcdf71f331cf1e8006ca8e51a30101a03f020b6501efe920101913024bbec8a2b54087ea747ec1d5ecc652b91406aa6f4c2f479843ebd290b26ad8043eca03dfd2400c181403af704f64c6afbff3dd10d8ba6707790ac9670d540f37a9448b0337baa6a5a92acac00000000000f424873b47eb527e2e6b9a73405d88f31477703ef31e5c4f2b8a2be754d66be0d60ff00000000000f424765a57c5f00074081716150205303024363500827216617de1e9f3a79e4c7d8a3a51ac0c8b54b6bbcd4f824c9f800aa2f36fee2672d4d2e789fd57af824d33228887af40bcfb492aebe39ec74d665726b6471454ab010160210106460600230343beccc243bc18876b43843800323ac0a349ba6ffaf4f87d8e7ba2404e280b7097d81420331a020161201b03b57ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffef00000000000f42450000000000000000000000000000000000000000000000000000000000000000000000000000000065a57c5f0003e665b94481e1d1c001f040901efe92001c0332dca2365b9de4000827290aec8965afabb16ebc3cb9b408ebae71b618d78788bc80d09843593cac98da490aec8965afabb16ebc3cb9b408ebae71b618d78788bc80d09843593cac98da40201e03b1f0101df3101064606003b0201db24220101482300ab29fe09ec98d5f7fe7ba21b174ce0ef21592ce1aa81e6f528916066f754d4b52559593ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbd01efe92000000000000001e8496cb4af8be40020120272501012026008be7f827b26357dff9ee886c5d3383bc8564b386aa079bd4a245819bdd5352d495656240e8cae6e880eb79a200000000000f424a65a57c5f00012195b1b1bcb081ddbdc9b190860101202800ab29fe09ec98d5f7fe7ba21b174ce0ef21592ce1aa81e6f528916066f754d4b52559593fc0000000000000000000000000000000000000000000000000000000000000001017d784000000000000001e8492cb4af8be40020766cb73bd302a03af704f64c6afbff3dd10d8ba6707790ac9670d540f37a9448b0337baa6a5a92acac00000000000f4247d59d160ea9c63d10edae2c76ada993f982915bc75f7bcc0fb81280820d15523200000000000f424165a57c5f00014082f2e2b020f0c0901c9c38018112d2c005bc00000000000000000000000012d452da449e50b8cf7dd27861f146122afe1b546bb8b70fc8216f0c614139f8e04009c402468bb8000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008272bf8229e6e684701825a6f8e1fb0f8155aba759d58b82e73b8405092874e23fa816617de1e9f3a79e4c7d8a3a51ac0c8b54b6bbcd4f824c9f800aa2f36fee26720101a031010c46060365b9de3100b959ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdf3fc13d931abeffcf744362e99c1de42b259c35503cdea5122c0cdeea9a96a4ab2b101c9c380006cb73bc00000000001e848ccb4af8be7fffffffc00244bfaeffebddf2ee4f04633ee2bbba628ae4e08b6e0043d11727286b0df248a2e17700403303af704f64c6afbff3dd10d8ba6707790ac9670d540f37a9448b0337baa6a5a92acac00000000000f42410000000000000000000000000000000000000000000000000000000000000000000000000000000065a57c5f0007408383734020520302436350061c000000000000600000000000719ae84f17b8f8b22026a975ff55f1ab19fde4a768744d2178dfa63bb533e107a40d03c04009e42664e625a0000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008272f1f67337526ee9890e137d5255f3150400e63d15dfe04b26653d275f2d0a6b04bf8229e6e684701825a6f8e1fb0f8155aba759d58b82e73b8405092874e23fa8010160390201db3c3a0101483b00ab29fe09ec98d5f7fe7ba21b174ce0ef21592ce1aa81e6f528916066f754d4b52559593ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbd01efe92000000000000001e8488cb4af8be400201203e3d010120400101203f00ab29fe09ec98d5f7fe7ba21b174ce0ef21592ce1aa81e6f528916066f754d4b52559593fc0000000000000000000000000000000000000000000000000000000000000001017d784000000000000001e8484cb4af8be40008be7f827b26357dff9ee886c5d3383bc8564b386aa079bd4a245819bdd5352d495656240e8cae6e880eb79a200000000000f424365a57c5f00012195b1b1bcb081ddbdc9b1908660bfedbd").endCell(); - log.info(c.print()); - log.info(c.toString()); - log.info("length {}", c.getBitLength()); - } - - @Test - public void testShouldDeserializeInsane() { - Cell c = CellBuilder.beginCell().fromBoc("b5ee9c72e20201380001000028250000002400cc00ea01c402a603420374039603a503be03d8044804b8050405ac05ec065606a2076e078e0824084208600880089e08bc08da08f80916093009d80a180b0a0b7a0bc70bea0c0e0cba0cda0cfa0d1a0d380d560d740d900dac0dc80e6e0ef20f160f360f820fce0fee100e102e104c106c108c10ac10cc10ec1196121e12841306132413421360137c142014a014ae14bc14ca14d814e614f415021510151e152c153a1548155615a215b015be15cc15da15e815f6160416ba16c816d616e416f21700170e171c172a1738178417a817cc181918c418e419041951199d19bc19da1a271a731a901aae1afb1b471b621b7e1bcb1c171c321cd81d251da81df51e471e921eb21eff1f4b1f6a1f8a1fd71ff620142061208020cd20ec210c2159217821c52211223022da232723ae23fb246024ad24f9257a25c725e42631264e269b26b827052751276c2810285d28dc2929297529c12a0d2ad82b252b442b522b9f2bbc2c092c262c732c922cdf2cfc2d492d662db32dd02e1d2e3a2e872ea42ec22f702fbd3009309e30ac30ba31073114316131ad31ba31c832153222326f327c32c9331533223330337d33c933d633e4343134e634f435aa35b8366c3720372e377b378837d537e237f037fe384b385838a538b238ff390c3959396639b339c03a0d3a1a3a673a743ac13b383bec3c393c463c543ca13cae3cfb3d473d543da13dae3dbc3e093e163ecd3f823fcf3fda3fe0402e405640aa40b740fa410441e84200420e421d422c423c42e043884430443c444844ce458e4614462646ca478b4794481a483648e74988499449a04a264ae64b6c4b7e4c3e4cc44cd64d7b4de94ea84eaf4f354f464fea504b041011ef55aaffffff11000100020003000401a09bc7a98700000000040101485c0d0000000100ffffffff000000000000000062b2ca7f00001a5752b3ec0000001a5752b3ec042d722c2c0004ee1f01485c09014820d8c400000003000000000000002e00050211b8e48dfb4a0eebb004000600071a8a03482793f3b50aaf5c1948a7daea6509532374f902fe6abeff45f620cb8c99cb00130443feeb6ff454dd7b749d28f509060c2cc668963d39733cf0e844a2880964938114c1372a89491186e2103aabb88851625b18674a78929f3c357ca78e98824227016e016e000b000c1489b85d301a5e194c97f1c275d3ead4bd74c6e4f42bc74ff8ef930e594b8dd9887900084a33f6fda87b6952196d2ab3a76db9754f0792826c8eb9650220c062ca9afc456d18d616915f7809f0e2a9af47f9b741c0d1567a8cc87eb371ae985206197a819b2896f2c00109010a010b010c009800001a5752a4a9c401485c0c493505d505412a231566c8853321bb16a8d291b5c091b6b89f7fb0f4470293ca35028007ab3f46b45071071ce8368191ef3b54ec0db1ad04e1ad4b8e254c89e4022581f2cf4db6b621cfac0f967a6e06286bfd400800080008001d43b9aca00250775d8011954fc400080201200009000a0015be000003bcb355ab466ad00015bfffffffbcbd0efda563d0245b9023afe2ffffff1100ffffffff000000000000000001485c0c0000000162b2ca7c00001a5752a4a9c401485c0960000d000e000f0010245b9023afe2ffffff1100ffffffff000000000000000001485c0d0000000162b2ca7f00001a5752b3ec0401485c0960001d001e001f0020284801010190c062d880448c7c066d5e7f424d3c899b5b7618f97ecf7c54e38dd4c8b25a00013213eaca33f4cbadbd5448172264067fbb377adbe16d7c4681fb55312783f206756a318a5c723a464c78c863a17c0802276f4114c4c8edf27dd9eb88622de8445b07016d00118207cb3d36dad8873eb00023008422330000000000000000ffffffffffffffff81f2cf4db6b621cfa828008400222455cc26aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac23224a27d088a237e001100ac001200ae28480101553f5abf307236fc3eae3b9829943a1b4f895241d07cd2f7fb7106f492a37a4f000222bf000193a937010004ee1f6000034aea52acf0880000d29bdd9fc8200a4106c7d59f0086cde0d05cc99baaddf7a9c5b890aa805e8c96680523524fb4a5a99ff81257e3afd8721409a6a81f22735c0e33400aeb6e7f0a1a5185bb3a3c9deba278be001300142213c3c0000695d4a559e12000b100153201c47dca7c0afc1021a7f8ac40f39fac4e3a34441c180afd0667ef533f08c042258d60f2282e7cde376f0df9fd5ebcc5d8bb19faf6cc57bbbb662485cd76bdce510010000c20004800492211480000d2ba94ab3c2400b30016221162000034aea52acf0900b500172213c480000d2ba94ab3c24000b700182211400000d2ba94ab3c2400b9001922110000034aea52acf09000bb001a22110000034aea52acf09000bd001b2212cc00001a575295678400bf001c2211400000d2ba94ab3c2400c300c4011100000000000000005000213213b82c6f6878b537db3c16dcd5f01397865949762fc38f51cb6aff56594f1062f1edf7f2f7d1549f1d22aab06d9a81c9d49510c3fa6d09dba89fcddb0b8576e4aa016d00118207cb3d37031435feb00068008422330000000000000000ffffffffffffffff81f2cf4dc0c50d7fa828008400223455ee67dd6327a64269ce346e9b1568ef56241f1ba5179cb6d2ac85c5c18646ae12717905e49ef1945ed5b3e03bab93b347378306bc631945e0355ad7507cbada29001b0010cc26aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac23224a2820ffffb7e010e00ac00ad00ae006bb0400000000000000000a42e0680000d2ba95254e1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc028480101173ea53338a2f89f176ad2d6129a90977e8c56e325d959bdf92b7171d9070911000423130103e59e9b6d6c439f580024006a00842313010217dee532a6595718002500260084331392afc8f7cde2b08b147ca948f16cc575bbbd4d383188441e172a5cbc617e05249b737c913fe069b3ce1ce7d550cb95f27f4d428faee54cd295c65c5b9ad7e3ae0027000e01014dad03493b489b5800310032008422130100ca31e1e96b10bbc80027006e2213010058b525488168d908006f0028221301003e470bb61928028800290072221100e1caf7c460aa04680073002a221100e1c6b40db0b41708002b0076221100e11e73378043a2080077002c220f00c021469bdc5408002d007a2210680c021412935422007b002e220f00c021383dbc6da8002f007e219dbceaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa81804265fa43649cc3b15c891620f7db60a685fb7054bcc7b8817f05a7e9b73acdede2200b57bfa000034aea549538700302277cff5555555555555555555555555555555555555555555555555555555555555555407aec10e79c0000000000000695d4a92a711804265fa436495d0008000812313010069341ebbd1eac97800330034008422130100e478e48d695dd1e8008500352848010199c07995a55880a2a97e2d1c235a7dfb6b24666e40158c97f7fafb18707d9e01002228480101a40b78c2e39cf3658d455ad29ca1f2bf10cdb87248a8d293e625f4ff821d3ffe001922130100cae245aca13c29a8003600882213010094b93dc1fd640ba800370038221301007e0f065474a37188008b0039221100f6aa376d88c09a280042009f221301007e00c5c8df3ca988008d003a221301007e00c226bc22c348003b0090221301007dfeec4e6f29f348003c0092221301007dfeec4db9634c680093003d221350401f7fbb08ed8733f2003e009621a1bcd9999999999999999999999999999999999999999999999999999999999998200fbfdd8431e351e0e7f7559f2be451b78ede8267e7a8cb24cabd8236aa272459ca146db75357e502000034aea5495385003f227bcff333333333333333333333333333333333333333333333333333333333333333340756c14c3f00000000000000695d4a92a70e00fbfdd8431e351e16d0009800402355ec05b6c5a0ba9cc563f4263b03448b2038580c84db168a6ea499c5ee5d19ddadc8351566240da1dbc38a3b009a009b00412179a062b1fa1362b37a13000080001d81a245901c2c06426d8b4537524ce2f72e8ceed6e41a8ab31206d0ede1c51dc00ebe70af3ef33d8313797763b95f20009d221100f6a49bd9e38f3928004300a1221100ea59d8cb334c9c08004400a3221100ea59cff28ceadfc800a40045220f00c108ba716ce988004600a7219bbd62f8f7bea30f8ab5e9f16c3fb8642b118f56ed1bdc49600dbe5220c8b1af9e040c474f8074f1d14ce894ceb17ddbe1eb5416175db816dcb3d9b86ecacfe305fc3df0baaa80000d2ba95254e1c00047236fcff34517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf21881f480000000000000695d4a92a7110311d3e017f000a900aa00ab220120004a00e2220120005e00c8220120004b00e4220120004c004d220120004e00e822012000f90056220120004f00ea220120005000ec220120005100ee220120005200f0220120005300f2220120005400f4220120005500f628480101a54022f5edbf4beba0648deeb1ffc566c63567b51e34ccd918ab339bdedfec330001220120005700fc220120005800fe22012000ff00592201200101005a220120005b0104220120005c0106220120005d010800b1bd24ee866df51003f6b534d22c17f58175a943d247f628a0d355a187e86e73bd18acb16cc00000000000002a80000001dd3de5878000001dde15bcd058acb28f0000000000000021800000014bff7ab78000001718cb2138a0220120005f00ca22012000cb0060220120006100ce220120006200d0220120006300d222012000d30064220120006500d622012000d70066220120006700da284801015dc67661a1c1ef1294e875961eea55bea7054c7101bc975ed0aa009be971719a000323130103e59e9b818a1aff580069006a00842313010217dee546c430b718006b006c0084284801013c24d22fb5e19c4c445ed87fd2f21aab05a39914a685834b6a1d0cf004891430016b33134d60714c9ba1d20d9c30bf39735d0ad7bfca9eb3ced50edfdae92a4c3339ef4d25e774489adf29b089b2e31b7a68d28886f450600fefbb6f581b3a94423ffc070027000e01014dad035d591ffb5800820083008422130100ca31e1e96b10bbc8006d006e2213010058b525488168d908006f007028480101256e458a2d80eecd799b387aa5e91b156bc583f9f095f0fcea7b2d73cb3d726e00262848010107983f5e2ef514d990c22499abec1ccb4fd222f7489b7febb2044fe24e39318d001a221301003e470bb61928028800710072221100e1caf7c460aa04680073007428480101d405a7172eafa75f0e67e1b0f52d000222f4399c5d7dda059af11c73faf135a300182848010189afd21725efab9748b8b6ef6dcfd892c9f647a939c73831d4f1dbc786b9ec690016221100e1c6b40db0b4170800750076221100e11e73378043a20800770078284801012b525231768abd4f2fc0464b8e5be011db5ebdb3a1ed6d61eebf186e8dc197ba001528480101b81fe7658c95d0f97eabe671d2b147f2da908bd4813119d475886872068353200014220f00c021469bdc54080079007a2210680c021412935422007b007c284801018916fffc4697fa71347a36028c9c0ab1b54bf2c278f9171f7837101f990665f2001128480101a248b81f22333cc28f6b6744e4298aefcd9b6f2dc5d7c99e1da1b28c37f3aa0c0007220f00c021383dbc6da8007d007e219dbceaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa81804265fa43649c9d338c13843e706c68e2455ed70bbf93820f28a394eec0b616e855fce8e6cac000034aea567d807007f284801010143b3d2dd671b2559543155e003f847022e510b3a57afabbca05d4069c327ef000d2277cff5555555555555555555555555555555555555555555555555555555555555555407aec10e79c0000000000000695d4acfb011804265fa436495d0008000812848010164a43970f2007a1da6d6fc81773cc095d1cc270e81359e471f3b03469abeb7b5000c214900000027cbb9d1062954439a83a91f27835fb9d2e3e798910356650c3c493c94623464684000ac28480101afccd0b5d74a6fad14fcb8652b14eea3d3d7ad0226c0961aa9992a1f0c2997c1002322130100e478e4a1873531e80085008628480101a5a7d24057d8643b2527709d986cda3846adcb3eddc32d28ec21f69e17dbaaef0001284801016161938bf6cbbbea618b3c71572f00d9392090c9f15e70d1ef9080503b42229c002322130100cae245c0bf1389a8008700882213010094b93dd61b3b6ba80089008a28480101b4d986be6da4a385ebc4d75e7b6864ddae73e6e6431f711cbb3208dfb35945750024221301007e0f0668927ad188008b008c221100f6aa376d88c09a28009e009f284801012234afc4f9aa54d36f371ab851ada0446bbab533a15161ca6f4afd77d69d89520012221301007e00c5dcfd140988008d008e2848010103f584b35917a807e8a2ec65376c8ed2c6ccecf273ba8cb55dbacfe29a84a6140013221301007e00c23ad9fa2348008f0090221301007dfeec628d0153480091009228480101735d9d54218cf8454bd30b70a53ae0de4219178b78f457b844f50dc11b5719f00013221301007dfeec61d73aac6800930094284801017cc50a2d61f5f6979db4641a9451edade1fb234111081a83333a2b03ce9dc373000a2848010110cac8bd77fa246c2bc95d0269759b612312bbc0438ed5eb7dd53116e55e9020000b221350401f7fbb0df4fd0bf20095009621a1bcd9999999999999999999999999999999999999999999999999999999999998200fbfdd86b59e3de15e7c728be36b6cb9aa8d1663f3d4c1e962ab20459e6e56ae211a233bc1e24f52000034aea567d80500972848010150725eee52e86432f846698a08ac153a67bc9ad9c160130af907c3bef05f29480007227bcff333333333333333333333333333333333333333333333333333333333333333340756c14c3f00000000000000695d4acfb00e00fbfdd86b59e3de16d000980099284801016217f872c99fafcb870f2c11a362f59339be95095f70d00b9cff2f6dcd69d3dd000e2355ec05b6c5a0ba9cc563f4263b03448b2038580c84db168a6ea499c5ee5d19ddadc8351566240da1dbc38a3b009a009b009c28480101fb16d1ca45ecb8d4d1f6b1ac903c630cc06f78334bc9b84bf30585e9422cb887000b284801018f1bd34960aa509ff15ef8c648fdcb942bb7a6c14bda5d4988792ce1c7800bee00062179a062b1fa1362b37a13000080001d81a245901c2c06426d8b4537524ce2f72e8ceed6e41a8ab31206d0ede1c51dc00ebe70af3ef33d831379c7db16df20009d28480101e9988188b13457c31092fcc241e6b801ab7dc39b30a0923557a193630fef257f000a221100f6a49bd9e38f392800a000a128480101c6100af2020b8ed627f48ec736f2cfa52e095b513479105a028f40e152c9586f0016221100ea59d8cb334c9c0800a200a3284801011e20584a9cf50091fb4dddfe4d2e98f8c879438cc843e24314604b44cb6f78580012221100ea59cff28ceadfc800a400a52848010141d3f8101f423d32b2cdb23d98d0f34f83db175e427605500093f4a31cd8df03000b28480101e2bc337ece7f3af5171f3265f44c612fc2fcba87f4b4563dc7fdc3285dd6a44d0008220f00c108ba716ce98800a600a7219bbd62f8f7bea30f8ab5e9f16c3fb8642b118f56ed1bdc49600dbe5220c8b1af9e040c474f800b0df7369fde2be70ee4d2e84a552cab4b035685314de3d2e8e12b8d25aa27ae80000d2ba959f601c000a8284801018e634c5cb159b3914109244a95171c97fe56c7ad67ec709cce94bb067893af680007236fcff34517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf21881f480000000000000695d4acfb0110311d3e017f000a900aa00ab284801017269fb9feb45d719ebdbc3b0816b987bab06f43378dc84dc84d55727905482140002004811fd096c000000000000000000000000000000000000000000000000000000000000000028480101986c49971b96062e1fba4410e27249c8d73b0a9380f7ffd44640167e68b215e8000328480101b4ff459f14a389ff7d6ea967ec8d5329f3cff84a787a7c1fcb6e3d447b6175e5001022bf000193a937010004ee1f6000034aea549538880000d29bdd9fc8200a4106c7d59f0086cde0d05cc99baaddf7a9c5b890aa805e8c96680523524fb4a5a99ff81257e3afd8721409a6a81f22735c0e33400aeb6e7f0a1a5185bb3a3c9deba278be00af00b028480101b20e36a3b36a4cdee601106c642e90718b0a58daf200753dbb3189f956b494b600012213c3c0000695d4a92a712000b100b222012000c500c628480101258d602eaa21d621634dcf86692aeae308ff3cf888f3edafc6a5b21848d732f900182211480000d2ba95254e2400b300b4284801014b01ebcf5425735461aa8b83bae89e70fa21e95d2ee85e57b05dad26c1d6d5300016221162000034aea549538900b500b6284801019523e298bdc5f691343d880493b8a6451f3f941c985a7c4a167ba0e1cdb4599600132213c480000d2ba95254e24000b700b82848010137844b3a6262ee12ef028d6b8968b779c5be75d93a7dc1838aba9408a360ea42000e2211400000d2ba95254e2400b900ba28480101ce05363b2c4d123e6af0a2c3edbe06e05e4b55117180062e69624e00f64ae2a7000c22110000034aea5495389000bb00bc28480101aad2366c8dcad53c429dfbea0cd1c479cc6b989ef981314b1382fd58de7c8afd000b22110000034aea5495389000bd00be284801015af875e56b2c21860165b66c58883a203401027a269c372667df9eb27b476259000a2212cc00001a5752a4a9c400bf00c0284801013eb4f392dec5652b5e530a0922b5533c816263d761c0775349d4265cd85bd761000322110000034aea5495389000c100c222110000034aea52acf09000c300c400a9d00000695d4a92a710000034aea54953880290b818926a0baa0a8254462acd910a6643762d51a5236b81236d713eff61e88e0527946a05000f567e8d68a0e20e39d06d0323de76a9d81b635a09c35a971c4a9913c9284801016e527b5263548e810db4a6e4a1f87c5c20d1c7859c8a5e2113127c954400e7b900012848010192f515d5126f2a2fe83d0204780eb95ac49143dae652a6a618f650997621e09a00013201d970752cf49fb39f7ea882f429ef6a8a5ce3eaf9ff4d35bfba6d93ffc9e2a7368180f9da67bd40c08ccea6759238e3e79b631d22aa1dc395bbcec337be6d4e84000f000c2000e100e222012000c700c822012000c900ca284801012a31c24fa32c257e4912fc641c19d5679a5359fb89020b7fe030e3b104be570f000e22012000cb00cc28480101f8b1119a3146337e09b6a8bbd36f93c78f448ea18e0591af0a3726033c7b5345000c2848010136a19e11f370f7b9cf36d83e0cdb68ea6f02ebe02487e3a5ca264a2baa6cd0d8000c22012000cd00ce22012000cf00d0284801015fb934835d63076694fbd0ca2191f6219a2017bfee8370008d48729374463b93000b22012000d100d228480101d98bd6122c9ac0cd3bb56dd7127ca09ede8c606fcb15de38baa4b47f7fe51f04000922012000d300d4284801011bd2caf8f41ad27d29c9c0d34e01bc0457050b3e5cce1754ec06a5fef2e688af000828480101d3073a3cbcbb4a650ca94a719590f8460e5f51d6081fcea01e7e51cfbc60a444000622012000d500d622012000d700d828480101ab9eb8899afa5c8bb9368d94781cf3ebb2eac7fb017a2b6133f9bb7b0e5d7b85000528480101664d4a2f536f0763f76857ceb94de20b4fad7e80b85675b3d02cf79a319b467e000122012000d900da02012000db00dc284801010f0ee7d20301abe555b4a76a6ada745283de3664ecb09ba794fec4d44db79b68000300b1bd1148769c03366e79fc451b06179e791641db92df408fd46e6ffe7ad24d90a90000000000000000000000000000000000000000000000000000000018a8fe848000000000000014000000006740cdc84000000b659904b9a002012000dd00de00b1bce1814fe876c4b4657ef4585f2f9b9158201e2fc77698c43e68104b88fe4ab2314e7cf70000000000000066800000039c368aef00000040a8c4d343b14e7b67800000000000003b000000040b2e294300000028134825e0c002015800df00e000afbc6d1a11a99e030e7005cac69de1a3cdeea9807743355fbf293f897e485ac868c54bf1b80000000000000124000000091627b10a000000bd5670281ec54bf2a8000000000000011400000006eaf842ee000000a8472576d100afbc6f013e1c5535e8ff36e8381a2acf51990fd66e35d30a40c32f50336512de48c56594fe00000000000001440000000ce66b410a000000d9c852602cc565938800000000000000d40000000de9bcb146000000935ab614cd22012000e300e4284801014356834a429921990e0c978c594d3d7734b7cd96dd66c057aa786ccf4f5a258c000e22012000e500e62848010134a3bc4b6c672bb70328222747df9434117f6ee5953dc9447b945d42862c585f000c22012000e700e822012000f900fa22012000e900ea284801016b54a1df1176e4608f655e63cf51ff3deec889dcf9229cceb100c32a12d3288e000922012000eb00ec284801015d23a19db6638756e655885d66767ab5ca9c7044b8d6263da018629630bda2a5000822012000ed00ee284801014e72d9d9406765832f323a591918a7b8cdb1acdbcbdeab3f2bcbc4c93fbc1f99000922012000ef00f02848010138b4953e5411a45c37899ce1936780cec049051f53d3a16bad52de7c7609476e000622012000f100f228480101a9cf62c6624684d83857a4381d9d525efe2e2d5bafd839d9893f80beeaa43f70000522012000f300f428480101d1a07de28968f21c0c3cfe0e69605731ae68b71969d27dd270f99b4079019904000222012000f500f6284801018d455e04c00fba1289866da39c0793758c8d6a4e41ca2dd5ec2c03c76df76c42000302014800f700f82848010122863015f2ff93c8dfe54f980440d8b3b2bd946770d126f32325fc9c8e37cb2e00020073de48c56594fe000000000290b818000004b380fb4ef8000090e500f4af24c56594fe00000000153ae540000004efd6476f22000098db0ac6ce1f00b0bc914560076a5a3e2f68770608073c7920cd095fd22f6624cdc5631150352c9400000000000000000000000000000000000000000000000000000000629df4ce000000000000004000000004a9d9195a0000002b5c8e819328480101d2fc779057e6ebb9d8413f029999ad6426bdc42b841578ba4f1302565b3bb3b8000a22012000fb00fc22012000fd00fe2848010166827a7a38f195b34597175fc019e4dc80b6f714f0b51a2369270417305747e1000922012000ff010028480101cef4f4863fe525820f12b7c79bbc2276d0fdb7e300c55d70d809bfdef1e801f5000728480101c76ad89ed6929dfcdcbaaa4f5720981c659c02b305514971803760369f7017650006220120010101022848010138e8cca37bb83b168adc87a7037092d90c734af074cace4ae828e0cf82b67b30000422012001030104220120010501062848010150d30f1a3fd6f709f0627934b2b31be081dc25bc52b51a353f850efa09ad224d00022201200107010800b1bd635fefc47229e53988915685933558fd7303875055c5949d871dc2688df796800000000000000000000000000000000000000000000000000000000c54be8f6000000000000007e0000000e610f41dc000000593a932aa9000b1bd24ee866df51003f6b534d22c17f58175a943d247f628a0d355a187e86e73bd18acb16cc00000000000002a80000001dd3de5878000001dde15bcd058acb29fc000000000000021c0000001814ffc698000001752c06e7e202848010160ce52c8bd8ed7f87a7643812f7690467a604fcff9ba1811d065a34a0202d78f000201038020010d00010211011366ea62c6b62574b18990480a15bd04daf2d4d5c8e3413a8f62b0ff533b259b00078201150317cca5687735940043b9aca004010e010f01100247a00d9b55c39995181e04934d61a2baf0f5aa35a4e059bb4c55f309227aee336c95200610011401210103d0400111003fb000000000400000000000000021dcd650010ee6b280087735940043b9aca004010150011301db500cc320a00a42e0680000d2ba95254e000000d2ba95254e0850d8a46888759f13cd17310cd46d6e9e821d494944c72f183259690def72a1a5a15278d7e6ad8df707446b0df93af44f8aca68c8a6c286121567c529e8dd7088800027779c00000000000000000a42e04b159653da0112001343b9aca0021dcd6500200201610114012101064606000125020340400116011702037604011801190297bf955555555555555555555555555555555555555555555555555555555555555502aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaad000000695d4acfb00c1013201340397beb33333333333333333333333333333333333333333333333333333333333333029999999999999999999999999999999999999999999999999999999999999999cf80000695d4acfb00040011a011b011c0397be8517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf029a28be3defa8c3e2ad7a7c5b0fee190ac463d5bb46f71258036f9488322c6be7cf80000695d4acfb0004001270128012901035040011d0103404001210082724a765bd03de7e557d03d203239641e4570953914b82a806fdbc2fa10f8c5e3b7e1cb96b8a440f43d5cc8d5334f00711345b647d43e5837cf367741c70934d23703af7333333333333333333333333333333333333333333333333333333333333333300001a5752b3ec0173fbaacf95f228dbc76f4133f3d46592655ec11b5513922ce50a36dba9abf28100001a5752a4a9c262b2ca7f00014080133011e011f0082724a765bd03de7e557d03d203239641e4570953914b82a806fdbc2fa10f8c5e3b78d942e903175e0ffe9857660057e1e7e904397d1bd95e61a0dc318aaabb1b31f02052030240120013700a0431b9004c4b4000000000000000000960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003af7333333333333333333333333333333333333333333333333333333333333333300001a5752b3ec0246660377de4bc319a5038b872892ad701fa6a7f2783ecefd07a68cb4fe32f8b700001a5752b3ec0162b2ca7f00014080122012301240101a001250082728d942e903175e0ffe9857660057e1e7e904397d1bd95e61a0dc318aaabb1b31fe1cb96b8a440f43d5cc8d5334f00711345b647d43e5837cf367741c70934d237020f0409283baec018110126013700ab69fe00000000000000000000000000000000000000000000000000000000000000013fccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd283baec0000000034aea567d800c56594fe40009e42614c107ac00000000000000000640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001035040012a01035040012d008272f46adf2640fb8c30d7d053c9c4084f8daeda7399e261dd404d1578691fcb5bd75f4f3be7c22b3f846e0fc1aa8c5ccb4ed9a7e5acc35369f076448359df9b18eb03af734517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf00001a5752b3ec01e9e3a299d1299d62fbb7c3d6a82c2ebb702db967b370dd959fc60bf87be1755500001a5752a4a9c362b2ca7f00014080133012b012c008272f46adf2640fb8c30d7d053c9c4084f8daeda7399e261dd404d1578691fcb5bd7b43acc176be3014d5645fa082b16fe872be1c3b8428621bc03e49a5bc0cf7db202052030340130013103af734517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf00001a5752b3ec0372f7b0548efa5c07fc58c3051d80c9f650039701e834559eabe556240894c83400001a5752b3ec0162b2ca7f00014080133012e012f008272b43acc176be3014d5645fa082b16fe872be1c3b8428621bc03e49a5bc0cf7db25f4f3be7c22b3f846e0fc1aa8c5ccb4ed9a7e5acc35369f076448359df9b18eb02053030340130013100a042665004c4b400000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069600000009600000004000600000000000519ae84f17b8f8b22026a975ff55f1ab19fde4a768744d2178dfa63bb533e107a409026bc03af7555555555555555555555555555555555555555555555555555555555555555500001a5752b3ec03e61d8ae448b107bedb05342fdb82a5e63dc40bf82d3f4db9d66f6f11005abdfd00001a5752a4a9c362b2ca7f0001408013301340135000120008272010f24a4cdf5d7c0f8497739ff731e5175cd3f10069c838b4445caf821c4cf4e6ca0ffac88c5927e1becceb3949e8aa3388a1cd3e5405413900cce63ed93f19902053030240136013700a041297004c4b40000000000000000002e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005bc00000000000000000000000012d452da449e50b8cf7dd27861f146122afe1b546bb8b70fc8216f0c614139f8e04a5134191").endCell(); - - String bocHexWithCrcAndIndex = c.toHex(true,true); - - log.info("hex {}", bocHexWithCrcAndIndex); - assertThat(bocHexWithCrcAndIndex).isEqualTo("b5ee9c72c20201380001000025e3000000120066007500c0010f015d0176018701bf01f701fd020002050219022002460256027602ab02b802c802e8031d0347034f03550377037c0389039603a803ce03f4045a048004b804ca05300538058a05fc06030615063b064b065206640674067b06cf0723078307c607d207e407f4081a082908300837084908590868086f0876087c088208c508cb08d10914091d092f093f094f0975099b09aa09b109d709de0a040a2a0a3a0a4a0a590a600a670ac70b270b870bd90bff0c250c4b0c5b0c810c910cb70cc70cce0cf40cfb0d210d310d410d510d580d5f0da20dab0dee0df70e3a0e430e530e790e880eae0ed40ee30eea0ef10f170f1e0f2e0f3d0f4c0f530f5a0f610fb31005103c104c105b1081109010b610c510cc10f21118111f1126114c115c116b117a118911901197119e11c411d411e312091218123e12641273127a12a012a712cd12d412fa130a131913281337133e1345134c13721382139113b713dd13eb141114201427144d1454147a148114a714b714c614d414e314ea14f114f81508152e153d15631571159715bd15cc15d315f9161f1626164c1653166316721680168f1696169d16a416b416da1700170e173417421749176f1795179c17a317c917d917e717f51804185b186218691870189618a618f8191e19711997199e19c419cb19f11a171a1e1a2e1a801ad31ada1ae11ae81b3d1b631ba31be51bec1c121c191c741c9a1cc01d151d551d971d9e1da51dac1df01e161e3c1e621e881eb11ed71efd1f581f7e1fc21fc92024207f208620ac20df2112214e21a82203220a22302256229722d82332238c23b223d823df243f24422468248e24b424b924fc250a256225b325e3041011ef55aaffffff11000100020003000401a09bc7a98700000000040101485c0d0000000100ffffffff000000000000000062b2ca7f00001a5752b3ec0000001a5752b3ec042d722c2c0004ee1f01485c09014820d8c400000003000000000000002e00050211b8e48dfb4a0eebb004000600070a8a0443feeb6ff454dd7b749d28f509060c2cc668963d39733cf0e844a2880964938114c1372a89491186e2103aabb88851625b18674a78929f3c357ca78e98824227016e016e0008000904894a33f6fda87b6952196d2ab3a76db9754f0792826c8eb9650220c062ca9afc456d18d616915f7809f0e2a9af47f9b741c0d1567a8cc87eb371ae985206197a819b2896f2c0000a000b000c000d009800001a5752a4a9c401485c0c493505d505412a231566c8853321bb16a8d291b5c091b6b89f7fb0f4470293ca35028007ab3f46b45071071ce8368191ef3b54ec0db1ad04e1ad4b8e254c89e4022581f2cf4db6b621cfac0f967a6e06286bfd4008000e000e001d43b9aca00250775d8011954fc40008245b9023afe2ffffff1100ffffffff000000000000000001485c0c0000000162b2ca7c00001a5752a4a9c401485c0960000f001000110012245b9023afe2ffffff1100ffffffff000000000000000001485c0d0000000162b2ca7f00001a5752b3ec0401485c0960001300140015001601038020001700010201018200180317cca5687735940043b9aca0040019001a001b020120001c001d284801010190c062d880448c7c066d5e7f424d3c899b5b7618f97ecf7c54e38dd4c8b25a000122138207cb3d36dad8873eb0001e012b22330000000000000000ffffffffffffffff81f2cf4db6b621cfa828012b001f2455cc26aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac23224a27d088a237e00200131002100220111000000000000000050002322138207cb3d37031435feb00024012b22330000000000000000ffffffffffffffff81f2cf4dc0c50d7fa828012b001f2455cc26aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac23224a2820ffffb7e00190131002500220247a00d9b55c39995181e04934d61a2baf0f5aa35a4e059bb4c55f309227aee336c95200610012c012d02034040002600270103d0400028003fb000000000400000000000000021dcd650010ee6b280087735940043b9aca00401015000290015be000003bcb355ab466ad00015bfffffffbcbd0efda563d023130103e59e9b6d6c439f58002a002b012b28480101173ea53338a2f89f176ad2d6129a90977e8c56e325d959bdf92b7171d9070911000428480101553f5abf307236fc3eae3b9829943a1b4f895241d07cd2f7fb7106f492a37a4f000222bf000193a937010004ee1f6000034aea52acf0880000d29bdd9fc8200a4106c7d59f0086cde0d05cc99baaddf7a9c5b890aa805e8c96680523524fb4a5a99ff81257e3afd8721409a6a81f22735c0e33400aeb6e7f0a1a5185bb3a3c9deba278be002c002d28480101b20e36a3b36a4cdee601106c642e90718b0a58daf200753dbb3189f956b494b60001006bb0400000000000000000a42e0680000d2ba95254e1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc023130103e59e9b818a1aff58002e002b012b22bf000193a937010004ee1f6000034aea549538880000d29bdd9fc8200a4106c7d59f0086cde0d05cc99baaddf7a9c5b890aa805e8c96680523524fb4a5a99ff81257e3afd8721409a6a81f22735c0e33400aeb6e7f0a1a5185bb3a3c9deba278be002f003002037604003100320297bf955555555555555555555555555555555555555555555555555555555555555502aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaad000000695d4acfb00c10033003401db500cc320a00a42e0680000d2ba95254e000000d2ba95254e0850d8a46888759f13cd17310cd46d6e9e821d494944c72f183259690def72a1a5a15278d7e6ad8df707446b0df93af44f8aca68c8a6c286121567c529e8dd7088800027779c00000000000000000a42e04b159653da0035020161012c012d2313010217dee532a659571800360037012b284801013c24d22fb5e19c4c445ed87fd2f21aab05a39914a685834b6a1d0cf004891430016b2213c3c0000695d4a559e12000380039220120003a003b2313010217dee546c430b718003c003d012b2213c3c0000695d4a92a71200038003e220120003f00400397beb33333333333333333333333333333333333333333333333333333333333333029999999999999999999999999999999999999999999999999999999999999999cf80000695d4acfb000400041004200430397be8517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf029a28be3defa8c3e2ad7a7c5b0fee190ac463d5bb46f71258036f9488322c6be7cf80000695d4acfb0004000440045004603af7555555555555555555555555555555555555555555555555555555555555555500001a5752b3ec03e61d8ae448b107bedb05342fdb82a5e63dc40bf82d3f4db9d66f6f11005abdfd00001a5752a4a9c362b2ca7f0001408012e00340047008272010f24a4cdf5d7c0f8497739ff731e5175cd3f10069c838b4445caf821c4cf4e6ca0ffac88c5927e1becceb3949e8aa3388a1cd3e5405413900cce63ed93f199001343b9aca0021dcd650020231301014dad03493b489b5800480049012b22130100ca31e1e96b10bbc8004a004b28480101258d602eaa21d621634dcf86692aeae308ff3cf888f3edafc6a5b21848d732f900182211480000d2ba94ab3c24004c004d220120004e004f22012000500051231301014dad035d591ffb5800520053012b22130100ca31e1e96b10bbc80054004b2211480000d2ba95254e24004c00552201200056004f2201200057005101035040005801034040012d0082724a765bd03de7e557d03d203239641e4570953914b82a806fdbc2fa10f8c5e3b7e1cb96b8a440f43d5cc8d5334f00711345b647d43e5837cf367741c70934d23701035040005901035040005a008272f46adf2640fb8c30d7d053c9c4084f8daeda7399e261dd404d1578691fcb5bd75f4f3be7c22b3f846e0fc1aa8c5ccb4ed9a7e5acc35369f076448359df9b18eb0205303024005b01372313010069341ebbd1eac978005c005d012b22130100e478e48d695dd1e8005e005f2213010058b525488168d9080060006128480101256e458a2d80eecd799b387aa5e91b156bc583f9f095f0fcea7b2d73cb3d726e0026284801014b01ebcf5425735461aa8b83bae89e70fa21e95d2ee85e57b05dad26c1d6d5300016221162000034aea52acf090062006322012000640065284801014356834a429921990e0c978c594d3d7734b7cd96dd66c057aa786ccf4f5a258c000e22012000660067284801012a31c24fa32c257e4912fc641c19d5679a5359fb89020b7fe030e3b104be570f000e28480101afccd0b5d74a6fad14fcb8652b14eea3d3d7ad0226c0961aa9992a1f0c2997c1002322130100e478e4a1873531e8005e00682213010058b525488168d90800600069221162000034aea54953890062006a220120006b0065220120006c006703af7333333333333333333333333333333333333333333333333333333333333333300001a5752b3ec0173fbaacf95f228dbc76f4133f3d46592655ec11b5513922ce50a36dba9abf28100001a5752a4a9c262b2ca7f0001408012e006d006e03af734517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf00001a5752b3ec01e9e3a299d1299d62fbb7c3d6a82c2ebb702db967b370dd959fc60bf87be1755500001a5752a4a9c362b2ca7f0001408012e006f007003af734517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf00001a5752b3ec0372f7b0548efa5c07fc58c3051d80c9f650039701e834559eabe556240894c83400001a5752b3ec0162b2ca7f0001408012e0071007200a041297004c4b40000000000000000002e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002848010199c07995a55880a2a97e2d1c235a7dfb6b24666e40158c97f7fafb18707d9e01002228480101a40b78c2e39cf3658d455ad29ca1f2bf10cdb87248a8d293e625f4ff821d3ffe0019284801016161938bf6cbbbea618b3c71572f00d9392090c9f15e70d1ef9080503b42229c002322130100cae245aca13c29a8007300742848010107983f5e2ef514d990c22499abec1ccb4fd222f7489b7febb2044fe24e39318d001a221301003e470bb61928028800750076284801019523e298bdc5f691343d880493b8a6451f3f941c985a7c4a167ba0e1cdb4599600132213c480000d2ba94ab3c240007700782201200079007a2848010134a3bc4b6c672bb70328222747df9434117f6ee5953dc9447b945d42862c585f000c220120007b007c28480101f8b1119a3146337e09b6a8bbd36f93c78f448ea18e0591af0a3726033c7b5345000c22130100cae245c0bf1389a8007d0074221301003e470bb619280288007e00762213c480000d2ba95254e2400077007f22012000800081220120007b00820082724a765bd03de7e557d03d203239641e4570953914b82a806fdbc2fa10f8c5e3b78d942e903175e0ffe9857660057e1e7e904397d1bd95e61a0dc318aaabb1b31f020520302400830137008272f46adf2640fb8c30d7d053c9c4084f8daeda7399e261dd404d1578691fcb5bd7b43acc176be3014d5645fa082b16fe872be1c3b8428621bc03e49a5bc0cf7db2020520303400840085008272b43acc176be3014d5645fa082b16fe872be1c3b8428621bc03e49a5bc0cf7db25f4f3be7c22b3f846e0fc1aa8c5ccb4ed9a7e5acc35369f076448359df9b18eb0205303034008400852213010094b93dc1fd640ba80086008728480101b4d986be6da4a385ebc4d75e7b6864ddae73e6e6431f711cbb3208dfb35945750024221100e1caf7c460aa04680088008928480101d405a7172eafa75f0e67e1b0f52d000222f4399c5d7dda059af11c73faf135a300182848010137844b3a6262ee12ef028d6b8968b779c5be75d93a7dc1838aba9408a360ea42000e2211400000d2ba94ab3c24008a008b220120008c008d220120008e008f2848010136a19e11f370f7b9cf36d83e0cdb68ea6f02ebe02487e3a5ca264a2baa6cd0d8000c220120009000912213010094b93dd61b3b6ba800920093221100e1caf7c460aa0468008800942211400000d2ba95254e24008a00952201200096008d220120008e00972201200098009100a0431b9004c4b4000000000000000000960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a042665004c4b400000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069600000009600000004000600000000000519ae84f17b8f8b22026a975ff55f1ab19fde4a768744d2178dfa63bb533e107a409026bc221301007e0f065474a371880099009a221100f6aa376d88c09a28009b009c2848010189afd21725efab9748b8b6ef6dcfd892c9f647a939c73831d4f1dbc786b9ec690016221100e1c6b40db0b41708009d009e28480101ce05363b2c4d123e6af0a2c3edbe06e05e4b55117180062e69624e00f64ae2a7000c22110000034aea52acf090009f00a022012000a100a2284801016b54a1df1176e4608f655e63cf51ff3deec889dcf9229cceb100c32a12d3288e000928480101d2fc779057e6ebb9d8413f029999ad6426bdc42b841578ba4f1302565b3bb3b8000a22012000a300a422012000a500a6284801015fb934835d63076694fbd0ca2191f6219a2017bfee8370008d48729374463b93000b221301007e0f0668927ad188009900a7221100f6aa376d88c09a2800a8009c221100e1c6b40db0b4170800a9009e22110000034aea54953890009f00aa22012000ab00a222012000ac00a422012000ad00a6284801012234afc4f9aa54d36f371ab851ada0446bbab533a15161ca6f4afd77d69d89520012221301007e00c5c8df3ca98800ae00af221100f6a49bd9e38f392800b000b128480101c6100af2020b8ed627f48ec736f2cfa52e095b513479105a028f40e152c9586f0016221100e11e73378043a20800b200b3284801012b525231768abd4f2fc0464b8e5be011db5ebdb3a1ed6d61eebf186e8dc197ba001528480101aad2366c8dcad53c429dfbea0cd1c479cc6b989ef981314b1382fd58de7c8afd000b22110000034aea52acf09000b400b522012000b600b7284801015d23a19db6638756e655885d66767ab5ca9c7044b8d6263da018629630bda2a5000822012000b800b92848010166827a7a38f195b34597175fc019e4dc80b6f714f0b51a2369270417305747e1000922012000ba00bb28480101d98bd6122c9ac0cd3bb56dd7127ca09ede8c606fcb15de38baa4b47f7fe51f040009221301007e00c5dcfd14098800ae00bc221100f6a49bd9e38f392800bd00b1221100e11e73378043a20800b200be22110000034aea5495389000b400bf22012000c000b722012000c100b922012000c200bb2848010103f584b35917a807e8a2ec65376c8ed2c6ccecf273ba8cb55dbacfe29a84a6140013221301007e00c226bc22c34800c300c4221100ea59d8cb334c9c0800c500c6284801011e20584a9cf50091fb4dddfe4d2e98f8c879438cc843e24314604b44cb6f7858001228480101b81fe7658c95d0f97eabe671d2b147f2da908bd4813119d475886872068353200014220f00c021469bdc540800c700c8284801015af875e56b2c21860165b66c58883a203401027a269c372667df9eb27b476259000a2212cc00001a575295678400c900ca22012000cb00cc284801014e72d9d9406765832f323a591918a7b8cdb1acdbcbdeab3f2bcbc4c93fbc1f99000922012000cd00ce28480101cef4f4863fe525820f12b7c79bbc2276d0fdb7e300c55d70d809bfdef1e801f5000722012000cf00d0284801011bd2caf8f41ad27d29c9c0d34e01bc0457050b3e5cce1754ec06a5fef2e688af0008221301007e00c23ad9fa234800d100c4221100ea59d8cb334c9c0800d200c6220f00c021469bdc540800d300c82212cc00001a5752a4a9c400c900d422012000d500cc22012000cd00d622012000cf00d7221301007dfeec4e6f29f34800d800d928480101735d9d54218cf8454bd30b70a53ae0de4219178b78f457b844f50dc11b5719f00013221100ea59cff28ceadfc800da00db2848010141d3f8101f423d32b2cdb23d98d0f34f83db175e427605500093f4a31cd8df03000b2210680c02141293542200dc00dd284801018916fffc4697fa71347a36028c9c0ab1b54bf2c278f9171f7837101f990665f20011284801013eb4f392dec5652b5e530a0922b5533c816263d761c0775349d4265cd85bd76100032211400000d2ba94ab3c24012f013022012000de00df2848010138b4953e5411a45c37899ce1936780cec049051f53d3a16bad52de7c7609476e000628480101c76ad89ed6929dfcdcbaaa4f5720981c659c02b305514971803760369f701765000622012000e000e128480101d3073a3cbcbb4a650ca94a719590f8460e5f51d6081fcea01e7e51cfbc60a444000622012000e200e3221301007dfeec628d01534800e400d9221100ea59cff28ceadfc800da00e52210680c02141293542200dc00e622110000034aea5495389000e700e822012000e900df22012000e000ea22012000eb00e3221301007dfeec4db9634c6800ec00ed284801017cc50a2d61f5f6979db4641a9451edade1fb234111081a83333a2b03ce9dc373000a28480101e2bc337ece7f3af5171f3265f44c612fc2fcba87f4b4563dc7fdc3285dd6a44d0008220f00c108ba716ce98800ee00ef28480101a248b81f22333cc28f6b6744e4298aefcd9b6f2dc5d7c99e1da1b28c37f3aa0c0007220f00c021383dbc6da800f000f122012000f200f328480101a9cf62c6624684d83857a4381d9d525efe2e2d5bafd839d9893f80beeaa43f7000052848010138e8cca37bb83b168adc87a7037092d90c734af074cace4ae828e0cf82b67b30000422012000f400f522012000f600f728480101ab9eb8899afa5c8bb9368d94781cf3ebb2eac7fb017a2b6133f9bb7b0e5d7b850005221301007dfeec61d73aac6800ec00f8220f00c108ba716ce98800f900ef220f00c021383dbc6da800fa00f122110000034aea52acf090012f013000a9d00000695d4a92a710000034aea54953880290b818926a0baa0a8254462acd910a6643762d51a5236b81236d713eff61e88e0527946a05000f567e8d68a0e20e39d06d0323de76a9d81b635a09c35a971c4a9913c922012000fb00f322012000fc00f522012000f600fd2848010110cac8bd77fa246c2bc95d0269759b612312bbc0438ed5eb7dd53116e55e9020000b221350401f7fbb08ed8733f200fe00ff219bbd62f8f7bea30f8ab5e9f16c3fb8642b118f56ed1bdc49600dbe5220c8b1af9e040c474f8074f1d14ce894ceb17ddbe1eb5416175db816dcb3d9b86ecacfe305fc3df0baaa80000d2ba95254e1c00100284801018e634c5cb159b3914109244a95171c97fe56c7ad67ec709cce94bb067893af680007219dbceaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa81804265fa43649cc3b15c891620f7db60a685fb7054bcc7b8817f05a7e9b73acdede2200b57bfa000034aea54953870101284801010143b3d2dd671b2559543155e003f847022e510b3a57afabbca05d4069c327ef000d2201200102010328480101d1a07de28968f21c0c3cfe0e69605731ae68b71969d27dd270f99b40790199040002220120010401052848010150d30f1a3fd6f709f0627934b2b31be081dc25bc52b51a353f850efa09ad224d000228480101664d4a2f536f0763f76857ceb94de20b4fad7e80b85675b3d02cf79a319b467e000122012001060107221350401f7fbb0df4fd0bf2010800ff219bbd62f8f7bea30f8ab5e9f16c3fb8642b118f56ed1bdc49600dbe5220c8b1af9e040c474f800b0df7369fde2be70ee4d2e84a552cab4b035685314de3d2e8e12b8d25aa27ae80000d2ba959f601c00109219dbceaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa81804265fa43649c9d338c13843e706c68e2455ed70bbf93820f28a394eec0b616e855fce8e6cac000034aea567d807010a220120010b0103220120010c0105220120010d010721a1bcd9999999999999999999999999999999999999999999999999999999999998200fbfdd8431e351e0e7f7559f2be451b78ede8267e7a8cb24cabd8236aa272459ca146db75357e502000034aea5495385010e2848010150725eee52e86432f846698a08ac153a67bc9ad9c160130af907c3bef05f29480007236fcff34517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf21881f480000000000000695d4a92a7110311d3e017f0010f011001112277cff5555555555555555555555555555555555555555555555555555555555555555407aec10e79c0000000000000695d4a92a711804265fa436495d00112011322012001140115284801018d455e04c00fba1289866da39c0793758c8d6a4e41ca2dd5ec2c03c76df76c4200032201200116011700b1bd635fefc47229e53988915685933558fd7303875055c5949d871dc2688df796800000000000000000000000000000000000000000000000000000000c54be8f6000000000000007e0000000e610f41dc000000593a932aa90284801015dc67661a1c1ef1294e875961eea55bea7054c7101bc975ed0aa009be971719a0003284801010f0ee7d20301abe555b4a76a6ada745283de3664ecb09ba794fec4d44db79b68000321a1bcd9999999999999999999999999999999999999999999999999999999999998200fbfdd86b59e3de15e7c728be36b6cb9aa8d1663f3d4c1e962ab20459e6e56ae211a233bc1e24f52000034aea567d8050118236fcff34517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf21881f480000000000000695d4acfb0110311d3e017f0010f011001112277cff5555555555555555555555555555555555555555555555555555555555555555407aec10e79c0000000000000695d4acfb011804265fa436495d00112011322012001190115220120011a0117020120011b011c227bcff333333333333333333333333333333333333333333333333333333333333333340756c14c3f00000000000000695d4a92a70e00fbfdd8431e351e16d0011d011e284801017269fb9feb45d719ebdbc3b0816b987bab06f43378dc84dc84d55727905482140002004811fd096c000000000000000000000000000000000000000000000000000000000000000028480101986c49971b96062e1fba4410e27249c8d73b0a9380f7ffd44640167e68b215e800032848010164a43970f2007a1da6d6fc81773cc095d1cc270e81359e471f3b03469abeb7b5000c214900000027cbb9d1062954439a83a91f27835fb9d2e3e798910356650c3c493c946234646840013128480101a54022f5edbf4beba0648deeb1ffc566c63567b51e34ccd918ab339bdedfec3300012848010122863015f2ff93c8dfe54f980440d8b3b2bd946770d126f32325fc9c8e37cb2e000200b1bd24ee866df51003f6b534d22c17f58175a943d247f628a0d355a187e86e73bd18acb16cc00000000000002a80000001dd3de5878000001dde15bcd058acb28f0000000000000021800000014bff7ab78000001718cb2138a02848010160ce52c8bd8ed7f87a7643812f7690467a604fcff9ba1811d065a34a0202d78f0002227bcff333333333333333333333333333333333333333333333333333333333333333340756c14c3f00000000000000695d4acfb00e00fbfdd86b59e3de16d0011d011f0201480120012100b1bd24ee866df51003f6b534d22c17f58175a943d247f628a0d355a187e86e73bd18acb16cc00000000000002a80000001dd3de5878000001dde15bcd058acb29fc000000000000021c0000001814ffc698000001752c06e7e2000b1bd1148769c03366e79fc451b06179e791641db92df408fd46e6ffe7ad24d90a90000000000000000000000000000000000000000000000000000000018a8fe848000000000000014000000006740cdc84000000b659904b9a002012001220123284801016217f872c99fafcb870f2c11a362f59339be95095f70d00b9cff2f6dcd69d3dd000e2355ec05b6c5a0ba9cc563f4263b03448b2038580c84db168a6ea499c5ee5d19ddadc8351566240da1dbc38a3b0124012501262355ec05b6c5a0ba9cc563f4263b03448b2038580c84db168a6ea499c5ee5d19ddadc8351566240da1dbc38a3b0124012501270073de48c56594fe000000000290b818000004b380fb4ef8000090e500f4af24c56594fe00000000153ae540000004efd6476f22000098db0ac6ce1f00b0bc914560076a5a3e2f68770608073c7920cd095fd22f6624cdc5631150352c9400000000000000000000000000000000000000000000000000000000629df4ce000000000000004000000004a9d9195a0000002b5c8e819300b1bce1814fe876c4b4657ef4585f2f9b9158201e2fc77698c43e68104b88fe4ab2314e7cf70000000000000066800000039c368aef00000040a8c4d343b14e7b67800000000000003b000000040b2e294300000028134825e0c00201580128012928480101fb16d1ca45ecb8d4d1f6b1ac903c630cc06f78334bc9b84bf30585e9422cb887000b284801018f1bd34960aa509ff15ef8c648fdcb942bb7a6c14bda5d4988792ce1c7800bee00062179a062b1fa1362b37a13000080001d81a245901c2c06426d8b4537524ce2f72e8ceed6e41a8ab31206d0ede1c51dc00ebe70af3ef33d8313797763b95f20012a2179a062b1fa1362b37a13000080001d81a245901c2c06426d8b4537524ce2f72e8ceed6e41a8ab31206d0ede1c51dc00ebe70af3ef33d831379c7db16df20012a00afbc6d1a11a99e030e7005cac69de1a3cdeea9807743355fbf293f897e485ac868c54bf1b80000000000000124000000091627b10a000000bd5670281ec54bf2a8000000000000011400000006eaf842ee000000a8472576d100afbc6f013e1c5535e8ff36e8381a2acf51990fd66e35d30a40c32f50336512de48c56594fe00000000000001440000000ce66b410a000000d9c852602cc565938800000000000000d40000000de9bcb146000000935ab614cd28480101e9988188b13457c31092fcc241e6b801ab7dc39b30a0923557a193630fef257f000a28480101a5a7d24057d8643b2527709d986cda3846adcb3eddc32d28ec21f69e17dbaaef00010106460600013503af7333333333333333333333333333333333333333333333333333333333333333300001a5752b3ec0246660377de4bc319a5038b872892ad701fa6a7f2783ecefd07a68cb4fe32f8b700001a5752b3ec0162b2ca7f0001408013201330134000120284801016e527b5263548e810db4a6e4a1f87c5c20d1c7859c8a5e2113127c954400e7b900012848010192f515d5126f2a2fe83d0204780eb95ac49143dae652a6a618f650997621e09a000128480101b4ff459f14a389ff7d6ea967ec8d5329f3cff84a787a7c1fcb6e3d447b6175e500100101a001350082728d942e903175e0ffe9857660057e1e7e904397d1bd95e61a0dc318aaabb1b31fe1cb96b8a440f43d5cc8d5334f00711345b647d43e5837cf367741c70934d237020f0409283baec018110136013700ab69fe00000000000000000000000000000000000000000000000000000000000000013fccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd283baec0000000034aea567d800c56594fe40009e42614c107ac000000000000000006400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005bc00000000000000000000000012d452da449e50b8cf7dd27861f146122afe1b546bb8b70fc8216f0c614139f8e046120c1e7"); - - String hash = Utils.bytesToHex(c.getHash()); - log.info("hash {}", hash); - assertThat(hash).isEqualTo("bf76eed0ac2f54e30c93c36e587a6dacd4526f45dcbf01a476c149f1991cb78a"); // works - } + /** issue 70 */ + @Test + public void testBocDeserializationIssue70() { + String base64boc = + "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"; + + byte[] rawBoc1 = Utils.base64ToSignedBytes(base64boc); + log.info("rawBoc {}, length {}", rawBoc1, rawBoc1.length); + log.info("hex1: {}", Hex.encodeHexString(rawBoc1)); + + // FileUtils.writeByteArrayToFile(new File("sample.boc"), rawBoc); + + // deserialize + Cell c1 = CellBuilder.beginCell().fromBoc(rawBoc1).endCell(); + + log.info("CellType {}", c1.getCellType()); + log.info(c1.print()); + + byte[] rawBoc2 = c1.toBoc(false); + log.info("rawBoc2 {}, length {}", rawBoc2, rawBoc2.length); + log.info("hex2: {}", Hex.encodeHexString(rawBoc2)); + log.info(Utils.bytesToBase64(rawBoc2)); + + // serialize + Cell c2 = CellBuilder.beginCell().fromBoc(rawBoc2).endCell(); + log.info(c2.print()); + log.info("exotic? {}", c2.isExotic()); + // assertThat(Hex.encodeHexString(rawBoc1)).isEqualTo(Hex.encodeHexString(rawBoc2)); // + // TODO + assertThat(c1.print()).isEqualTo(c2.print()); + } + + @Test + public void testBocDeserializationAllConfig() throws IOException { + String newBlockOutput = + IOUtils.toString( + Objects.requireNonNull(getClass().getResourceAsStream("/allconfig-boc-as-hex.txt")), + StandardCharsets.UTF_8); + String cellOutput = + IOUtils.toString( + Objects.requireNonNull(getClass().getResourceAsStream("/allconfig-cell-print.txt")), + StandardCharsets.UTF_8); + Cell cell = CellBuilder.beginCell().fromBoc(newBlockOutput).endCell(); + log.info("CellType {}", cell.getCellType()); + log.info(cell.print()); + log.info(Utils.bytesToHex(cell.toBoc(true))); + + String actual = StringUtils.trim(cell.print()); + + assertThat(actual).isEqualTo(cellOutput); + } + + @Test + public void testBocIssue74() { + Cell cell = + CellBuilder.beginCell() + .fromBoc( + "b5ee9c72e20201380001000028250000002400cc00ea01c402a603420374039603a503be03d8044804b8050405ac05ec065606a2076e078e0824084208600880089e08bc08da08f80916093009d80a180b0a0b7a0bc70bea0c0e0cba0cda0cfa0d1a0d380d560d740d900dac0dc80e6e0ef20f160f360f820fce0fee100e102e104c106c108c10ac10cc10ec1196121e12841306132413421360137c142014a014ae14bc14ca14d814e614f415021510151e152c153a1548155615a215b015be15cc15da15e815f6160416ba16c816d616e416f21700170e171c172a1738178417a817cc181918c418e419041951199d19bc19da1a271a731a901aae1afb1b471b621b7e1bcb1c171c321cd81d251da81df51e471e921eb21eff1f4b1f6a1f8a1fd71ff620142061208020cd20ec210c2159217821c52211223022da232723ae23fb246024ad24f9257a25c725e42631264e269b26b827052751276c2810285d28dc2929297529c12a0d2ad82b252b442b522b9f2bbc2c092c262c732c922cdf2cfc2d492d662db32dd02e1d2e3a2e872ea42ec22f702fbd3009309e30ac30ba31073114316131ad31ba31c832153222326f327c32c9331533223330337d33c933d633e4343134e634f435aa35b8366c3720372e377b378837d537e237f037fe384b385838a538b238ff390c3959396639b339c03a0d3a1a3a673a743ac13b383bec3c393c463c543ca13cae3cfb3d473d543da13dae3dbc3e093e163ecd3f823fcf3fda3fe0402e405640aa40b740fa410441e84200420e421d422c423c42e043884430443c444844ce458e4614462646ca478b4794481a483648e74988499449a04a264ae64b6c4b7e4c3e4cc44cd64d7b4de94ea84eaf4f354f464fea504b041011ef55aaffffff11000100020003000401a09bc7a98700000000040101485c0d0000000100ffffffff000000000000000062b2ca7f00001a5752b3ec0000001a5752b3ec042d722c2c0004ee1f01485c09014820d8c400000003000000000000002e00050211b8e48dfb4a0eebb004000600071a8a03482793f3b50aaf5c1948a7daea6509532374f902fe6abeff45f620cb8c99cb00130443feeb6ff454dd7b749d28f509060c2cc668963d39733cf0e844a2880964938114c1372a89491186e2103aabb88851625b18674a78929f3c357ca78e98824227016e016e000b000c1489b85d301a5e194c97f1c275d3ead4bd74c6e4f42bc74ff8ef930e594b8dd9887900084a33f6fda87b6952196d2ab3a76db9754f0792826c8eb9650220c062ca9afc456d18d616915f7809f0e2a9af47f9b741c0d1567a8cc87eb371ae985206197a819b2896f2c00109010a010b010c009800001a5752a4a9c401485c0c493505d505412a231566c8853321bb16a8d291b5c091b6b89f7fb0f4470293ca35028007ab3f46b45071071ce8368191ef3b54ec0db1ad04e1ad4b8e254c89e4022581f2cf4db6b621cfac0f967a6e06286bfd400800080008001d43b9aca00250775d8011954fc400080201200009000a0015be000003bcb355ab466ad00015bfffffffbcbd0efda563d0245b9023afe2ffffff1100ffffffff000000000000000001485c0c0000000162b2ca7c00001a5752a4a9c401485c0960000d000e000f0010245b9023afe2ffffff1100ffffffff000000000000000001485c0d0000000162b2ca7f00001a5752b3ec0401485c0960001d001e001f0020284801010190c062d880448c7c066d5e7f424d3c899b5b7618f97ecf7c54e38dd4c8b25a00013213eaca33f4cbadbd5448172264067fbb377adbe16d7c4681fb55312783f206756a318a5c723a464c78c863a17c0802276f4114c4c8edf27dd9eb88622de8445b07016d00118207cb3d36dad8873eb00023008422330000000000000000ffffffffffffffff81f2cf4db6b621cfa828008400222455cc26aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac23224a27d088a237e001100ac001200ae28480101553f5abf307236fc3eae3b9829943a1b4f895241d07cd2f7fb7106f492a37a4f000222bf000193a937010004ee1f6000034aea52acf0880000d29bdd9fc8200a4106c7d59f0086cde0d05cc99baaddf7a9c5b890aa805e8c96680523524fb4a5a99ff81257e3afd8721409a6a81f22735c0e33400aeb6e7f0a1a5185bb3a3c9deba278be001300142213c3c0000695d4a559e12000b100153201c47dca7c0afc1021a7f8ac40f39fac4e3a34441c180afd0667ef533f08c042258d60f2282e7cde376f0df9fd5ebcc5d8bb19faf6cc57bbbb662485cd76bdce510010000c20004800492211480000d2ba94ab3c2400b30016221162000034aea52acf0900b500172213c480000d2ba94ab3c24000b700182211400000d2ba94ab3c2400b9001922110000034aea52acf09000bb001a22110000034aea52acf09000bd001b2212cc00001a575295678400bf001c2211400000d2ba94ab3c2400c300c4011100000000000000005000213213b82c6f6878b537db3c16dcd5f01397865949762fc38f51cb6aff56594f1062f1edf7f2f7d1549f1d22aab06d9a81c9d49510c3fa6d09dba89fcddb0b8576e4aa016d00118207cb3d37031435feb00068008422330000000000000000ffffffffffffffff81f2cf4dc0c50d7fa828008400223455ee67dd6327a64269ce346e9b1568ef56241f1ba5179cb6d2ac85c5c18646ae12717905e49ef1945ed5b3e03bab93b347378306bc631945e0355ad7507cbada29001b0010cc26aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac23224a2820ffffb7e010e00ac00ad00ae006bb0400000000000000000a42e0680000d2ba95254e1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc028480101173ea53338a2f89f176ad2d6129a90977e8c56e325d959bdf92b7171d9070911000423130103e59e9b6d6c439f580024006a00842313010217dee532a6595718002500260084331392afc8f7cde2b08b147ca948f16cc575bbbd4d383188441e172a5cbc617e05249b737c913fe069b3ce1ce7d550cb95f27f4d428faee54cd295c65c5b9ad7e3ae0027000e01014dad03493b489b5800310032008422130100ca31e1e96b10bbc80027006e2213010058b525488168d908006f0028221301003e470bb61928028800290072221100e1caf7c460aa04680073002a221100e1c6b40db0b41708002b0076221100e11e73378043a2080077002c220f00c021469bdc5408002d007a2210680c021412935422007b002e220f00c021383dbc6da8002f007e219dbceaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa81804265fa43649cc3b15c891620f7db60a685fb7054bcc7b8817f05a7e9b73acdede2200b57bfa000034aea549538700302277cff5555555555555555555555555555555555555555555555555555555555555555407aec10e79c0000000000000695d4a92a711804265fa436495d0008000812313010069341ebbd1eac97800330034008422130100e478e48d695dd1e8008500352848010199c07995a55880a2a97e2d1c235a7dfb6b24666e40158c97f7fafb18707d9e01002228480101a40b78c2e39cf3658d455ad29ca1f2bf10cdb87248a8d293e625f4ff821d3ffe001922130100cae245aca13c29a8003600882213010094b93dc1fd640ba800370038221301007e0f065474a37188008b0039221100f6aa376d88c09a280042009f221301007e00c5c8df3ca988008d003a221301007e00c226bc22c348003b0090221301007dfeec4e6f29f348003c0092221301007dfeec4db9634c680093003d221350401f7fbb08ed8733f2003e009621a1bcd9999999999999999999999999999999999999999999999999999999999998200fbfdd8431e351e0e7f7559f2be451b78ede8267e7a8cb24cabd8236aa272459ca146db75357e502000034aea5495385003f227bcff333333333333333333333333333333333333333333333333333333333333333340756c14c3f00000000000000695d4a92a70e00fbfdd8431e351e16d0009800402355ec05b6c5a0ba9cc563f4263b03448b2038580c84db168a6ea499c5ee5d19ddadc8351566240da1dbc38a3b009a009b00412179a062b1fa1362b37a13000080001d81a245901c2c06426d8b4537524ce2f72e8ceed6e41a8ab31206d0ede1c51dc00ebe70af3ef33d8313797763b95f20009d221100f6a49bd9e38f3928004300a1221100ea59d8cb334c9c08004400a3221100ea59cff28ceadfc800a40045220f00c108ba716ce988004600a7219bbd62f8f7bea30f8ab5e9f16c3fb8642b118f56ed1bdc49600dbe5220c8b1af9e040c474f8074f1d14ce894ceb17ddbe1eb5416175db816dcb3d9b86ecacfe305fc3df0baaa80000d2ba95254e1c00047236fcff34517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf21881f480000000000000695d4a92a7110311d3e017f000a900aa00ab220120004a00e2220120005e00c8220120004b00e4220120004c004d220120004e00e822012000f90056220120004f00ea220120005000ec220120005100ee220120005200f0220120005300f2220120005400f4220120005500f628480101a54022f5edbf4beba0648deeb1ffc566c63567b51e34ccd918ab339bdedfec330001220120005700fc220120005800fe22012000ff00592201200101005a220120005b0104220120005c0106220120005d010800b1bd24ee866df51003f6b534d22c17f58175a943d247f628a0d355a187e86e73bd18acb16cc00000000000002a80000001dd3de5878000001dde15bcd058acb28f0000000000000021800000014bff7ab78000001718cb2138a0220120005f00ca22012000cb0060220120006100ce220120006200d0220120006300d222012000d30064220120006500d622012000d70066220120006700da284801015dc67661a1c1ef1294e875961eea55bea7054c7101bc975ed0aa009be971719a000323130103e59e9b818a1aff580069006a00842313010217dee546c430b718006b006c0084284801013c24d22fb5e19c4c445ed87fd2f21aab05a39914a685834b6a1d0cf004891430016b33134d60714c9ba1d20d9c30bf39735d0ad7bfca9eb3ced50edfdae92a4c3339ef4d25e774489adf29b089b2e31b7a68d28886f450600fefbb6f581b3a94423ffc070027000e01014dad035d591ffb5800820083008422130100ca31e1e96b10bbc8006d006e2213010058b525488168d908006f007028480101256e458a2d80eecd799b387aa5e91b156bc583f9f095f0fcea7b2d73cb3d726e00262848010107983f5e2ef514d990c22499abec1ccb4fd222f7489b7febb2044fe24e39318d001a221301003e470bb61928028800710072221100e1caf7c460aa04680073007428480101d405a7172eafa75f0e67e1b0f52d000222f4399c5d7dda059af11c73faf135a300182848010189afd21725efab9748b8b6ef6dcfd892c9f647a939c73831d4f1dbc786b9ec690016221100e1c6b40db0b4170800750076221100e11e73378043a20800770078284801012b525231768abd4f2fc0464b8e5be011db5ebdb3a1ed6d61eebf186e8dc197ba001528480101b81fe7658c95d0f97eabe671d2b147f2da908bd4813119d475886872068353200014220f00c021469bdc54080079007a2210680c021412935422007b007c284801018916fffc4697fa71347a36028c9c0ab1b54bf2c278f9171f7837101f990665f2001128480101a248b81f22333cc28f6b6744e4298aefcd9b6f2dc5d7c99e1da1b28c37f3aa0c0007220f00c021383dbc6da8007d007e219dbceaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa81804265fa43649c9d338c13843e706c68e2455ed70bbf93820f28a394eec0b616e855fce8e6cac000034aea567d807007f284801010143b3d2dd671b2559543155e003f847022e510b3a57afabbca05d4069c327ef000d2277cff5555555555555555555555555555555555555555555555555555555555555555407aec10e79c0000000000000695d4acfb011804265fa436495d0008000812848010164a43970f2007a1da6d6fc81773cc095d1cc270e81359e471f3b03469abeb7b5000c214900000027cbb9d1062954439a83a91f27835fb9d2e3e798910356650c3c493c94623464684000ac28480101afccd0b5d74a6fad14fcb8652b14eea3d3d7ad0226c0961aa9992a1f0c2997c1002322130100e478e4a1873531e80085008628480101a5a7d24057d8643b2527709d986cda3846adcb3eddc32d28ec21f69e17dbaaef0001284801016161938bf6cbbbea618b3c71572f00d9392090c9f15e70d1ef9080503b42229c002322130100cae245c0bf1389a8008700882213010094b93dd61b3b6ba80089008a28480101b4d986be6da4a385ebc4d75e7b6864ddae73e6e6431f711cbb3208dfb35945750024221301007e0f0668927ad188008b008c221100f6aa376d88c09a28009e009f284801012234afc4f9aa54d36f371ab851ada0446bbab533a15161ca6f4afd77d69d89520012221301007e00c5dcfd140988008d008e2848010103f584b35917a807e8a2ec65376c8ed2c6ccecf273ba8cb55dbacfe29a84a6140013221301007e00c23ad9fa2348008f0090221301007dfeec628d0153480091009228480101735d9d54218cf8454bd30b70a53ae0de4219178b78f457b844f50dc11b5719f00013221301007dfeec61d73aac6800930094284801017cc50a2d61f5f6979db4641a9451edade1fb234111081a83333a2b03ce9dc373000a2848010110cac8bd77fa246c2bc95d0269759b612312bbc0438ed5eb7dd53116e55e9020000b221350401f7fbb0df4fd0bf20095009621a1bcd9999999999999999999999999999999999999999999999999999999999998200fbfdd86b59e3de15e7c728be36b6cb9aa8d1663f3d4c1e962ab20459e6e56ae211a233bc1e24f52000034aea567d80500972848010150725eee52e86432f846698a08ac153a67bc9ad9c160130af907c3bef05f29480007227bcff333333333333333333333333333333333333333333333333333333333333333340756c14c3f00000000000000695d4acfb00e00fbfdd86b59e3de16d000980099284801016217f872c99fafcb870f2c11a362f59339be95095f70d00b9cff2f6dcd69d3dd000e2355ec05b6c5a0ba9cc563f4263b03448b2038580c84db168a6ea499c5ee5d19ddadc8351566240da1dbc38a3b009a009b009c28480101fb16d1ca45ecb8d4d1f6b1ac903c630cc06f78334bc9b84bf30585e9422cb887000b284801018f1bd34960aa509ff15ef8c648fdcb942bb7a6c14bda5d4988792ce1c7800bee00062179a062b1fa1362b37a13000080001d81a245901c2c06426d8b4537524ce2f72e8ceed6e41a8ab31206d0ede1c51dc00ebe70af3ef33d831379c7db16df20009d28480101e9988188b13457c31092fcc241e6b801ab7dc39b30a0923557a193630fef257f000a221100f6a49bd9e38f392800a000a128480101c6100af2020b8ed627f48ec736f2cfa52e095b513479105a028f40e152c9586f0016221100ea59d8cb334c9c0800a200a3284801011e20584a9cf50091fb4dddfe4d2e98f8c879438cc843e24314604b44cb6f78580012221100ea59cff28ceadfc800a400a52848010141d3f8101f423d32b2cdb23d98d0f34f83db175e427605500093f4a31cd8df03000b28480101e2bc337ece7f3af5171f3265f44c612fc2fcba87f4b4563dc7fdc3285dd6a44d0008220f00c108ba716ce98800a600a7219bbd62f8f7bea30f8ab5e9f16c3fb8642b118f56ed1bdc49600dbe5220c8b1af9e040c474f800b0df7369fde2be70ee4d2e84a552cab4b035685314de3d2e8e12b8d25aa27ae80000d2ba959f601c000a8284801018e634c5cb159b3914109244a95171c97fe56c7ad67ec709cce94bb067893af680007236fcff34517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf21881f480000000000000695d4acfb0110311d3e017f000a900aa00ab284801017269fb9feb45d719ebdbc3b0816b987bab06f43378dc84dc84d55727905482140002004811fd096c000000000000000000000000000000000000000000000000000000000000000028480101986c49971b96062e1fba4410e27249c8d73b0a9380f7ffd44640167e68b215e8000328480101b4ff459f14a389ff7d6ea967ec8d5329f3cff84a787a7c1fcb6e3d447b6175e5001022bf000193a937010004ee1f6000034aea549538880000d29bdd9fc8200a4106c7d59f0086cde0d05cc99baaddf7a9c5b890aa805e8c96680523524fb4a5a99ff81257e3afd8721409a6a81f22735c0e33400aeb6e7f0a1a5185bb3a3c9deba278be00af00b028480101b20e36a3b36a4cdee601106c642e90718b0a58daf200753dbb3189f956b494b600012213c3c0000695d4a92a712000b100b222012000c500c628480101258d602eaa21d621634dcf86692aeae308ff3cf888f3edafc6a5b21848d732f900182211480000d2ba95254e2400b300b4284801014b01ebcf5425735461aa8b83bae89e70fa21e95d2ee85e57b05dad26c1d6d5300016221162000034aea549538900b500b6284801019523e298bdc5f691343d880493b8a6451f3f941c985a7c4a167ba0e1cdb4599600132213c480000d2ba95254e24000b700b82848010137844b3a6262ee12ef028d6b8968b779c5be75d93a7dc1838aba9408a360ea42000e2211400000d2ba95254e2400b900ba28480101ce05363b2c4d123e6af0a2c3edbe06e05e4b55117180062e69624e00f64ae2a7000c22110000034aea5495389000bb00bc28480101aad2366c8dcad53c429dfbea0cd1c479cc6b989ef981314b1382fd58de7c8afd000b22110000034aea5495389000bd00be284801015af875e56b2c21860165b66c58883a203401027a269c372667df9eb27b476259000a2212cc00001a5752a4a9c400bf00c0284801013eb4f392dec5652b5e530a0922b5533c816263d761c0775349d4265cd85bd761000322110000034aea5495389000c100c222110000034aea52acf09000c300c400a9d00000695d4a92a710000034aea54953880290b818926a0baa0a8254462acd910a6643762d51a5236b81236d713eff61e88e0527946a05000f567e8d68a0e20e39d06d0323de76a9d81b635a09c35a971c4a9913c9284801016e527b5263548e810db4a6e4a1f87c5c20d1c7859c8a5e2113127c954400e7b900012848010192f515d5126f2a2fe83d0204780eb95ac49143dae652a6a618f650997621e09a00013201d970752cf49fb39f7ea882f429ef6a8a5ce3eaf9ff4d35bfba6d93ffc9e2a7368180f9da67bd40c08ccea6759238e3e79b631d22aa1dc395bbcec337be6d4e84000f000c2000e100e222012000c700c822012000c900ca284801012a31c24fa32c257e4912fc641c19d5679a5359fb89020b7fe030e3b104be570f000e22012000cb00cc28480101f8b1119a3146337e09b6a8bbd36f93c78f448ea18e0591af0a3726033c7b5345000c2848010136a19e11f370f7b9cf36d83e0cdb68ea6f02ebe02487e3a5ca264a2baa6cd0d8000c22012000cd00ce22012000cf00d0284801015fb934835d63076694fbd0ca2191f6219a2017bfee8370008d48729374463b93000b22012000d100d228480101d98bd6122c9ac0cd3bb56dd7127ca09ede8c606fcb15de38baa4b47f7fe51f04000922012000d300d4284801011bd2caf8f41ad27d29c9c0d34e01bc0457050b3e5cce1754ec06a5fef2e688af000828480101d3073a3cbcbb4a650ca94a719590f8460e5f51d6081fcea01e7e51cfbc60a444000622012000d500d622012000d700d828480101ab9eb8899afa5c8bb9368d94781cf3ebb2eac7fb017a2b6133f9bb7b0e5d7b85000528480101664d4a2f536f0763f76857ceb94de20b4fad7e80b85675b3d02cf79a319b467e000122012000d900da02012000db00dc284801010f0ee7d20301abe555b4a76a6ada745283de3664ecb09ba794fec4d44db79b68000300b1bd1148769c03366e79fc451b06179e791641db92df408fd46e6ffe7ad24d90a90000000000000000000000000000000000000000000000000000000018a8fe848000000000000014000000006740cdc84000000b659904b9a002012000dd00de00b1bce1814fe876c4b4657ef4585f2f9b9158201e2fc77698c43e68104b88fe4ab2314e7cf70000000000000066800000039c368aef00000040a8c4d343b14e7b67800000000000003b000000040b2e294300000028134825e0c002015800df00e000afbc6d1a11a99e030e7005cac69de1a3cdeea9807743355fbf293f897e485ac868c54bf1b80000000000000124000000091627b10a000000bd5670281ec54bf2a8000000000000011400000006eaf842ee000000a8472576d100afbc6f013e1c5535e8ff36e8381a2acf51990fd66e35d30a40c32f50336512de48c56594fe00000000000001440000000ce66b410a000000d9c852602cc565938800000000000000d40000000de9bcb146000000935ab614cd22012000e300e4284801014356834a429921990e0c978c594d3d7734b7cd96dd66c057aa786ccf4f5a258c000e22012000e500e62848010134a3bc4b6c672bb70328222747df9434117f6ee5953dc9447b945d42862c585f000c22012000e700e822012000f900fa22012000e900ea284801016b54a1df1176e4608f655e63cf51ff3deec889dcf9229cceb100c32a12d3288e000922012000eb00ec284801015d23a19db6638756e655885d66767ab5ca9c7044b8d6263da018629630bda2a5000822012000ed00ee284801014e72d9d9406765832f323a591918a7b8cdb1acdbcbdeab3f2bcbc4c93fbc1f99000922012000ef00f02848010138b4953e5411a45c37899ce1936780cec049051f53d3a16bad52de7c7609476e000622012000f100f228480101a9cf62c6624684d83857a4381d9d525efe2e2d5bafd839d9893f80beeaa43f70000522012000f300f428480101d1a07de28968f21c0c3cfe0e69605731ae68b71969d27dd270f99b4079019904000222012000f500f6284801018d455e04c00fba1289866da39c0793758c8d6a4e41ca2dd5ec2c03c76df76c42000302014800f700f82848010122863015f2ff93c8dfe54f980440d8b3b2bd946770d126f32325fc9c8e37cb2e00020073de48c56594fe000000000290b818000004b380fb4ef8000090e500f4af24c56594fe00000000153ae540000004efd6476f22000098db0ac6ce1f00b0bc914560076a5a3e2f68770608073c7920cd095fd22f6624cdc5631150352c9400000000000000000000000000000000000000000000000000000000629df4ce000000000000004000000004a9d9195a0000002b5c8e819328480101d2fc779057e6ebb9d8413f029999ad6426bdc42b841578ba4f1302565b3bb3b8000a22012000fb00fc22012000fd00fe2848010166827a7a38f195b34597175fc019e4dc80b6f714f0b51a2369270417305747e1000922012000ff010028480101cef4f4863fe525820f12b7c79bbc2276d0fdb7e300c55d70d809bfdef1e801f5000728480101c76ad89ed6929dfcdcbaaa4f5720981c659c02b305514971803760369f7017650006220120010101022848010138e8cca37bb83b168adc87a7037092d90c734af074cace4ae828e0cf82b67b30000422012001030104220120010501062848010150d30f1a3fd6f709f0627934b2b31be081dc25bc52b51a353f850efa09ad224d00022201200107010800b1bd635fefc47229e53988915685933558fd7303875055c5949d871dc2688df796800000000000000000000000000000000000000000000000000000000c54be8f6000000000000007e0000000e610f41dc000000593a932aa9000b1bd24ee866df51003f6b534d22c17f58175a943d247f628a0d355a187e86e73bd18acb16cc00000000000002a80000001dd3de5878000001dde15bcd058acb29fc000000000000021c0000001814ffc698000001752c06e7e202848010160ce52c8bd8ed7f87a7643812f7690467a604fcff9ba1811d065a34a0202d78f000201038020010d00010211011366ea62c6b62574b18990480a15bd04daf2d4d5c8e3413a8f62b0ff533b259b00078201150317cca5687735940043b9aca004010e010f01100247a00d9b55c39995181e04934d61a2baf0f5aa35a4e059bb4c55f309227aee336c95200610011401210103d0400111003fb000000000400000000000000021dcd650010ee6b280087735940043b9aca004010150011301db500cc320a00a42e0680000d2ba95254e000000d2ba95254e0850d8a46888759f13cd17310cd46d6e9e821d494944c72f183259690def72a1a5a15278d7e6ad8df707446b0df93af44f8aca68c8a6c286121567c529e8dd7088800027779c00000000000000000a42e04b159653da0112001343b9aca0021dcd6500200201610114012101064606000125020340400116011702037604011801190297bf955555555555555555555555555555555555555555555555555555555555555502aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaad000000695d4acfb00c1013201340397beb33333333333333333333333333333333333333333333333333333333333333029999999999999999999999999999999999999999999999999999999999999999cf80000695d4acfb00040011a011b011c0397be8517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf029a28be3defa8c3e2ad7a7c5b0fee190ac463d5bb46f71258036f9488322c6be7cf80000695d4acfb0004001270128012901035040011d0103404001210082724a765bd03de7e557d03d203239641e4570953914b82a806fdbc2fa10f8c5e3b7e1cb96b8a440f43d5cc8d5334f00711345b647d43e5837cf367741c70934d23703af7333333333333333333333333333333333333333333333333333333333333333300001a5752b3ec0173fbaacf95f228dbc76f4133f3d46592655ec11b5513922ce50a36dba9abf28100001a5752a4a9c262b2ca7f00014080133011e011f0082724a765bd03de7e557d03d203239641e4570953914b82a806fdbc2fa10f8c5e3b78d942e903175e0ffe9857660057e1e7e904397d1bd95e61a0dc318aaabb1b31f02052030240120013700a0431b9004c4b4000000000000000000960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003af7333333333333333333333333333333333333333333333333333333333333333300001a5752b3ec0246660377de4bc319a5038b872892ad701fa6a7f2783ecefd07a68cb4fe32f8b700001a5752b3ec0162b2ca7f00014080122012301240101a001250082728d942e903175e0ffe9857660057e1e7e904397d1bd95e61a0dc318aaabb1b31fe1cb96b8a440f43d5cc8d5334f00711345b647d43e5837cf367741c70934d237020f0409283baec018110126013700ab69fe00000000000000000000000000000000000000000000000000000000000000013fccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd283baec0000000034aea567d800c56594fe40009e42614c107ac00000000000000000640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001035040012a01035040012d008272f46adf2640fb8c30d7d053c9c4084f8daeda7399e261dd404d1578691fcb5bd75f4f3be7c22b3f846e0fc1aa8c5ccb4ed9a7e5acc35369f076448359df9b18eb03af734517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf00001a5752b3ec01e9e3a299d1299d62fbb7c3d6a82c2ebb702db967b370dd959fc60bf87be1755500001a5752a4a9c362b2ca7f00014080133012b012c008272f46adf2640fb8c30d7d053c9c4084f8daeda7399e261dd404d1578691fcb5bd7b43acc176be3014d5645fa082b16fe872be1c3b8428621bc03e49a5bc0cf7db202052030340130013103af734517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf00001a5752b3ec0372f7b0548efa5c07fc58c3051d80c9f650039701e834559eabe556240894c83400001a5752b3ec0162b2ca7f00014080133012e012f008272b43acc176be3014d5645fa082b16fe872be1c3b8428621bc03e49a5bc0cf7db25f4f3be7c22b3f846e0fc1aa8c5ccb4ed9a7e5acc35369f076448359df9b18eb02053030340130013100a042665004c4b400000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069600000009600000004000600000000000519ae84f17b8f8b22026a975ff55f1ab19fde4a768744d2178dfa63bb533e107a409026bc03af7555555555555555555555555555555555555555555555555555555555555555500001a5752b3ec03e61d8ae448b107bedb05342fdb82a5e63dc40bf82d3f4db9d66f6f11005abdfd00001a5752a4a9c362b2ca7f0001408013301340135000120008272010f24a4cdf5d7c0f8497739ff731e5175cd3f10069c838b4445caf821c4cf4e6ca0ffac88c5927e1becceb3949e8aa3388a1cd3e5405413900cce63ed93f19902053030240136013700a041297004c4b40000000000000000002e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005bc00000000000000000000000012d452da449e50b8cf7dd27861f146122afe1b546bb8b70fc8216f0c614139f8e04a5134191") + .endCell(); + log.info("CellType {}", cell.getCellType()); + log.info(cell.print()); + log.info(Utils.bytesToHex(cell.toBoc(true))); + log.info(Utils.bytesToHex(cell.getHash())); + } + + @Test + public void testBocIssue3() { + Cell cell = + CellBuilder.beginCell() + .fromBoc( + "b5ee9c72e2020152000100002a490000002400cc00ea0180026202fe033003520361037a03940404047404c0056805a8069a06b4075c079c0806087608c30a160a3a0a5e0b0a0b2a0b4a0b6a0b880ba60bc20bde0bfa0c160c320cd80d5c0d800da00dec0e380e580e780e980eb60ed60ef60f160f360f560f76102010a8110e119011ae11cc11ea120612aa132a13761442148f14ae154415621580159e15bc15da15f81616163416521670168e16ac16ca16d816e616f417021710171e172c173a1748175617641772178017cc17da17e817f6180418121820182e187a1888189618a418b218c018ce18dc18ea18f8190619521976199a19e71a921ab21ad21b1f1b6b1b8a1ba81bf51c411c5e1c7a1cc71d131d2e1d4a1d971de31dfe1e4b1e661f0c1f591fdc2029207b20c721122132217f21cb21ea220a22572276229422e12300234d236c238c23d923f82445249124b024fd251c25c62613269a26e7274c279927e5286628b328d0291d293a298729a429f12a3d2a582afc2b492bc82c152c612cad2ccc2cda2d272d442d912dae2dfb2e182e652e822ecf2eec2f392f562fa32fc0300d302a3077309430e130fe314b316831b531d2321f323c325a3308335533a1343634443491349e34eb34f835453552356035ad35f936063653366036ad36ba370737143722376f377c37c937d6382338d838e6399a3a4e3a5c3aa93ab63ac43ad23b1f3b2c3b793b863bd33be03c2d3c3a3c873c943ce13cee3d3b3d483d953da43df13e683f1c3f693f763f843fd1401d402a40774084409240df412b41384185419241df41ec41fa42ae43624416442244284476449e44f244ff4542454c463046484656466546744684472847d0487848844890491649d64a5c4a6e4b124bd34bdc4c624c7e4d2f4dd04ddc4de84e6e4f2e4fb44fc65086510c511e51c3523152f052f7537d538e54325493041011ef55aaffffff11000100020003000401a09bc7a9870000000004010173ed450000000100ffffffff0000000000000000634e93ea00001d3677b8338000001d3677b83384955d862e00058edb0173ed410173bfbec400000003000000000000002e00050211b8e48dfb4a0eebb004000600070a8a040a13051bcbbbdeccd56f979164b7da81b8e49732e7215334e2b8ce57c41888d03190bd932f59e8bcca9b92cd1032c316407ca6099409a8aedf4146f39e95ffec016e016e000b000c14892736daee89910b52d7041a889bf97c864cfc84eeafba291a1b5b2e931cc1b5e800084a33f6fd0be55a2d75c3eae367b5ba338705f0319041b70e23a5c9b65374cf2739898e58f78b372f9292751451def1be4dc7cf494ef17470574d85c253ef77746b8ea127c00123012401250126009800001d3677a8f1440173ed443de180887d5f5a84d44bd19c87cbb664b0561d5eb81da88c5782b0e36e9a07e4d7fd7d801561f54bffc0cb5c4ec4e855deeeeb6fdf26d4c99a086ffafb93580a022581fa7454b05a2ea2ac0fd3a2a5d348d295400800080008001d43b9aca00250775d8011954fc400080201200009000a0015be000003bcb355ab466ad00015bfffffffbcbd0efda563d0245b9023afe2ffffff1100ffffffff00000000000000000173ed4400000001634e93e700001d3677a8f1440173ed4160000d000e000f0010245b9023afe2ffffff1100ffffffff00000000000000000173ed4500000001634e93ea00001d3677b833840173ed416000110012001300142848010124871f46ee0eb1ae00a27d5c29f6cdbcc378c1f4f1380805ff2297c9ed9fcf2200013213a09776db739953220712f110cafb8c5d8dc0fab70e9391a4894fc7cc8706b210f3282d0d6691f0235fdd6b31911b4bd49619c99ab3dbcb80305cea71d75d2eb0016d00128207e9d152c168ba8ab00018009122330000000000000000ffffffffffffffff81fa7454b05a2ea2a8280091001634558d88cb7e0929c9a44ffc1cf3c5a230c0db9b7ba3f7e489ee00f8289579a5c967d13c5fdbab5e261b0b55885aa0a63abbc4487521903d912f3e35c296ad0eb23d001b0010cc26aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac23305e8350c57b37e003f008e004000410111000000000000000050001532139abefb5447ac011734d52324dd76a05aff0775b45c928601222624dbc2141bf2fa4c3e38ec56db5fc900c7c628d963f6fd5f016fdbf141f3f5ae91c3314e7b7f016d00128207e9d152e9a4694ab00072009122330000000000000000ffffffffffffffff81fa7454ba691a52a828009100162455cc26aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac23305e83a13cd8b7e0128008e00170041006bb0400000000000000000b9f6a280000e9b3bd478a1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc028480101de5adf45c03a745fc9d3a418d9e2ba096db9c1aaa77bc0898b6d9ebb611d2b40000532bfe179ee8495cd144a2f6d30950db2d48088fac5f9a778519dc0114219bf54cead2e7212dcdf398af721e9e425782d575b6c4026b7ec52ea1d3fe9dbb2bbe2aecf001a0010000100f59f3900058edb600003a6cef51e28880000e99c6da994200b9dfdf25ea78c41c94e4584ff2623b917b789f5d0e6a859861410542cb94e76fdc6efde77dc19b6aa8de0d4ad05651468c38cb9f64e1f8cf1351de6d5a7d98d56d6ded0be00bb00bc23130103f4e8a960b45d4558001900740091231301022a87a0b197c88778001a001b0091331367865aed64db08164a3138d816a8cacbb8b8fa46bc1fd1023ef5bd4e8fb6299ddc6201a0bfe76f22f36ca8ad0c54aa645c5739752b0a53bac3e57e9dda18febd0027000f01015ec2a32762fd21d800270028009122130100cbc4fd8a34cb65a8001c007822130100596b57d9c1932d880079001d221301003f0bad3989c46848001e007c221100e0b187aea6583a68007d001f221100e0a7528c0ef9512800200080220f00c141a6498c4d0800810021220f00c02225548664a800220084220f00c0221de12e910800850023220f4030085e7768002a00870024220f00c02170f2272c280025008a219dbceaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa818042d76318e19f365e6f7e0780eb2bc9f0c382940ef38b61bb6257ad617eb36fe8c9f56964f2800003a6cef51e28700262277cff55555555555555555555555555555555555555555555555555555555555555554085ac1288e0000000000000074d9dea3c5118042d76318e195d0008c008d2313010068a1a14c598fee380029002a009122130100f62101db096d33a80092002b28480101357b3e386bb95837e17d8fc7dd37f292efdc3301f6e109d8b33eb8a02afbb95d002228480101df3229c929cdae91378fd16242bda5a97246c54da4e9700d7427829825ee7b5d001922130100dd08f96dc461bcc8002c009522130100a6df074312541a08002d002e22130100902873121142a0c80098002f221100f6b6943101117948003900ae2213010090175c7b3161aee8009a0030221301008fb45fdc97d252080031009d221301008f689e5fb80803e80032009f221301008f677b3e09283ac800a00033221301008f677a70024cc70800a20034221301008f6779cbfeb8f188003500a521a1bcd99999999999999999999999999999999999999999999999999999999999982011ecef393af6d61933fe8eada66c79771a5de359b379b70bfe4414022dee90877585c9818f39dda000003a6cef51e2850036227bcff33333333333333333333333333333333333333333333333333333333333333334081ac1664bc000000000000074d9dea3c50e011ecef393af6d6196d000a700372355ec039e4242ff8cc69bf4260c44ddc7b820f838fa85ad1828d2b83ace409d6c02a3b89a505ac592d94a7c4d00a900aa00382179a0634dfa13634f7a130000800006226ee3dc107c1c7d42d68c14695c1d67204eb60151dc4d282d62c96ca53e26c0100ee542c8b882e30ec339334e5ca000ac221100f6a2a63eab3d4e48003a00b0221100ea5905b0b329bd88003b00b2221100ea58fcd0996ec14800b3003c220f00c035987df0cb08003d00b6219bbd62f8f7bea30f8ab5e9f16c3fb8642b118f56ed1bdc49600dbe5220c8b1af9e040c474f803d1a0544cba813425adf3253dd3727a789c9e418b5e788a4cab5df805caee92b00000e9b3bd478a1c0003e236fcff34517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf21881f48000000000000074d9dea3c5110311d3e017f000b800b900ba28480101db29f7a5808e1a673feb2258d777f3005642991b8025b1f92bcd7c498a8bd8ed000222bf000100f59f3900058edb600003a6cef335e0880000e99c6da994200b9dfdf25ea78c41c94e4584ff2623b917b789f5d0e6a859861410542cb94e76fdc6efde77dc19b6aa8de0d4ad05651468c38cb9f64e1f8cf1351de6d5a7d98d56d6ded0be0042004328480101b20e36a3b36a4cdee601106c642e90718b0a58daf200753dbb3189f956b494b600012213c3c000074d9de66bc12000bd004432014645ed4db913f636932b4bebb489b51112e1a415136d57d6c6735ffc4bd556606e33f960111aa97c043f6040c47d1298da52d6a46a0378304ba87f61f3dee9db0010000c20005100522211480000e9b3bccd782400bf00452211200003a6cef335e09000c100462211200003a6cef335e09000c3004722116200003a6cef335e0900c500482211200003a6cef335e09000c700492211200003a6cef335e09000c9004a2211200003a6cef335e09000cb004b2211000003a6cef335e09000cd004c2211400000e9b3bccd782400cf004d2211000003a6cef335e09000d1004e2211400000e9b3bccd782400d3004f2211400000e9b3bccd782400d500502211d000003a6cef335e0900d900da220120005300f822012000dd006722012000540055220120005600fc220120010f005f220120005700fe2201200058010022012000590102220120005a0104220120005b0106220120005c0108220120005d010a220120005e010c28480101f25a1e1d7f11115186543ff6eb95e3d9b98f71d2c959af6b0dad6b63cd1e6d6900012201200060011222012001130061220120011500622201200063011822012001190064220120011b0065220120011d006628480101a96f5d75bc79b8d1640e680704965baaa2245e4b3a5ad8e980ef5a3568409418000222012000df006822012000e10069220120006a00e422012000e5006b22012000e7006c22012000e9006d22012000eb006e220120006f00ee220120007000f0220120007100f2284801016f2780ba9d3cdce8eee34a23d893d90800da0ac1be8a973c513909136b7f636b000223130103f4e8a974d234a558007300740091231301022a87a0c5b59fe77800750076009128480101827773c365eccfd6cb46a3f783a09f1aba77ce1a0a4d62048569e9b845e955f8016b3313e844a4da57b7cf2b0b52b004cc5886c966478e37012ee2d9b473bf083e1e3072beee68024dd8cc7dffdfde9e114e4818dc10824b446d661453963fa117c1fcbf0027000f01015ec2a33b80d481d8008f0090009122130100cbc4fd8a34cb65a80077007822130100596b57d9c1932d880079007a28480101cf20bddca78403c3e40e2ab1b3eeb526c425b5efb531e6c5bd3d52019c25125c002628480101ff7081e66c7f0d6e868021316b0189b9e67b61284c176cd74f78fa6baa18a025001a221301003f0bad3989c46848007b007c221100e0b187aea6583a68007d007e284801011d818de56750d053b2a227f0da85ba37fb1869d0c774629d04e2668e1204c0a3001b28480101174c3878604468b08b7b76f5349c41201ae28b81ca1d94794ab11a692e4668250018221100e0a7528c0ef95128007f0080220f00c141a6498c4d080081008228480101e00721ae4b2be2ed708fa68e6b7bec2759a107504812069b3b8aa9acea346c66001528480101747c06e45f53ca1dc7d23f39db07d12f2e67fa595a36fa41d26683ab42d1a3040014220f00c02225548664a800830084220f00c0221de12e91080085008628480101eb38ef90c590bedb3ce31140d2d4176d43db6b7aab35df685afc4ccf2a383209000b2848010179a2e20b8a926ab2fe83108ff00f2fbced9958047008e5cb5fdf8c798aab63850010220f4030085e7768002a0087008828480101a248b81f22333cc28f6b6744e4298aefcd9b6f2dc5d7c99e1da1b28c37f3aa0c0007220f00c02170f2272c280089008a219dbceaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa818042d76318e1805a8c67376726b2dcf563d47e9c2ed6fa8fd993942535d6c8ed758902593e99400003a6cef706707008b284801010143b3d2dd671b2559543155e003f847022e510b3a57afabbca05d4069c327ef000d2277cff55555555555555555555555555555555555555555555555555555555555555554085ac1288e0000000000000074d9dee0ce118042d76318e195d0008c008d2848010164a43970f2007a1da6d6fc81773cc095d1cc270e81359e471f3b03469abeb7b5000c214900000027cbb9d1062954439a83a91f27835fb9d2e3e798910356650c3c493c946234646840008e28480101374e198a900e08edc634a5f2ad73e388b0a3019d24269fae8046024e437476b1001028480101903aa268fecbed38822a8972ba42eadb53c0972f11b8486f1534210245db4898002322130100f62101ef274493a80092009328480101a5a7d24057d8643b2527709d986cda3846adcb3eddc32d28ec21f69e17dbaaef0001284801012bd772e408a34578028922281a3e5b5384970a6a6dd741b1cfa3b80a3e5ec57d002322130100dd08f981e2391cc80094009522130100a6df0757302b7a080096009728480101b90ed7fc04a4971294b12a078ec8189e8fdba184de6e23043922a774ae403ee2002422130100902873262f1a00c800980099221100f6b694310111794800ad00ae28480101eda54e0b0237690499c3e159ab800469fdbcb3c162d42181c2c298acd4e98f3100152213010090175c8f4f390ee8009a009b28480101cc6ead611f9fa7c0598d8f88d658fe0b91f5f9c9635c872154234c16c722970c0014221301008fb45ff0b5a9b208009c009d221301008f689e73d5df63e8009e009f28480101c7c146bea2ced23475861d11146c0560a46c3d243563fda0e32bf8c34229d2670013221301008f677b5226ff9ac800a000a128480101ef1aa8b2068cf6a8eadef8197235a5d5976865a32a3ad1fe80db069ddb8cc2fe001128480101c2ef35325f62d0b4cc17d1f5d083894100c3c478504d70b6eb8d3cf26e604ff40011221301008f677a842024270800a200a3284801018a51fe69422dbf7e028fb1dcac5a62064eefeb4c080793e78a24ef22334b307c0010221301008f6779e01c90518800a400a521a1bcd99999999999999999999999999999999999999999999999999999999999982011ecef3bbeb1c21823653419f6ebabf10f7978dae7e33a12d3bbe9815917a62eb4fe902f2a96e88600003a6cef70670500a62848010150725eee52e86432f846698a08ac153a67bc9ad9c160130af907c3bef05f29480007227bcff33333333333333333333333333333333333333333333333333333333333333334081ac1664bc000000000000074d9dee0ce0e011ecef3bbeb1c2196d000a700a8284801016217f872c99fafcb870f2c11a362f59339be95095f70d00b9cff2f6dcd69d3dd000e2355ec039e4242ff8cc69bf4260c44ddc7b820f838fa85ad1828d2b83ace409d6c02a3b89a505ac592d94a7c4d00a900aa00ab28480101ff06225996392d9e78d92fef981828f3459892841111b2d352901236d506cb65000b28480101336df3bd068890e3f26c1a8f5e77c4bf7cc3c81fc88006ab614b6db43647262600072179a0634dfa13634f7a130000800006226ee3dc107c1c7d42d68c14695c1d67204eb60151dc4d282d62c96ca53e26c0100ee542c8b882e30ec389aaabdca000ac28480101b8ad45439ed0f9f1ffb12362a0c0a6f522734feed11dda077d5f6067f1305170000b221100f6a2a63eab3d4e4800af00b028480101e2a96bbff9be849635722263833d77a90f0a832b410f8b73bca56041fd7e21970016221100ea5905b0b329bd8800b100b22848010130dd0d5ef5796dc4c101fbf5b4b083599e509d0f738b07a8dbfad6b5ae53aecb0012221100ea58fcd0996ec14800b300b42848010130219e3c8c788af6da8a296da6f3e9925c909eed9821a0ae1911c38f56f7b37e000b28480101e2bc337ece7f3af5171f3265f44c612fc2fcba87f4b4563dc7fdc3285dd6a44d0008220f00c035987df0cb0800b500b6219bbd62f8f7bea30f8ab5e9f16c3fb8642b118f56ed1bdc49600dbe5220c8b1af9e040c474f804c5ac6247ef1e5d11d080c3d8b21135b54598a72e11fbc6ebe1fa0c4b2a7df0a00000e9b3bdc19c1c000b72848010118dd0a8040c21a2cfb6c0acf4ad636dc67ef3ab0a3e102f1b43ad500c55728d00007236fcff34517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf21881f48000000000000074d9dee0ce110311d3e017f000b800b900ba284801017269fb9feb45d719ebdbc3b0816b987bab06f43378dc84dc84d55727905482140002004811fd096c000000000000000000000000000000000000000000000000000000000000000028480101986c49971b96062e1fba4410e27249c8d73b0a9380f7ffd44640167e68b215e800032213c3c000074d9dea3c512000bd00be22012000db00dc28480101258d602eaa21d621634dcf86692aeae308ff3cf888f3edafc6a5b21848d732f900182211480000e9b3bd478a2400bf00c0284801014b01ebcf5425735461aa8b83bae89e70fa21e95d2ee85e57b05dad26c1d6d53000162211200003a6cef51e289000c100c22848010165b0a85a0fdea0c76a2a98445623ea62427099a6318624794dea416f1bdc6f5c00152211200003a6cef51e289000c300c428480101b5b64686c719580155341cb7347af0405dec7158c283ad30833b07325bdc48a5001422116200003a6cef51e28900c500c628480101fde4f74a9866e3de066d6d27e3b1fe107053ecce8b54d8b05ebf4a3b0789c26b00112211200003a6cef51e289000c700c828480101f7a4391731a8136b142d214311bd2f8c162938f27185d22de576a045a13b1e1600102211200003a6cef51e289000c900ca2848010187c846be2bc06a266ae017ae9a13c66cf156125edd95b8bd4f6cfe3c903e3b35000f2211200003a6cef51e289000cb00cc2848010122da148fcc6a6a317ae3c41ee888034019cbfa89e57f306b85601dd2045d6daa000e2211000003a6cef51e289000cd00ce2848010191c44865f6767ab41750fbf5117df2d8be3110925c7993aa2e03780673c31f32000d2211400000e9b3bd478a2400cf00d0284801016d16afa0d70d41df6abe49636527c0b566bd3b722b731eba03433d7efbcb3908000b2211000003a6cef51e289000d100d228480101d744ca7d3ce6fe4538b3fa6a138971ca129c227d8a6736a9cd1d33c2f1fd06cc000a2211400000e9b3bd478a2400d300d42848010175d211346d824c33aff56800c12e0b320854590aadfd85e3f909502cdb6ec3c100082211400000e9b3bd478a2400d500d628480101322f03bbddf42b900d602199315f5d4befa1a9282a2a6c845f3db6ccd2b6bfc000062211cc00003a6cef51e28900d700d82211000003a6cef335e09000d900da00a9d0000074d9dea3c51000003a6cef51e28802e7da887bc30110fabeb509a897a3390f976cc960ac3abd703b5118af0561c6dd340fc9affafb002ac3ea97ff8196b89d89d0abbdddd6dfbe4da9933410dff5f726b01528480101523e62a3a95932c2a65f2314a8a818f82f48644967cc31dcfda9954109d8b55100012848010177c2748c31a7f78c56862aa9d06df60981de7aaa59e67d4d0360a2903384fe1500013201032a5ac73da06a6b989d158bec539003d36dc087d663eda6337be5667c284f16310ee22bacedde5f1c215edbbbdf7a1c20c98ec248b7893266ebfceeb41817bd000f000c2000f700f822012000dd00de284801019deed5e9cd5995ad6c97a06276c939029a1d05a6de03b6c724a4b5567e9adb7a000e22012000df00e0284801016bc4ad2e5c909f6f452be243edc65694f7e6db5f2fc615f69756954a60a563a2000c22012000e100e2284801016925c827cdb72656785a860c0ed1b94c1ff9f0614b9e2ed1b0aa1ee8fbb395aa000c22012000e300e422012000e500e62848010197d9c97586b5cf9a93f5077cf1e13c91f7a4d5b240601e4d08030ab62cd17707000b28480101f613c63e75ce90bdb3aadf01297ba9a958588392473ea542ef8654f281d2854f000922012000e700e828480101d83f99b6b2deca33e45337ea0fa4788a5590c2a9f88654c24c1e4b5282ec7787000822012000e900ea28480101497deb7f82cc061521c9f6bf58ddd3043ecb1dbaea13352ecb73bb53236a9dd8000622012000eb00ec28480101e86bec3c2e5a0c5b9bad30e9b0efd5c74409fece4efd571f8fe02eccbbd0af1a000422012000ed00ee22012000ef00f02848010178a2f12e152f91343bff8aeda8ca7bab1039578fb6b03832c150f22786d0500c000422012000f100f228480101b26a0cc496805853f303d8a00ae9fc7f7b20dc7cab6d1d1c21f5b86469874a84000202012000f300f428480101a31f27b17ffa79bcaf0e47f55dffa054f825e019e447026255e7e1a8d7488701000200b1bcd91dbefdb40075ad92878e330bb79115bcfc28f3c5b9833df391ce8138514a3199fcd1800000000000006500000002b0d782ed8000003f2a3414d8b199f72d0000000000000040800000038a0ed0708000002d14497b814002014800f500f600afbc6827bcf8957c10b8a5694ecd7f0dd41e6a2cd906c77e5340983b618fb6fb0800000000000000000000000000000000000000000000000000000000c695ef7e000000000000007200000006efab3f64000000450742496300afbc66e5f2524ea28a3bde37c9b8f9e929de2e8e0ae9b0b84a7deeee8d71d424e8c69d27d400000000000000e2000000093197d6c2000000a8632502f4c69d1ba4000000000000008a000000116e3e81da0000006af0f2148122012000f900fa28480101912d60694234d59e4645f5d2ebd90e081979a3f6eaf4124bec3980e4547a5094000e22012000fb00fc220120010f011022012000fd00fe28480101348a81067d100edaf90feeb18db50c3c315a07c6c0944b52368c30e76a6f40df000b22012000ff0100284801018540d2166efad6f7a81289ddf3983d3ed177993dce47ccb150f2fcc287428d53000a220120010101022848010110b3b5e79df7c963efb443120853eb1bf9377e78020993bf79d5aaa9b02d1a6a000822012001030104284801016f610eec3a1e4dc9bdacbda0e586e7a8f6b4734b6599ecc0f8c5d0e9666d0ed3000822012001050106284801019100c451439a1cfdcf444d77bc78d03f19ca5e71b1f8fdae5e9e0ccf3e8214a000072201200107010828480101e0140ab9f7e276e1143af00713243e470dfc2c93c02b124622926fd33551a71b00062201200109010a284801014ef684da255649795b7830d1100f419d8f8a0eeb9ed6ed3610ba20b5d815deed0003220120010b010c2848010155cdb8f72801ef11ba562172ed2626c88208eddcf4a0c8f6d5447a785d02b790000202037820010d010e28480101b6eb72df89b91190ab85640f1ef9817bf00e49c5c11e8fd173b5b382ca4a104700010073dde8c69d27d40000000002e7da88000004baec525bbe000096f6a2fa0e38c69d27d4000000001598a6b2000004da46f3846200009e49d38f1eeb00afbbdc4b61f8041625a15bee3b094ff72034e12e69e8d71521ac6748fe6359832319afc8c8000000000000066800000033ffaa8b0000000419c4a9d68319afccd800000000000003d00000002e72705fc80000026a49c0209c284801018dfe3c99df194f8fec2b5b64b5ef08296b853794a29497c7c425ca62a44695e6000c2201200111011222012001130114284801010c275d6749b7c9102256e4abafdecda16a1697f20d26cd0e711bd9d58ef4a2f2000a28480101c169f7745c95d5f3f6b4e550c15978aaf563631f3a9e6ddaaa361ed4042e4f05000922012001150116284801017a3b4493fefcfd2275fa2f6ab01a8db5d70a443fb48dfb00e152545adfb97cbb0007220120011701182201200119011a28480101b13de2fa76c60764833d05264a2e1081609e2dfa9a04bf8d6c5e1162ac7d47cb000728480101027742b12159d2d1310044b4a94e1eea928905b045871a52b552b4b4841288400006220120011b011c28480101df4611dc79f46dc700809e0c3140796be5ca9572c3f3fab70ddbe6a5460bf4900003220120011d011e28480101d52b65c44fcc1a90bbbf8cc01e8ab9c7b6c51f95c2735d6de72a669c1135a8360003020162011f01200201200121012200b0bc885a77c249fb95f38bb13224853b7944942c4b10b84f1b99aa32892aabd4f46335f78a00000000000000bc00000003fb0146f100000074c1cd03f56335e64b0000000000000058000000040ca9eccb000000387d19d10000afbc60807ffe2b018ea1eb65ddc523f7772fc1e1f16e73ee8905b4b66c12275ca800000000000000000000000000000000000000000000000000000000c67fd5260000000000000096000000081b2d1d7000000064c8dda77100afbc799607d471065ad26b0a721946ed764b15a01cf341e11989f08863962a362800000000000000000000000000000000000000000000000000000000c69d27d4000000000000003e00000002165b2b1c0000002c0b7cc7ad0103802001270001021101918f8df47d89a592d9a8e2220276e210d49d789c174ab2b303917d71c6655837000782012f0317cca5687735940043b9aca00401280129012a0247a00f076afb8843d0d2618df1779691876f9ffd59f9b30f47df60f49496744dec67200610012e013b0103d040012b003fb000000000400000000000000021dcd650010ee6b280087735940043b9aca004010150012d01db500e3a26680b9f6a280000e9b3bd478a000000e9b3bd478a0d73fd8f873243316a5b55a0395be4d1c584d71a7c52116b6379a3e93f9649360375de02eb9865b5786e167c4411e5c415cf6064be75fe04b0f81f0c4b84c7260880002c7d7c00000000000000000b9f6a0b1a749f2a012c001343b9aca0021dcd650020020161012e013b0106460600013f020340400130013102037604013201330297bf955555555555555555555555555555555555555555555555555555555555555502aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaad00000074d9dee0ce0c1014c014e0397beb33333333333333333333333333333333333333333333333333333333333333029999999999999999999999999999999999999999999999999999999999999999cf8000074d9dee0ce00400134013501360397be8517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf029a28be3defa8c3e2ad7a7c5b0fee190ac463d5bb46f71258036f9488322c6be7cf8000074d9dee0ce004001410142014301035040013701034040013b0082722f7566ede0ba3a333ac2ca4e9820a0eb28fa3c675e8c5b7378fbba7d487af6b6d8b330226ee7a4226c9a4e28167203a4dec229d3f51655422b56dd7122352fda03af7333333333333333333333333333333333333333333333333333333333333333300001d3677b8338199ff4756d3363cbb8d2ef1acd9bcdb85ff220a0116f74843bac2e4c0c79ceed000001d3677a8f142634e93ea0001408014d013801390082722f7566ede0ba3a333ac2ca4e9820a0eb28fa3c675e8c5b7378fbba7d487af6b69e73e012c2b93293818802ecda692b6a70c7bc140c3d6ba22159dd15949099300205203024013a015100a0431b9004c4b4000000000000000000960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003af7333333333333333333333333333333333333333333333333333333333333333300001d3677b8338232a2e0d714f1820922c85912266b270b551f97fd88c9ce96b02fbe0b94fedd3300001d3677b83381634e93ea0001408013c013d013e0101a0013f0082729e73e012c2b93293818802ecda692b6a70c7bc140c3d6ba22159dd1594909930d8b330226ee7a4226c9a4e28167203a4dec229d3f51655422b56dd7122352fda020f0409283baec018110140015100ab69fe00000000000000000000000000000000000000000000000000000000000000013fccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd283baec000000003a6cef706700c69d27d440009e42614c107ac0000000000000000064000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000103504001440103504001470082723145f857768776495406acbcd9f6451e43b82a7cf2b787bdfcd66f54e8f61eb2f5fc1aa51cd06879f30dac067b3d17d0571b7c8ef15db6c57ce3e90f63e7d80803af734517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf00001d3677b833817a340a8997502684b5be64a7ba6e4f4f1393c8316bcf1149956bbf00b95dd25600001d3677a8f143634e93ea0001408014d014501460082723145f857768776495406acbcd9f6451e43b82a7cf2b787bdfcd66f54e8f61eb20d9c166ab6df5f0d47d18e86fc45c1e5f42681c1184337189ef2e4aa3f2552c10205203034014a014b03af734517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf00001d3677b83383a4dbec8658831b756fd060883f7d013972d9838f66cebcd2e28d66f2b2d6d46900001d3677b83381634e93ea0001408014d014801490082720d9c166ab6df5f0d47d18e86fc45c1e5f42681c1184337189ef2e4aa3f2552c1f5fc1aa51cd06879f30dac067b3d17d0571b7c8ef15db6c57ce3e90f63e7d8080205303034014a014b00a042665004c4b400000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069600000009600000004000600000000000519ae84f17b8f8b22026a975ff55f1ab19fde4a768744d2178dfa63bb533e107a409026bc03af7555555555555555555555555555555555555555555555555555555555555555500001d3677b83383f9b2f37bf03c07595e4f861c14a0779c5b0ddb12bd6b0bf59b7f464fab4b279400001d3677a8f143634e93ea0001408014d014e014f0001200082720ac47779e474df79ac188caf2308fa7fccf511a8be789a6502f15ca63fba64408669008ce4710e1108a5eee86c282b1d13feaf7634e0c592943ae844ddd4ca0c02053030240150015100a041297004c4b40000000000000000002e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005bc00000000000000000000000012d452da449e50b8cf7dd27861f146122afe1b546bb8b70fc8216f0c614139f8e04d7cef969") + .endCell(); + log.info("CellType {}", cell.getCellType()); + log.info(cell.print()); + log.info(Utils.bytesToHex(cell.toBoc(true))); + } + + /** deserialize cell of code of wallet v4r2 */ + @Test + public void testBocIssue4() { + String cellExpected = + "x{FF00F4A413F4BCF2C80B}\n" + + " x{2_}\n" + + " x{4}\n" + + " x{D001D0D3032171B0925F04E022D749C120925F04E002D31F218210706C7567BD22821064737472BDB0925F05E003FA403020FA4401C8CA07CBFFC9D0ED44D0810140D721F404305C810108F40A6FA131B3925F07E005D33FC8258210706C7567BA923830E30D03821064737472BA925F06E30D}\n" + + " x{01FA00F40430F8276F2230500AA121BEF2E0508210F06C75677080185004CB0526CF1658FA0219F400CB6917CB1F5260CB3F20C98040FB0006}\n" + + " x{5004810108F45930ED44D0810140D720C801CF16F400C9ED540172B08E208210E47374727080185005CB055003CF1623FA0213CB6ACB1FCB3FC98040FB00925F03E2}\n" + + " x{2_}\n" + + " x{2_}\n" + + " x{5}\n" + + " x{B29DFB513420405035C87D010C00B23281F2FFF274006040423D029BE84C6_}\n" + + " x{2_}\n" + + " x{ADCE76A26840206B90EB85FFC_}\n" + + " x{AF1DF6A26840106B90EB858FC_}\n" + + " x{B8C97ED44D0D70B1F}\n" + + " x{BD242B6F6A2684080A06B90FA0218470D4080847A4937D29910CE6903E9FF9837812801B7810148987159F3184_}\n" + + " x{F28308D71820D31FD31FD31F02F823BBF264ED44D0D31FD31FD3FFF404D15143BAF2A15151BAF2A205F901541064F910F2A3F80024A4C8CB1F5240CB1F5230CBFF5210F400C9ED54F80F01D30721C0009F6C519320D74A96D307D402FB00E830E021C001E30021C002E30001C0039130E30D03A4C8CB1F12CB1FCBFF}\n" + + " x{D207FA00D4D422F90005C8CA0715CBFFC9D077748018C8CB05CB0222CF165005FA0214CB6B12CCCCC973FB00C84014810108F451F2A702}\n" + + " x{810108D718FA00D33FC8542047810108F451F2A782106E6F746570748018C8CB05CB025006CF165004FA0214CB6A12CB1FCB3FC973FB0002}\n" + + " x{810108D718FA00D33F305224810108F459F2A782106473747270748018C8CB05CB025005CF165003FA0213CB6ACB1F12CB3FC973FB00}\n" + + " x{F400C9ED54}\n"; + + String bocHexExpected = + "B5EE9C72410214010002CE000114FF00F4A413F4BCF2C80B010201200203020148040504F8F28308D71820D31FD31FD31F02F823BBF264ED44D0D31FD31FD3FFF404D15143BAF2A15151BAF2A205F901541064F910F2A3F80024A4C8CB1F5240CB1F5230CBFF5210F400C9ED54F80F01D30721C0009F6C519320D74A96D307D402FB00E830E021C001E30021C002E30001C0039130E30D03A4C8CB1F12CB1FCBFF1011121302E6D001D0D3032171B0925F04E022D749C120925F04E002D31F218210706C7567BD22821064737472BDB0925F05E003FA403020FA4401C8CA07CBFFC9D0ED44D0810140D721F404305C810108F40A6FA131B3925F07E005D33FC8258210706C7567BA923830E30D03821064737472BA925F06E30D06070201200809007201FA00F40430F8276F2230500AA121BEF2E0508210F06C75677080185004CB0526CF1658FA0219F400CB6917CB1F5260CB3F20C98040FB000600845004810108F45930ED44D0810140D720C801CF16F400C9ED540172B08E208210E47374727080185005CB055003CF1623FA0213CB6ACB1FCB3FC98040FB00925F03E20201200A0B0059BD242B6F6A2684080A06B90FA0218470D4080847A4937D29910CE6903E9FF9837812801B7810148987159F31840201580C0D0011B8C97ED44D0D70B1F8003DB29DFB513420405035C87D010C00B23281F2FFF274006040423D029BE84C600201200E0F0019ADCE76A26840206B90EB85FFC00019AF1DF6A26840106B90EB858FC0006ED207FA00D4D422F90005C8CA0715CBFFC9D077748018C8CB05CB0222CF165005FA0214CB6B12CCCCC973FB00C84014810108F451F2A7020070810108D718FA00D33FC8542047810108F451F2A782106E6F746570748018C8CB05CB025006CF165004FA0214CB6A12CB1FCB3FC973FB0002006C810108D718FA00D33F305224810108F459F2A782106473747270748018C8CB05CB025005CF165003FA0213CB6ACB1F12CB3FC973FB00000AF400C9ED54D4552129"; + Cell cell = CellBuilder.beginCell().fromBoc(bocHexExpected).endCell(); + log.info("CellType {}", cell.getCellType()); + log.info(cell.print()); + log.info(Utils.bytesToHex(cell.toBoc(true, false, false, false, false))); + + assertThat(cell.print()).isEqualTo(cellExpected); + + // todo + // assertThat(Utils.bytesToHex(cell.toBoc(true)).toUpperCase()).isEqualTo(bocHexExpected); + } + + /** basic cell */ + @Test + public void testCellBackAndForth1() { + String cellExpected = "x{40000001400000036_}\n"; + String bocHexExpected = "B5EE9C7241010101000B0000114000000140000003603C39FDA2"; + Cell cell = CellBuilder.beginCell().fromBoc(bocHexExpected).endCell(); + + log.info("CellType {}", cell.getCellType()); + log.info(cell.print()); + log.info(Utils.bytesToHex(cell.toBoc(true))); + + assertThat(cell.print()).isEqualTo(cellExpected); + assertThat(Utils.bytesToHex(cell.toBoc(true)).toUpperCase()).isEqualTo(bocHexExpected); + } + + /** cell with one ref */ + @Test + public void testCellBackAndForth2() { + String cellExpected = "x{40000001400000034_}\n" + " x{40000001400000036_}\n"; + String bocHexExpected = + "B5EE9C7241010201001700011140000001400000034001001140000001400000036010CB5ED2"; + Cell cell = CellBuilder.beginCell().fromBoc(bocHexExpected).endCell(); + + log.info("CellType {}", cell.getCellType()); + log.info(cell.print()); + log.info(Utils.bytesToHex(cell.toBoc(true))); + + assertThat(cell.print()).isEqualTo(cellExpected); + assertThat(Utils.bytesToHex(cell.toBoc(true)).toUpperCase()).isEqualTo(bocHexExpected); + } + + /** cell with one ref that has another ref */ + @Test + public void testCellBackAndForth3() { + String cellExpected = + "x{40000001400000034_}\n" + " x{40000001400000034_}\n" + " x{40000001400000036_}\n"; + String bocHexExpected = + "B5EE9C72410103010023000111400000014000000340010111400000014000000340020011400000014000000360CD2FA77E"; + Cell cell = CellBuilder.beginCell().fromBoc(bocHexExpected).endCell(); + + log.info("CellType {}", cell.getCellType()); + log.info(cell.print()); + log.info(Utils.bytesToHex(cell.toBoc(true))); + + assertThat(cell.print()).isEqualTo(cellExpected); + assertThat(Utils.bytesToHex(cell.toBoc(true)).toUpperCase()).isEqualTo(bocHexExpected); + } + + /* + * complex cell with four refs: + * =: cell1 + * cell1 ."cell 1: " B dup Bx. cr + *

+ * =: cell2 + * cell2 ."cell 2: " B dup Bx. cr + *

+ * =: cell3 + * cell3 ."cell 3: " B dup Bx. cr + *

+ * =: cell4 + * cell4 ."cell 4: " B dup Bx. cr + *

+ * =: cell5 + * cell5 ."cell 5: " B dup Bx. cr + */ + @Test + public void testCellBackAndForth4() { + String cellExpected = + "x{40000001400000034_}\n" + + " x{40000001400000036_}\n" + + " x{40000001400000034_}\n" + + " x{40000001400000036_}\n" + + " x{40000001400000034_}\n" + + " x{40000001400000034_}\n" + + " x{40000001400000036_}\n" + + " x{40000001400000034_}\n" + + " x{40000001400000034_}\n" + + " x{40000001400000036_}\n" + + " x{40000001400000034_}\n" + + " x{40000001400000034_}\n" + + " x{40000001400000036_}\n"; + String bocHexExpected = + "B5EE9C7241010501003F00041140000001400000034004030201021140000001400000034003020111400000014000000340030111400000014000000340040011400000014000000360785A1C4B"; + Cell cell = CellBuilder.beginCell().fromBoc(bocHexExpected).endCell(); + + log.info("CellType {}", cell.getCellType()); + log.info(cell.print()); + log.info(Utils.bytesToHex(cell.toBoc(true))); + + assertThat(cell.print()).isEqualTo(cellExpected); + assertThat(Utils.bytesToHex(cell.toBoc(true)).toUpperCase()).isEqualTo(bocHexExpected); + } + + private static final String BOC_FIFT_HEX_LARGE2 = + "b5ee9c7241023201000498000114ff00f4a413f4bcf2c80b010201200302000cf2308048f2f00201480e0402012008050201200706001db9c34f00a5f03802032028307f00580011bbbd182108325e4c380201200d090201200b0a003bb6e53da89a1f401a803a1a7ffe00203e00203a861a1e0026209a8608a810020120310c002bb2fe7c02840917c120c1fd039be864fe800c380c1c200017bb9a5ed44d0d430d0d3ff3080202cb120f0201ce1110005b3e105bc90c0c40b53d01347b5134350c3434ffcc201254452ebcbd087ec120841ca368e840b2333d00104c3c01a000513e105bc90c0c40bd01347b5134350c3434ffcc20125444eebcbd20840764eab600723d00104c3c01a002012023130201201c140201201915020120181601f73e105bc90c80fd01347c02b434c03e8034c7f4c7fd010c2012c97cbd2012d4e4ae7cbd2012d4e4ee7cbd20134920840ee6b2802814032ec6fcbd3e097e0554c1e8483e0454c2e0083d039be864f4c7cc248c083880a94b20083d039be865900720083d05a74c083232c7f274100720083d05b882a9013232c01400e0170038fa02cb1fcb1f17f400c9f00b82101a69387e02c8cb1ff4004130f00600793e105bc90c0c40b53d01347b5134350c3434ffcc201254c52ebcbd08b434ffcc201200aebcbd3c028c54943c02e0843218aeaf40b2333d00104c3c01a00201201b1a00e33e105bc90c0c40b4fff4c7fe803d01347c02887434ffcc20125446eebcbd08e0080a60c1fc014c6011c07cbc94ca3c020a7232ffd50825a0083d10c1291508e43c0240bc02e0840d2212a4497232ffd49032c7d4883d00095110d4a17c01e0841c04df21c0f232ffc4b2c7fd00104c3c01a000ed3e105bc90c0c40b4fff4c7fe803d01347c0288e0080a60c1fc016011c07cbd2011d4c6eebcbd14cc3c0214d2bc020af232ffd5082e20083d10c06951543c0241291509243c025004fc02e084260abfffc97232ffd49032c7d4883d00095110d4a17c01e0840c19b443c0f232ffc4b2c7fd00104c3c01a0020120201d0201201f1e001f3214017e8084fd003d003333327b552000193b51343e803d013d0135350c200201202221003b20128870403cbc8830802672007e8080a0c1fd10e5cc0060c1fd16cc38a0001d0060c1fd039be864fe800c380c1c200201202b2402012028250201202726003d1c20043232c141bc0105b3c594013e808532dab2c7c4b2cff3c4f25c7ec020003d1c20043232c1417c010573c5893e808532da84b2c7f2cff3c4f260103ec0200201202a290023104cfd039be8482540b5c04c00780c5c0ca0001d1c081cb232c072c032c1f2fff274200201202d2c00215fa4001fa46804602c00012f2f4d3ff3080201202f2e001134c1c06a80b5c6006001ed20120871c03cbc807434c0c05c6c2497c0f83c00cc4074c7dc208061a808f00023858cc074c7e01200a0841b5a5b9d2e84bcbd2082c63cd865d6f4cffe801400f880fe0048840d10015bc13e186084100d28f014842ea4cc3c033820842296cbb9d4842ea4cc3c03782082c63cd854842ea4cc3c03f8203000588210982535785210ba9330f00ee08210b766741a5210ba9330f011e0821025d53dfdba92f010e0308048f2f00011b323bc02840d17c12004896818"; + private static final String BOC_FIFT_BASE64_LARGE = + "te6ccgECMgEABJgAART/APSkE/S88sgLAQIBIAIDAgFIBAUADPIwgEjy8AICywYHAgEgKCkCASAICQIBziYnAgEgCgsCASAXGAIBIAwNAgEgERICASAODwAhX6QAH6RoBGAsAAEvL00/8wgB7SASCHHAPLyAdDTAwFxsJJfA+DwAzEB0x9wggGGoCPAAI4WMwHTH4BIAoIQbWludLoS8vSCCxjzYZdb0z/6AFAD4gP4ASIQNEAFbwT4YYIQQDSjwFIQupMw8AzgghCKWy7nUhC6kzDwDeCCCxjzYVIQupMw8A/ggEAARNMHAaoC1xgBgAFiCEJglNXhSELqTMPAO4IIQt2Z0GlIQupMw8BHgghAl1T39upLwEOAwgEjy8AIBIBMUAgEgFRYAHRwIHLIywHLAMsHy//J0IAAjEEz9A5voSCVAtcBMAHgMXAygAD0cIAQyMsFBfAEFc8WJPoCFMtqEssfyz/PE8mAQPsAgAD0cIAQyMsFBvAEFs8WUAT6AhTLassfEss/zxPJcfsAgAgEgGRoCASAfIAIBIBscAgEgHR4AHQBgwf0Dm+hk/oAMOAwcIAA7IBKIcEA8vIgwgCZyAH6AgKDB/RDlzABgwf0WzDigABk7UTQ+gD0BPQE1NQwgAB8yFAF+gIT9AD0AMzMye1UgAgEgISICASAjJADtPhBbyQwMQLT/9Mf+gD0BNHwCiOAICmDB/AFgEcB8vSAR1MbuvL0UzDwCFNK8AgryMv/VCC4gCD0QwGlRVDwCQSkVCSQ8AlAE/ALghCYKv//JcjL/1JAyx9SIPQAJURDUoXwB4IQMGbRDwPIy/8Syx/0AEEw8AaAA4z4QW8kMDEC0//TH/oA9ATR8Aoh0NP/MIBJURu68vQjgCApgwfwBTGARwHy8lMo8AgpyMv/VCCWgCD0QwSkVCOQ8AkC8AuCEDSISpElyMv/UkDLH1Ig9AAlRENShfAHghBwE3yHA8jL/xLLH/QAQTDwBoAB5PhBbyQwMQLU9ATR7UTQ1DDQ0/8wgElTFLry9CLQ0/8wgEgCuvL08AoxUlDwC4IQyGK6vQLIzPQAQTDwBoAH3PhBbyQyA/QE0fAK0NMA+gDTH9Mf9AQwgEsl8vSAS1OSufL0gEtTk7ny9IBNJIIQO5rKAKBQDLsb8vT4JfgVUwehIPgRUwuAIPQOb6GT0x8wkjAg4gKlLIAg9A5voZZAHIAg9BadMCDIyx/J0EAcgCD0FuIKpATIywBQA4CUAOPoCyx/LHxf0AMnwC4IQGmk4fgLIyx/0AEEw8AYAUT4QW8kMDEC9ATR7UTQ1DDQ0/8wgElRE7ry9IIQHZOq2AHI9ABBMPAGgAFs+EFvJDAxAtT0BNHtRNDUMNDT/zCASVEUuvL0IfsEghByjaOhAsjM9ABBMPAGgAgEgKisCASAwMQAXu5pe1E0NQw0NP/MIAgEgLC0CASAuLwA7tuU9qJofQBqAOhp//gAgPgAgOoYaHgAmIJqGCKgQABGzI7wChA0XwSAAK7L+fAKECRfBIMH9A5voZP6ADDgMHCAAEbu9GCEIMl5MOAAducNPAKXwOAIDICgwfwBY"; + private static final String BOC_FIFT_LARGE_HASH = + "2f013a05f1522b9288e0412c524186f089ea30e87afc9a51395eed0019f2cf8f"; + + private static final String BOC_FIFT_HEX_WITH_DUPS = + "b5ee9c720101180100e800020310c201020163a90da09563b6740a4b7f68ca09fbdb76b0035cc101450a16e2e79b985ebbb38a0c5768616c657320546f6b656e0357484c40030119a1dcd65000000003200000032604003e1e68747470733a2f2f746f6e7768616c65732e636f6d2f636f6e74656e742f0203ccc0050602012007080201481415020120090a0201200f10000ba38000002cc00201200b0c0009b6000000c30201480d0e00094000000638000950000005f8000ba6000000304002012011170201581213000940000005c8000950000005e8000ba18000002ec002012016170009b4000000b70009d8000002d4"; + private static final String BOC_FIFT_BASE64_WITH_DUPS = + "te6ccgEBGAEA6AACAxDCAQIBY6kNoJVjtnQKS39oygn723awA1zBAUUKFuLnm5heu7OKDFdoYWxlcyBUb2tlbgNXSExAAwEZodzWUAAAAAMgAAADJgQAPh5odHRwczovL3RvbndoYWxlcy5jb20vY29udGVudC8CA8zABQYCASAHCAIBSBQVAgEgCQoCASAPEAALo4AAACzAAgEgCwwACbYAAADDAgFIDQ4ACUAAAAY4AAlQAAAF+AALpgAAADBAAgEgERcCAVgSEwAJQAAABcgACVAAAAXoAAuhgAAALsACASAWFwAJtAAAALcACdgAAALU"; + private static final String BOC_FIFT_WITH_DUPS_HASH = + "5049e60708f6f8aefb51009361aa6ad6fc6a14becd8d8bef37d10cf2e8ea281d"; + + private static final String BOC_FIFT_HEX_DEEP_DUPLICATED_HASHMAP = + "b5ee9c7241010901006a000101c0010202cb02030201200404020162060702012005050201200606020120080800434801f9c856c1260ecc28bf6928191e2b79c9a64d19c787ccb9d113c6d609690b7f0900432007e7215b04983b30a2fda4a06478ade7269934671e1f32e7444f1b5825a42dfc2404807a00"; + private static final String BOC_FIFT_DEEP_DUPLICATED_HASHMAP_HASH = + "69e794b89cef40a0ee3ab947cf8ea70736101d9c86ae4168406fc72964d1a9e6"; + + @Test + public void testShouldDeserializeSerializeDeserializeBocFromHex() { + Cell c1 = CellBuilder.beginCell().fromBoc(BOC_FIFT_HEX_LARGE2).endCell(); + log.info("CellType c1 {}", c1.getCellType()); + log.info("Hex c1 {}", Utils.bytesToHex(c1.toBoc(true, true))); + assertThat(Utils.bytesToHex(c1.hash())).isEqualTo(BOC_FIFT_LARGE_HASH); + assertThat(Utils.bytesToHex(c1.getHash())).isEqualTo(BOC_FIFT_LARGE_HASH); + + Cell c2 = CellBuilder.beginCell().fromBoc(BOC_FIFT_HEX_WITH_DUPS).endCell(); + log.info("CellType c2 {}", c2.getCellType()); + log.info("Hex c2 {}", Utils.bytesToHex(c2.toBoc(true, true))); + assertThat(Utils.bytesToHex(c2.hash())).isEqualTo(BOC_FIFT_WITH_DUPS_HASH); + assertThat(Utils.bytesToHex(c2.getHash())).isEqualTo(BOC_FIFT_WITH_DUPS_HASH); + + Cell c3 = CellBuilder.beginCell().fromBoc(BOC_FIFT_HEX_DEEP_DUPLICATED_HASHMAP).endCell(); + log.info("CellType c3 {}", c3.getCellType()); + log.info("Hex c3 {}", Utils.bytesToHex(c3.toBoc(true, true))); + assertThat(Utils.bytesToHex(c3.hash())).isEqualTo(BOC_FIFT_DEEP_DUPLICATED_HASHMAP_HASH); + assertThat(Utils.bytesToHex(c3.getHash())).isEqualTo(BOC_FIFT_DEEP_DUPLICATED_HASHMAP_HASH); + + String hex1 = c1.toHex(); + String hex2 = c2.toHex(); + String hex3 = c3.toHex(); + + log.info("hex1 {}", hex1); + log.info("hex2 {}", hex2); + log.info("hex3 {}", hex3); + + Cell result1 = CellBuilder.beginCell().fromBoc(hex1).endCell(); + Cell result2 = CellBuilder.beginCell().fromBoc(hex2).endCell(); + Cell result3 = CellBuilder.beginCell().fromBoc(hex3).endCell(); + + assertThat(Utils.bytesToHex(result1.hash())).isEqualTo(BOC_FIFT_LARGE_HASH); + assertThat(Utils.bytesToHex(result2.hash())).isEqualTo(BOC_FIFT_WITH_DUPS_HASH); + assertThat(Utils.bytesToHex(result3.hash())).isEqualTo(BOC_FIFT_DEEP_DUPLICATED_HASHMAP_HASH); + } + + @Test + public void testShouldDeserializeSerializeDeserializeBocFromBase64() { + Cell c1 = + CellBuilder.beginCell().fromBoc(Utils.base64ToSignedBytes(BOC_FIFT_BASE64_LARGE)).endCell(); + assertThat(Utils.bytesToHex(c1.hash())).isEqualTo(BOC_FIFT_LARGE_HASH); + assertThat(Utils.bytesToHex(c1.getHash())).isEqualTo(BOC_FIFT_LARGE_HASH); + + Cell c2 = + CellBuilder.beginCell() + .fromBoc(Utils.base64ToSignedBytes(BOC_FIFT_BASE64_WITH_DUPS)) + .endCell(); + assertThat(Utils.bytesToHex(c2.hash())).isEqualTo(BOC_FIFT_WITH_DUPS_HASH); + assertThat(Utils.bytesToHex(c2.getHash())).isEqualTo(BOC_FIFT_WITH_DUPS_HASH); + + String base64c1 = c1.toBase64(); + String base64c2 = c2.toBase64(true); + + Cell c3 = CellBuilder.beginCell().fromBoc(Utils.base64ToSignedBytes(base64c1)).endCell(); + Cell c4 = CellBuilder.beginCell().fromBoc(Utils.base64ToSignedBytes(base64c2)).endCell(); + + assertThat(Utils.bytesToHex(c3.hash())).isEqualTo(BOC_FIFT_LARGE_HASH); + assertThat(Utils.bytesToHex(c4.hash())).isEqualTo(BOC_FIFT_WITH_DUPS_HASH); + } + + @Test + public void testShouldDeserializeSerializeDeserializeBocWithExoticCells() { + log.info( + "hex {}", + Utils.base64ToHexString( + "te6ccuICASMAAQAAJm0AAAAkAMwA6gGAAmIC/gMwA0oDWQNyA4wEhAT0BQ4FtgX2BugHWAekCEwIjAj2CUMJjgpaCnoLEAsuC0wLaguIC6gLxgvkDAIMIAw+DFwNCg0uDVIN/g4eDj4OXg58DpoOtg7SDu4PCg+wEDQQWBB4EMQREBEwEVARcBGOEa4RzhHuEg4SLhLYE2ATxBRGFGQUghSgFLwVYBXgFe4V/BYKFhgWJhY0FkIWUBZeFmwWehaIFtQW4hbwFv4XDBcaFygXNhdEF5AXtBfYGCUY0BjwGRAZXRmpGcgZ5hozGn8anBq4GwUbURtsG4gb1RwhHDwc4h0vHbId/x5RHpwevB8JH1UfdB+UH+EgACAeIGsgiiDXIPYhFiFjIYIhzyIbIjoi5CMxI7gkBSRoJLUlASWCJc8l7CY5JlYmoybAJw0nWSd0KBgoZSjkKTEpfSnJKhUq4CstK0wr4iwvLEwsmSy2LQMtIC1tLYot1y32LkMuYC6tLsovFy80L4Evni/rMAgwVTByML8w3DGKMjgyRjKTMqAyrjK8MwkzFjNjM3AzvTPKNBc0JDRxNH40yzTYNSU1MjV/NYw12TXmNjM2QDb0N2w4IDhtOHo4xzjUOSE5Ljk8OYk51TniOfA6PTqJOpY6pDrxOz07SjwAPLY8wjzIPRY9Kj1+PYs9lD54PpA+nj6tPrw+zD9wQBhAwEDMQNhBXkIeQqRCtkNaRBtEJESqRMZFd0YYRiRGMEa2R3ZH/EgOSM5JVElmSgtKeUs4Sz9LxUvWTHpM2wQQEe9Vqv///xEAAQACAAMABAGgm8ephwAAAAAEAQFcY8oAAAABAP////8AAAAAAAAAAGL7u90AABusl7vrgAAAG6yXu+uEpYk+AwAFOWIBXGPGAVw1xMQAAAADAAAAAAAAAC4ABQIRuOSN+0ZVPxAEAAYABwqKBPTVPFzdihzyG0ZA/Z/mBJ1yBqgO+orVswRwW9Ghgz0za8SUx1HcFeKT2oruLoomx5yUkuOsElnlsSJNKY+/ENoBbgFuAAsADBSJmYD0kiPZUykP36g26WWT2iA3GY68wcz8ZL8QwW+fhvAACEoz9v2aCe+A7qvC9i2h3Y6Njxlya+THPWSTqtk2VhEmjFQ8JXqzCxqvVlxyT5lrgSew1WEQPh5vGG5G6aL+jSx7p9yWwAD1APYA9wD4AJgAABusl6ypRAFcY8mtUGDeEa5UtZnyUWZSv8kV786DFV0ENsQUkqouFOLX3rb1GiR3IplBS223L+1UZy+klFYI0IbJ4XbYN5fnBSteAiWB+InEuMrAkZwPxE4l+P/9DMAIAAgACAAVAjKp+IARlU/EAAgCASAACQAKABW+AAADvLNVq0Zq0AAVv////7y9Dv2lY9A0W/TVPFzdihzyG0ZA/Z/mBJ1yBqgO+orVswRwW9Ghgz0zire8kc/uikSA5tJI792XKtIcd16h+cRO+PhEg96KGUIBbgASkCOv4v///xEA/////wAAAAAAAAAAAVxjyQAAAAFi+7vaAAAbrJesqUQBXGPGYAASABMAFAAVJFuQI6/i////EQD/////AAAAAAAAAAABXGPKAAAAAWL7u90AABusl7vrhAFcY8ZgAA0ADgAPABABEQAAAAAAAAAAUAARMhMdtc3JNOOXcP4CUgqFLYe5jp9eFGCXN/2PYC5God0p7ETUNyBAKrRSk9HHSEaboZwqfwF4wdahjVNsDNrEHei6AW0AEYIH4icS/H/+hnAAYgB+IjMAAAAAAAAAAP//////////gfiJxL8f/6GYKAB+ABY0VVYFBXh8evRXt1/LXGzQvukMsZdguMASeBnedPbBTQIbXMJZIizmRhXnEzCtaN1v/eOKo/DPF2/JtB2rCC+iFr8AGwAQzCaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqsIyjH/9rdaTfgD6AKYApwCoAGuwQAAAAAAAAAAArjHlAAAN1kvWVKH//////////////////////////////////////////8AoSAEBDRhZGTMcB5HAoou+7uCSHdojFWI3aVx/gTlOrgNM7EMAATITslv1ooQGvZd9j8gshuttzHXVNdKRRvN/mR9pG838qiamUhqaVKTFYyGRZPN04LZpGPPs+x1U4wJQzWuvxOSisQFtABGCB+InEuMrAkZwACcAfiIzAAAAAAAAAAD//////////4H4icS4ysCRmCgAfgAWJFXMJqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqwjKMf/qDNwt+ABcApgAYAKgoSAEB3lrfRcA6dF/J06QY2eK6CW25waqne8CJi22eu2EdK0AABShIAQFGlzTBTSSwdU7e8/LK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")); + Cell c = + CellBuilder.beginCell() + .fromBoc( + Utils.base64ToSignedBytes( + "te6ccuICASMAAQAAJm0AAAAkAMwA6gGAAmIC/gMwA0oDWQNyA4wEhAT0BQ4FtgX2BugHWAekCEwIjAj2CUMJjgpaCnoLEAsuC0wLaguIC6gLxgvkDAIMIAw+DFwNCg0uDVIN/g4eDj4OXg58DpoOtg7SDu4PCg+wEDQQWBB4EMQREBEwEVARcBGOEa4RzhHuEg4SLhLYE2ATxBRGFGQUghSgFLwVYBXgFe4V/BYKFhgWJhY0FkIWUBZeFmwWehaIFtQW4hbwFv4XDBcaFygXNhdEF5AXtBfYGCUY0BjwGRAZXRmpGcgZ5hozGn8anBq4GwUbURtsG4gb1RwhHDwc4h0vHbId/x5RHpwevB8JH1UfdB+UH+EgACAeIGsgiiDXIPYhFiFjIYIhzyIbIjoi5CMxI7gkBSRoJLUlASWCJc8l7CY5JlYmoybAJw0nWSd0KBgoZSjkKTEpfSnJKhUq4CstK0wr4iwvLEwsmSy2LQMtIC1tLYot1y32LkMuYC6tLsovFy80L4Evni/rMAgwVTByML8w3DGKMjgyRjKTMqAyrjK8MwkzFjNjM3AzvTPKNBc0JDRxNH40yzTYNSU1MjV/NYw12TXmNjM2QDb0N2w4IDhtOHo4xzjUOSE5Ljk8OYk51TniOfA6PTqJOpY6pDrxOz07SjwAPLY8wjzIPRY9Kj1+PYs9lD54PpA+nj6tPrw+zD9wQBhAwEDMQNhBXkIeQqRCtkNaRBtEJESqRMZFd0YYRiRGMEa2R3ZH/EgOSM5JVElmSgtKeUs4Sz9LxUvWTHpM2wQQEe9Vqv///xEAAQACAAMABAGgm8ephwAAAAAEAQFcY8oAAAABAP////8AAAAAAAAAAGL7u90AABusl7vrgAAAG6yXu+uEpYk+AwAFOWIBXGPGAVw1xMQAAAADAAAAAAAAAC4ABQIRuOSN+0ZVPxAEAAYABwqKBPTVPFzdihzyG0ZA/Z/mBJ1yBqgO+orVswRwW9Ghgz0za8SUx1HcFeKT2oruLoomx5yUkuOsElnlsSJNKY+/ENoBbgFuAAsADBSJmYD0kiPZUykP36g26WWT2iA3GY68wcz8ZL8QwW+fhvAACEoz9v2aCe+A7qvC9i2h3Y6Njxlya+THPWSTqtk2VhEmjFQ8JXqzCxqvVlxyT5lrgSew1WEQPh5vGG5G6aL+jSx7p9yWwAD1APYA9wD4AJgAABusl6ypRAFcY8mtUGDeEa5UtZnyUWZSv8kV786DFV0ENsQUkqouFOLX3rb1GiR3IplBS223L+1UZy+klFYI0IbJ4XbYN5fnBSteAiWB+InEuMrAkZwPxE4l+P/9DMAIAAgACAAVAjKp+IARlU/EAAgCASAACQAKABW+AAADvLNVq0Zq0AAVv////7y9Dv2lY9A0W/TVPFzdihzyG0ZA/Z/mBJ1yBqgO+orVswRwW9Ghgz0zire8kc/uikSA5tJI792XKtIcd16h+cRO+PhEg96KGUIBbgASkCOv4v///xEA/////wAAAAAAAAAAAVxjyQAAAAFi+7vaAAAbrJesqUQBXGPGYAASABMAFAAVJFuQI6/i////EQD/////AAAAAAAAAAABXGPKAAAAAWL7u90AABusl7vrhAFcY8ZgAA0ADgAPABABEQAAAAAAAAAAUAARMhMdtc3JNOOXcP4CUgqFLYe5jp9eFGCXN/2PYC5God0p7ETUNyBAKrRSk9HHSEaboZwqfwF4wdahjVNsDNrEHei6AW0AEYIH4icS/H/+hnAAYgB+IjMAAAAAAAAAAP//////////gfiJxL8f/6GYKAB+ABY0VVYFBXh8evRXt1/LXGzQvukMsZdguMASeBnedPbBTQIbXMJZIizmRhXnEzCtaN1v/eOKo/DPF2/JtB2rCC+iFr8AGwAQzCaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqsIyjH/9rdaTfgD6AKYApwCoAGuwQAAAAAAAAAAArjHlAAAN1kvWVKH//////////////////////////////////////////8AoSAEBDRhZGTMcB5HAoou+7uCSHdojFWI3aVx/gTlOrgNM7EMAATITslv1ooQGvZd9j8gshuttzHXVNdKRRvN/mR9pG838qiamUhqaVKTFYyGRZPN04LZpGPPs+x1U4wJQzWuvxOSisQFtABGCB+InEuMrAkZwACcAfiIzAAAAAAAAAAD//////////4H4icS4ysCRmCgAfgAWJFXMJqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqwjKMf/qDNwt+ABcApgAYAKgoSAEB3lrfRcA6dF/J06QY2eK6CW25waqne8CJi22eu2EdK0AABShIAQFGlzTBTSSwdU7e8/LK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")) + .endCell(); + log.info("type {}", Utils.bytesToHex(c.getHash())); + } + + @Test + public void testShouldDeserialize2() { + Cell cell = + CellBuilder.beginCell() + .fromBoc( + Utils.base64ToSignedBytes( + "te6cckEBAQEAIgAAQI4l3QgXTJzTGSGBoCKurXZZrCqdShK4T1Fg7dLsxwbqJRoppg==")) + .endCell(); + log.info("CellType {}", cell.getCellType()); + } + + @Test + public void testShouldDeserializeAccountState() { + Cell c = + CellBuilder.beginCell() + .fromBoc( + "b5ee9c724101030100d700026fc00c419e2b8a3b6cd81acd3967dbbaf4442e1870e99eaf32278b7814a6ccaac5f802068148c314b1854000006735d812370d00764ce8d340010200deff0020dd2082014c97ba218201339cbab19f71b0ed44d0d31fd31f31d70bffe304e0a4f2608308d71820d31fd31fd31ff82313bbf263ed44d0d31fd31fd3ffd15132baf2a15144baf2a204f901541055f910f2a3f8009320d74a96d307d402fb00e8d101a4c8cb1fcb1fcbffc9ed5400500000000229a9a317d78e2ef9e6572eeaa3f206ae5c3dd4d00ddd2ffa771196dc0ab985fa84daf451c340d7fa") + .endCell(); + log.info("CellType {}", c.getCellType()); + log.info(c.toString()); + log.info("length {}", c.getBitLength()); + } + + @Test + public void testShouldDeserializeInMsgDescr() { + Cell c = + CellBuilder.beginCell() + .fromBoc( + "b5ee9c724102300100078d0001099b2dcef0200102090d96e77810120202090d96e778100a030246bfa9346e9464c7f146a6be4225b1c98e29a59561fbb67319922eda6acc69f6b9130030040501064606000903af7000000000000000000000000000000000000000000000000000000000000000000000000000f42439440e0c397a3b2ee3cbd81ea78021862f892a5a9e779d1fecd55236d6571eb5200000000000f424165a57c5f0001408082f06020f0409017d784018110729009a27c89c40000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101a00900ab29fe09ec98d5f7fe7ba21b174ce0ef21592ce1aa81e6f528916066f754d4b52559593fc0000000000000000000000000000000000000000000000000000000000000001017d784000000000000001e8484cb4af8be4002094365b9de04260b0251bf084dd4db5a349ccfcf293baf5f5b626f4a130856b6613ded62877bfecc2536dcd96e7780cd96e77a110c03af704f64c6afbff3dd10d8ba6707790ac9670d540f37a9448b0337baa6a5a92acac00000000000f4247d59d160ea9c63d10edae2c76ada993f982915bc75f7bcc0fb81280820d15523200000000000f424165a57c5f0001408100f0d020f0c0901c9c38018110e29009c402468bb8000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008272bf8229e6e684701825a6f8e1fb0f8155aba759d58b82e73b8405092874e23fa816617de1e9f3a79e4c7d8a3a51ac0c8b54b6bbcd4f824c9f800aa2f36fee26720101a019010c46060365b9de19020300101c130246bf919848778310ed687087000647581469374dff5e9f0fb1cf744809c5016e12fb00301a1403b57ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffef00000000000f42450000000000000000000000000000000000000000000000000000000000000000000000000000000065a57c5f0003e665b9448171615001f040901efe92001c0332dca2365b9de4000827290aec8965afabb16ebc3cb9b408ebae71b618d78788bc80d09843593cac98da490aec8965afabb16ebc3cb9b408ebae71b618d78788bc80d09843593cac98da40201e01b180101df1900b959ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdf3fc13d931abeffcf744362e99c1de42b259c35503cdea5122c0cdeea9a96a4ab2b101c9c380006cb73bc00000000001e848ccb4af8be7fffffffc001064606001b00ab29fe09ec98d5f7fe7ba21b174ce0ef21592ce1aa81e6f528916066f754d4b52559593ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbd01efe92000000000000001e8488cb4af8be400246bfad8011dbd0ddd5549e65b1288c858e77dc3e0a5ba9eae0d756ca2e8b5731753e0030211d03af7000000000000000000000000000000000000000000000000000000000000000000000000000f42410000000000000000000000000000000000000000000000000000000000000000000000000000000065a57c5f0001408201f1e0113040829a40cd41efffe02230082725828aa96d32f676df2049228847cc42b15b0a52d9ffa3bc66b36fcedeff20af9310a1de222ce584cb4e86613b11d31616e9eaa4ff9ee499f19b104cf71eb504f0101a02201064606002201a369fe00000000000000000000000000000000000000000000000000000000000000013fc000000000000000000000000000000000000000000000000000000000000000020000000000001e8480cb4af8be402302012025240015bfffffffbcbd1a94a200100015be000003bcb3670dc155500245bf2ac017c203ca0d9d008bf543c1364eebf27183668cf1e8b1e0e98af56b2dc1dc00c22d2703af7333333333333333333333333333333333333333333333333333333333333333300000000000f4242cac3c5723cb68f5f7dba257e7f812140298ea360bdbf630cd33c8da2b098829200000000000f424165a57c5f00014082c2b28020f04091954fc4018112a29005bc00000000000000000000000012d452da449e50b8cf7dd27861f146122afe1b546bb8b70fc8216f0c614139f8e04009e41778c0a604000000000000000003e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082729304b9982993165dc7b4b2ccfc64c61bf6455afe7e4fe1233d5f827261360d8ed855aea1ede2adcff55d3d37fcf59c03bd19c39f843a14faef85cad3980cf6920101a02e01064606002e00ab69fe00000000000000000000000000000000000000000000000000000000000000013fccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd1954fc4000000000000001e8480cb4af8be40008272310a1de222ce584cb4e86613b11d31616e9eaa4ff9ee499f19b104cf71eb504f606c97d0dc8b63016a6afd67b2fe52cd0e02a3dcdf71f331cf1e8006ca8e51a323766587") + .endCell(); + log.info(c.print()); + log.info(c.toString()); + log.info("length {}", c.getBitLength()); + } + + @Test + public void testShouldDeserializeOutMsgDescr() { + Cell c = + CellBuilder.beginCell() + .fromBoc( + "b5ee9c72410241010008c7000109a06dac2c020102091036d61601030202091017d7840104060209101efe92013212020b4405f5e1004009050343bf084dd4db5a349ccfcf293baf5f5b626f4a130856b6613ded62877bfecc2536dc0a301b290203504007080343bf24d1ba51931fc51a9af90896c72638a6965587eed9cc6648bb69ab31a7dae44c0a0c330b0243bf17c9d39d78e8498a560800ddfb11dc48be1bc0edc2fbf90844eceb5ab4649610022614024bbf0847cbb01de39c3308edf1091131c7dedb780ca3e34d85bdc1a6ab4df16d79e9017d7840060a140106460600280201610c0d01064606003f03af7000000000000000000000000000000000000000000000000000000000000000000000000000f42439440e0c397a3b2ee3cbd81ea78021862f892a5a9e779d1fecd55236d6571eb5200000000000f424165a57c5f000140811100e020f0409017d784018110f2c009a27c89c4000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008272310a1de222ce584cb4e86613b11d31616e9eaa4ff9ee499f19b104cf71eb504f606c97d0dc8b63016a6afd67b2fe52cd0e02a3dcdf71f331cf1e8006ca8e51a30101a03f020b6501efe920101913024bbec8a2b54087ea747ec1d5ecc652b91406aa6f4c2f479843ebd290b26ad8043eca03dfd2400c181403af704f64c6afbff3dd10d8ba6707790ac9670d540f37a9448b0337baa6a5a92acac00000000000f424873b47eb527e2e6b9a73405d88f31477703ef31e5c4f2b8a2be754d66be0d60ff00000000000f424765a57c5f00074081716150205303024363500827216617de1e9f3a79e4c7d8a3a51ac0c8b54b6bbcd4f824c9f800aa2f36fee2672d4d2e789fd57af824d33228887af40bcfb492aebe39ec74d665726b6471454ab010160210106460600230343beccc243bc18876b43843800323ac0a349ba6ffaf4f87d8e7ba2404e280b7097d81420331a020161201b03b57ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffef00000000000f42450000000000000000000000000000000000000000000000000000000000000000000000000000000065a57c5f0003e665b94481e1d1c001f040901efe92001c0332dca2365b9de4000827290aec8965afabb16ebc3cb9b408ebae71b618d78788bc80d09843593cac98da490aec8965afabb16ebc3cb9b408ebae71b618d78788bc80d09843593cac98da40201e03b1f0101df3101064606003b0201db24220101482300ab29fe09ec98d5f7fe7ba21b174ce0ef21592ce1aa81e6f528916066f754d4b52559593ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbd01efe92000000000000001e8496cb4af8be40020120272501012026008be7f827b26357dff9ee886c5d3383bc8564b386aa079bd4a245819bdd5352d495656240e8cae6e880eb79a200000000000f424a65a57c5f00012195b1b1bcb081ddbdc9b190860101202800ab29fe09ec98d5f7fe7ba21b174ce0ef21592ce1aa81e6f528916066f754d4b52559593fc0000000000000000000000000000000000000000000000000000000000000001017d784000000000000001e8492cb4af8be40020766cb73bd302a03af704f64c6afbff3dd10d8ba6707790ac9670d540f37a9448b0337baa6a5a92acac00000000000f4247d59d160ea9c63d10edae2c76ada993f982915bc75f7bcc0fb81280820d15523200000000000f424165a57c5f00014082f2e2b020f0c0901c9c38018112d2c005bc00000000000000000000000012d452da449e50b8cf7dd27861f146122afe1b546bb8b70fc8216f0c614139f8e04009c402468bb8000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008272bf8229e6e684701825a6f8e1fb0f8155aba759d58b82e73b8405092874e23fa816617de1e9f3a79e4c7d8a3a51ac0c8b54b6bbcd4f824c9f800aa2f36fee26720101a031010c46060365b9de3100b959ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdf3fc13d931abeffcf744362e99c1de42b259c35503cdea5122c0cdeea9a96a4ab2b101c9c380006cb73bc00000000001e848ccb4af8be7fffffffc00244bfaeffebddf2ee4f04633ee2bbba628ae4e08b6e0043d11727286b0df248a2e17700403303af704f64c6afbff3dd10d8ba6707790ac9670d540f37a9448b0337baa6a5a92acac00000000000f42410000000000000000000000000000000000000000000000000000000000000000000000000000000065a57c5f0007408383734020520302436350061c000000000000600000000000719ae84f17b8f8b22026a975ff55f1ab19fde4a768744d2178dfa63bb533e107a40d03c04009e42664e625a0000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008272f1f67337526ee9890e137d5255f3150400e63d15dfe04b26653d275f2d0a6b04bf8229e6e684701825a6f8e1fb0f8155aba759d58b82e73b8405092874e23fa8010160390201db3c3a0101483b00ab29fe09ec98d5f7fe7ba21b174ce0ef21592ce1aa81e6f528916066f754d4b52559593ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbd01efe92000000000000001e8488cb4af8be400201203e3d010120400101203f00ab29fe09ec98d5f7fe7ba21b174ce0ef21592ce1aa81e6f528916066f754d4b52559593fc0000000000000000000000000000000000000000000000000000000000000001017d784000000000000001e8484cb4af8be40008be7f827b26357dff9ee886c5d3383bc8564b386aa079bd4a245819bdd5352d495656240e8cae6e880eb79a200000000000f424365a57c5f00012195b1b1bcb081ddbdc9b1908660bfedbd") + .endCell(); + log.info(c.print()); + log.info(c.toString()); + log.info("length {}", c.getBitLength()); + } + + @Test + public void testShouldDeserializeInsane() { + Cell c = + CellBuilder.beginCell() + .fromBoc( + "b5ee9c72e20201380001000028250000002400cc00ea01c402a603420374039603a503be03d8044804b8050405ac05ec065606a2076e078e0824084208600880089e08bc08da08f80916093009d80a180b0a0b7a0bc70bea0c0e0cba0cda0cfa0d1a0d380d560d740d900dac0dc80e6e0ef20f160f360f820fce0fee100e102e104c106c108c10ac10cc10ec1196121e12841306132413421360137c142014a014ae14bc14ca14d814e614f415021510151e152c153a1548155615a215b015be15cc15da15e815f6160416ba16c816d616e416f21700170e171c172a1738178417a817cc181918c418e419041951199d19bc19da1a271a731a901aae1afb1b471b621b7e1bcb1c171c321cd81d251da81df51e471e921eb21eff1f4b1f6a1f8a1fd71ff620142061208020cd20ec210c2159217821c52211223022da232723ae23fb246024ad24f9257a25c725e42631264e269b26b827052751276c2810285d28dc2929297529c12a0d2ad82b252b442b522b9f2bbc2c092c262c732c922cdf2cfc2d492d662db32dd02e1d2e3a2e872ea42ec22f702fbd3009309e30ac30ba31073114316131ad31ba31c832153222326f327c32c9331533223330337d33c933d633e4343134e634f435aa35b8366c3720372e377b378837d537e237f037fe384b385838a538b238ff390c3959396639b339c03a0d3a1a3a673a743ac13b383bec3c393c463c543ca13cae3cfb3d473d543da13dae3dbc3e093e163ecd3f823fcf3fda3fe0402e405640aa40b740fa410441e84200420e421d422c423c42e043884430443c444844ce458e4614462646ca478b4794481a483648e74988499449a04a264ae64b6c4b7e4c3e4cc44cd64d7b4de94ea84eaf4f354f464fea504b041011ef55aaffffff11000100020003000401a09bc7a98700000000040101485c0d0000000100ffffffff000000000000000062b2ca7f00001a5752b3ec0000001a5752b3ec042d722c2c0004ee1f01485c09014820d8c400000003000000000000002e00050211b8e48dfb4a0eebb004000600071a8a03482793f3b50aaf5c1948a7daea6509532374f902fe6abeff45f620cb8c99cb00130443feeb6ff454dd7b749d28f509060c2cc668963d39733cf0e844a2880964938114c1372a89491186e2103aabb88851625b18674a78929f3c357ca78e98824227016e016e000b000c1489b85d301a5e194c97f1c275d3ead4bd74c6e4f42bc74ff8ef930e594b8dd9887900084a33f6fda87b6952196d2ab3a76db9754f0792826c8eb9650220c062ca9afc456d18d616915f7809f0e2a9af47f9b741c0d1567a8cc87eb371ae985206197a819b2896f2c00109010a010b010c009800001a5752a4a9c401485c0c493505d505412a231566c8853321bb16a8d291b5c091b6b89f7fb0f4470293ca35028007ab3f46b45071071ce8368191ef3b54ec0db1ad04e1ad4b8e254c89e4022581f2cf4db6b621cfac0f967a6e06286bfd400800080008001d43b9aca00250775d8011954fc400080201200009000a0015be000003bcb355ab466ad00015bfffffffbcbd0efda563d0245b9023afe2ffffff1100ffffffff000000000000000001485c0c0000000162b2ca7c00001a5752a4a9c401485c0960000d000e000f0010245b9023afe2ffffff1100ffffffff000000000000000001485c0d0000000162b2ca7f00001a5752b3ec0401485c0960001d001e001f0020284801010190c062d880448c7c066d5e7f424d3c899b5b7618f97ecf7c54e38dd4c8b25a00013213eaca33f4cbadbd5448172264067fbb377adbe16d7c4681fb55312783f206756a318a5c723a464c78c863a17c0802276f4114c4c8edf27dd9eb88622de8445b07016d00118207cb3d36dad8873eb00023008422330000000000000000ffffffffffffffff81f2cf4db6b621cfa828008400222455cc26aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac23224a27d088a237e001100ac001200ae28480101553f5abf307236fc3eae3b9829943a1b4f895241d07cd2f7fb7106f492a37a4f000222bf000193a937010004ee1f6000034aea52acf0880000d29bdd9fc8200a4106c7d59f0086cde0d05cc99baaddf7a9c5b890aa805e8c96680523524fb4a5a99ff81257e3afd8721409a6a81f22735c0e33400aeb6e7f0a1a5185bb3a3c9deba278be001300142213c3c0000695d4a559e12000b100153201c47dca7c0afc1021a7f8ac40f39fac4e3a34441c180afd0667ef533f08c042258d60f2282e7cde376f0df9fd5ebcc5d8bb19faf6cc57bbbb662485cd76bdce510010000c20004800492211480000d2ba94ab3c2400b30016221162000034aea52acf0900b500172213c480000d2ba94ab3c24000b700182211400000d2ba94ab3c2400b9001922110000034aea52acf09000bb001a22110000034aea52acf09000bd001b2212cc00001a575295678400bf001c2211400000d2ba94ab3c2400c300c4011100000000000000005000213213b82c6f6878b537db3c16dcd5f01397865949762fc38f51cb6aff56594f1062f1edf7f2f7d1549f1d22aab06d9a81c9d49510c3fa6d09dba89fcddb0b8576e4aa016d00118207cb3d37031435feb00068008422330000000000000000ffffffffffffffff81f2cf4dc0c50d7fa828008400223455ee67dd6327a64269ce346e9b1568ef56241f1ba5179cb6d2ac85c5c18646ae12717905e49ef1945ed5b3e03bab93b347378306bc631945e0355ad7507cbada29001b0010cc26aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac23224a2820ffffb7e010e00ac00ad00ae006bb0400000000000000000a42e0680000d2ba95254e1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc028480101173ea53338a2f89f176ad2d6129a90977e8c56e325d959bdf92b7171d9070911000423130103e59e9b6d6c439f580024006a00842313010217dee532a6595718002500260084331392afc8f7cde2b08b147ca948f16cc575bbbd4d383188441e172a5cbc617e05249b737c913fe069b3ce1ce7d550cb95f27f4d428faee54cd295c65c5b9ad7e3ae0027000e01014dad03493b489b5800310032008422130100ca31e1e96b10bbc80027006e2213010058b525488168d908006f0028221301003e470bb61928028800290072221100e1caf7c460aa04680073002a221100e1c6b40db0b41708002b0076221100e11e73378043a2080077002c220f00c021469bdc5408002d007a2210680c021412935422007b002e220f00c021383dbc6da8002f007e219dbceaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa81804265fa43649cc3b15c891620f7db60a685fb7054bcc7b8817f05a7e9b73acdede2200b57bfa000034aea549538700302277cff5555555555555555555555555555555555555555555555555555555555555555407aec10e79c0000000000000695d4a92a711804265fa436495d0008000812313010069341ebbd1eac97800330034008422130100e478e48d695dd1e8008500352848010199c07995a55880a2a97e2d1c235a7dfb6b24666e40158c97f7fafb18707d9e01002228480101a40b78c2e39cf3658d455ad29ca1f2bf10cdb87248a8d293e625f4ff821d3ffe001922130100cae245aca13c29a8003600882213010094b93dc1fd640ba800370038221301007e0f065474a37188008b0039221100f6aa376d88c09a280042009f221301007e00c5c8df3ca988008d003a221301007e00c226bc22c348003b0090221301007dfeec4e6f29f348003c0092221301007dfeec4db9634c680093003d221350401f7fbb08ed8733f2003e009621a1bcd9999999999999999999999999999999999999999999999999999999999998200fbfdd8431e351e0e7f7559f2be451b78ede8267e7a8cb24cabd8236aa272459ca146db75357e502000034aea5495385003f227bcff333333333333333333333333333333333333333333333333333333333333333340756c14c3f00000000000000695d4a92a70e00fbfdd8431e351e16d0009800402355ec05b6c5a0ba9cc563f4263b03448b2038580c84db168a6ea499c5ee5d19ddadc8351566240da1dbc38a3b009a009b00412179a062b1fa1362b37a13000080001d81a245901c2c06426d8b4537524ce2f72e8ceed6e41a8ab31206d0ede1c51dc00ebe70af3ef33d8313797763b95f20009d221100f6a49bd9e38f3928004300a1221100ea59d8cb334c9c08004400a3221100ea59cff28ceadfc800a40045220f00c108ba716ce988004600a7219bbd62f8f7bea30f8ab5e9f16c3fb8642b118f56ed1bdc49600dbe5220c8b1af9e040c474f8074f1d14ce894ceb17ddbe1eb5416175db816dcb3d9b86ecacfe305fc3df0baaa80000d2ba95254e1c00047236fcff34517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf21881f480000000000000695d4a92a7110311d3e017f000a900aa00ab220120004a00e2220120005e00c8220120004b00e4220120004c004d220120004e00e822012000f90056220120004f00ea220120005000ec220120005100ee220120005200f0220120005300f2220120005400f4220120005500f628480101a54022f5edbf4beba0648deeb1ffc566c63567b51e34ccd918ab339bdedfec330001220120005700fc220120005800fe22012000ff00592201200101005a220120005b0104220120005c0106220120005d010800b1bd24ee866df51003f6b534d22c17f58175a943d247f628a0d355a187e86e73bd18acb16cc00000000000002a80000001dd3de5878000001dde15bcd058acb28f0000000000000021800000014bff7ab78000001718cb2138a0220120005f00ca22012000cb0060220120006100ce220120006200d0220120006300d222012000d30064220120006500d622012000d70066220120006700da284801015dc67661a1c1ef1294e875961eea55bea7054c7101bc975ed0aa009be971719a000323130103e59e9b818a1aff580069006a00842313010217dee546c430b718006b006c0084284801013c24d22fb5e19c4c445ed87fd2f21aab05a39914a685834b6a1d0cf004891430016b33134d60714c9ba1d20d9c30bf39735d0ad7bfca9eb3ced50edfdae92a4c3339ef4d25e774489adf29b089b2e31b7a68d28886f450600fefbb6f581b3a94423ffc070027000e01014dad035d591ffb5800820083008422130100ca31e1e96b10bbc8006d006e2213010058b525488168d908006f007028480101256e458a2d80eecd799b387aa5e91b156bc583f9f095f0fcea7b2d73cb3d726e00262848010107983f5e2ef514d990c22499abec1ccb4fd222f7489b7febb2044fe24e39318d001a221301003e470bb61928028800710072221100e1caf7c460aa04680073007428480101d405a7172eafa75f0e67e1b0f52d000222f4399c5d7dda059af11c73faf135a300182848010189afd21725efab9748b8b6ef6dcfd892c9f647a939c73831d4f1dbc786b9ec690016221100e1c6b40db0b4170800750076221100e11e73378043a20800770078284801012b525231768abd4f2fc0464b8e5be011db5ebdb3a1ed6d61eebf186e8dc197ba001528480101b81fe7658c95d0f97eabe671d2b147f2da908bd4813119d475886872068353200014220f00c021469bdc54080079007a2210680c021412935422007b007c284801018916fffc4697fa71347a36028c9c0ab1b54bf2c278f9171f7837101f990665f2001128480101a248b81f22333cc28f6b6744e4298aefcd9b6f2dc5d7c99e1da1b28c37f3aa0c0007220f00c021383dbc6da8007d007e219dbceaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa81804265fa43649c9d338c13843e706c68e2455ed70bbf93820f28a394eec0b616e855fce8e6cac000034aea567d807007f284801010143b3d2dd671b2559543155e003f847022e510b3a57afabbca05d4069c327ef000d2277cff5555555555555555555555555555555555555555555555555555555555555555407aec10e79c0000000000000695d4acfb011804265fa436495d0008000812848010164a43970f2007a1da6d6fc81773cc095d1cc270e81359e471f3b03469abeb7b5000c214900000027cbb9d1062954439a83a91f27835fb9d2e3e798910356650c3c493c94623464684000ac28480101afccd0b5d74a6fad14fcb8652b14eea3d3d7ad0226c0961aa9992a1f0c2997c1002322130100e478e4a1873531e80085008628480101a5a7d24057d8643b2527709d986cda3846adcb3eddc32d28ec21f69e17dbaaef0001284801016161938bf6cbbbea618b3c71572f00d9392090c9f15e70d1ef9080503b42229c002322130100cae245c0bf1389a8008700882213010094b93dd61b3b6ba80089008a28480101b4d986be6da4a385ebc4d75e7b6864ddae73e6e6431f711cbb3208dfb35945750024221301007e0f0668927ad188008b008c221100f6aa376d88c09a28009e009f284801012234afc4f9aa54d36f371ab851ada0446bbab533a15161ca6f4afd77d69d89520012221301007e00c5dcfd140988008d008e2848010103f584b35917a807e8a2ec65376c8ed2c6ccecf273ba8cb55dbacfe29a84a6140013221301007e00c23ad9fa2348008f0090221301007dfeec628d0153480091009228480101735d9d54218cf8454bd30b70a53ae0de4219178b78f457b844f50dc11b5719f00013221301007dfeec61d73aac6800930094284801017cc50a2d61f5f6979db4641a9451edade1fb234111081a83333a2b03ce9dc373000a2848010110cac8bd77fa246c2bc95d0269759b612312bbc0438ed5eb7dd53116e55e9020000b221350401f7fbb0df4fd0bf20095009621a1bcd9999999999999999999999999999999999999999999999999999999999998200fbfdd86b59e3de15e7c728be36b6cb9aa8d1663f3d4c1e962ab20459e6e56ae211a233bc1e24f52000034aea567d80500972848010150725eee52e86432f846698a08ac153a67bc9ad9c160130af907c3bef05f29480007227bcff333333333333333333333333333333333333333333333333333333333333333340756c14c3f00000000000000695d4acfb00e00fbfdd86b59e3de16d000980099284801016217f872c99fafcb870f2c11a362f59339be95095f70d00b9cff2f6dcd69d3dd000e2355ec05b6c5a0ba9cc563f4263b03448b2038580c84db168a6ea499c5ee5d19ddadc8351566240da1dbc38a3b009a009b009c28480101fb16d1ca45ecb8d4d1f6b1ac903c630cc06f78334bc9b84bf30585e9422cb887000b284801018f1bd34960aa509ff15ef8c648fdcb942bb7a6c14bda5d4988792ce1c7800bee00062179a062b1fa1362b37a13000080001d81a245901c2c06426d8b4537524ce2f72e8ceed6e41a8ab31206d0ede1c51dc00ebe70af3ef33d831379c7db16df20009d28480101e9988188b13457c31092fcc241e6b801ab7dc39b30a0923557a193630fef257f000a221100f6a49bd9e38f392800a000a128480101c6100af2020b8ed627f48ec736f2cfa52e095b513479105a028f40e152c9586f0016221100ea59d8cb334c9c0800a200a3284801011e20584a9cf50091fb4dddfe4d2e98f8c879438cc843e24314604b44cb6f78580012221100ea59cff28ceadfc800a400a52848010141d3f8101f423d32b2cdb23d98d0f34f83db175e427605500093f4a31cd8df03000b28480101e2bc337ece7f3af5171f3265f44c612fc2fcba87f4b4563dc7fdc3285dd6a44d0008220f00c108ba716ce98800a600a7219bbd62f8f7bea30f8ab5e9f16c3fb8642b118f56ed1bdc49600dbe5220c8b1af9e040c474f800b0df7369fde2be70ee4d2e84a552cab4b035685314de3d2e8e12b8d25aa27ae80000d2ba959f601c000a8284801018e634c5cb159b3914109244a95171c97fe56c7ad67ec709cce94bb067893af680007236fcff34517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf21881f480000000000000695d4acfb0110311d3e017f000a900aa00ab284801017269fb9feb45d719ebdbc3b0816b987bab06f43378dc84dc84d55727905482140002004811fd096c000000000000000000000000000000000000000000000000000000000000000028480101986c49971b96062e1fba4410e27249c8d73b0a9380f7ffd44640167e68b215e8000328480101b4ff459f14a389ff7d6ea967ec8d5329f3cff84a787a7c1fcb6e3d447b6175e5001022bf000193a937010004ee1f6000034aea549538880000d29bdd9fc8200a4106c7d59f0086cde0d05cc99baaddf7a9c5b890aa805e8c96680523524fb4a5a99ff81257e3afd8721409a6a81f22735c0e33400aeb6e7f0a1a5185bb3a3c9deba278be00af00b028480101b20e36a3b36a4cdee601106c642e90718b0a58daf200753dbb3189f956b494b600012213c3c0000695d4a92a712000b100b222012000c500c628480101258d602eaa21d621634dcf86692aeae308ff3cf888f3edafc6a5b21848d732f900182211480000d2ba95254e2400b300b4284801014b01ebcf5425735461aa8b83bae89e70fa21e95d2ee85e57b05dad26c1d6d5300016221162000034aea549538900b500b6284801019523e298bdc5f691343d880493b8a6451f3f941c985a7c4a167ba0e1cdb4599600132213c480000d2ba95254e24000b700b82848010137844b3a6262ee12ef028d6b8968b779c5be75d93a7dc1838aba9408a360ea42000e2211400000d2ba95254e2400b900ba28480101ce05363b2c4d123e6af0a2c3edbe06e05e4b55117180062e69624e00f64ae2a7000c22110000034aea5495389000bb00bc28480101aad2366c8dcad53c429dfbea0cd1c479cc6b989ef981314b1382fd58de7c8afd000b22110000034aea5495389000bd00be284801015af875e56b2c21860165b66c58883a203401027a269c372667df9eb27b476259000a2212cc00001a5752a4a9c400bf00c0284801013eb4f392dec5652b5e530a0922b5533c816263d761c0775349d4265cd85bd761000322110000034aea5495389000c100c222110000034aea52acf09000c300c400a9d00000695d4a92a710000034aea54953880290b818926a0baa0a8254462acd910a6643762d51a5236b81236d713eff61e88e0527946a05000f567e8d68a0e20e39d06d0323de76a9d81b635a09c35a971c4a9913c9284801016e527b5263548e810db4a6e4a1f87c5c20d1c7859c8a5e2113127c954400e7b900012848010192f515d5126f2a2fe83d0204780eb95ac49143dae652a6a618f650997621e09a00013201d970752cf49fb39f7ea882f429ef6a8a5ce3eaf9ff4d35bfba6d93ffc9e2a7368180f9da67bd40c08ccea6759238e3e79b631d22aa1dc395bbcec337be6d4e84000f000c2000e100e222012000c700c822012000c900ca284801012a31c24fa32c257e4912fc641c19d5679a5359fb89020b7fe030e3b104be570f000e22012000cb00cc28480101f8b1119a3146337e09b6a8bbd36f93c78f448ea18e0591af0a3726033c7b5345000c2848010136a19e11f370f7b9cf36d83e0cdb68ea6f02ebe02487e3a5ca264a2baa6cd0d8000c22012000cd00ce22012000cf00d0284801015fb934835d63076694fbd0ca2191f6219a2017bfee8370008d48729374463b93000b22012000d100d228480101d98bd6122c9ac0cd3bb56dd7127ca09ede8c606fcb15de38baa4b47f7fe51f04000922012000d300d4284801011bd2caf8f41ad27d29c9c0d34e01bc0457050b3e5cce1754ec06a5fef2e688af000828480101d3073a3cbcbb4a650ca94a719590f8460e5f51d6081fcea01e7e51cfbc60a444000622012000d500d622012000d700d828480101ab9eb8899afa5c8bb9368d94781cf3ebb2eac7fb017a2b6133f9bb7b0e5d7b85000528480101664d4a2f536f0763f76857ceb94de20b4fad7e80b85675b3d02cf79a319b467e000122012000d900da02012000db00dc284801010f0ee7d20301abe555b4a76a6ada745283de3664ecb09ba794fec4d44db79b68000300b1bd1148769c03366e79fc451b06179e791641db92df408fd46e6ffe7ad24d90a90000000000000000000000000000000000000000000000000000000018a8fe848000000000000014000000006740cdc84000000b659904b9a002012000dd00de00b1bce1814fe876c4b4657ef4585f2f9b9158201e2fc77698c43e68104b88fe4ab2314e7cf70000000000000066800000039c368aef00000040a8c4d343b14e7b67800000000000003b000000040b2e294300000028134825e0c002015800df00e000afbc6d1a11a99e030e7005cac69de1a3cdeea9807743355fbf293f897e485ac868c54bf1b80000000000000124000000091627b10a000000bd5670281ec54bf2a8000000000000011400000006eaf842ee000000a8472576d100afbc6f013e1c5535e8ff36e8381a2acf51990fd66e35d30a40c32f50336512de48c56594fe00000000000001440000000ce66b410a000000d9c852602cc565938800000000000000d40000000de9bcb146000000935ab614cd22012000e300e4284801014356834a429921990e0c978c594d3d7734b7cd96dd66c057aa786ccf4f5a258c000e22012000e500e62848010134a3bc4b6c672bb70328222747df9434117f6ee5953dc9447b945d42862c585f000c22012000e700e822012000f900fa22012000e900ea284801016b54a1df1176e4608f655e63cf51ff3deec889dcf9229cceb100c32a12d3288e000922012000eb00ec284801015d23a19db6638756e655885d66767ab5ca9c7044b8d6263da018629630bda2a5000822012000ed00ee284801014e72d9d9406765832f323a591918a7b8cdb1acdbcbdeab3f2bcbc4c93fbc1f99000922012000ef00f02848010138b4953e5411a45c37899ce1936780cec049051f53d3a16bad52de7c7609476e000622012000f100f228480101a9cf62c6624684d83857a4381d9d525efe2e2d5bafd839d9893f80beeaa43f70000522012000f300f428480101d1a07de28968f21c0c3cfe0e69605731ae68b71969d27dd270f99b4079019904000222012000f500f6284801018d455e04c00fba1289866da39c0793758c8d6a4e41ca2dd5ec2c03c76df76c42000302014800f700f82848010122863015f2ff93c8dfe54f980440d8b3b2bd946770d126f32325fc9c8e37cb2e00020073de48c56594fe000000000290b818000004b380fb4ef8000090e500f4af24c56594fe00000000153ae540000004efd6476f22000098db0ac6ce1f00b0bc914560076a5a3e2f68770608073c7920cd095fd22f6624cdc5631150352c9400000000000000000000000000000000000000000000000000000000629df4ce000000000000004000000004a9d9195a0000002b5c8e819328480101d2fc779057e6ebb9d8413f029999ad6426bdc42b841578ba4f1302565b3bb3b8000a22012000fb00fc22012000fd00fe2848010166827a7a38f195b34597175fc019e4dc80b6f714f0b51a2369270417305747e1000922012000ff010028480101cef4f4863fe525820f12b7c79bbc2276d0fdb7e300c55d70d809bfdef1e801f5000728480101c76ad89ed6929dfcdcbaaa4f5720981c659c02b305514971803760369f7017650006220120010101022848010138e8cca37bb83b168adc87a7037092d90c734af074cace4ae828e0cf82b67b30000422012001030104220120010501062848010150d30f1a3fd6f709f0627934b2b31be081dc25bc52b51a353f850efa09ad224d00022201200107010800b1bd635fefc47229e53988915685933558fd7303875055c5949d871dc2688df796800000000000000000000000000000000000000000000000000000000c54be8f6000000000000007e0000000e610f41dc000000593a932aa9000b1bd24ee866df51003f6b534d22c17f58175a943d247f628a0d355a187e86e73bd18acb16cc00000000000002a80000001dd3de5878000001dde15bcd058acb29fc000000000000021c0000001814ffc698000001752c06e7e202848010160ce52c8bd8ed7f87a7643812f7690467a604fcff9ba1811d065a34a0202d78f000201038020010d00010211011366ea62c6b62574b18990480a15bd04daf2d4d5c8e3413a8f62b0ff533b259b00078201150317cca5687735940043b9aca004010e010f01100247a00d9b55c39995181e04934d61a2baf0f5aa35a4e059bb4c55f309227aee336c95200610011401210103d0400111003fb000000000400000000000000021dcd650010ee6b280087735940043b9aca004010150011301db500cc320a00a42e0680000d2ba95254e000000d2ba95254e0850d8a46888759f13cd17310cd46d6e9e821d494944c72f183259690def72a1a5a15278d7e6ad8df707446b0df93af44f8aca68c8a6c286121567c529e8dd7088800027779c00000000000000000a42e04b159653da0112001343b9aca0021dcd6500200201610114012101064606000125020340400116011702037604011801190297bf955555555555555555555555555555555555555555555555555555555555555502aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaad000000695d4acfb00c1013201340397beb33333333333333333333333333333333333333333333333333333333333333029999999999999999999999999999999999999999999999999999999999999999cf80000695d4acfb00040011a011b011c0397be8517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf029a28be3defa8c3e2ad7a7c5b0fee190ac463d5bb46f71258036f9488322c6be7cf80000695d4acfb0004001270128012901035040011d0103404001210082724a765bd03de7e557d03d203239641e4570953914b82a806fdbc2fa10f8c5e3b7e1cb96b8a440f43d5cc8d5334f00711345b647d43e5837cf367741c70934d23703af7333333333333333333333333333333333333333333333333333333333333333300001a5752b3ec0173fbaacf95f228dbc76f4133f3d46592655ec11b5513922ce50a36dba9abf28100001a5752a4a9c262b2ca7f00014080133011e011f0082724a765bd03de7e557d03d203239641e4570953914b82a806fdbc2fa10f8c5e3b78d942e903175e0ffe9857660057e1e7e904397d1bd95e61a0dc318aaabb1b31f02052030240120013700a0431b9004c4b4000000000000000000960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003af7333333333333333333333333333333333333333333333333333333333333333300001a5752b3ec0246660377de4bc319a5038b872892ad701fa6a7f2783ecefd07a68cb4fe32f8b700001a5752b3ec0162b2ca7f00014080122012301240101a001250082728d942e903175e0ffe9857660057e1e7e904397d1bd95e61a0dc318aaabb1b31fe1cb96b8a440f43d5cc8d5334f00711345b647d43e5837cf367741c70934d237020f0409283baec018110126013700ab69fe00000000000000000000000000000000000000000000000000000000000000013fccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd283baec0000000034aea567d800c56594fe40009e42614c107ac00000000000000000640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001035040012a01035040012d008272f46adf2640fb8c30d7d053c9c4084f8daeda7399e261dd404d1578691fcb5bd75f4f3be7c22b3f846e0fc1aa8c5ccb4ed9a7e5acc35369f076448359df9b18eb03af734517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf00001a5752b3ec01e9e3a299d1299d62fbb7c3d6a82c2ebb702db967b370dd959fc60bf87be1755500001a5752a4a9c362b2ca7f00014080133012b012c008272f46adf2640fb8c30d7d053c9c4084f8daeda7399e261dd404d1578691fcb5bd7b43acc176be3014d5645fa082b16fe872be1c3b8428621bc03e49a5bc0cf7db202052030340130013103af734517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf00001a5752b3ec0372f7b0548efa5c07fc58c3051d80c9f650039701e834559eabe556240894c83400001a5752b3ec0162b2ca7f00014080133012e012f008272b43acc176be3014d5645fa082b16fe872be1c3b8428621bc03e49a5bc0cf7db25f4f3be7c22b3f846e0fc1aa8c5ccb4ed9a7e5acc35369f076448359df9b18eb02053030340130013100a042665004c4b400000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069600000009600000004000600000000000519ae84f17b8f8b22026a975ff55f1ab19fde4a768744d2178dfa63bb533e107a409026bc03af7555555555555555555555555555555555555555555555555555555555555555500001a5752b3ec03e61d8ae448b107bedb05342fdb82a5e63dc40bf82d3f4db9d66f6f11005abdfd00001a5752a4a9c362b2ca7f0001408013301340135000120008272010f24a4cdf5d7c0f8497739ff731e5175cd3f10069c838b4445caf821c4cf4e6ca0ffac88c5927e1becceb3949e8aa3388a1cd3e5405413900cce63ed93f19902053030240136013700a041297004c4b40000000000000000002e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005bc00000000000000000000000012d452da449e50b8cf7dd27861f146122afe1b546bb8b70fc8216f0c614139f8e04a5134191") + .endCell(); + + String bocHexWithCrcAndIndex = c.toHex(true, true); + + log.info("hex {}", bocHexWithCrcAndIndex); + assertThat(bocHexWithCrcAndIndex) + .isEqualTo( + "b5ee9c72c20201380001000025e3000000120066007500c0010f015d0176018701bf01f701fd020002050219022002460256027602ab02b802c802e8031d0347034f03550377037c0389039603a803ce03f4045a048004b804ca05300538058a05fc06030615063b064b065206640674067b06cf0723078307c607d207e407f4081a082908300837084908590868086f0876087c088208c508cb08d10914091d092f093f094f0975099b09aa09b109d709de0a040a2a0a3a0a4a0a590a600a670ac70b270b870bd90bff0c250c4b0c5b0c810c910cb70cc70cce0cf40cfb0d210d310d410d510d580d5f0da20dab0dee0df70e3a0e430e530e790e880eae0ed40ee30eea0ef10f170f1e0f2e0f3d0f4c0f530f5a0f610fb31005103c104c105b1081109010b610c510cc10f21118111f1126114c115c116b117a118911901197119e11c411d411e312091218123e12641273127a12a012a712cd12d412fa130a131913281337133e1345134c13721382139113b713dd13eb141114201427144d1454147a148114a714b714c614d414e314ea14f114f81508152e153d15631571159715bd15cc15d315f9161f1626164c1653166316721680168f1696169d16a416b416da1700170e173417421749176f1795179c17a317c917d917e717f51804185b186218691870189618a618f8191e19711997199e19c419cb19f11a171a1e1a2e1a801ad31ada1ae11ae81b3d1b631ba31be51bec1c121c191c741c9a1cc01d151d551d971d9e1da51dac1df01e161e3c1e621e881eb11ed71efd1f581f7e1fc21fc92024207f208620ac20df2112214e21a82203220a22302256229722d82332238c23b223d823df243f24422468248e24b424b924fc250a256225b325e3041011ef55aaffffff11000100020003000401a09bc7a98700000000040101485c0d0000000100ffffffff000000000000000062b2ca7f00001a5752b3ec0000001a5752b3ec042d722c2c0004ee1f01485c09014820d8c400000003000000000000002e00050211b8e48dfb4a0eebb004000600070a8a0443feeb6ff454dd7b749d28f509060c2cc668963d39733cf0e844a2880964938114c1372a89491186e2103aabb88851625b18674a78929f3c357ca78e98824227016e016e0008000904894a33f6fda87b6952196d2ab3a76db9754f0792826c8eb9650220c062ca9afc456d18d616915f7809f0e2a9af47f9b741c0d1567a8cc87eb371ae985206197a819b2896f2c0000a000b000c000d009800001a5752a4a9c401485c0c493505d505412a231566c8853321bb16a8d291b5c091b6b89f7fb0f4470293ca35028007ab3f46b45071071ce8368191ef3b54ec0db1ad04e1ad4b8e254c89e4022581f2cf4db6b621cfac0f967a6e06286bfd4008000e000e001d43b9aca00250775d8011954fc40008245b9023afe2ffffff1100ffffffff000000000000000001485c0c0000000162b2ca7c00001a5752a4a9c401485c0960000f001000110012245b9023afe2ffffff1100ffffffff000000000000000001485c0d0000000162b2ca7f00001a5752b3ec0401485c0960001300140015001601038020001700010201018200180317cca5687735940043b9aca0040019001a001b020120001c001d284801010190c062d880448c7c066d5e7f424d3c899b5b7618f97ecf7c54e38dd4c8b25a000122138207cb3d36dad8873eb0001e012b22330000000000000000ffffffffffffffff81f2cf4db6b621cfa828012b001f2455cc26aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac23224a27d088a237e00200131002100220111000000000000000050002322138207cb3d37031435feb00024012b22330000000000000000ffffffffffffffff81f2cf4dc0c50d7fa828012b001f2455cc26aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac23224a2820ffffb7e00190131002500220247a00d9b55c39995181e04934d61a2baf0f5aa35a4e059bb4c55f309227aee336c95200610012c012d02034040002600270103d0400028003fb000000000400000000000000021dcd650010ee6b280087735940043b9aca00401015000290015be000003bcb355ab466ad00015bfffffffbcbd0efda563d023130103e59e9b6d6c439f58002a002b012b28480101173ea53338a2f89f176ad2d6129a90977e8c56e325d959bdf92b7171d9070911000428480101553f5abf307236fc3eae3b9829943a1b4f895241d07cd2f7fb7106f492a37a4f000222bf000193a937010004ee1f6000034aea52acf0880000d29bdd9fc8200a4106c7d59f0086cde0d05cc99baaddf7a9c5b890aa805e8c96680523524fb4a5a99ff81257e3afd8721409a6a81f22735c0e33400aeb6e7f0a1a5185bb3a3c9deba278be002c002d28480101b20e36a3b36a4cdee601106c642e90718b0a58daf200753dbb3189f956b494b60001006bb0400000000000000000a42e0680000d2ba95254e1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc023130103e59e9b818a1aff58002e002b012b22bf000193a937010004ee1f6000034aea549538880000d29bdd9fc8200a4106c7d59f0086cde0d05cc99baaddf7a9c5b890aa805e8c96680523524fb4a5a99ff81257e3afd8721409a6a81f22735c0e33400aeb6e7f0a1a5185bb3a3c9deba278be002f003002037604003100320297bf955555555555555555555555555555555555555555555555555555555555555502aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaad000000695d4acfb00c10033003401db500cc320a00a42e0680000d2ba95254e000000d2ba95254e0850d8a46888759f13cd17310cd46d6e9e821d494944c72f183259690def72a1a5a15278d7e6ad8df707446b0df93af44f8aca68c8a6c286121567c529e8dd7088800027779c00000000000000000a42e04b159653da0035020161012c012d2313010217dee532a659571800360037012b284801013c24d22fb5e19c4c445ed87fd2f21aab05a39914a685834b6a1d0cf004891430016b2213c3c0000695d4a559e12000380039220120003a003b2313010217dee546c430b718003c003d012b2213c3c0000695d4a92a71200038003e220120003f00400397beb33333333333333333333333333333333333333333333333333333333333333029999999999999999999999999999999999999999999999999999999999999999cf80000695d4acfb000400041004200430397be8517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf029a28be3defa8c3e2ad7a7c5b0fee190ac463d5bb46f71258036f9488322c6be7cf80000695d4acfb0004000440045004603af7555555555555555555555555555555555555555555555555555555555555555500001a5752b3ec03e61d8ae448b107bedb05342fdb82a5e63dc40bf82d3f4db9d66f6f11005abdfd00001a5752a4a9c362b2ca7f0001408012e00340047008272010f24a4cdf5d7c0f8497739ff731e5175cd3f10069c838b4445caf821c4cf4e6ca0ffac88c5927e1becceb3949e8aa3388a1cd3e5405413900cce63ed93f199001343b9aca0021dcd650020231301014dad03493b489b5800480049012b22130100ca31e1e96b10bbc8004a004b28480101258d602eaa21d621634dcf86692aeae308ff3cf888f3edafc6a5b21848d732f900182211480000d2ba94ab3c24004c004d220120004e004f22012000500051231301014dad035d591ffb5800520053012b22130100ca31e1e96b10bbc80054004b2211480000d2ba95254e24004c00552201200056004f2201200057005101035040005801034040012d0082724a765bd03de7e557d03d203239641e4570953914b82a806fdbc2fa10f8c5e3b7e1cb96b8a440f43d5cc8d5334f00711345b647d43e5837cf367741c70934d23701035040005901035040005a008272f46adf2640fb8c30d7d053c9c4084f8daeda7399e261dd404d1578691fcb5bd75f4f3be7c22b3f846e0fc1aa8c5ccb4ed9a7e5acc35369f076448359df9b18eb0205303024005b01372313010069341ebbd1eac978005c005d012b22130100e478e48d695dd1e8005e005f2213010058b525488168d9080060006128480101256e458a2d80eecd799b387aa5e91b156bc583f9f095f0fcea7b2d73cb3d726e0026284801014b01ebcf5425735461aa8b83bae89e70fa21e95d2ee85e57b05dad26c1d6d5300016221162000034aea52acf090062006322012000640065284801014356834a429921990e0c978c594d3d7734b7cd96dd66c057aa786ccf4f5a258c000e22012000660067284801012a31c24fa32c257e4912fc641c19d5679a5359fb89020b7fe030e3b104be570f000e28480101afccd0b5d74a6fad14fcb8652b14eea3d3d7ad0226c0961aa9992a1f0c2997c1002322130100e478e4a1873531e8005e00682213010058b525488168d90800600069221162000034aea54953890062006a220120006b0065220120006c006703af7333333333333333333333333333333333333333333333333333333333333333300001a5752b3ec0173fbaacf95f228dbc76f4133f3d46592655ec11b5513922ce50a36dba9abf28100001a5752a4a9c262b2ca7f0001408012e006d006e03af734517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf00001a5752b3ec01e9e3a299d1299d62fbb7c3d6a82c2ebb702db967b370dd959fc60bf87be1755500001a5752a4a9c362b2ca7f0001408012e006f007003af734517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf00001a5752b3ec0372f7b0548efa5c07fc58c3051d80c9f650039701e834559eabe556240894c83400001a5752b3ec0162b2ca7f0001408012e0071007200a041297004c4b40000000000000000002e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002848010199c07995a55880a2a97e2d1c235a7dfb6b24666e40158c97f7fafb18707d9e01002228480101a40b78c2e39cf3658d455ad29ca1f2bf10cdb87248a8d293e625f4ff821d3ffe0019284801016161938bf6cbbbea618b3c71572f00d9392090c9f15e70d1ef9080503b42229c002322130100cae245aca13c29a8007300742848010107983f5e2ef514d990c22499abec1ccb4fd222f7489b7febb2044fe24e39318d001a221301003e470bb61928028800750076284801019523e298bdc5f691343d880493b8a6451f3f941c985a7c4a167ba0e1cdb4599600132213c480000d2ba94ab3c240007700782201200079007a2848010134a3bc4b6c672bb70328222747df9434117f6ee5953dc9447b945d42862c585f000c220120007b007c28480101f8b1119a3146337e09b6a8bbd36f93c78f448ea18e0591af0a3726033c7b5345000c22130100cae245c0bf1389a8007d0074221301003e470bb619280288007e00762213c480000d2ba95254e2400077007f22012000800081220120007b00820082724a765bd03de7e557d03d203239641e4570953914b82a806fdbc2fa10f8c5e3b78d942e903175e0ffe9857660057e1e7e904397d1bd95e61a0dc318aaabb1b31f020520302400830137008272f46adf2640fb8c30d7d053c9c4084f8daeda7399e261dd404d1578691fcb5bd7b43acc176be3014d5645fa082b16fe872be1c3b8428621bc03e49a5bc0cf7db2020520303400840085008272b43acc176be3014d5645fa082b16fe872be1c3b8428621bc03e49a5bc0cf7db25f4f3be7c22b3f846e0fc1aa8c5ccb4ed9a7e5acc35369f076448359df9b18eb0205303034008400852213010094b93dc1fd640ba80086008728480101b4d986be6da4a385ebc4d75e7b6864ddae73e6e6431f711cbb3208dfb35945750024221100e1caf7c460aa04680088008928480101d405a7172eafa75f0e67e1b0f52d000222f4399c5d7dda059af11c73faf135a300182848010137844b3a6262ee12ef028d6b8968b779c5be75d93a7dc1838aba9408a360ea42000e2211400000d2ba94ab3c24008a008b220120008c008d220120008e008f2848010136a19e11f370f7b9cf36d83e0cdb68ea6f02ebe02487e3a5ca264a2baa6cd0d8000c220120009000912213010094b93dd61b3b6ba800920093221100e1caf7c460aa0468008800942211400000d2ba95254e24008a00952201200096008d220120008e00972201200098009100a0431b9004c4b4000000000000000000960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a042665004c4b400000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069600000009600000004000600000000000519ae84f17b8f8b22026a975ff55f1ab19fde4a768744d2178dfa63bb533e107a409026bc221301007e0f065474a371880099009a221100f6aa376d88c09a28009b009c2848010189afd21725efab9748b8b6ef6dcfd892c9f647a939c73831d4f1dbc786b9ec690016221100e1c6b40db0b41708009d009e28480101ce05363b2c4d123e6af0a2c3edbe06e05e4b55117180062e69624e00f64ae2a7000c22110000034aea52acf090009f00a022012000a100a2284801016b54a1df1176e4608f655e63cf51ff3deec889dcf9229cceb100c32a12d3288e000928480101d2fc779057e6ebb9d8413f029999ad6426bdc42b841578ba4f1302565b3bb3b8000a22012000a300a422012000a500a6284801015fb934835d63076694fbd0ca2191f6219a2017bfee8370008d48729374463b93000b221301007e0f0668927ad188009900a7221100f6aa376d88c09a2800a8009c221100e1c6b40db0b4170800a9009e22110000034aea54953890009f00aa22012000ab00a222012000ac00a422012000ad00a6284801012234afc4f9aa54d36f371ab851ada0446bbab533a15161ca6f4afd77d69d89520012221301007e00c5c8df3ca98800ae00af221100f6a49bd9e38f392800b000b128480101c6100af2020b8ed627f48ec736f2cfa52e095b513479105a028f40e152c9586f0016221100e11e73378043a20800b200b3284801012b525231768abd4f2fc0464b8e5be011db5ebdb3a1ed6d61eebf186e8dc197ba001528480101aad2366c8dcad53c429dfbea0cd1c479cc6b989ef981314b1382fd58de7c8afd000b22110000034aea52acf09000b400b522012000b600b7284801015d23a19db6638756e655885d66767ab5ca9c7044b8d6263da018629630bda2a5000822012000b800b92848010166827a7a38f195b34597175fc019e4dc80b6f714f0b51a2369270417305747e1000922012000ba00bb28480101d98bd6122c9ac0cd3bb56dd7127ca09ede8c606fcb15de38baa4b47f7fe51f040009221301007e00c5dcfd14098800ae00bc221100f6a49bd9e38f392800bd00b1221100e11e73378043a20800b200be22110000034aea5495389000b400bf22012000c000b722012000c100b922012000c200bb2848010103f584b35917a807e8a2ec65376c8ed2c6ccecf273ba8cb55dbacfe29a84a6140013221301007e00c226bc22c34800c300c4221100ea59d8cb334c9c0800c500c6284801011e20584a9cf50091fb4dddfe4d2e98f8c879438cc843e24314604b44cb6f7858001228480101b81fe7658c95d0f97eabe671d2b147f2da908bd4813119d475886872068353200014220f00c021469bdc540800c700c8284801015af875e56b2c21860165b66c58883a203401027a269c372667df9eb27b476259000a2212cc00001a575295678400c900ca22012000cb00cc284801014e72d9d9406765832f323a591918a7b8cdb1acdbcbdeab3f2bcbc4c93fbc1f99000922012000cd00ce28480101cef4f4863fe525820f12b7c79bbc2276d0fdb7e300c55d70d809bfdef1e801f5000722012000cf00d0284801011bd2caf8f41ad27d29c9c0d34e01bc0457050b3e5cce1754ec06a5fef2e688af0008221301007e00c23ad9fa234800d100c4221100ea59d8cb334c9c0800d200c6220f00c021469bdc540800d300c82212cc00001a5752a4a9c400c900d422012000d500cc22012000cd00d622012000cf00d7221301007dfeec4e6f29f34800d800d928480101735d9d54218cf8454bd30b70a53ae0de4219178b78f457b844f50dc11b5719f00013221100ea59cff28ceadfc800da00db2848010141d3f8101f423d32b2cdb23d98d0f34f83db175e427605500093f4a31cd8df03000b2210680c02141293542200dc00dd284801018916fffc4697fa71347a36028c9c0ab1b54bf2c278f9171f7837101f990665f20011284801013eb4f392dec5652b5e530a0922b5533c816263d761c0775349d4265cd85bd76100032211400000d2ba94ab3c24012f013022012000de00df2848010138b4953e5411a45c37899ce1936780cec049051f53d3a16bad52de7c7609476e000628480101c76ad89ed6929dfcdcbaaa4f5720981c659c02b305514971803760369f701765000622012000e000e128480101d3073a3cbcbb4a650ca94a719590f8460e5f51d6081fcea01e7e51cfbc60a444000622012000e200e3221301007dfeec628d01534800e400d9221100ea59cff28ceadfc800da00e52210680c02141293542200dc00e622110000034aea5495389000e700e822012000e900df22012000e000ea22012000eb00e3221301007dfeec4db9634c6800ec00ed284801017cc50a2d61f5f6979db4641a9451edade1fb234111081a83333a2b03ce9dc373000a28480101e2bc337ece7f3af5171f3265f44c612fc2fcba87f4b4563dc7fdc3285dd6a44d0008220f00c108ba716ce98800ee00ef28480101a248b81f22333cc28f6b6744e4298aefcd9b6f2dc5d7c99e1da1b28c37f3aa0c0007220f00c021383dbc6da800f000f122012000f200f328480101a9cf62c6624684d83857a4381d9d525efe2e2d5bafd839d9893f80beeaa43f7000052848010138e8cca37bb83b168adc87a7037092d90c734af074cace4ae828e0cf82b67b30000422012000f400f522012000f600f728480101ab9eb8899afa5c8bb9368d94781cf3ebb2eac7fb017a2b6133f9bb7b0e5d7b850005221301007dfeec61d73aac6800ec00f8220f00c108ba716ce98800f900ef220f00c021383dbc6da800fa00f122110000034aea52acf090012f013000a9d00000695d4a92a710000034aea54953880290b818926a0baa0a8254462acd910a6643762d51a5236b81236d713eff61e88e0527946a05000f567e8d68a0e20e39d06d0323de76a9d81b635a09c35a971c4a9913c922012000fb00f322012000fc00f522012000f600fd2848010110cac8bd77fa246c2bc95d0269759b612312bbc0438ed5eb7dd53116e55e9020000b221350401f7fbb08ed8733f200fe00ff219bbd62f8f7bea30f8ab5e9f16c3fb8642b118f56ed1bdc49600dbe5220c8b1af9e040c474f8074f1d14ce894ceb17ddbe1eb5416175db816dcb3d9b86ecacfe305fc3df0baaa80000d2ba95254e1c00100284801018e634c5cb159b3914109244a95171c97fe56c7ad67ec709cce94bb067893af680007219dbceaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa81804265fa43649cc3b15c891620f7db60a685fb7054bcc7b8817f05a7e9b73acdede2200b57bfa000034aea54953870101284801010143b3d2dd671b2559543155e003f847022e510b3a57afabbca05d4069c327ef000d2201200102010328480101d1a07de28968f21c0c3cfe0e69605731ae68b71969d27dd270f99b40790199040002220120010401052848010150d30f1a3fd6f709f0627934b2b31be081dc25bc52b51a353f850efa09ad224d000228480101664d4a2f536f0763f76857ceb94de20b4fad7e80b85675b3d02cf79a319b467e000122012001060107221350401f7fbb0df4fd0bf2010800ff219bbd62f8f7bea30f8ab5e9f16c3fb8642b118f56ed1bdc49600dbe5220c8b1af9e040c474f800b0df7369fde2be70ee4d2e84a552cab4b035685314de3d2e8e12b8d25aa27ae80000d2ba959f601c00109219dbceaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa81804265fa43649c9d338c13843e706c68e2455ed70bbf93820f28a394eec0b616e855fce8e6cac000034aea567d807010a220120010b0103220120010c0105220120010d010721a1bcd9999999999999999999999999999999999999999999999999999999999998200fbfdd8431e351e0e7f7559f2be451b78ede8267e7a8cb24cabd8236aa272459ca146db75357e502000034aea5495385010e2848010150725eee52e86432f846698a08ac153a67bc9ad9c160130af907c3bef05f29480007236fcff34517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf21881f480000000000000695d4a92a7110311d3e017f0010f011001112277cff5555555555555555555555555555555555555555555555555555555555555555407aec10e79c0000000000000695d4a92a711804265fa436495d00112011322012001140115284801018d455e04c00fba1289866da39c0793758c8d6a4e41ca2dd5ec2c03c76df76c4200032201200116011700b1bd635fefc47229e53988915685933558fd7303875055c5949d871dc2688df796800000000000000000000000000000000000000000000000000000000c54be8f6000000000000007e0000000e610f41dc000000593a932aa90284801015dc67661a1c1ef1294e875961eea55bea7054c7101bc975ed0aa009be971719a0003284801010f0ee7d20301abe555b4a76a6ada745283de3664ecb09ba794fec4d44db79b68000321a1bcd9999999999999999999999999999999999999999999999999999999999998200fbfdd86b59e3de15e7c728be36b6cb9aa8d1663f3d4c1e962ab20459e6e56ae211a233bc1e24f52000034aea567d8050118236fcff34517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf21881f480000000000000695d4acfb0110311d3e017f0010f011001112277cff5555555555555555555555555555555555555555555555555555555555555555407aec10e79c0000000000000695d4acfb011804265fa436495d00112011322012001190115220120011a0117020120011b011c227bcff333333333333333333333333333333333333333333333333333333333333333340756c14c3f00000000000000695d4a92a70e00fbfdd8431e351e16d0011d011e284801017269fb9feb45d719ebdbc3b0816b987bab06f43378dc84dc84d55727905482140002004811fd096c000000000000000000000000000000000000000000000000000000000000000028480101986c49971b96062e1fba4410e27249c8d73b0a9380f7ffd44640167e68b215e800032848010164a43970f2007a1da6d6fc81773cc095d1cc270e81359e471f3b03469abeb7b5000c214900000027cbb9d1062954439a83a91f27835fb9d2e3e798910356650c3c493c946234646840013128480101a54022f5edbf4beba0648deeb1ffc566c63567b51e34ccd918ab339bdedfec3300012848010122863015f2ff93c8dfe54f980440d8b3b2bd946770d126f32325fc9c8e37cb2e000200b1bd24ee866df51003f6b534d22c17f58175a943d247f628a0d355a187e86e73bd18acb16cc00000000000002a80000001dd3de5878000001dde15bcd058acb28f0000000000000021800000014bff7ab78000001718cb2138a02848010160ce52c8bd8ed7f87a7643812f7690467a604fcff9ba1811d065a34a0202d78f0002227bcff333333333333333333333333333333333333333333333333333333333333333340756c14c3f00000000000000695d4acfb00e00fbfdd86b59e3de16d0011d011f0201480120012100b1bd24ee866df51003f6b534d22c17f58175a943d247f628a0d355a187e86e73bd18acb16cc00000000000002a80000001dd3de5878000001dde15bcd058acb29fc000000000000021c0000001814ffc698000001752c06e7e2000b1bd1148769c03366e79fc451b06179e791641db92df408fd46e6ffe7ad24d90a90000000000000000000000000000000000000000000000000000000018a8fe848000000000000014000000006740cdc84000000b659904b9a002012001220123284801016217f872c99fafcb870f2c11a362f59339be95095f70d00b9cff2f6dcd69d3dd000e2355ec05b6c5a0ba9cc563f4263b03448b2038580c84db168a6ea499c5ee5d19ddadc8351566240da1dbc38a3b0124012501262355ec05b6c5a0ba9cc563f4263b03448b2038580c84db168a6ea499c5ee5d19ddadc8351566240da1dbc38a3b0124012501270073de48c56594fe000000000290b818000004b380fb4ef8000090e500f4af24c56594fe00000000153ae540000004efd6476f22000098db0ac6ce1f00b0bc914560076a5a3e2f68770608073c7920cd095fd22f6624cdc5631150352c9400000000000000000000000000000000000000000000000000000000629df4ce000000000000004000000004a9d9195a0000002b5c8e819300b1bce1814fe876c4b4657ef4585f2f9b9158201e2fc77698c43e68104b88fe4ab2314e7cf70000000000000066800000039c368aef00000040a8c4d343b14e7b67800000000000003b000000040b2e294300000028134825e0c00201580128012928480101fb16d1ca45ecb8d4d1f6b1ac903c630cc06f78334bc9b84bf30585e9422cb887000b284801018f1bd34960aa509ff15ef8c648fdcb942bb7a6c14bda5d4988792ce1c7800bee00062179a062b1fa1362b37a13000080001d81a245901c2c06426d8b4537524ce2f72e8ceed6e41a8ab31206d0ede1c51dc00ebe70af3ef33d8313797763b95f20012a2179a062b1fa1362b37a13000080001d81a245901c2c06426d8b4537524ce2f72e8ceed6e41a8ab31206d0ede1c51dc00ebe70af3ef33d831379c7db16df20012a00afbc6d1a11a99e030e7005cac69de1a3cdeea9807743355fbf293f897e485ac868c54bf1b80000000000000124000000091627b10a000000bd5670281ec54bf2a8000000000000011400000006eaf842ee000000a8472576d100afbc6f013e1c5535e8ff36e8381a2acf51990fd66e35d30a40c32f50336512de48c56594fe00000000000001440000000ce66b410a000000d9c852602cc565938800000000000000d40000000de9bcb146000000935ab614cd28480101e9988188b13457c31092fcc241e6b801ab7dc39b30a0923557a193630fef257f000a28480101a5a7d24057d8643b2527709d986cda3846adcb3eddc32d28ec21f69e17dbaaef00010106460600013503af7333333333333333333333333333333333333333333333333333333333333333300001a5752b3ec0246660377de4bc319a5038b872892ad701fa6a7f2783ecefd07a68cb4fe32f8b700001a5752b3ec0162b2ca7f0001408013201330134000120284801016e527b5263548e810db4a6e4a1f87c5c20d1c7859c8a5e2113127c954400e7b900012848010192f515d5126f2a2fe83d0204780eb95ac49143dae652a6a618f650997621e09a000128480101b4ff459f14a389ff7d6ea967ec8d5329f3cff84a787a7c1fcb6e3d447b6175e500100101a001350082728d942e903175e0ffe9857660057e1e7e904397d1bd95e61a0dc318aaabb1b31fe1cb96b8a440f43d5cc8d5334f00711345b647d43e5837cf367741c70934d237020f0409283baec018110136013700ab69fe00000000000000000000000000000000000000000000000000000000000000013fccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd283baec0000000034aea567d800c56594fe40009e42614c107ac000000000000000006400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005bc00000000000000000000000012d452da449e50b8cf7dd27861f146122afe1b546bb8b70fc8216f0c614139f8e046120c1e7"); + + String hash = Utils.bytesToHex(c.getHash()); + log.info("hash {}", hash); + assertThat(hash) + .isEqualTo("bf76eed0ac2f54e30c93c36e587a6dacd4526f45dcbf01a476c149f1991cb78a"); // works + } } diff --git a/emulator/src/main/java/org/ton/java/emulator/tvm/TvmEmulator.java b/emulator/src/main/java/org/ton/java/emulator/tvm/TvmEmulator.java index 1840be50..888b3ffc 100644 --- a/emulator/src/main/java/org/ton/java/emulator/tvm/TvmEmulator.java +++ b/emulator/src/main/java/org/ton/java/emulator/tvm/TvmEmulator.java @@ -25,7 +25,7 @@ public class TvmEmulator { * If not specified then tries to find emulator in system folder, more info here */ - private String pathToEmulatorSharedLib; + public String pathToEmulatorSharedLib; private final TvmEmulatorI tvmEmulatorI; private final long tvmEmulator; diff --git a/emulator/src/main/java/org/ton/java/emulator/tx/TxEmulator.java b/emulator/src/main/java/org/ton/java/emulator/tx/TxEmulator.java index b73f0c1f..5c7d9816 100644 --- a/emulator/src/main/java/org/ton/java/emulator/tx/TxEmulator.java +++ b/emulator/src/main/java/org/ton/java/emulator/tx/TxEmulator.java @@ -25,7 +25,7 @@ @Builder public class TxEmulator { - private String pathToEmulatorSharedLib; + public String pathToEmulatorSharedLib; private final TxEmulatorI txEmulatorI; private final long txEmulator; private TxEmulatorConfig configType; diff --git a/fift/src/main/java/org/ton/java/fift/FiftRunner.java b/fift/src/main/java/org/ton/java/fift/FiftRunner.java index 52001d6d..aa0ec5e7 100644 --- a/fift/src/main/java/org/ton/java/fift/FiftRunner.java +++ b/fift/src/main/java/org/ton/java/fift/FiftRunner.java @@ -16,9 +16,9 @@ public class FiftRunner { String fiftAsmLibraryPath; String fiftSmartcontLibraryPath; - String fiftExecutablePath; + public String fiftExecutablePath; - static String fiftExecutable = ""; + public static String fiftExecutable = ""; public static class FiftRunnerBuilder {} @@ -137,4 +137,16 @@ public String runStdIn(String workdir, String stdin) { return null; } } + + public String getLibsPath() { + if (Utils.getOS() == Utils.OS.WINDOWS) { + return fiftAsmLibraryPath + "@" + fiftSmartcontLibraryPath; + } else { + return fiftAsmLibraryPath + ":" + fiftSmartcontLibraryPath; + } + } + + public String getFiftPath() { + return Utils.detectAbsolutePath("fift", false); + } } diff --git a/func/src/main/java/org/ton/java/func/FuncRunner.java b/func/src/main/java/org/ton/java/func/FuncRunner.java index 7e7dd3f8..3f867014 100644 --- a/func/src/main/java/org/ton/java/func/FuncRunner.java +++ b/func/src/main/java/org/ton/java/func/FuncRunner.java @@ -11,9 +11,9 @@ @Slf4j public class FuncRunner { - String funcExecutablePath; + public String funcExecutablePath; - static String funcExecutable = ""; + public static String funcExecutable = ""; public static class FuncRunnerBuilder {} @@ -63,4 +63,8 @@ public String run(String workdir, String... params) { return ""; } + + public String getFuncPath() { + return Utils.detectAbsolutePath("func", false); + } } diff --git a/pom.xml b/pom.xml index 3ea29b3a..876b6827 100644 --- a/pom.xml +++ b/pom.xml @@ -25,6 +25,7 @@ fift func devenv + blockchain diff --git a/smartcontract/src/main/java/org/ton/java/smartcontract/SmartContractCompiler.java b/smartcontract/src/main/java/org/ton/java/smartcontract/SmartContractCompiler.java index c275106c..7ddb7bda 100644 --- a/smartcontract/src/main/java/org/ton/java/smartcontract/SmartContractCompiler.java +++ b/smartcontract/src/main/java/org/ton/java/smartcontract/SmartContractCompiler.java @@ -1,9 +1,10 @@ package org.ton.java.smartcontract; +import static java.util.Objects.isNull; + import java.io.File; import java.net.URL; import java.nio.file.Paths; -import jdk.nashorn.internal.ir.annotations.Ignore; import lombok.Builder; import lombok.Getter; import lombok.extern.slf4j.Slf4j; @@ -24,9 +25,9 @@ public class SmartContractCompiler { String contractPath; String contractAsResource; - @Ignore private FiftRunner fiftRunner; + private FiftRunner fiftRunner; - @Ignore private FuncRunner funcRunner; + private FuncRunner funcRunner; private boolean printFiftAsmOutput; @@ -39,8 +40,12 @@ public static SmartContractCompilerBuilder builder() { private static class CustomSmartContractCompilerBuilder extends SmartContractCompilerBuilder { @Override public SmartContractCompiler build() { - super.funcRunner = FuncRunner.builder().build(); - super.fiftRunner = FiftRunner.builder().build(); + if (isNull(super.funcRunner)) { + super.funcRunner = FuncRunner.builder().build(); + } + if (isNull(super.fiftRunner)) { + super.fiftRunner = FiftRunner.builder().build(); + } return super.build(); } } diff --git a/smartcontract/src/main/java/org/ton/java/smartcontract/faucet/TestnetFaucet.java b/smartcontract/src/main/java/org/ton/java/smartcontract/faucet/TestnetFaucet.java index 817854e6..ff25850d 100644 --- a/smartcontract/src/main/java/org/ton/java/smartcontract/faucet/TestnetFaucet.java +++ b/smartcontract/src/main/java/org/ton/java/smartcontract/faucet/TestnetFaucet.java @@ -4,6 +4,7 @@ import com.iwebpp.crypto.TweetNaclFast; import java.math.BigInteger; +import lombok.extern.slf4j.Slf4j; import org.ton.java.address.Address; import org.ton.java.smartcontract.types.WalletV1R3Config; import org.ton.java.smartcontract.wallet.ContractUtils; @@ -12,6 +13,7 @@ import org.ton.java.tonlib.types.ExtMessageInfo; import org.ton.java.utils.Utils; +@Slf4j public class TestnetFaucet { public static String PUBLIC_KEY = @@ -45,11 +47,10 @@ public static BigInteger topUpContract( } faucetBalance = faucet.getBalance(); - System.out.println( - "Faucet address " - + faucet.getAddress().toBounceable() - + ", balance " - + Utils.formatNanoValue(faucetBalance)); + log.info( + "Faucet address {}, balance {}", + faucet.getAddress().toBounceable(), + Utils.formatNanoValue(faucetBalance)); if (faucetBalance.compareTo(amount) < 0) { throw new Error( "Faucet does not have that much toncoins. faucet balance " @@ -58,7 +59,7 @@ public static BigInteger topUpContract( + Utils.formatNanoValue(amount)); } } catch (Exception e) { - System.out.println("Cannot get faucet balance. Restarting..."); + log.info("Cannot get faucet balance. Restarting..."); Utils.sleep(5, "Waiting for faucet balance"); } } while (isNull(faucetBalance)); diff --git a/smartcontract/src/main/java/org/ton/java/smartcontract/wallet/Contract.java b/smartcontract/src/main/java/org/ton/java/smartcontract/wallet/Contract.java index 8be30378..6c59c4dc 100644 --- a/smartcontract/src/main/java/org/ton/java/smartcontract/wallet/Contract.java +++ b/smartcontract/src/main/java/org/ton/java/smartcontract/wallet/Contract.java @@ -1,6 +1,7 @@ package org.ton.java.smartcontract.wallet; - +import java.math.BigInteger; +import java.util.List; import org.apache.commons.lang3.StringUtils; import org.ton.java.address.Address; import org.ton.java.cell.Cell; @@ -13,154 +14,152 @@ import org.ton.java.tonlib.types.RawTransaction; import org.ton.java.utils.Utils; -import java.math.BigInteger; -import java.util.List; - -/** - * Interface for all smart contract objects in ton4j. - */ +/** Interface for all smart contract objects in ton4j. */ public interface Contract { - Tonlib getTonlib(); - - long getWorkchain(); - - String getName(); - - default Address getAddress() { - return StateInit.builder() - .code(createCodeCell()) - .data(createDataCell()) - .build().getAddress(getWorkchain()); - } - - default Address getAddress(byte workchain) { - return getStateInit().getAddress(workchain); - } - - default MsgAddressIntStd getAddressIntStd() { - Address ownAddress = getStateInit().getAddress(getWorkchain()); - return MsgAddressIntStd.builder() - .workchainId(ownAddress.wc) - .address(ownAddress.toBigInteger()) - .build(); - } - - default MsgAddressIntStd getAddressIntStd(int workchain) { - Address ownAddress = getStateInit().getAddress(); - return MsgAddressIntStd.builder() - .workchainId((byte) workchain) - .address(ownAddress.toBigInteger()) - .build(); - } - - /** - * @return Cell containing contact code - */ - Cell createCodeCell(); - - /** - * Method to override - * - * @return {Cell} cell contains contract data - */ - Cell createDataCell(); - - default Cell createLibraryCell() { - return null; - } - - /** - * Message StateInit consists of initial contract code, data and address in a blockchain - * - * @return StateInit - */ - default StateInit getStateInit() { - return StateInit.builder() - .code(createCodeCell()) - .data(createDataCell()) - .lib(createLibraryCell()) - .build(); - } - - default long getSeqno() { - - if (this instanceof WalletV1R1) { - throw new Error("Wallet V1R1 does not have seqno method"); - } - - return getTonlib().getSeqno(getAddress()); - } - - default boolean isDeployed() { - return StringUtils.isNotEmpty(getTonlib().getRawAccountState(getAddress()).getCode()); - } - - default void waitForDeployment(int timeoutSeconds) { - System.out.println("waiting for deployment up to " + timeoutSeconds + " sec"); - int i = 0; - do { - if (++i * 2 >= timeoutSeconds) { - throw new Error("Can't deploy contract within specified timeout."); - } - Utils.sleep(2); - } - while (!isDeployed()); - } - - default void waitForBalanceChange(int timeoutSeconds) { - System.out.println("waiting for balance change up to " + timeoutSeconds + " sec"); - BigInteger initialBalance = getBalance(); - int i = 0; - do { - if (++i * 2 >= timeoutSeconds) { - throw new Error("Balance was not changed within specified timeout."); - } - Utils.sleep(2); - } - while (initialBalance.equals(getBalance())); - } - - default BigInteger getBalance() { - return new BigInteger(getTonlib().getAccountState(getAddress()).getBalance()); - } - - default List getTransactions(int historyLimit) { - return getTonlib().getAllRawTransactions(getAddress().toBounceable(), BigInteger.ZERO, null, historyLimit).getTransactions(); - } - - default List getTransactions() { - return getTonlib().getAllRawTransactions(getAddress().toBounceable(), BigInteger.ZERO, null, 20).getTransactions(); - } - - default Message prepareDeployMsg() { - throw new Error("not implemented"); - } - - default Message prepareExternalMsg(WalletConfig config) { - throw new Error("not implemented"); - } - - default BigInteger getGasFees() { - switch (getName()) { - case "V1R1": - return BigInteger.valueOf(40000); // 0.00004 toncoins - case "V1R2": - return BigInteger.valueOf(40000); - case "V1R3": - return BigInteger.valueOf(40000); - case "V2R1": - return BigInteger.valueOf(40000); - case "V2R2": - return BigInteger.valueOf(40000); - case "V3R1": - return BigInteger.valueOf(40000); - case "V3R2": - return BigInteger.valueOf(40000); - case "V4R2": - return BigInteger.valueOf(310000); - default: - throw new Error("Unknown wallet version"); - } - } -} \ No newline at end of file + Tonlib getTonlib(); + + long getWorkchain(); + + String getName(); + + default Address getAddress() { + return StateInit.builder() + .code(createCodeCell()) + .data(createDataCell()) + .build() + .getAddress(getWorkchain()); + } + + default Address getAddress(byte workchain) { + return getStateInit().getAddress(workchain); + } + + default MsgAddressIntStd getAddressIntStd() { + Address ownAddress = getStateInit().getAddress(getWorkchain()); + return MsgAddressIntStd.builder() + .workchainId(ownAddress.wc) + .address(ownAddress.toBigInteger()) + .build(); + } + + default MsgAddressIntStd getAddressIntStd(int workchain) { + Address ownAddress = getStateInit().getAddress(); + return MsgAddressIntStd.builder() + .workchainId((byte) workchain) + .address(ownAddress.toBigInteger()) + .build(); + } + + /** + * @return Cell containing contact code + */ + Cell createCodeCell(); + + /** + * Method to override + * + * @return {Cell} cell contains contract data + */ + Cell createDataCell(); + + default Cell createLibraryCell() { + return null; + } + + /** + * Message StateInit consists of initial contract code, data and address in a blockchain + * + * @return StateInit + */ + default StateInit getStateInit() { + return StateInit.builder() + .code(createCodeCell()) + .data(createDataCell()) + .lib(createLibraryCell()) + .build(); + } + + default long getSeqno() { + + if (this instanceof WalletV1R1) { + throw new Error("Wallet V1R1 does not have seqno method"); + } + + return getTonlib().getSeqno(getAddress()); + } + + default boolean isDeployed() { + return StringUtils.isNotEmpty(getTonlib().getRawAccountState(getAddress()).getCode()); + } + + default void waitForDeployment(int timeoutSeconds) { + System.out.println("waiting for deployment up to " + timeoutSeconds + " sec"); + int i = 0; + do { + if (++i * 2 >= timeoutSeconds) { + throw new Error("Can't deploy contract within specified timeout."); + } + Utils.sleep(2); + } while (!isDeployed()); + } + + default void waitForBalanceChange(int timeoutSeconds) { + System.out.println("waiting for balance change up to " + timeoutSeconds + " sec"); + BigInteger initialBalance = getBalance(); + int i = 0; + do { + if (++i * 2 >= timeoutSeconds) { + throw new Error("Balance was not changed within specified timeout."); + } + Utils.sleep(2); + } while (initialBalance.equals(getBalance())); + } + + default BigInteger getBalance() { + return new BigInteger(getTonlib().getAccountState(getAddress()).getBalance()); + } + + default List getTransactions(int historyLimit) { + return getTonlib() + .getAllRawTransactions(getAddress().toBounceable(), BigInteger.ZERO, null, historyLimit) + .getTransactions(); + } + + default List getTransactions() { + return getTonlib() + .getAllRawTransactions(getAddress().toBounceable(), BigInteger.ZERO, null, 20) + .getTransactions(); + } + + default Message prepareDeployMsg() { + throw new Error("not implemented"); + } + + default Message prepareExternalMsg(WalletConfig config) { + throw new Error("not implemented"); + } + + default BigInteger getGasFees() { + switch (getName()) { + case "V1R1": + return BigInteger.valueOf(40000); // 0.00004 toncoins + case "V1R2": + return BigInteger.valueOf(40000); + case "V1R3": + return BigInteger.valueOf(40000); + case "V2R1": + return BigInteger.valueOf(40000); + case "V2R2": + return BigInteger.valueOf(40000); + case "V3R1": + return BigInteger.valueOf(40000); + case "V3R2": + return BigInteger.valueOf(40000); + case "V4R2": + return BigInteger.valueOf(310000); + default: + throw new Error("Unknown wallet version"); + } + } +} diff --git a/tonlib/src/main/java/org/ton/java/tonlib/Tonlib.java b/tonlib/src/main/java/org/ton/java/tonlib/Tonlib.java index eae85a64..15f9da10 100644 --- a/tonlib/src/main/java/org/ton/java/tonlib/Tonlib.java +++ b/tonlib/src/main/java/org/ton/java/tonlib/Tonlib.java @@ -33,7 +33,7 @@ public class Tonlib { * If not specified then tries to find tonlib in system folder, more info here */ - private String pathToTonlibSharedLib; + public String pathToTonlibSharedLib; /** * if not specified and globalConfigAsString is null then integrated global-config.json is used; @@ -42,7 +42,7 @@ public class Tonlib { * *

If not specified and testnet=true then integrated testnet-global.config.json is used; */ - private String pathToGlobalConfig; + public String pathToGlobalConfig; /** * if not specified and pathToGlobalConfig is null then integrated global-config.json is used; @@ -231,7 +231,7 @@ public Tonlib build() { super.keystoreInMemory, super.keystorePath, super.pathToGlobalConfig, - (super.globalConfigAsString != null && super.globalConfigAsString.length() > 33) + (nonNull(super.globalConfigAsString) && super.globalConfigAsString.length() > 33) ? super.globalConfigAsString.substring(0, 33) : "", super.originalGlobalConfigInternal.getLiteservers().length, @@ -390,6 +390,12 @@ private String syncAndRead(String query) { + " times was not able retrieve result from lite-server."); } + if (response.contains("Failed to unpack account state")) { + log.info( + "You are trying to deploy a contract on address that does not have toncoins."); + break outterloop; + } + if (usingAllLiteServers) { // try next lite-server from the list TonGlobalConfig globalConfigCurrent = @@ -1556,4 +1562,31 @@ public SmcLibraryResult getLibraries(List librariesHashes) { return libraryResultParser.parse(result); } } + + public boolean isDeployed(Address address) { + return StringUtils.isNotEmpty(this.getRawAccountState(address).getCode()); + } + + public void waitForDeployment(Address address, int timeoutSeconds) { + log.info("waiting for deployment up to {}s", timeoutSeconds); + int i = 0; + do { + if (++i * 2 >= timeoutSeconds) { + throw new Error("Can't deploy contract within specified timeout."); + } + Utils.sleep(2); + } while (!isDeployed(address)); + } + + public void waitForBalanceChange(Address address, int timeoutSeconds) { + log.info("waiting for balance change up to {}s", timeoutSeconds); + BigInteger initialBalance = getAccountBalance(address); + int i = 0; + do { + if (++i * 2 >= timeoutSeconds) { + throw new Error("Balance was not changed within specified timeout."); + } + Utils.sleep(2); + } while (initialBalance.equals(getAccountBalance(address))); + } }