diff --git a/.gitignore b/.gitignore index fcc42db9..218e8043 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,6 @@ /.mvn.classpath /notes* /settings.json -/testnet* /settings*.json /testchain*.json /run-testnet*.sh diff --git a/src/main/java/org/qortal/api/resource/AdminResource.java b/src/main/java/org/qortal/api/resource/AdminResource.java index 46e204db..ef2a3f95 100644 --- a/src/main/java/org/qortal/api/resource/AdminResource.java +++ b/src/main/java/org/qortal/api/resource/AdminResource.java @@ -45,6 +45,7 @@ import org.qortal.block.BlockChain; import org.qortal.controller.Controller; import org.qortal.controller.Synchronizer; import org.qortal.controller.Synchronizer.SynchronizationResult; +import org.qortal.controller.repository.BlockArchiveRebuilder; import org.qortal.data.account.MintingAccountData; import org.qortal.data.account.RewardShareData; import org.qortal.network.Network; @@ -734,6 +735,64 @@ public class AdminResource { } } + @POST + @Path("/repository/archive/rebuild") + @Operation( + summary = "Rebuild archive", + description = "Rebuilds archive files, using the specified serialization version", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.TEXT_PLAIN, + schema = @Schema( + type = "number", example = "2" + ) + ) + ), + responses = { + @ApiResponse( + description = "\"true\"", + content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "string")) + ) + } + ) + @ApiErrors({ApiError.REPOSITORY_ISSUE}) + @SecurityRequirement(name = "apiKey") + public String rebuildArchive(@HeaderParam(Security.API_KEY_HEADER) String apiKey, Integer serializationVersion) { + Security.checkApiCallAllowed(request); + + // Default serialization version to value specified in settings + if (serializationVersion == null) { + serializationVersion = Settings.getInstance().getDefaultArchiveVersion(); + } + + try { + // We don't actually need to lock the blockchain here, but we'll do it anyway so that + // the node can focus on rebuilding rather than synchronizing / minting. + ReentrantLock blockchainLock = Controller.getInstance().getBlockchainLock(); + + blockchainLock.lockInterruptibly(); + + try { + BlockArchiveRebuilder blockArchiveRebuilder = new BlockArchiveRebuilder(serializationVersion); + blockArchiveRebuilder.start(); + + return "true"; + + } catch (IOException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA, e); + + } finally { + blockchainLock.unlock(); + } + } catch (InterruptedException e) { + // We couldn't lock blockchain to perform rebuild + return "false"; + } catch (DataException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.REPOSITORY_ISSUE, e); + } + } + @DELETE @Path("/repository") @Operation( diff --git a/src/main/java/org/qortal/api/resource/ArbitraryResource.java b/src/main/java/org/qortal/api/resource/ArbitraryResource.java index 0df81d9b..235e3edc 100644 --- a/src/main/java/org/qortal/api/resource/ArbitraryResource.java +++ b/src/main/java/org/qortal/api/resource/ArbitraryResource.java @@ -773,6 +773,7 @@ public class ArbitraryResource { @QueryParam("description") String description, @QueryParam("tags") List tags, @QueryParam("category") Category category, + @QueryParam("fee") Long fee, String path) { Security.checkApiCallAllowed(request); @@ -781,7 +782,7 @@ public class ArbitraryResource { } return this.upload(Service.valueOf(serviceString), name, null, path, null, null, false, - title, description, tags, category); + fee, title, description, tags, category); } @POST @@ -818,6 +819,7 @@ public class ArbitraryResource { @QueryParam("description") String description, @QueryParam("tags") List tags, @QueryParam("category") Category category, + @QueryParam("fee") Long fee, String path) { Security.checkApiCallAllowed(request); @@ -826,7 +828,7 @@ public class ArbitraryResource { } return this.upload(Service.valueOf(serviceString), name, identifier, path, null, null, false, - title, description, tags, category); + fee, title, description, tags, category); } @@ -864,6 +866,7 @@ public class ArbitraryResource { @QueryParam("description") String description, @QueryParam("tags") List tags, @QueryParam("category") Category category, + @QueryParam("fee") Long fee, String base64) { Security.checkApiCallAllowed(request); @@ -872,7 +875,7 @@ public class ArbitraryResource { } return this.upload(Service.valueOf(serviceString), name, null, null, null, base64, false, - title, description, tags, category); + fee, title, description, tags, category); } @POST @@ -907,6 +910,7 @@ public class ArbitraryResource { @QueryParam("description") String description, @QueryParam("tags") List tags, @QueryParam("category") Category category, + @QueryParam("fee") Long fee, String base64) { Security.checkApiCallAllowed(request); @@ -915,7 +919,7 @@ public class ArbitraryResource { } return this.upload(Service.valueOf(serviceString), name, identifier, null, null, base64, false, - title, description, tags, category); + fee, title, description, tags, category); } @@ -952,6 +956,7 @@ public class ArbitraryResource { @QueryParam("description") String description, @QueryParam("tags") List tags, @QueryParam("category") Category category, + @QueryParam("fee") Long fee, String base64Zip) { Security.checkApiCallAllowed(request); @@ -960,7 +965,7 @@ public class ArbitraryResource { } return this.upload(Service.valueOf(serviceString), name, null, null, null, base64Zip, true, - title, description, tags, category); + fee, title, description, tags, category); } @POST @@ -995,6 +1000,7 @@ public class ArbitraryResource { @QueryParam("description") String description, @QueryParam("tags") List tags, @QueryParam("category") Category category, + @QueryParam("fee") Long fee, String base64Zip) { Security.checkApiCallAllowed(request); @@ -1003,7 +1009,7 @@ public class ArbitraryResource { } return this.upload(Service.valueOf(serviceString), name, identifier, null, null, base64Zip, true, - title, description, tags, category); + fee, title, description, tags, category); } @@ -1043,6 +1049,7 @@ public class ArbitraryResource { @QueryParam("description") String description, @QueryParam("tags") List tags, @QueryParam("category") Category category, + @QueryParam("fee") Long fee, String string) { Security.checkApiCallAllowed(request); @@ -1051,7 +1058,7 @@ public class ArbitraryResource { } return this.upload(Service.valueOf(serviceString), name, null, null, string, null, false, - title, description, tags, category); + fee, title, description, tags, category); } @POST @@ -1088,6 +1095,7 @@ public class ArbitraryResource { @QueryParam("description") String description, @QueryParam("tags") List tags, @QueryParam("category") Category category, + @QueryParam("fee") Long fee, String string) { Security.checkApiCallAllowed(request); @@ -1096,14 +1104,14 @@ public class ArbitraryResource { } return this.upload(Service.valueOf(serviceString), name, identifier, null, string, null, false, - title, description, tags, category); + fee, title, description, tags, category); } // Shared methods - private String upload(Service service, String name, String identifier, - String path, String string, String base64, boolean zipped, + private String upload(Service service, String name, String identifier, String path, + String string, String base64, boolean zipped, Long fee, String title, String description, List tags, Category category) { // Fetch public key from registered name try (final Repository repository = RepositoryManager.getRepository()) { @@ -1167,9 +1175,14 @@ public class ArbitraryResource { } } + // Default to zero fee if not specified + if (fee == null) { + fee = 0L; + } + try { ArbitraryDataTransactionBuilder transactionBuilder = new ArbitraryDataTransactionBuilder( - repository, publicKey58, Paths.get(path), name, null, service, identifier, + repository, publicKey58, fee, Paths.get(path), name, null, service, identifier, title, description, tags, category ); diff --git a/src/main/java/org/qortal/api/resource/BlocksResource.java b/src/main/java/org/qortal/api/resource/BlocksResource.java index 98c5f00d..ad5e466d 100644 --- a/src/main/java/org/qortal/api/resource/BlocksResource.java +++ b/src/main/java/org/qortal/api/resource/BlocksResource.java @@ -48,6 +48,7 @@ import org.qortal.repository.RepositoryManager; import org.qortal.transform.TransformationException; import org.qortal.transform.block.BlockTransformer; import org.qortal.utils.Base58; +import org.qortal.utils.Triple; @Path("/blocks") @Tag(name = "Blocks") @@ -165,10 +166,13 @@ public class BlocksResource { } // Not found, so try the block archive - byte[] bytes = BlockArchiveReader.getInstance().fetchSerializedBlockBytesForSignature(signature, false, repository); - if (bytes != null) { - if (version != 1) { - throw ApiExceptionFactory.INSTANCE.createCustomException(request, ApiError.INVALID_CRITERIA, "Archived blocks require version 1"); + Triple serializedBlock = BlockArchiveReader.getInstance().fetchSerializedBlockBytesForSignature(signature, false, repository); + if (serializedBlock != null) { + byte[] bytes = serializedBlock.getA(); + Integer serializationVersion = serializedBlock.getB(); + if (version != serializationVersion) { + // TODO: we could quite easily reserialize the block with the requested version + throw ApiExceptionFactory.INSTANCE.createCustomException(request, ApiError.INVALID_CRITERIA, "Block is not stored using requested serialization version."); } return Base58.encode(bytes); } diff --git a/src/main/java/org/qortal/api/resource/ChatResource.java b/src/main/java/org/qortal/api/resource/ChatResource.java index 2601e938..150b6f63 100644 --- a/src/main/java/org/qortal/api/resource/ChatResource.java +++ b/src/main/java/org/qortal/api/resource/ChatResource.java @@ -72,6 +72,7 @@ public class ChatResource { @QueryParam("reference") String reference, @QueryParam("chatreference") String chatReference, @QueryParam("haschatreference") Boolean hasChatReference, + @QueryParam("sender") String sender, @Parameter(ref = "limit") @QueryParam("limit") Integer limit, @Parameter(ref = "offset") @QueryParam("offset") Integer offset, @Parameter(ref = "reverse") @QueryParam("reverse") Boolean reverse) { @@ -107,6 +108,7 @@ public class ChatResource { chatReferenceBytes, hasChatReference, involvingAddresses, + sender, limit, offset, reverse); } catch (DataException e) { throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.REPOSITORY_ISSUE, e); diff --git a/src/main/java/org/qortal/api/websocket/ChatMessagesWebSocket.java b/src/main/java/org/qortal/api/websocket/ChatMessagesWebSocket.java index 76ed936c..c6d7aaed 100644 --- a/src/main/java/org/qortal/api/websocket/ChatMessagesWebSocket.java +++ b/src/main/java/org/qortal/api/websocket/ChatMessagesWebSocket.java @@ -49,6 +49,7 @@ public class ChatMessagesWebSocket extends ApiWebSocket { null, null, null, + null, null, null, null); sendMessages(session, chatMessages); @@ -79,6 +80,7 @@ public class ChatMessagesWebSocket extends ApiWebSocket { null, null, involvingAddresses, + null, null, null, null); sendMessages(session, chatMessages); diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataTransactionBuilder.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataTransactionBuilder.java index 0f3d4357..b27e511c 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataTransactionBuilder.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataTransactionBuilder.java @@ -46,6 +46,7 @@ public class ArbitraryDataTransactionBuilder { private static final double MAX_FILE_DIFF = 0.5f; private final String publicKey58; + private final long fee; private final Path path; private final String name; private Method method; @@ -64,11 +65,12 @@ public class ArbitraryDataTransactionBuilder { private ArbitraryTransactionData arbitraryTransactionData; private ArbitraryDataFile arbitraryDataFile; - public ArbitraryDataTransactionBuilder(Repository repository, String publicKey58, Path path, String name, + public ArbitraryDataTransactionBuilder(Repository repository, String publicKey58, long fee, Path path, String name, Method method, Service service, String identifier, String title, String description, List tags, Category category) { this.repository = repository; this.publicKey58 = publicKey58; + this.fee = fee; this.path = path; this.name = name; this.method = method; @@ -261,7 +263,7 @@ public class ArbitraryDataTransactionBuilder { } final BaseTransactionData baseTransactionData = new BaseTransactionData(now, Group.NO_GROUP, - lastReference, creatorPublicKey, 0L, null); + lastReference, creatorPublicKey, fee, null); final int size = (int) arbitraryDataFile.size(); final int version = 5; final int nonce = 0; diff --git a/src/main/java/org/qortal/block/Block.java b/src/main/java/org/qortal/block/Block.java index 59de8870..e030e6a6 100644 --- a/src/main/java/org/qortal/block/Block.java +++ b/src/main/java/org/qortal/block/Block.java @@ -657,6 +657,10 @@ public class Block { return this.atStates; } + public byte[] getAtStatesHash() { + return this.atStatesHash; + } + /** * Return expanded info on block's online accounts. *

diff --git a/src/main/java/org/qortal/block/BlockChain.java b/src/main/java/org/qortal/block/BlockChain.java index b96350e6..88880887 100644 --- a/src/main/java/org/qortal/block/BlockChain.java +++ b/src/main/java/org/qortal/block/BlockChain.java @@ -78,7 +78,8 @@ public class BlockChain { onlineAccountMinterLevelValidationHeight, selfSponsorshipAlgoV1Height, feeValidationFixTimestamp, - chatReferenceTimestamp; + chatReferenceTimestamp, + arbitraryOptionalFeeTimestamp; } // Custom transaction fees @@ -522,6 +523,10 @@ public class BlockChain { return this.featureTriggers.get(FeatureTrigger.chatReferenceTimestamp.name()).longValue(); } + public long getArbitraryOptionalFeeTimestamp() { + return this.featureTriggers.get(FeatureTrigger.arbitraryOptionalFeeTimestamp.name()).longValue(); + } + // More complex getters for aspects that change by height or timestamp diff --git a/src/main/java/org/qortal/controller/Controller.java b/src/main/java/org/qortal/controller/Controller.java index 69995180..7e8fea5e 100644 --- a/src/main/java/org/qortal/controller/Controller.java +++ b/src/main/java/org/qortal/controller/Controller.java @@ -402,8 +402,6 @@ public class Controller extends Thread { RepositoryManager.setRequestedCheckpoint(Boolean.TRUE); try (final Repository repository = RepositoryManager.getRepository()) { - RepositoryManager.archive(repository); - RepositoryManager.prune(repository); RepositoryManager.rebuildTransactionSequences(repository); } } catch (DataException e) { @@ -1380,9 +1378,24 @@ public class Controller extends Thread { // If we have no block data, we should check the archive in case it's there if (blockData == null) { if (Settings.getInstance().isArchiveEnabled()) { - byte[] bytes = BlockArchiveReader.getInstance().fetchSerializedBlockBytesForSignature(signature, true, repository); - if (bytes != null) { - CachedBlockMessage blockMessage = new CachedBlockMessage(bytes); + Triple serializedBlock = BlockArchiveReader.getInstance().fetchSerializedBlockBytesForSignature(signature, true, repository); + if (serializedBlock != null) { + byte[] bytes = serializedBlock.getA(); + Integer serializationVersion = serializedBlock.getB(); + + Message blockMessage; + switch (serializationVersion) { + case 1: + blockMessage = new CachedBlockMessage(bytes); + break; + + case 2: + blockMessage = new CachedBlockV2Message(bytes); + break; + + default: + return; + } blockMessage.setId(message.getId()); // This call also causes the other needed data to be pulled in from repository diff --git a/src/main/java/org/qortal/controller/repository/BlockArchiveRebuilder.java b/src/main/java/org/qortal/controller/repository/BlockArchiveRebuilder.java new file mode 100644 index 00000000..63579d3c --- /dev/null +++ b/src/main/java/org/qortal/controller/repository/BlockArchiveRebuilder.java @@ -0,0 +1,121 @@ +package org.qortal.controller.repository; + +import org.apache.commons.io.FileUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.qortal.controller.Controller; +import org.qortal.controller.Synchronizer; +import org.qortal.repository.*; +import org.qortal.settings.Settings; +import org.qortal.transform.TransformationException; + +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; + + +public class BlockArchiveRebuilder { + + private static final Logger LOGGER = LogManager.getLogger(BlockArchiveRebuilder.class); + + private final int serializationVersion; + + public BlockArchiveRebuilder(int serializationVersion) { + this.serializationVersion = serializationVersion; + } + + public void start() throws DataException, IOException { + if (!Settings.getInstance().isArchiveEnabled() || Settings.getInstance().isLite()) { + return; + } + + // New archive path is in a different location from original archive path, to avoid conflicts. + // It will be moved later, once the process is complete. + final Path newArchivePath = Paths.get(Settings.getInstance().getRepositoryPath(), "archive-rebuild"); + final Path originalArchivePath = Paths.get(Settings.getInstance().getRepositoryPath(), "archive"); + + // Delete archive-rebuild if it exists from a previous attempt + FileUtils.deleteDirectory(newArchivePath.toFile()); + + try (final Repository repository = RepositoryManager.getRepository()) { + int startHeight = 1; // We need to rebuild the entire archive + + LOGGER.info("Rebuilding block archive from height {}...", startHeight); + + while (!Controller.isStopping()) { + repository.discardChanges(); + + Thread.sleep(1000L); + + // Don't even attempt if we're mid-sync as our repository requests will be delayed for ages + if (Synchronizer.getInstance().isSynchronizing()) { + continue; + } + + // Rebuild archive + try { + final int maximumArchiveHeight = BlockArchiveReader.getInstance().getHeightOfLastArchivedBlock(); + if (startHeight >= maximumArchiveHeight) { + // We've finished. + // Delete existing archive and move the newly built one into its place + FileUtils.deleteDirectory(originalArchivePath.toFile()); + FileUtils.moveDirectory(newArchivePath.toFile(), originalArchivePath.toFile()); + BlockArchiveReader.getInstance().invalidateFileListCache(); + LOGGER.info("Block archive successfully rebuilt"); + return; + } + + BlockArchiveWriter writer = new BlockArchiveWriter(startHeight, maximumArchiveHeight, serializationVersion, newArchivePath, repository); + + // Set data source to BLOCK_ARCHIVE as we are rebuilding + writer.setDataSource(BlockArchiveWriter.BlockArchiveDataSource.BLOCK_ARCHIVE); + + // We can't enforce the 100MB file size target, as the final file needs to contain all blocks + // that exist in the current archive. Otherwise, the final blocks in the archive will be lost. + writer.setShouldEnforceFileSizeTarget(false); + + // We want to log the rebuild progress + writer.setShouldLogProgress(true); + + BlockArchiveWriter.BlockArchiveWriteResult result = writer.write(); + switch (result) { + case OK: + // Increment block archive height + startHeight += writer.getWrittenCount(); + repository.saveChanges(); + break; + + case STOPPING: + return; + + // We've reached the limit of the blocks we can archive + // Sleep for a while to allow more to become available + case NOT_ENOUGH_BLOCKS: + // This shouldn't happen, as we're not enforcing minimum file sizes + repository.discardChanges(); + throw new DataException("Unable to rebuild archive due to unexpected NOT_ENOUGH_BLOCKS response."); + + case BLOCK_NOT_FOUND: + // We tried to archive a block that didn't exist. This is a major failure and likely means + // that a bootstrap or re-sync is needed. Try again every minute until then. + LOGGER.info("Error: block not found when rebuilding archive. If this error persists, " + + "a bootstrap or re-sync may be needed."); + repository.discardChanges(); + throw new DataException("Unable to rebuild archive because a block is missing."); + } + + } catch (IOException | TransformationException e) { + LOGGER.info("Caught exception when rebuilding block archive", e); + throw new DataException("Unable to rebuild block archive"); + } + + } + } catch (InterruptedException e) { + // Do nothing + } finally { + // Delete archive-rebuild if it still exists, as that means something went wrong + FileUtils.deleteDirectory(newArchivePath.toFile()); + } + } + +} diff --git a/src/main/java/org/qortal/network/message/CachedBlockV2Message.java b/src/main/java/org/qortal/network/message/CachedBlockV2Message.java new file mode 100644 index 00000000..c981293d --- /dev/null +++ b/src/main/java/org/qortal/network/message/CachedBlockV2Message.java @@ -0,0 +1,43 @@ +package org.qortal.network.message; + +import com.google.common.primitives.Ints; +import org.qortal.block.Block; +import org.qortal.transform.TransformationException; +import org.qortal.transform.block.BlockTransformer; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.ByteBuffer; + +// This is an OUTGOING-only Message which more readily lends itself to being cached +public class CachedBlockV2Message extends Message implements Cloneable { + + public CachedBlockV2Message(Block block) throws TransformationException { + super(MessageType.BLOCK_V2); + + ByteArrayOutputStream bytes = new ByteArrayOutputStream(); + + try { + bytes.write(Ints.toByteArray(block.getBlockData().getHeight())); + + bytes.write(BlockTransformer.toBytes(block)); + } catch (IOException e) { + throw new AssertionError("IOException shouldn't occur with ByteArrayOutputStream"); + } + + this.dataBytes = bytes.toByteArray(); + this.checksumBytes = Message.generateChecksum(this.dataBytes); + } + + public CachedBlockV2Message(byte[] cachedBytes) { + super(MessageType.BLOCK_V2); + + this.dataBytes = cachedBytes; + this.checksumBytes = Message.generateChecksum(this.dataBytes); + } + + public static Message fromByteBuffer(int id, ByteBuffer byteBuffer) { + throw new UnsupportedOperationException("CachedBlockMessageV2 is for outgoing messages only"); + } + +} diff --git a/src/main/java/org/qortal/repository/BlockArchiveReader.java b/src/main/java/org/qortal/repository/BlockArchiveReader.java index 311d21c7..1f04bced 100644 --- a/src/main/java/org/qortal/repository/BlockArchiveReader.java +++ b/src/main/java/org/qortal/repository/BlockArchiveReader.java @@ -3,10 +3,7 @@ package org.qortal.repository; import com.google.common.primitives.Ints; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.qortal.data.at.ATStateData; import org.qortal.data.block.BlockArchiveData; -import org.qortal.data.block.BlockData; -import org.qortal.data.transaction.TransactionData; import org.qortal.settings.Settings; import org.qortal.transform.TransformationException; import org.qortal.transform.block.BlockTransformation; @@ -67,20 +64,51 @@ public class BlockArchiveReader { this.fileListCache = Map.copyOf(map); } + public Integer fetchSerializationVersionForHeight(int height) { + if (this.fileListCache == null) { + this.fetchFileList(); + } + + Triple serializedBlock = this.fetchSerializedBlockBytesForHeight(height); + if (serializedBlock == null) { + return null; + } + Integer serializationVersion = serializedBlock.getB(); + return serializationVersion; + } + public BlockTransformation fetchBlockAtHeight(int height) { if (this.fileListCache == null) { this.fetchFileList(); } - byte[] serializedBytes = this.fetchSerializedBlockBytesForHeight(height); - if (serializedBytes == null) { + Triple serializedBlock = this.fetchSerializedBlockBytesForHeight(height); + if (serializedBlock == null) { + return null; + } + byte[] serializedBytes = serializedBlock.getA(); + Integer serializationVersion = serializedBlock.getB(); + if (serializedBytes == null || serializationVersion == null) { return null; } ByteBuffer byteBuffer = ByteBuffer.wrap(serializedBytes); BlockTransformation blockInfo = null; try { - blockInfo = BlockTransformer.fromByteBuffer(byteBuffer); + switch (serializationVersion) { + case 1: + blockInfo = BlockTransformer.fromByteBuffer(byteBuffer); + break; + + case 2: + blockInfo = BlockTransformer.fromByteBufferV2(byteBuffer); + break; + + default: + // Invalid serialization version + return null; + } + if (blockInfo != null && blockInfo.getBlockData() != null) { // Block height is stored outside of the main serialized bytes, so it // won't be set automatically. @@ -168,15 +196,20 @@ public class BlockArchiveReader { return null; } - public byte[] fetchSerializedBlockBytesForSignature(byte[] signature, boolean includeHeightPrefix, Repository repository) { + public Triple fetchSerializedBlockBytesForSignature(byte[] signature, boolean includeHeightPrefix, Repository repository) { if (this.fileListCache == null) { this.fetchFileList(); } Integer height = this.fetchHeightForSignature(signature, repository); if (height != null) { - byte[] blockBytes = this.fetchSerializedBlockBytesForHeight(height); - if (blockBytes == null) { + Triple serializedBlock = this.fetchSerializedBlockBytesForHeight(height); + if (serializedBlock == null) { + return null; + } + byte[] blockBytes = serializedBlock.getA(); + Integer version = serializedBlock.getB(); + if (blockBytes == null || version == null) { return null; } @@ -187,18 +220,18 @@ public class BlockArchiveReader { try { bytes.write(Ints.toByteArray(height)); bytes.write(blockBytes); - return bytes.toByteArray(); + return new Triple<>(bytes.toByteArray(), version, height); } catch (IOException e) { return null; } } - return blockBytes; + return new Triple<>(blockBytes, version, height); } return null; } - public byte[] fetchSerializedBlockBytesForHeight(int height) { + public Triple fetchSerializedBlockBytesForHeight(int height) { String filename = this.getFilenameForHeight(height); if (filename == null) { // We don't have this block in the archive @@ -221,7 +254,7 @@ public class BlockArchiveReader { // End of fixed length header // Make sure the version is one we recognize - if (version != 1) { + if (version != 1 && version != 2) { LOGGER.info("Error: unknown version in file {}: {}", filename, version); return null; } @@ -258,7 +291,7 @@ public class BlockArchiveReader { byte[] blockBytes = new byte[blockLength]; file.read(blockBytes); - return blockBytes; + return new Triple<>(blockBytes, version, height); } catch (FileNotFoundException e) { LOGGER.info("File {} not found: {}", filename, e.getMessage()); @@ -279,6 +312,30 @@ public class BlockArchiveReader { } } + public int getHeightOfLastArchivedBlock() { + if (this.fileListCache == null) { + this.fetchFileList(); + } + + int maxEndHeight = 0; + + Iterator it = this.fileListCache.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pair = (Map.Entry) it.next(); + if (pair == null && pair.getKey() == null && pair.getValue() == null) { + continue; + } + Triple heightInfo = (Triple) pair.getValue(); + Integer endHeight = heightInfo.getB(); + + if (endHeight != null && endHeight > maxEndHeight) { + maxEndHeight = endHeight; + } + } + + return maxEndHeight; + } + public void invalidateFileListCache() { this.fileListCache = null; } diff --git a/src/main/java/org/qortal/repository/BlockArchiveWriter.java b/src/main/java/org/qortal/repository/BlockArchiveWriter.java index 5127bf9b..e47aabbd 100644 --- a/src/main/java/org/qortal/repository/BlockArchiveWriter.java +++ b/src/main/java/org/qortal/repository/BlockArchiveWriter.java @@ -6,10 +6,13 @@ import org.apache.logging.log4j.Logger; import org.qortal.block.Block; import org.qortal.controller.Controller; import org.qortal.controller.Synchronizer; +import org.qortal.data.at.ATStateData; import org.qortal.data.block.BlockArchiveData; import org.qortal.data.block.BlockData; +import org.qortal.data.transaction.TransactionData; import org.qortal.settings.Settings; import org.qortal.transform.TransformationException; +import org.qortal.transform.block.BlockTransformation; import org.qortal.transform.block.BlockTransformer; import java.io.ByteArrayOutputStream; @@ -18,6 +21,7 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.List; public class BlockArchiveWriter { @@ -28,25 +32,78 @@ public class BlockArchiveWriter { BLOCK_NOT_FOUND } + public enum BlockArchiveDataSource { + BLOCK_REPOSITORY, // To build an archive from the Blocks table + BLOCK_ARCHIVE // To build a new archive from an existing archive + } + private static final Logger LOGGER = LogManager.getLogger(BlockArchiveWriter.class); - public static final long DEFAULT_FILE_SIZE_TARGET = 100 * 1024 * 1024; // 100MiB + public static final long DEFAULT_FILE_SIZE_TARGET_V1 = 100 * 1024 * 1024; // 100MiB + public static final long DEFAULT_FILE_SIZE_TARGET_V2 = 10 * 1024 * 1024; // 10MiB private int startHeight; private final int endHeight; + private final Integer serializationVersion; + private final Path archivePath; private final Repository repository; - private long fileSizeTarget = DEFAULT_FILE_SIZE_TARGET; + private long fileSizeTarget = DEFAULT_FILE_SIZE_TARGET_V1; private boolean shouldEnforceFileSizeTarget = true; + // Default data source to BLOCK_REPOSITORY; can optionally be overridden + private BlockArchiveDataSource dataSource = BlockArchiveDataSource.BLOCK_REPOSITORY; + + private boolean shouldLogProgress = false; + private int writtenCount; private int lastWrittenHeight; private Path outputPath; - public BlockArchiveWriter(int startHeight, int endHeight, Repository repository) { + /** + * Instantiate a BlockArchiveWriter using a custom archive path + * @param startHeight + * @param endHeight + * @param repository + */ + public BlockArchiveWriter(int startHeight, int endHeight, Integer serializationVersion, Path archivePath, Repository repository) { this.startHeight = startHeight; this.endHeight = endHeight; + this.archivePath = archivePath.toAbsolutePath(); this.repository = repository; + + if (serializationVersion == null) { + // When serialization version isn't specified, fetch it from the existing archive + serializationVersion = this.findSerializationVersion(); + } + + // Reduce default file size target if we're using V2, as the average block size is over 90% smaller + if (serializationVersion == 2) { + this.setFileSizeTarget(DEFAULT_FILE_SIZE_TARGET_V2); + } + + this.serializationVersion = serializationVersion; + } + + /** + * Instantiate a BlockArchiveWriter using the default archive path and version + * @param startHeight + * @param endHeight + * @param repository + */ + public BlockArchiveWriter(int startHeight, int endHeight, Repository repository) { + this(startHeight, endHeight, null, Paths.get(Settings.getInstance().getRepositoryPath(), "archive"), repository); + } + + private int findSerializationVersion() { + // Attempt to fetch the serialization version from the existing archive + Integer block2SerializationVersion = BlockArchiveReader.getInstance().fetchSerializationVersionForHeight(2); + if (block2SerializationVersion != null) { + return block2SerializationVersion; + } + + // Default to version specified in settings + return Settings.getInstance().getDefaultArchiveVersion(); } public static int getMaxArchiveHeight(Repository repository) throws DataException { @@ -72,8 +129,7 @@ public class BlockArchiveWriter { public BlockArchiveWriteResult write() throws DataException, IOException, TransformationException, InterruptedException { // Create the archive folder if it doesn't exist - // This is a subfolder of the db directory, to make bootstrapping easier - Path archivePath = Paths.get(Settings.getInstance().getRepositoryPath(), "archive").toAbsolutePath(); + // This is generally a subfolder of the db directory, to make bootstrapping easier try { Files.createDirectories(archivePath); } catch (IOException e) { @@ -95,13 +151,13 @@ public class BlockArchiveWriter { LOGGER.info(String.format("Fetching blocks from height %d...", startHeight)); int i = 0; - while (headerBytes.size() + bytes.size() < this.fileSizeTarget - || this.shouldEnforceFileSizeTarget == false) { + while (headerBytes.size() + bytes.size() < this.fileSizeTarget) { if (Controller.isStopping()) { return BlockArchiveWriteResult.STOPPING; } if (Synchronizer.getInstance().isSynchronizing()) { + Thread.sleep(1000L); continue; } @@ -112,7 +168,28 @@ public class BlockArchiveWriter { //LOGGER.info("Fetching block {}...", currentHeight); - BlockData blockData = repository.getBlockRepository().fromHeight(currentHeight); + BlockData blockData = null; + List transactions = null; + List atStates = null; + byte[] atStatesHash = null; + + switch (this.dataSource) { + case BLOCK_ARCHIVE: + BlockTransformation archivedBlock = BlockArchiveReader.getInstance().fetchBlockAtHeight(currentHeight); + if (archivedBlock != null) { + blockData = archivedBlock.getBlockData(); + transactions = archivedBlock.getTransactions(); + atStates = archivedBlock.getAtStates(); + atStatesHash = archivedBlock.getAtStatesHash(); + } + break; + + case BLOCK_REPOSITORY: + default: + blockData = repository.getBlockRepository().fromHeight(currentHeight); + break; + } + if (blockData == null) { return BlockArchiveWriteResult.BLOCK_NOT_FOUND; } @@ -122,18 +199,50 @@ public class BlockArchiveWriter { repository.getBlockArchiveRepository().save(blockArchiveData); repository.saveChanges(); + // Build the block + Block block; + if (atStatesHash != null) { + block = new Block(repository, blockData, transactions, atStatesHash); + } + else if (atStates != null) { + block = new Block(repository, blockData, transactions, atStates); + } + else { + block = new Block(repository, blockData); + } + // Write the block data to some byte buffers - Block block = new Block(repository, blockData); int blockIndex = bytes.size(); // Write block index to header headerBytes.write(Ints.toByteArray(blockIndex)); // Write block height bytes.write(Ints.toByteArray(block.getBlockData().getHeight())); - byte[] blockBytes = BlockTransformer.toBytes(block); + + // Get serialized block bytes + byte[] blockBytes; + switch (serializationVersion) { + case 1: + blockBytes = BlockTransformer.toBytes(block); + break; + + case 2: + blockBytes = BlockTransformer.toBytesV2(block); + break; + + default: + throw new DataException("Invalid serialization version"); + } + // Write block length bytes.write(Ints.toByteArray(blockBytes.length)); // Write block bytes bytes.write(blockBytes); + + // Log every 1000 blocks + if (this.shouldLogProgress && i % 1000 == 0) { + LOGGER.info("Archived up to block height {}. Size of current file: {} bytes", currentHeight, (headerBytes.size() + bytes.size())); + } + i++; } @@ -147,11 +256,10 @@ public class BlockArchiveWriter { // We have enough blocks to create a new file int endHeight = startHeight + i - 1; - int version = 1; String filePath = String.format("%s/%d-%d.dat", archivePath.toString(), startHeight, endHeight); FileOutputStream fileOutputStream = new FileOutputStream(filePath); // Write version number - fileOutputStream.write(Ints.toByteArray(version)); + fileOutputStream.write(Ints.toByteArray(serializationVersion)); // Write start height fileOutputStream.write(Ints.toByteArray(startHeight)); // Write end height @@ -199,4 +307,12 @@ public class BlockArchiveWriter { this.shouldEnforceFileSizeTarget = shouldEnforceFileSizeTarget; } + public void setDataSource(BlockArchiveDataSource dataSource) { + this.dataSource = dataSource; + } + + public void setShouldLogProgress(boolean shouldLogProgress) { + this.shouldLogProgress = shouldLogProgress; + } + } diff --git a/src/main/java/org/qortal/repository/ChatRepository.java b/src/main/java/org/qortal/repository/ChatRepository.java index c4541907..34ad77dd 100644 --- a/src/main/java/org/qortal/repository/ChatRepository.java +++ b/src/main/java/org/qortal/repository/ChatRepository.java @@ -15,7 +15,7 @@ public interface ChatRepository { */ public List getMessagesMatchingCriteria(Long before, Long after, Integer txGroupId, byte[] reference, byte[] chatReferenceBytes, Boolean hasChatReference, - List involving, Integer limit, Integer offset, Boolean reverse) throws DataException; + List involving, String senderAddress, Integer limit, Integer offset, Boolean reverse) throws DataException; public ChatMessage toChatMessage(ChatTransactionData chatTransactionData) throws DataException; diff --git a/src/main/java/org/qortal/repository/RepositoryManager.java b/src/main/java/org/qortal/repository/RepositoryManager.java index 983404c1..6d1f361e 100644 --- a/src/main/java/org/qortal/repository/RepositoryManager.java +++ b/src/main/java/org/qortal/repository/RepositoryManager.java @@ -3,10 +3,6 @@ package org.qortal.repository; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.qortal.data.transaction.TransactionData; -import org.qortal.gui.SplashFrame; -import org.qortal.repository.hsqldb.HSQLDBDatabaseArchiving; -import org.qortal.repository.hsqldb.HSQLDBDatabasePruning; -import org.qortal.repository.hsqldb.HSQLDBRepository; import org.qortal.settings.Settings; import org.qortal.transaction.Transaction; @@ -65,63 +61,6 @@ public abstract class RepositoryManager { // Backup is best-effort so don't complain } } - - public static boolean archive(Repository repository) { - if (Settings.getInstance().isLite()) { - // Lite nodes have no blockchain - return false; - } - - // Bulk archive the database the first time we use archive mode - if (Settings.getInstance().isArchiveEnabled()) { - if (RepositoryManager.canArchiveOrPrune()) { - try { - return HSQLDBDatabaseArchiving.buildBlockArchive(repository, BlockArchiveWriter.DEFAULT_FILE_SIZE_TARGET); - - } catch (DataException e) { - LOGGER.info("Unable to build block archive. The database may have been left in an inconsistent state."); - } - } - else { - LOGGER.info("Unable to build block archive due to missing ATStatesHeightIndex. Bootstrapping is recommended."); - LOGGER.info("To bootstrap, stop the core and delete the db folder, then start the core again."); - SplashFrame.getInstance().updateStatus("Missing index. Bootstrapping is recommended."); - } - } - return false; - } - - public static boolean prune(Repository repository) { - if (Settings.getInstance().isLite()) { - // Lite nodes have no blockchain - return false; - } - - // Bulk prune the database the first time we use top-only or block archive mode - if (Settings.getInstance().isTopOnly() || - Settings.getInstance().isArchiveEnabled()) { - if (RepositoryManager.canArchiveOrPrune()) { - try { - boolean prunedATStates = HSQLDBDatabasePruning.pruneATStates((HSQLDBRepository) repository); - boolean prunedBlocks = HSQLDBDatabasePruning.pruneBlocks((HSQLDBRepository) repository); - - // Perform repository maintenance to shrink the db size down - if (prunedATStates && prunedBlocks) { - HSQLDBDatabasePruning.performMaintenance(repository); - return true; - } - - } catch (SQLException | DataException e) { - LOGGER.info("Unable to bulk prune AT states. The database may have been left in an inconsistent state."); - } - } - else { - LOGGER.info("Unable to prune blocks due to missing ATStatesHeightIndex. Bootstrapping is recommended."); - } - } - return false; - } - public static boolean rebuildTransactionSequences(Repository repository) throws DataException { if (Settings.getInstance().isLite()) { // Lite nodes have no blockchain diff --git a/src/main/java/org/qortal/repository/hsqldb/HSQLDBChatRepository.java b/src/main/java/org/qortal/repository/hsqldb/HSQLDBChatRepository.java index a995a0b3..55467d87 100644 --- a/src/main/java/org/qortal/repository/hsqldb/HSQLDBChatRepository.java +++ b/src/main/java/org/qortal/repository/hsqldb/HSQLDBChatRepository.java @@ -24,7 +24,7 @@ public class HSQLDBChatRepository implements ChatRepository { @Override public List getMessagesMatchingCriteria(Long before, Long after, Integer txGroupId, byte[] referenceBytes, - byte[] chatReferenceBytes, Boolean hasChatReference, List involving, + byte[] chatReferenceBytes, Boolean hasChatReference, List involving, String senderAddress, Integer limit, Integer offset, Boolean reverse) throws DataException { // Check args meet expectations if ((txGroupId != null && involving != null && !involving.isEmpty()) @@ -74,6 +74,11 @@ public class HSQLDBChatRepository implements ChatRepository { whereClauses.add("chat_reference IS NULL"); } + if (senderAddress != null) { + whereClauses.add("sender = ?"); + bindParams.add(senderAddress); + } + if (txGroupId != null) { whereClauses.add("tx_group_id = " + txGroupId); // int safe to use literally whereClauses.add("recipient IS NULL"); diff --git a/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabaseArchiving.java b/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabaseArchiving.java deleted file mode 100644 index 90022b00..00000000 --- a/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabaseArchiving.java +++ /dev/null @@ -1,88 +0,0 @@ -package org.qortal.repository.hsqldb; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.qortal.controller.Controller; -import org.qortal.gui.SplashFrame; -import org.qortal.repository.BlockArchiveWriter; -import org.qortal.repository.DataException; -import org.qortal.repository.Repository; -import org.qortal.repository.RepositoryManager; -import org.qortal.transform.TransformationException; - -import java.io.IOException; - -/** - * - * When switching to an archiving node, we need to archive most of the database contents. - * This involves copying its data into flat files. - * If we do this entirely as a background process, it is very slow and can interfere with syncing. - * However, if we take the approach of doing this in bulk, before starting up the rest of the - * processes, this makes it much faster and less invasive. - * - * From that point, the original background archiving process will run, but can be dialled right down - * so not to interfere with syncing. - * - */ - - -public class HSQLDBDatabaseArchiving { - - private static final Logger LOGGER = LogManager.getLogger(HSQLDBDatabaseArchiving.class); - - - public static boolean buildBlockArchive(Repository repository, long fileSizeTarget) throws DataException { - - // Only build the archive if we haven't already got one that is up to date - boolean upToDate = BlockArchiveWriter.isArchiverUpToDate(repository); - if (upToDate) { - // Already archived - return false; - } - - LOGGER.info("Building block archive - this process could take a while..."); - SplashFrame.getInstance().updateStatus("Building block archive..."); - - final int maximumArchiveHeight = BlockArchiveWriter.getMaxArchiveHeight(repository); - int startHeight = 0; - - while (!Controller.isStopping()) { - try { - BlockArchiveWriter writer = new BlockArchiveWriter(startHeight, maximumArchiveHeight, repository); - writer.setFileSizeTarget(fileSizeTarget); - BlockArchiveWriter.BlockArchiveWriteResult result = writer.write(); - switch (result) { - case OK: - // Increment block archive height - startHeight = writer.getLastWrittenHeight() + 1; - repository.getBlockArchiveRepository().setBlockArchiveHeight(startHeight); - repository.saveChanges(); - break; - - case STOPPING: - return false; - - case NOT_ENOUGH_BLOCKS: - // We've reached the limit of the blocks we can archive - // Return from the whole method - return true; - - case BLOCK_NOT_FOUND: - // We tried to archive a block that didn't exist. This is a major failure and likely means - // that a bootstrap or re-sync is needed. Return rom the method - LOGGER.info("Error: block not found when building archive. If this error persists, " + - "a bootstrap or re-sync may be needed."); - return false; - } - - } catch (IOException | TransformationException | InterruptedException e) { - LOGGER.info("Caught exception when creating block cache", e); - return false; - } - } - - // If we got this far then something went wrong (most likely the app is stopping) - return false; - } - -} diff --git a/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabasePruning.java b/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabasePruning.java deleted file mode 100644 index e2bfc9ef..00000000 --- a/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabasePruning.java +++ /dev/null @@ -1,332 +0,0 @@ -package org.qortal.repository.hsqldb; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.qortal.controller.Controller; -import org.qortal.data.block.BlockData; -import org.qortal.gui.SplashFrame; -import org.qortal.repository.BlockArchiveWriter; -import org.qortal.repository.DataException; -import org.qortal.repository.Repository; -import org.qortal.settings.Settings; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.concurrent.TimeoutException; - -/** - * - * When switching from a full node to a pruning node, we need to delete most of the database contents. - * If we do this entirely as a background process, it is very slow and can interfere with syncing. - * However, if we take the approach of transferring only the necessary rows to a new table and then - * deleting the original table, this makes the process much faster. It was taking several days to - * delete the AT states in the background, but only a couple of minutes to copy them to a new table. - * - * The trade off is that we have to go through a form of "reshape" when starting the app for the first - * time after enabling pruning mode. But given that this is an opt-in mode, I don't think it will be - * a problem. - * - * Once the pruning is complete, it automatically performs a CHECKPOINT DEFRAG in order to - * shrink the database file size down to a fraction of what it was before. - * - * From this point, the original background process will run, but can be dialled right down so not - * to interfere with syncing. - * - */ - - -public class HSQLDBDatabasePruning { - - private static final Logger LOGGER = LogManager.getLogger(HSQLDBDatabasePruning.class); - - - public static boolean pruneATStates(HSQLDBRepository repository) throws SQLException, DataException { - - // Only bulk prune AT states if we have never done so before - int pruneHeight = repository.getATRepository().getAtPruneHeight(); - if (pruneHeight > 0) { - // Already pruned AT states - return false; - } - - if (Settings.getInstance().isArchiveEnabled()) { - // Only proceed if we can see that the archiver has already finished - // This way, if the archiver failed for any reason, we can prune once it has had - // some opportunities to try again - boolean upToDate = BlockArchiveWriter.isArchiverUpToDate(repository); - if (!upToDate) { - return false; - } - } - - LOGGER.info("Starting bulk prune of AT states - this process could take a while... " + - "(approx. 2 mins on high spec, or upwards of 30 mins in some cases)"); - SplashFrame.getInstance().updateStatus("Pruning database (takes up to 30 mins)..."); - - // Create new AT-states table to hold smaller dataset - repository.executeCheckedUpdate("DROP TABLE IF EXISTS ATStatesNew"); - repository.executeCheckedUpdate("CREATE TABLE ATStatesNew (" - + "AT_address QortalAddress, height INTEGER NOT NULL, state_hash ATStateHash NOT NULL, " - + "fees QortalAmount NOT NULL, is_initial BOOLEAN NOT NULL, sleep_until_message_timestamp BIGINT, " - + "PRIMARY KEY (AT_address, height), " - + "FOREIGN KEY (AT_address) REFERENCES ATs (AT_address) ON DELETE CASCADE)"); - repository.executeCheckedUpdate("SET TABLE ATStatesNew NEW SPACE"); - repository.executeCheckedUpdate("CHECKPOINT"); - - // Add a height index - LOGGER.info("Adding index to AT states table..."); - repository.executeCheckedUpdate("CREATE INDEX IF NOT EXISTS ATStatesNewHeightIndex ON ATStatesNew (height)"); - repository.executeCheckedUpdate("CHECKPOINT"); - - - // Find our latest block - BlockData latestBlock = repository.getBlockRepository().getLastBlock(); - if (latestBlock == null) { - LOGGER.info("Unable to determine blockchain height, necessary for bulk block pruning"); - return false; - } - - // Calculate some constants for later use - final int blockchainHeight = latestBlock.getHeight(); - int maximumBlockToTrim = blockchainHeight - Settings.getInstance().getPruneBlockLimit(); - if (Settings.getInstance().isArchiveEnabled()) { - // Archive mode - don't prune anything that hasn't been archived yet - maximumBlockToTrim = Math.min(maximumBlockToTrim, repository.getBlockArchiveRepository().getBlockArchiveHeight() - 1); - } - final int endHeight = blockchainHeight; - final int blockStep = 10000; - - - // It's essential that we rebuild the latest AT states here, as we are using this data in the next query. - // Failing to do this will result in important AT states being deleted, rendering the database unusable. - repository.getATRepository().rebuildLatestAtStates(endHeight); - - - // Loop through all the LatestATStates and copy them to the new table - LOGGER.info("Copying AT states..."); - for (int height = 0; height < endHeight; height += blockStep) { - final int batchEndHeight = height + blockStep - 1; - //LOGGER.info(String.format("Copying AT states between %d and %d...", height, batchEndHeight)); - - String sql = "SELECT height, AT_address FROM LatestATStates WHERE height BETWEEN ? AND ?"; - try (ResultSet latestAtStatesResultSet = repository.checkedExecute(sql, height, batchEndHeight)) { - if (latestAtStatesResultSet != null) { - do { - int latestAtHeight = latestAtStatesResultSet.getInt(1); - String latestAtAddress = latestAtStatesResultSet.getString(2); - - // Copy this latest ATState to the new table - //LOGGER.info(String.format("Copying AT %s at height %d...", latestAtAddress, latestAtHeight)); - try { - String updateSql = "INSERT INTO ATStatesNew (" - + "SELECT AT_address, height, state_hash, fees, is_initial, sleep_until_message_timestamp " - + "FROM ATStates " - + "WHERE height = ? AND AT_address = ?)"; - repository.executeCheckedUpdate(updateSql, latestAtHeight, latestAtAddress); - } catch (SQLException e) { - repository.examineException(e); - throw new DataException("Unable to copy ATStates", e); - } - - // If this batch includes blocks after the maximum block to trim, we will need to copy - // each of its AT states above maximumBlockToTrim as they are considered "recent". We - // need to do this for _all_ AT states in these blocks, regardless of their latest state. - if (batchEndHeight >= maximumBlockToTrim) { - // Now copy this AT's states for each recent block they are present in - for (int i = maximumBlockToTrim; i < endHeight; i++) { - if (latestAtHeight < i) { - // This AT finished before this block so there is nothing to copy - continue; - } - - //LOGGER.info(String.format("Copying recent AT %s at height %d...", latestAtAddress, i)); - try { - // Copy each LatestATState to the new table - String updateSql = "INSERT IGNORE INTO ATStatesNew (" - + "SELECT AT_address, height, state_hash, fees, is_initial, sleep_until_message_timestamp " - + "FROM ATStates " - + "WHERE height = ? AND AT_address = ?)"; - repository.executeCheckedUpdate(updateSql, i, latestAtAddress); - } catch (SQLException e) { - repository.examineException(e); - throw new DataException("Unable to copy ATStates", e); - } - } - } - repository.saveChanges(); - - } while (latestAtStatesResultSet.next()); - } - } catch (SQLException e) { - throw new DataException("Unable to copy AT states", e); - } - } - - - // Finally, drop the original table and rename - LOGGER.info("Deleting old AT states..."); - repository.executeCheckedUpdate("DROP TABLE ATStates"); - repository.executeCheckedUpdate("ALTER TABLE ATStatesNew RENAME TO ATStates"); - repository.executeCheckedUpdate("ALTER INDEX ATStatesNewHeightIndex RENAME TO ATStatesHeightIndex"); - repository.executeCheckedUpdate("CHECKPOINT"); - - // Update the prune height - int nextPruneHeight = maximumBlockToTrim + 1; - repository.getATRepository().setAtPruneHeight(nextPruneHeight); - repository.saveChanges(); - - repository.executeCheckedUpdate("CHECKPOINT"); - - // Now prune/trim the ATStatesData, as this currently goes back over a month - return HSQLDBDatabasePruning.pruneATStateData(repository); - } - - /* - * Bulk prune ATStatesData to catch up with the now pruned ATStates table - * This uses the existing AT States trimming code but with a much higher end block - */ - private static boolean pruneATStateData(Repository repository) throws DataException { - - if (Settings.getInstance().isArchiveEnabled()) { - // Don't prune ATStatesData in archive mode - return true; - } - - BlockData latestBlock = repository.getBlockRepository().getLastBlock(); - if (latestBlock == null) { - LOGGER.info("Unable to determine blockchain height, necessary for bulk ATStatesData pruning"); - return false; - } - final int blockchainHeight = latestBlock.getHeight(); - int upperPrunableHeight = blockchainHeight - Settings.getInstance().getPruneBlockLimit(); - // ATStateData is already trimmed - so carry on from where we left off in the past - int pruneStartHeight = repository.getATRepository().getAtTrimHeight(); - - LOGGER.info("Starting bulk prune of AT states data - this process could take a while... (approx. 3 mins on high spec)"); - - while (pruneStartHeight < upperPrunableHeight) { - // Prune all AT state data up until our latest minus pruneBlockLimit (or our archive height) - - if (Controller.isStopping()) { - return false; - } - - // Override batch size in the settings because this is a one-off process - final int batchSize = 1000; - final int rowLimitPerBatch = 50000; - int upperBatchHeight = pruneStartHeight + batchSize; - int upperPruneHeight = Math.min(upperBatchHeight, upperPrunableHeight); - - LOGGER.trace(String.format("Pruning AT states data between %d and %d...", pruneStartHeight, upperPruneHeight)); - - int numATStatesPruned = repository.getATRepository().trimAtStates(pruneStartHeight, upperPruneHeight, rowLimitPerBatch); - repository.saveChanges(); - - if (numATStatesPruned > 0) { - LOGGER.trace(String.format("Pruned %d AT states data rows between blocks %d and %d", - numATStatesPruned, pruneStartHeight, upperPruneHeight)); - } else { - repository.getATRepository().setAtTrimHeight(upperBatchHeight); - // No need to rebuild the latest AT states as we aren't currently synchronizing - repository.saveChanges(); - LOGGER.debug(String.format("Bumping AT states trim height to %d", upperBatchHeight)); - - // Can we move onto next batch? - if (upperPrunableHeight > upperBatchHeight) { - pruneStartHeight = upperBatchHeight; - } - else { - // We've finished pruning - break; - } - } - } - - return true; - } - - public static boolean pruneBlocks(Repository repository) throws SQLException, DataException { - - // Only bulk prune AT states if we have never done so before - int pruneHeight = repository.getBlockRepository().getBlockPruneHeight(); - if (pruneHeight > 0) { - // Already pruned blocks - return false; - } - - if (Settings.getInstance().isArchiveEnabled()) { - // Only proceed if we can see that the archiver has already finished - // This way, if the archiver failed for any reason, we can prune once it has had - // some opportunities to try again - boolean upToDate = BlockArchiveWriter.isArchiverUpToDate(repository); - if (!upToDate) { - return false; - } - } - - BlockData latestBlock = repository.getBlockRepository().getLastBlock(); - if (latestBlock == null) { - LOGGER.info("Unable to determine blockchain height, necessary for bulk block pruning"); - return false; - } - final int blockchainHeight = latestBlock.getHeight(); - int upperPrunableHeight = blockchainHeight - Settings.getInstance().getPruneBlockLimit(); - int pruneStartHeight = 0; - - if (Settings.getInstance().isArchiveEnabled()) { - // Archive mode - don't prune anything that hasn't been archived yet - upperPrunableHeight = Math.min(upperPrunableHeight, repository.getBlockArchiveRepository().getBlockArchiveHeight() - 1); - } - - LOGGER.info("Starting bulk prune of blocks - this process could take a while... (approx. 5 mins on high spec)"); - - while (pruneStartHeight < upperPrunableHeight) { - // Prune all blocks up until our latest minus pruneBlockLimit - - int upperBatchHeight = pruneStartHeight + Settings.getInstance().getBlockPruneBatchSize(); - int upperPruneHeight = Math.min(upperBatchHeight, upperPrunableHeight); - - LOGGER.info(String.format("Pruning blocks between %d and %d...", pruneStartHeight, upperPruneHeight)); - - int numBlocksPruned = repository.getBlockRepository().pruneBlocks(pruneStartHeight, upperPruneHeight); - repository.saveChanges(); - - if (numBlocksPruned > 0) { - LOGGER.info(String.format("Pruned %d block%s between %d and %d", - numBlocksPruned, (numBlocksPruned != 1 ? "s" : ""), - pruneStartHeight, upperPruneHeight)); - } else { - final int nextPruneHeight = upperPruneHeight + 1; - repository.getBlockRepository().setBlockPruneHeight(nextPruneHeight); - repository.saveChanges(); - LOGGER.debug(String.format("Bumping block base prune height to %d", nextPruneHeight)); - - // Can we move onto next batch? - if (upperPrunableHeight > nextPruneHeight) { - pruneStartHeight = nextPruneHeight; - } - else { - // We've finished pruning - break; - } - } - } - - return true; - } - - public static void performMaintenance(Repository repository) throws SQLException, DataException { - try { - SplashFrame.getInstance().updateStatus("Performing maintenance..."); - - // Timeout if the database isn't ready for backing up after 5 minutes - // Nothing else should be using the db at this point, so a timeout shouldn't happen - long timeout = 5 * 60 * 1000L; - repository.performPeriodicMaintenance(timeout); - - } catch (TimeoutException e) { - LOGGER.info("Attempt to perform maintenance failed due to timeout: {}", e.getMessage()); - } - } - -} diff --git a/src/main/java/org/qortal/settings/Settings.java b/src/main/java/org/qortal/settings/Settings.java index ae5dc173..c6c49c1f 100644 --- a/src/main/java/org/qortal/settings/Settings.java +++ b/src/main/java/org/qortal/settings/Settings.java @@ -178,6 +178,8 @@ public class Settings { private boolean archiveEnabled = true; /** How often to attempt archiving (ms). */ private long archiveInterval = 7171L; // milliseconds + /** Serialization version to use when building an archive */ + private int defaultArchiveVersion = 1; /** Whether to automatically bootstrap instead of syncing from genesis */ @@ -273,6 +275,7 @@ public class Settings { private String[] bootstrapHosts = new String[] { "http://bootstrap.qortal.org", "http://bootstrap2.qortal.org", + "http://bootstrap3.qortal.org", "http://bootstrap.qortal.online" }; @@ -926,6 +929,10 @@ public class Settings { return this.archiveInterval; } + public int getDefaultArchiveVersion() { + return this.defaultArchiveVersion; + } + public boolean getBootstrap() { return this.bootstrap; diff --git a/src/main/java/org/qortal/transaction/ArbitraryTransaction.java b/src/main/java/org/qortal/transaction/ArbitraryTransaction.java index 50d8ccad..3452f916 100644 --- a/src/main/java/org/qortal/transaction/ArbitraryTransaction.java +++ b/src/main/java/org/qortal/transaction/ArbitraryTransaction.java @@ -9,6 +9,7 @@ import org.qortal.account.Account; import org.qortal.block.BlockChain; import org.qortal.controller.arbitrary.ArbitraryDataManager; import org.qortal.controller.arbitrary.ArbitraryDataStorageManager; +import org.qortal.controller.repository.NamesDatabaseIntegrityCheck; import org.qortal.crypto.Crypto; import org.qortal.crypto.MemoryPoW; import org.qortal.data.PaymentData; @@ -87,6 +88,12 @@ public class ArbitraryTransaction extends Transaction { if (this.transactionData.getFee() < 0) return ValidationResult.NEGATIVE_FEE; + // After the feature trigger, we require the fee to be sufficient if it's not 0. + // If the fee is zero, then the nonce is validated in isSignatureValid() as an alternative to a fee + if (this.arbitraryTransactionData.getTimestamp() >= BlockChain.getInstance().getArbitraryOptionalFeeTimestamp() && this.arbitraryTransactionData.getFee() != 0L) { + return super.isFeeValid(); + } + return ValidationResult.OK; } @@ -207,10 +214,14 @@ public class ArbitraryTransaction extends Transaction { // Clear nonce from transactionBytes ArbitraryTransactionTransformer.clearNonce(transactionBytes); - // We only need to check nonce for recent transactions due to PoW verification overhead - if (NTP.getTime() - this.arbitraryTransactionData.getTimestamp() < HISTORIC_THRESHOLD) { - int difficulty = ArbitraryDataManager.getInstance().getPowDifficulty(); - return MemoryPoW.verify2(transactionBytes, POW_BUFFER_SIZE, difficulty, nonce); + // As of feature-trigger timestamp, we only require a nonce when the fee is zero + boolean beforeFeatureTrigger = this.arbitraryTransactionData.getTimestamp() < BlockChain.getInstance().getArbitraryOptionalFeeTimestamp(); + if (beforeFeatureTrigger || this.arbitraryTransactionData.getFee() == 0L) { + // We only need to check nonce for recent transactions due to PoW verification overhead + if (NTP.getTime() - this.arbitraryTransactionData.getTimestamp() < HISTORIC_THRESHOLD) { + int difficulty = ArbitraryDataManager.getInstance().getPowDifficulty(); + return MemoryPoW.verify2(transactionBytes, POW_BUFFER_SIZE, difficulty, nonce); + } } } @@ -241,7 +252,15 @@ public class ArbitraryTransaction extends Transaction { @Override public void preProcess() throws DataException { - // Nothing to do + ArbitraryTransactionData arbitraryTransactionData = (ArbitraryTransactionData) transactionData; + if (arbitraryTransactionData.getName() == null) + return; + + // Rebuild this name in the Names table from the transaction history + // This is necessary because in some rare cases names can be missing from the Names table after registration + // but we have been unable to reproduce the issue and track down the root cause + NamesDatabaseIntegrityCheck namesDatabaseIntegrityCheck = new NamesDatabaseIntegrityCheck(); + namesDatabaseIntegrityCheck.rebuildName(arbitraryTransactionData.getName(), this.repository); } @Override diff --git a/src/main/java/org/qortal/transform/block/BlockTransformer.java b/src/main/java/org/qortal/transform/block/BlockTransformer.java index c97aa090..15445327 100644 --- a/src/main/java/org/qortal/transform/block/BlockTransformer.java +++ b/src/main/java/org/qortal/transform/block/BlockTransformer.java @@ -312,16 +312,24 @@ public class BlockTransformer extends Transformer { ByteArrayOutputStream atHashBytes = new ByteArrayOutputStream(atBytesLength); long atFees = 0; - for (ATStateData atStateData : block.getATStates()) { - // Skip initial states generated by DEPLOY_AT transactions in the same block - if (atStateData.isInitial()) - continue; + if (block.getAtStatesHash() != null) { + // We already have the AT states hash + atFees = blockData.getATFees(); + atHashBytes.write(block.getAtStatesHash()); + } + else { + // We need to build the AT states hash + for (ATStateData atStateData : block.getATStates()) { + // Skip initial states generated by DEPLOY_AT transactions in the same block + if (atStateData.isInitial()) + continue; - atHashBytes.write(atStateData.getATAddress().getBytes(StandardCharsets.UTF_8)); - atHashBytes.write(atStateData.getStateHash()); - atHashBytes.write(Longs.toByteArray(atStateData.getFees())); + atHashBytes.write(atStateData.getATAddress().getBytes(StandardCharsets.UTF_8)); + atHashBytes.write(atStateData.getStateHash()); + atHashBytes.write(Longs.toByteArray(atStateData.getFees())); - atFees += atStateData.getFees(); + atFees += atStateData.getFees(); + } } bytes.write(Ints.toByteArray(blockData.getATCount())); diff --git a/src/main/java/org/qortal/utils/BlockArchiveUtils.java b/src/main/java/org/qortal/utils/BlockArchiveUtils.java index 84de1a31..807faef9 100644 --- a/src/main/java/org/qortal/utils/BlockArchiveUtils.java +++ b/src/main/java/org/qortal/utils/BlockArchiveUtils.java @@ -21,6 +21,16 @@ public class BlockArchiveUtils { * into the HSQLDB, in order to make it SQL-compatible * again. *

+ * This is only fully compatible with archives that use + * serialization version 1. For version 2 (or above), + * we are unable to import individual AT states as we + * only have a single combined hash, so the use cases + * for this are greatly limited. + *

+ * A version 1 archive should ultimately be rebuildable + * via a resync or reindex from genesis, allowing + * access to this feature once again. + *

* Note: calls discardChanges() and saveChanges(), so * make sure that you commit any existing repository * changes before calling this method. @@ -61,9 +71,18 @@ public class BlockArchiveUtils { repository.getBlockRepository().save(blockInfo.getBlockData()); // Save AT state data hashes - for (ATStateData atStateData : blockInfo.getAtStates()) { - atStateData.setHeight(blockInfo.getBlockData().getHeight()); - repository.getATRepository().save(atStateData); + if (blockInfo.getAtStates() != null) { + for (ATStateData atStateData : blockInfo.getAtStates()) { + atStateData.setHeight(blockInfo.getBlockData().getHeight()); + repository.getATRepository().save(atStateData); + } + } + else { + // We don't have AT state hashes, so we are only importing a partial state. + // This can still be useful to allow orphaning to very old blocks, when we + // need to access other chainstate info (such as balances) at an earlier block. + // In order to do this, the orphan process must be temporarily adjusted to avoid + // orphaning AT states, as it will otherwise fail due to having no previous state. } } catch (DataException e) { diff --git a/src/main/resources/blockchain.json b/src/main/resources/blockchain.json index 46b4b4f9..7ce93a28 100644 --- a/src/main/resources/blockchain.json +++ b/src/main/resources/blockchain.json @@ -85,7 +85,8 @@ "onlineAccountMinterLevelValidationHeight": 1092000, "selfSponsorshipAlgoV1Height": 1092400, "feeValidationFixTimestamp": 1671918000000, - "chatReferenceTimestamp": 1674316800000 + "chatReferenceTimestamp": 1674316800000, + "arbitraryOptionalFeeTimestamp": 9999999999999 }, "checkpoints": [ { "height": 1136300, "signature": "3BbwawEF2uN8Ni5ofpJXkukoU8ctAPxYoFB7whq9pKfBnjfZcpfEJT4R95NvBDoTP8WDyWvsUvbfHbcr9qSZuYpSKZjUQTvdFf6eqznHGEwhZApWfvXu6zjGCxYCp65F4jsVYYJjkzbjmkCg5WAwN5voudngA23kMK6PpTNygapCzXt" } diff --git a/src/test/java/org/qortal/test/BlockArchiveTests.java b/src/test/java/org/qortal/test/BlockArchiveV1Tests.java similarity index 69% rename from src/test/java/org/qortal/test/BlockArchiveTests.java rename to src/test/java/org/qortal/test/BlockArchiveV1Tests.java index 8b3de67b..a28bd28d 100644 --- a/src/test/java/org/qortal/test/BlockArchiveTests.java +++ b/src/test/java/org/qortal/test/BlockArchiveV1Tests.java @@ -1,6 +1,7 @@ package org.qortal.test; import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.reflect.FieldUtils; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -10,8 +11,6 @@ import org.qortal.data.at.ATStateData; import org.qortal.data.block.BlockData; import org.qortal.data.transaction.TransactionData; import org.qortal.repository.*; -import org.qortal.repository.hsqldb.HSQLDBDatabaseArchiving; -import org.qortal.repository.hsqldb.HSQLDBDatabasePruning; import org.qortal.repository.hsqldb.HSQLDBRepository; import org.qortal.settings.Settings; import org.qortal.test.common.AtUtils; @@ -26,7 +25,6 @@ import org.qortal.utils.NTP; import java.io.File; import java.io.IOException; -import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.sql.SQLException; @@ -34,13 +32,16 @@ import java.util.List; import static org.junit.Assert.*; -public class BlockArchiveTests extends Common { +public class BlockArchiveV1Tests extends Common { @Before - public void beforeTest() throws DataException { + public void beforeTest() throws DataException, IllegalAccessException { Common.useSettings("test-settings-v2-block-archive.json"); NTP.setFixedOffset(Settings.getInstance().getTestNtpOffset()); this.deleteArchiveDirectory(); + + // Set default archive version to 1, so that archive builds in these tests use V2 + FieldUtils.writeField(Settings.getInstance(), "defaultArchiveVersion", 1, true); } @After @@ -333,212 +334,6 @@ public class BlockArchiveTests extends Common { } } - @Test - public void testBulkArchiveAndPrune() throws DataException, SQLException { - try (final Repository repository = RepositoryManager.getRepository()) { - HSQLDBRepository hsqldb = (HSQLDBRepository) repository; - - // Deploy an AT so that we have AT state data - PrivateKeyAccount deployer = Common.getTestAccount(repository, "alice"); - byte[] creationBytes = AtUtils.buildSimpleAT(); - long fundingAmount = 1_00000000L; - AtUtils.doDeployAT(repository, deployer, creationBytes, fundingAmount); - - // Mint some blocks so that we are able to archive them later - for (int i = 0; i < 1000; i++) { - BlockMinter.mintTestingBlock(repository, Common.getTestAccount(repository, "alice-reward-share")); - } - - // Assume 900 blocks are trimmed (this specifies the first untrimmed height) - repository.getBlockRepository().setOnlineAccountsSignaturesTrimHeight(901); - repository.getATRepository().setAtTrimHeight(901); - - // Check the max archive height - this should be one less than the first untrimmed height - final int maximumArchiveHeight = BlockArchiveWriter.getMaxArchiveHeight(repository); - assertEquals(900, maximumArchiveHeight); - - // Check the current archive height - assertEquals(0, repository.getBlockArchiveRepository().getBlockArchiveHeight()); - - // Write blocks 2-900 to the archive (using bulk method) - int fileSizeTarget = 428600; // Pre-calculated size of 900 blocks - assertTrue(HSQLDBDatabaseArchiving.buildBlockArchive(repository, fileSizeTarget)); - - // Ensure the block archive height has increased - assertEquals(901, repository.getBlockArchiveRepository().getBlockArchiveHeight()); - - // Ensure the SQL repository contains blocks 2 and 900... - assertNotNull(repository.getBlockRepository().fromHeight(2)); - assertNotNull(repository.getBlockRepository().fromHeight(900)); - - // Check the current prune heights - assertEquals(0, repository.getBlockRepository().getBlockPruneHeight()); - assertEquals(0, repository.getATRepository().getAtPruneHeight()); - - // Prior to archiving or pruning, ensure blocks 2 to 1002 and their AT states are available in the db - for (int i=2; i<=1002; i++) { - assertNotNull(repository.getBlockRepository().fromHeight(i)); - List atStates = repository.getATRepository().getBlockATStatesAtHeight(i); - assertNotNull(atStates); - assertEquals(1, atStates.size()); - } - - // Prune all the archived blocks and AT states (using bulk method) - assertTrue(HSQLDBDatabasePruning.pruneBlocks(hsqldb)); - assertTrue(HSQLDBDatabasePruning.pruneATStates(hsqldb)); - - // Ensure the current prune heights have increased - assertEquals(901, repository.getBlockRepository().getBlockPruneHeight()); - assertEquals(901, repository.getATRepository().getAtPruneHeight()); - - // Now ensure the SQL repository is missing blocks 2 and 900... - assertNull(repository.getBlockRepository().fromHeight(2)); - assertNull(repository.getBlockRepository().fromHeight(900)); - - // ... but it's not missing blocks 1 and 901 (we don't prune the genesis block) - assertNotNull(repository.getBlockRepository().fromHeight(1)); - assertNotNull(repository.getBlockRepository().fromHeight(901)); - - // Validate the latest block height in the repository - assertEquals(1002, (int) repository.getBlockRepository().getLastBlock().getHeight()); - - // Ensure blocks 2-900 are all available in the archive - for (int i=2; i<=900; i++) { - assertNotNull(repository.getBlockArchiveRepository().fromHeight(i)); - } - - // Ensure blocks 2-900 are NOT available in the db - for (int i=2; i<=900; i++) { - assertNull(repository.getBlockRepository().fromHeight(i)); - } - - // Ensure blocks 901 to 1002 and their AT states are available in the db - for (int i=901; i<=1002; i++) { - assertNotNull(repository.getBlockRepository().fromHeight(i)); - List atStates = repository.getATRepository().getBlockATStatesAtHeight(i); - assertNotNull(atStates); - assertEquals(1, atStates.size()); - } - - // Ensure blocks 901 to 1002 are not available in the archive - for (int i=901; i<=1002; i++) { - assertNull(repository.getBlockArchiveRepository().fromHeight(i)); - } - } - } - - @Test - public void testBulkArchiveAndPruneMultipleFiles() throws DataException, SQLException { - try (final Repository repository = RepositoryManager.getRepository()) { - HSQLDBRepository hsqldb = (HSQLDBRepository) repository; - - // Deploy an AT so that we have AT state data - PrivateKeyAccount deployer = Common.getTestAccount(repository, "alice"); - byte[] creationBytes = AtUtils.buildSimpleAT(); - long fundingAmount = 1_00000000L; - AtUtils.doDeployAT(repository, deployer, creationBytes, fundingAmount); - - // Mint some blocks so that we are able to archive them later - for (int i = 0; i < 1000; i++) { - BlockMinter.mintTestingBlock(repository, Common.getTestAccount(repository, "alice-reward-share")); - } - - // Assume 900 blocks are trimmed (this specifies the first untrimmed height) - repository.getBlockRepository().setOnlineAccountsSignaturesTrimHeight(901); - repository.getATRepository().setAtTrimHeight(901); - - // Check the max archive height - this should be one less than the first untrimmed height - final int maximumArchiveHeight = BlockArchiveWriter.getMaxArchiveHeight(repository); - assertEquals(900, maximumArchiveHeight); - - // Check the current archive height - assertEquals(0, repository.getBlockArchiveRepository().getBlockArchiveHeight()); - - // Write blocks 2-900 to the archive (using bulk method) - int fileSizeTarget = 42360; // Pre-calculated size of approx 90 blocks - assertTrue(HSQLDBDatabaseArchiving.buildBlockArchive(repository, fileSizeTarget)); - - // Ensure 10 archive files have been created - Path archivePath = Paths.get(Settings.getInstance().getRepositoryPath(), "archive"); - assertEquals(10, new File(archivePath.toString()).list().length); - - // Check the files exist - assertTrue(Files.exists(Paths.get(archivePath.toString(), "2-90.dat"))); - assertTrue(Files.exists(Paths.get(archivePath.toString(), "91-179.dat"))); - assertTrue(Files.exists(Paths.get(archivePath.toString(), "180-268.dat"))); - assertTrue(Files.exists(Paths.get(archivePath.toString(), "269-357.dat"))); - assertTrue(Files.exists(Paths.get(archivePath.toString(), "358-446.dat"))); - assertTrue(Files.exists(Paths.get(archivePath.toString(), "447-535.dat"))); - assertTrue(Files.exists(Paths.get(archivePath.toString(), "536-624.dat"))); - assertTrue(Files.exists(Paths.get(archivePath.toString(), "625-713.dat"))); - assertTrue(Files.exists(Paths.get(archivePath.toString(), "714-802.dat"))); - assertTrue(Files.exists(Paths.get(archivePath.toString(), "803-891.dat"))); - - // Ensure the block archive height has increased - // It won't be as high as 901, because blocks 892-901 were too small to reach the file size - // target of the 11th file - assertEquals(892, repository.getBlockArchiveRepository().getBlockArchiveHeight()); - - // Ensure the SQL repository contains blocks 2 and 891... - assertNotNull(repository.getBlockRepository().fromHeight(2)); - assertNotNull(repository.getBlockRepository().fromHeight(891)); - - // Check the current prune heights - assertEquals(0, repository.getBlockRepository().getBlockPruneHeight()); - assertEquals(0, repository.getATRepository().getAtPruneHeight()); - - // Prior to archiving or pruning, ensure blocks 2 to 1002 and their AT states are available in the db - for (int i=2; i<=1002; i++) { - assertNotNull(repository.getBlockRepository().fromHeight(i)); - List atStates = repository.getATRepository().getBlockATStatesAtHeight(i); - assertNotNull(atStates); - assertEquals(1, atStates.size()); - } - - // Prune all the archived blocks and AT states (using bulk method) - assertTrue(HSQLDBDatabasePruning.pruneBlocks(hsqldb)); - assertTrue(HSQLDBDatabasePruning.pruneATStates(hsqldb)); - - // Ensure the current prune heights have increased - assertEquals(892, repository.getBlockRepository().getBlockPruneHeight()); - assertEquals(892, repository.getATRepository().getAtPruneHeight()); - - // Now ensure the SQL repository is missing blocks 2 and 891... - assertNull(repository.getBlockRepository().fromHeight(2)); - assertNull(repository.getBlockRepository().fromHeight(891)); - - // ... but it's not missing blocks 1 and 901 (we don't prune the genesis block) - assertNotNull(repository.getBlockRepository().fromHeight(1)); - assertNotNull(repository.getBlockRepository().fromHeight(892)); - - // Validate the latest block height in the repository - assertEquals(1002, (int) repository.getBlockRepository().getLastBlock().getHeight()); - - // Ensure blocks 2-891 are all available in the archive - for (int i=2; i<=891; i++) { - assertNotNull(repository.getBlockArchiveRepository().fromHeight(i)); - } - - // Ensure blocks 2-891 are NOT available in the db - for (int i=2; i<=891; i++) { - assertNull(repository.getBlockRepository().fromHeight(i)); - } - - // Ensure blocks 892 to 1002 and their AT states are available in the db - for (int i=892; i<=1002; i++) { - assertNotNull(repository.getBlockRepository().fromHeight(i)); - List atStates = repository.getATRepository().getBlockATStatesAtHeight(i); - assertNotNull(atStates); - assertEquals(1, atStates.size()); - } - - // Ensure blocks 892 to 1002 are not available in the archive - for (int i=892; i<=1002; i++) { - assertNull(repository.getBlockArchiveRepository().fromHeight(i)); - } - } - } - @Test public void testTrimArchivePruneAndOrphan() throws DataException, InterruptedException, TransformationException, IOException { try (final Repository repository = RepositoryManager.getRepository()) { diff --git a/src/test/java/org/qortal/test/BlockArchiveV2Tests.java b/src/test/java/org/qortal/test/BlockArchiveV2Tests.java new file mode 100644 index 00000000..3b1d12d3 --- /dev/null +++ b/src/test/java/org/qortal/test/BlockArchiveV2Tests.java @@ -0,0 +1,504 @@ +package org.qortal.test; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.reflect.FieldUtils; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.qortal.account.PrivateKeyAccount; +import org.qortal.controller.BlockMinter; +import org.qortal.data.at.ATStateData; +import org.qortal.data.block.BlockData; +import org.qortal.data.transaction.TransactionData; +import org.qortal.repository.*; +import org.qortal.repository.hsqldb.HSQLDBRepository; +import org.qortal.settings.Settings; +import org.qortal.test.common.AtUtils; +import org.qortal.test.common.BlockUtils; +import org.qortal.test.common.Common; +import org.qortal.transaction.DeployAtTransaction; +import org.qortal.transaction.Transaction; +import org.qortal.transform.TransformationException; +import org.qortal.transform.block.BlockTransformation; +import org.qortal.utils.BlockArchiveUtils; +import org.qortal.utils.NTP; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.sql.SQLException; +import java.util.List; + +import static org.junit.Assert.*; + +public class BlockArchiveV2Tests extends Common { + + @Before + public void beforeTest() throws DataException, IllegalAccessException { + Common.useSettings("test-settings-v2-block-archive.json"); + NTP.setFixedOffset(Settings.getInstance().getTestNtpOffset()); + this.deleteArchiveDirectory(); + + // Set default archive version to 2, so that archive builds in these tests use V2 + FieldUtils.writeField(Settings.getInstance(), "defaultArchiveVersion", 2, true); + } + + @After + public void afterTest() throws DataException { + this.deleteArchiveDirectory(); + } + + + @Test + public void testWriter() throws DataException, InterruptedException, TransformationException, IOException { + try (final Repository repository = RepositoryManager.getRepository()) { + + // Mint some blocks so that we are able to archive them later + for (int i = 0; i < 1000; i++) { + BlockMinter.mintTestingBlock(repository, Common.getTestAccount(repository, "alice-reward-share")); + } + + // 900 blocks are trimmed (this specifies the first untrimmed height) + repository.getBlockRepository().setOnlineAccountsSignaturesTrimHeight(901); + repository.getATRepository().setAtTrimHeight(901); + + // Check the max archive height - this should be one less than the first untrimmed height + final int maximumArchiveHeight = BlockArchiveWriter.getMaxArchiveHeight(repository); + assertEquals(900, maximumArchiveHeight); + + // Write blocks 2-900 to the archive + BlockArchiveWriter writer = new BlockArchiveWriter(0, maximumArchiveHeight, repository); + writer.setShouldEnforceFileSizeTarget(false); // To avoid the need to pre-calculate file sizes + BlockArchiveWriter.BlockArchiveWriteResult result = writer.write(); + assertEquals(BlockArchiveWriter.BlockArchiveWriteResult.OK, result); + + // Make sure that the archive contains the correct number of blocks + assertEquals(900 - 1, writer.getWrittenCount()); + + // Increment block archive height + repository.getBlockArchiveRepository().setBlockArchiveHeight(writer.getWrittenCount()); + repository.saveChanges(); + assertEquals(900 - 1, repository.getBlockArchiveRepository().getBlockArchiveHeight()); + + // Ensure the file exists + File outputFile = writer.getOutputPath().toFile(); + assertTrue(outputFile.exists()); + } + } + + @Test + public void testWriterAndReader() throws DataException, InterruptedException, TransformationException, IOException { + try (final Repository repository = RepositoryManager.getRepository()) { + + // Mint some blocks so that we are able to archive them later + for (int i = 0; i < 1000; i++) { + BlockMinter.mintTestingBlock(repository, Common.getTestAccount(repository, "alice-reward-share")); + } + + // 900 blocks are trimmed (this specifies the first untrimmed height) + repository.getBlockRepository().setOnlineAccountsSignaturesTrimHeight(901); + repository.getATRepository().setAtTrimHeight(901); + + // Check the max archive height - this should be one less than the first untrimmed height + final int maximumArchiveHeight = BlockArchiveWriter.getMaxArchiveHeight(repository); + assertEquals(900, maximumArchiveHeight); + + // Write blocks 2-900 to the archive + BlockArchiveWriter writer = new BlockArchiveWriter(0, maximumArchiveHeight, repository); + writer.setShouldEnforceFileSizeTarget(false); // To avoid the need to pre-calculate file sizes + BlockArchiveWriter.BlockArchiveWriteResult result = writer.write(); + assertEquals(BlockArchiveWriter.BlockArchiveWriteResult.OK, result); + + // Make sure that the archive contains the correct number of blocks + assertEquals(900 - 1, writer.getWrittenCount()); + + // Increment block archive height + repository.getBlockArchiveRepository().setBlockArchiveHeight(writer.getWrittenCount()); + repository.saveChanges(); + assertEquals(900 - 1, repository.getBlockArchiveRepository().getBlockArchiveHeight()); + + // Ensure the file exists + File outputFile = writer.getOutputPath().toFile(); + assertTrue(outputFile.exists()); + + // Read block 2 from the archive + BlockArchiveReader reader = BlockArchiveReader.getInstance(); + BlockTransformation block2Info = reader.fetchBlockAtHeight(2); + BlockData block2ArchiveData = block2Info.getBlockData(); + + // Read block 2 from the repository + BlockData block2RepositoryData = repository.getBlockRepository().fromHeight(2); + + // Ensure the values match + assertEquals(block2ArchiveData.getHeight(), block2RepositoryData.getHeight()); + assertArrayEquals(block2ArchiveData.getSignature(), block2RepositoryData.getSignature()); + + // Test some values in the archive + assertEquals(1, block2ArchiveData.getOnlineAccountsCount()); + + // Read block 900 from the archive + BlockTransformation block900Info = reader.fetchBlockAtHeight(900); + BlockData block900ArchiveData = block900Info.getBlockData(); + + // Read block 900 from the repository + BlockData block900RepositoryData = repository.getBlockRepository().fromHeight(900); + + // Ensure the values match + assertEquals(block900ArchiveData.getHeight(), block900RepositoryData.getHeight()); + assertArrayEquals(block900ArchiveData.getSignature(), block900RepositoryData.getSignature()); + + // Test some values in the archive + assertEquals(1, block900ArchiveData.getOnlineAccountsCount()); + + } + } + + @Test + public void testArchivedAtStates() throws DataException, InterruptedException, TransformationException, IOException { + try (final Repository repository = RepositoryManager.getRepository()) { + + // Deploy an AT so that we have AT state data + PrivateKeyAccount deployer = Common.getTestAccount(repository, "alice"); + byte[] creationBytes = AtUtils.buildSimpleAT(); + long fundingAmount = 1_00000000L; + DeployAtTransaction deployAtTransaction = AtUtils.doDeployAT(repository, deployer, creationBytes, fundingAmount); + String atAddress = deployAtTransaction.getATAccount().getAddress(); + + // Mint some blocks so that we are able to archive them later + for (int i = 0; i < 1000; i++) { + BlockMinter.mintTestingBlock(repository, Common.getTestAccount(repository, "alice-reward-share")); + } + + // 9 blocks are trimmed (this specifies the first untrimmed height) + repository.getBlockRepository().setOnlineAccountsSignaturesTrimHeight(10); + repository.getATRepository().setAtTrimHeight(10); + + // Check the max archive height + final int maximumArchiveHeight = BlockArchiveWriter.getMaxArchiveHeight(repository); + assertEquals(9, maximumArchiveHeight); + + // Write blocks 2-9 to the archive + BlockArchiveWriter writer = new BlockArchiveWriter(0, maximumArchiveHeight, repository); + writer.setShouldEnforceFileSizeTarget(false); // To avoid the need to pre-calculate file sizes + BlockArchiveWriter.BlockArchiveWriteResult result = writer.write(); + assertEquals(BlockArchiveWriter.BlockArchiveWriteResult.OK, result); + + // Make sure that the archive contains the correct number of blocks + assertEquals(9 - 1, writer.getWrittenCount()); + + // Increment block archive height + repository.getBlockArchiveRepository().setBlockArchiveHeight(writer.getWrittenCount()); + repository.saveChanges(); + assertEquals(9 - 1, repository.getBlockArchiveRepository().getBlockArchiveHeight()); + + // Ensure the file exists + File outputFile = writer.getOutputPath().toFile(); + assertTrue(outputFile.exists()); + + // Check blocks 3-9 + for (Integer testHeight = 2; testHeight <= 9; testHeight++) { + + // Read a block from the archive + BlockArchiveReader reader = BlockArchiveReader.getInstance(); + BlockTransformation blockInfo = reader.fetchBlockAtHeight(testHeight); + BlockData archivedBlockData = blockInfo.getBlockData(); + byte[] archivedAtStateHash = blockInfo.getAtStatesHash(); + List archivedTransactions = blockInfo.getTransactions(); + + // Read the same block from the repository + BlockData repositoryBlockData = repository.getBlockRepository().fromHeight(testHeight); + ATStateData repositoryAtStateData = repository.getATRepository().getATStateAtHeight(atAddress, testHeight); + + // Ensure the repository has full AT state data + assertNotNull(repositoryAtStateData.getStateHash()); + assertNotNull(repositoryAtStateData.getStateData()); + + // Check the archived AT state + if (testHeight == 2) { + assertEquals(1, archivedTransactions.size()); + assertEquals(Transaction.TransactionType.DEPLOY_AT, archivedTransactions.get(0).getType()); + } + else { + // Blocks 3+ shouldn't have any transactions + assertTrue(archivedTransactions.isEmpty()); + } + + // Ensure the archive has the AT states hash + assertNotNull(archivedAtStateHash); + + // Also check the online accounts count and height + assertEquals(1, archivedBlockData.getOnlineAccountsCount()); + assertEquals(testHeight, archivedBlockData.getHeight()); + + // Ensure the values match + assertEquals(archivedBlockData.getHeight(), repositoryBlockData.getHeight()); + assertArrayEquals(archivedBlockData.getSignature(), repositoryBlockData.getSignature()); + assertEquals(archivedBlockData.getOnlineAccountsCount(), repositoryBlockData.getOnlineAccountsCount()); + assertArrayEquals(archivedBlockData.getMinterSignature(), repositoryBlockData.getMinterSignature()); + assertEquals(archivedBlockData.getATCount(), repositoryBlockData.getATCount()); + assertEquals(archivedBlockData.getOnlineAccountsCount(), repositoryBlockData.getOnlineAccountsCount()); + assertArrayEquals(archivedBlockData.getReference(), repositoryBlockData.getReference()); + assertEquals(archivedBlockData.getTimestamp(), repositoryBlockData.getTimestamp()); + assertEquals(archivedBlockData.getATFees(), repositoryBlockData.getATFees()); + assertEquals(archivedBlockData.getTotalFees(), repositoryBlockData.getTotalFees()); + assertEquals(archivedBlockData.getTransactionCount(), repositoryBlockData.getTransactionCount()); + assertArrayEquals(archivedBlockData.getTransactionsSignature(), repositoryBlockData.getTransactionsSignature()); + + // TODO: build atStatesHash and compare against value in archive + } + + // Check block 10 (unarchived) + BlockArchiveReader reader = BlockArchiveReader.getInstance(); + BlockTransformation blockInfo = reader.fetchBlockAtHeight(10); + assertNull(blockInfo); + + } + + } + + @Test + public void testArchiveAndPrune() throws DataException, InterruptedException, TransformationException, IOException { + try (final Repository repository = RepositoryManager.getRepository()) { + + // Deploy an AT so that we have AT state data + PrivateKeyAccount deployer = Common.getTestAccount(repository, "alice"); + byte[] creationBytes = AtUtils.buildSimpleAT(); + long fundingAmount = 1_00000000L; + AtUtils.doDeployAT(repository, deployer, creationBytes, fundingAmount); + + // Mint some blocks so that we are able to archive them later + for (int i = 0; i < 1000; i++) { + BlockMinter.mintTestingBlock(repository, Common.getTestAccount(repository, "alice-reward-share")); + } + + // Assume 900 blocks are trimmed (this specifies the first untrimmed height) + repository.getBlockRepository().setOnlineAccountsSignaturesTrimHeight(901); + repository.getATRepository().setAtTrimHeight(901); + + // Check the max archive height - this should be one less than the first untrimmed height + final int maximumArchiveHeight = BlockArchiveWriter.getMaxArchiveHeight(repository); + assertEquals(900, maximumArchiveHeight); + + // Write blocks 2-900 to the archive + BlockArchiveWriter writer = new BlockArchiveWriter(0, maximumArchiveHeight, repository); + writer.setShouldEnforceFileSizeTarget(false); // To avoid the need to pre-calculate file sizes + BlockArchiveWriter.BlockArchiveWriteResult result = writer.write(); + assertEquals(BlockArchiveWriter.BlockArchiveWriteResult.OK, result); + + // Make sure that the archive contains the correct number of blocks + assertEquals(900 - 1, writer.getWrittenCount()); + + // Increment block archive height + repository.getBlockArchiveRepository().setBlockArchiveHeight(901); + repository.saveChanges(); + assertEquals(901, repository.getBlockArchiveRepository().getBlockArchiveHeight()); + + // Ensure the file exists + File outputFile = writer.getOutputPath().toFile(); + assertTrue(outputFile.exists()); + + // Ensure the SQL repository contains blocks 2 and 900... + assertNotNull(repository.getBlockRepository().fromHeight(2)); + assertNotNull(repository.getBlockRepository().fromHeight(900)); + + // Prune all the archived blocks + int numBlocksPruned = repository.getBlockRepository().pruneBlocks(0, 900); + assertEquals(900-1, numBlocksPruned); + repository.getBlockRepository().setBlockPruneHeight(901); + + // Prune the AT states for the archived blocks + repository.getATRepository().rebuildLatestAtStates(900); + repository.saveChanges(); + int numATStatesPruned = repository.getATRepository().pruneAtStates(0, 900); + assertEquals(900-2, numATStatesPruned); // Minus 1 for genesis block, and another for the latest AT state + repository.getATRepository().setAtPruneHeight(901); + + // Now ensure the SQL repository is missing blocks 2 and 900... + assertNull(repository.getBlockRepository().fromHeight(2)); + assertNull(repository.getBlockRepository().fromHeight(900)); + + // ... but it's not missing blocks 1 and 901 (we don't prune the genesis block) + assertNotNull(repository.getBlockRepository().fromHeight(1)); + assertNotNull(repository.getBlockRepository().fromHeight(901)); + + // Validate the latest block height in the repository + assertEquals(1002, (int) repository.getBlockRepository().getLastBlock().getHeight()); + + } + } + + @Test + public void testTrimArchivePruneAndOrphan() throws DataException, InterruptedException, TransformationException, IOException { + try (final Repository repository = RepositoryManager.getRepository()) { + + // Deploy an AT so that we have AT state data + PrivateKeyAccount deployer = Common.getTestAccount(repository, "alice"); + byte[] creationBytes = AtUtils.buildSimpleAT(); + long fundingAmount = 1_00000000L; + AtUtils.doDeployAT(repository, deployer, creationBytes, fundingAmount); + + // Mint some blocks so that we are able to archive them later + for (int i = 0; i < 1000; i++) { + BlockMinter.mintTestingBlock(repository, Common.getTestAccount(repository, "alice-reward-share")); + } + + // Make sure that block 500 has full AT state data and data hash + List block500AtStatesData = repository.getATRepository().getBlockATStatesAtHeight(500); + ATStateData atStatesData = repository.getATRepository().getATStateAtHeight(block500AtStatesData.get(0).getATAddress(), 500); + assertNotNull(atStatesData.getStateHash()); + assertNotNull(atStatesData.getStateData()); + + // Trim the first 500 blocks + repository.getBlockRepository().trimOldOnlineAccountsSignatures(0, 500); + repository.getBlockRepository().setOnlineAccountsSignaturesTrimHeight(501); + repository.getATRepository().rebuildLatestAtStates(500); + repository.getATRepository().trimAtStates(0, 500, 1000); + repository.getATRepository().setAtTrimHeight(501); + + // Now block 499 should only have the AT state data hash + List block499AtStatesData = repository.getATRepository().getBlockATStatesAtHeight(499); + atStatesData = repository.getATRepository().getATStateAtHeight(block499AtStatesData.get(0).getATAddress(), 499); + assertNotNull(atStatesData.getStateHash()); + assertNull(atStatesData.getStateData()); + + // ... but block 500 should have the full data (due to being retained as the "latest" AT state in the trimmed range + block500AtStatesData = repository.getATRepository().getBlockATStatesAtHeight(500); + atStatesData = repository.getATRepository().getATStateAtHeight(block500AtStatesData.get(0).getATAddress(), 500); + assertNotNull(atStatesData.getStateHash()); + assertNotNull(atStatesData.getStateData()); + + // ... and block 501 should also have the full data + List block501AtStatesData = repository.getATRepository().getBlockATStatesAtHeight(501); + atStatesData = repository.getATRepository().getATStateAtHeight(block501AtStatesData.get(0).getATAddress(), 501); + assertNotNull(atStatesData.getStateHash()); + assertNotNull(atStatesData.getStateData()); + + // Check the max archive height - this should be one less than the first untrimmed height + final int maximumArchiveHeight = BlockArchiveWriter.getMaxArchiveHeight(repository); + assertEquals(500, maximumArchiveHeight); + + BlockData block3DataPreArchive = repository.getBlockRepository().fromHeight(3); + + // Write blocks 2-500 to the archive + BlockArchiveWriter writer = new BlockArchiveWriter(0, maximumArchiveHeight, repository); + writer.setShouldEnforceFileSizeTarget(false); // To avoid the need to pre-calculate file sizes + BlockArchiveWriter.BlockArchiveWriteResult result = writer.write(); + assertEquals(BlockArchiveWriter.BlockArchiveWriteResult.OK, result); + + // Make sure that the archive contains the correct number of blocks + assertEquals(500 - 1, writer.getWrittenCount()); // -1 for the genesis block + + // Increment block archive height + repository.getBlockArchiveRepository().setBlockArchiveHeight(writer.getWrittenCount()); + repository.saveChanges(); + assertEquals(500 - 1, repository.getBlockArchiveRepository().getBlockArchiveHeight()); + + // Ensure the file exists + File outputFile = writer.getOutputPath().toFile(); + assertTrue(outputFile.exists()); + + // Ensure the SQL repository contains blocks 2 and 500... + assertNotNull(repository.getBlockRepository().fromHeight(2)); + assertNotNull(repository.getBlockRepository().fromHeight(500)); + + // Prune all the archived blocks + int numBlocksPruned = repository.getBlockRepository().pruneBlocks(0, 500); + assertEquals(500-1, numBlocksPruned); + repository.getBlockRepository().setBlockPruneHeight(501); + + // Prune the AT states for the archived blocks + repository.getATRepository().rebuildLatestAtStates(500); + repository.saveChanges(); + int numATStatesPruned = repository.getATRepository().pruneAtStates(2, 500); + assertEquals(498, numATStatesPruned); // Minus 1 for genesis block, and another for the latest AT state + repository.getATRepository().setAtPruneHeight(501); + + // Now ensure the SQL repository is missing blocks 2 and 500... + assertNull(repository.getBlockRepository().fromHeight(2)); + assertNull(repository.getBlockRepository().fromHeight(500)); + + // ... but it's not missing blocks 1 and 501 (we don't prune the genesis block) + assertNotNull(repository.getBlockRepository().fromHeight(1)); + assertNotNull(repository.getBlockRepository().fromHeight(501)); + + // Validate the latest block height in the repository + assertEquals(1002, (int) repository.getBlockRepository().getLastBlock().getHeight()); + + // Now orphan some unarchived blocks. + BlockUtils.orphanBlocks(repository, 500); + assertEquals(502, (int) repository.getBlockRepository().getLastBlock().getHeight()); + + // We're close to the lower limit of the SQL database now, so + // we need to import some blocks from the archive + BlockArchiveUtils.importFromArchive(401, 500, repository); + + // Ensure the SQL repository now contains block 401 but not 400... + assertNotNull(repository.getBlockRepository().fromHeight(401)); + assertNull(repository.getBlockRepository().fromHeight(400)); + + // Import the remaining 399 blocks + BlockArchiveUtils.importFromArchive(2, 400, repository); + + // Verify that block 3 matches the original + BlockData block3DataPostArchive = repository.getBlockRepository().fromHeight(3); + assertArrayEquals(block3DataPreArchive.getSignature(), block3DataPostArchive.getSignature()); + assertEquals(block3DataPreArchive.getHeight(), block3DataPostArchive.getHeight()); + + // Orphan 2 more block, which should be the last one that is possible to be orphaned + // TODO: figure out why this is 1 block more than in the equivalent block archive V1 test + BlockUtils.orphanBlocks(repository, 2); + + // Orphan another block, which should fail + Exception exception = null; + try { + BlockUtils.orphanBlocks(repository, 1); + } catch (DataException e) { + exception = e; + } + + // Ensure that a DataException is thrown because there is no more AT states data available + assertNotNull(exception); + assertEquals(DataException.class, exception.getClass()); + + // FUTURE: we may be able to retain unique AT states when trimming, to avoid this exception + // and allow orphaning back through blocks with trimmed AT states. + + } + } + + + /** + * Many nodes are missing an ATStatesHeightIndex due to an earlier bug + * In these cases we disable archiving and pruning as this index is a + * very essential component in these processes. + */ + @Test + public void testMissingAtStatesHeightIndex() throws DataException, SQLException { + try (final HSQLDBRepository repository = (HSQLDBRepository) RepositoryManager.getRepository()) { + + // Firstly check that we're able to prune or archive when the index exists + assertTrue(repository.getATRepository().hasAtStatesHeightIndex()); + assertTrue(RepositoryManager.canArchiveOrPrune()); + + // Delete the index + repository.prepareStatement("DROP INDEX ATSTATESHEIGHTINDEX").execute(); + + // Ensure check that we're unable to prune or archive when the index doesn't exist + assertFalse(repository.getATRepository().hasAtStatesHeightIndex()); + assertFalse(RepositoryManager.canArchiveOrPrune()); + } + } + + + private void deleteArchiveDirectory() { + // Delete archive directory if exists + Path archivePath = Paths.get(Settings.getInstance().getRepositoryPath(), "archive").toAbsolutePath(); + try { + FileUtils.deleteDirectory(archivePath.toFile()); + } catch (IOException e) { + + } + } + +} diff --git a/src/test/java/org/qortal/test/arbitrary/ArbitraryDataStoragePolicyTests.java b/src/test/java/org/qortal/test/arbitrary/ArbitraryDataStoragePolicyTests.java index 9bf76127..49e645cf 100644 --- a/src/test/java/org/qortal/test/arbitrary/ArbitraryDataStoragePolicyTests.java +++ b/src/test/java/org/qortal/test/arbitrary/ArbitraryDataStoragePolicyTests.java @@ -246,7 +246,7 @@ public class ArbitraryDataStoragePolicyTests extends Common { Path path = Paths.get("src/test/resources/arbitrary/demo1"); ArbitraryDataTransactionBuilder txnBuilder = new ArbitraryDataTransactionBuilder( - repository, publicKey58, path, name, Method.PUT, Service.ARBITRARY_DATA, null, + repository, publicKey58, 0L, path, name, Method.PUT, Service.ARBITRARY_DATA, null, null, null, null, null); txnBuilder.build(); diff --git a/src/test/java/org/qortal/test/arbitrary/ArbitraryTransactionMetadataTests.java b/src/test/java/org/qortal/test/arbitrary/ArbitraryTransactionMetadataTests.java index 5d28568d..bf4f0a70 100644 --- a/src/test/java/org/qortal/test/arbitrary/ArbitraryTransactionMetadataTests.java +++ b/src/test/java/org/qortal/test/arbitrary/ArbitraryTransactionMetadataTests.java @@ -107,7 +107,7 @@ public class ArbitraryTransactionMetadataTests extends Common { // Create PUT transaction Path path1 = ArbitraryUtils.generateRandomDataPath(dataLength); ArbitraryDataFile arbitraryDataFile = ArbitraryUtils.createAndMintTxn(repository, publicKey58, path1, name, - identifier, ArbitraryTransactionData.Method.PUT, service, alice, chunkSize, + identifier, ArbitraryTransactionData.Method.PUT, service, alice, chunkSize, 0L, true, title, description, tags, category); // Check the chunk count is correct @@ -157,7 +157,7 @@ public class ArbitraryTransactionMetadataTests extends Common { // Create PUT transaction Path path1 = ArbitraryUtils.generateRandomDataPath(dataLength); ArbitraryDataFile arbitraryDataFile = ArbitraryUtils.createAndMintTxn(repository, publicKey58, path1, name, - identifier, ArbitraryTransactionData.Method.PUT, service, alice, chunkSize, + identifier, ArbitraryTransactionData.Method.PUT, service, alice, chunkSize, 0L, true, title, description, tags, category); // Check the chunk count is correct @@ -219,7 +219,7 @@ public class ArbitraryTransactionMetadataTests extends Common { // Create PUT transaction Path path1 = ArbitraryUtils.generateRandomDataPath(dataLength); ArbitraryDataFile arbitraryDataFile = ArbitraryUtils.createAndMintTxn(repository, publicKey58, path1, name, - identifier, ArbitraryTransactionData.Method.PUT, service, alice, chunkSize, + identifier, ArbitraryTransactionData.Method.PUT, service, alice, chunkSize, 0L, true, title, description, tags, category); // Check the chunk count is correct @@ -273,7 +273,7 @@ public class ArbitraryTransactionMetadataTests extends Common { // Create PUT transaction Path path1 = ArbitraryUtils.generateRandomDataPath(dataLength); ArbitraryDataFile arbitraryDataFile = ArbitraryUtils.createAndMintTxn(repository, publicKey58, path1, name, - identifier, ArbitraryTransactionData.Method.PUT, service, alice, chunkSize, + identifier, ArbitraryTransactionData.Method.PUT, service, alice, chunkSize, 0L, true, title, description, tags, category); // Check the metadata is correct diff --git a/src/test/java/org/qortal/test/arbitrary/ArbitraryTransactionTests.java b/src/test/java/org/qortal/test/arbitrary/ArbitraryTransactionTests.java index 294e463e..2c2d52b2 100644 --- a/src/test/java/org/qortal/test/arbitrary/ArbitraryTransactionTests.java +++ b/src/test/java/org/qortal/test/arbitrary/ArbitraryTransactionTests.java @@ -5,6 +5,7 @@ import org.junit.Before; import org.junit.Test; import org.qortal.account.PrivateKeyAccount; import org.qortal.arbitrary.ArbitraryDataFile; +import org.qortal.arbitrary.ArbitraryDataTransactionBuilder; import org.qortal.arbitrary.exception.MissingDataException; import org.qortal.arbitrary.misc.Service; import org.qortal.controller.arbitrary.ArbitraryDataManager; @@ -20,9 +21,11 @@ import org.qortal.test.common.TransactionUtils; import org.qortal.test.common.transaction.TestTransaction; import org.qortal.transaction.ArbitraryTransaction; import org.qortal.transaction.RegisterNameTransaction; +import org.qortal.transaction.Transaction; import org.qortal.utils.Base58; import org.qortal.utils.NTP; +import javax.xml.crypto.Data; import java.io.IOException; import java.nio.file.Path; @@ -36,7 +39,7 @@ public class ArbitraryTransactionTests extends Common { } @Test - public void testDifficultyTooLow() throws IllegalAccessException, DataException, IOException, MissingDataException { + public void testDifficultyTooLow() throws IllegalAccessException, DataException, IOException { try (final Repository repository = RepositoryManager.getRepository()) { PrivateKeyAccount alice = Common.getTestAccount(repository, "alice"); String publicKey58 = Base58.encode(alice.getPublicKey()); @@ -78,7 +81,346 @@ public class ArbitraryTransactionTests extends Common { assertTrue(transaction.isSignatureValid()); } - } + @Test + public void testNonceAndFee() throws IllegalAccessException, DataException, IOException { + try (final Repository repository = RepositoryManager.getRepository()) { + PrivateKeyAccount alice = Common.getTestAccount(repository, "alice"); + String publicKey58 = Base58.encode(alice.getPublicKey()); + String name = "TEST"; // Can be anything for this test + String identifier = null; // Not used for this test + Service service = Service.ARBITRARY_DATA; + int chunkSize = 100; + int dataLength = 900; // Actual data length will be longer due to encryption + + // Register the name to Alice + RegisterNameTransactionData registerNameTransactionData = new RegisterNameTransactionData(TestTransaction.generateBase(alice), name, ""); + registerNameTransactionData.setFee(new RegisterNameTransaction(null, null).getUnitFee(registerNameTransactionData.getTimestamp())); + TransactionUtils.signAndMint(repository, registerNameTransactionData, alice); + + // Set difficulty to 1 + FieldUtils.writeField(ArbitraryDataManager.getInstance(), "powDifficulty", 1, true); + + // Create PUT transaction, with a fee + Path path1 = ArbitraryUtils.generateRandomDataPath(dataLength); + long fee = 10000000; // sufficient + boolean computeNonce = true; + ArbitraryDataFile arbitraryDataFile = ArbitraryUtils.createAndMintTxn(repository, publicKey58, path1, name, identifier, ArbitraryTransactionData.Method.PUT, service, alice, chunkSize, fee, computeNonce, null, null, null, null); + + // Check that nonce validation succeeds + byte[] signature = arbitraryDataFile.getSignature(); + TransactionData transactionData = repository.getTransactionRepository().fromSignature(signature); + ArbitraryTransaction transaction = new ArbitraryTransaction(repository, transactionData); + assertTrue(transaction.isSignatureValid()); + + // Increase difficulty to 15 + FieldUtils.writeField(ArbitraryDataManager.getInstance(), "powDifficulty", 15, true); + + // Make sure that nonce validation still succeeds, as the fee has allowed us to avoid including a nonce + assertTrue(transaction.isSignatureValid()); + } + } + + @Test + public void testNonceAndLowFee() throws IllegalAccessException, DataException, IOException { + try (final Repository repository = RepositoryManager.getRepository()) { + PrivateKeyAccount alice = Common.getTestAccount(repository, "alice"); + String publicKey58 = Base58.encode(alice.getPublicKey()); + String name = "TEST"; // Can be anything for this test + String identifier = null; // Not used for this test + Service service = Service.ARBITRARY_DATA; + int chunkSize = 100; + int dataLength = 900; // Actual data length will be longer due to encryption + + // Register the name to Alice + RegisterNameTransactionData registerNameTransactionData = new RegisterNameTransactionData(TestTransaction.generateBase(alice), name, ""); + registerNameTransactionData.setFee(new RegisterNameTransaction(null, null).getUnitFee(registerNameTransactionData.getTimestamp())); + TransactionUtils.signAndMint(repository, registerNameTransactionData, alice); + + // Set difficulty to 1 + FieldUtils.writeField(ArbitraryDataManager.getInstance(), "powDifficulty", 1, true); + + // Create PUT transaction, with a fee that is too low + Path path1 = ArbitraryUtils.generateRandomDataPath(dataLength); + long fee = 9999999; // insufficient + boolean computeNonce = true; + boolean insufficientFeeDetected = false; + try { + ArbitraryUtils.createAndMintTxn(repository, publicKey58, path1, name, identifier, ArbitraryTransactionData.Method.PUT, service, alice, chunkSize, fee, computeNonce, null, null, null, null); + } + catch (DataException e) { + if (e.getMessage().contains("INSUFFICIENT_FEE")) { + insufficientFeeDetected = true; + } + } + + // Transaction should be invalid due to an insufficient fee + assertTrue(insufficientFeeDetected); + } + } + + @Test + public void testFeeNoNonce() throws IllegalAccessException, DataException, IOException { + try (final Repository repository = RepositoryManager.getRepository()) { + PrivateKeyAccount alice = Common.getTestAccount(repository, "alice"); + String publicKey58 = Base58.encode(alice.getPublicKey()); + String name = "TEST"; // Can be anything for this test + String identifier = null; // Not used for this test + Service service = Service.ARBITRARY_DATA; + int chunkSize = 100; + int dataLength = 900; // Actual data length will be longer due to encryption + + // Register the name to Alice + RegisterNameTransactionData registerNameTransactionData = new RegisterNameTransactionData(TestTransaction.generateBase(alice), name, ""); + registerNameTransactionData.setFee(new RegisterNameTransaction(null, null).getUnitFee(registerNameTransactionData.getTimestamp())); + TransactionUtils.signAndMint(repository, registerNameTransactionData, alice); + + // Set difficulty to 1 + FieldUtils.writeField(ArbitraryDataManager.getInstance(), "powDifficulty", 1, true); + + // Create PUT transaction, with a fee + Path path1 = ArbitraryUtils.generateRandomDataPath(dataLength); + long fee = 10000000; // sufficient + boolean computeNonce = false; + ArbitraryDataFile arbitraryDataFile = ArbitraryUtils.createAndMintTxn(repository, publicKey58, path1, name, identifier, ArbitraryTransactionData.Method.PUT, service, alice, chunkSize, fee, computeNonce, null, null, null, null); + + // Check that nonce validation succeeds, even though it wasn't computed. This is because we have included a sufficient fee. + byte[] signature = arbitraryDataFile.getSignature(); + TransactionData transactionData = repository.getTransactionRepository().fromSignature(signature); + ArbitraryTransaction transaction = new ArbitraryTransaction(repository, transactionData); + assertTrue(transaction.isSignatureValid()); + + // Increase difficulty to 15 + FieldUtils.writeField(ArbitraryDataManager.getInstance(), "powDifficulty", 15, true); + + // Make sure that nonce validation still succeeds, as the fee has allowed us to avoid including a nonce + assertTrue(transaction.isSignatureValid()); + } + } + + @Test + public void testLowFeeNoNonce() throws IllegalAccessException, DataException, IOException { + try (final Repository repository = RepositoryManager.getRepository()) { + PrivateKeyAccount alice = Common.getTestAccount(repository, "alice"); + String publicKey58 = Base58.encode(alice.getPublicKey()); + String name = "TEST"; // Can be anything for this test + String identifier = null; // Not used for this test + Service service = Service.ARBITRARY_DATA; + int chunkSize = 100; + int dataLength = 900; // Actual data length will be longer due to encryption + + // Register the name to Alice + RegisterNameTransactionData registerNameTransactionData = new RegisterNameTransactionData(TestTransaction.generateBase(alice), name, ""); + registerNameTransactionData.setFee(new RegisterNameTransaction(null, null).getUnitFee(registerNameTransactionData.getTimestamp())); + TransactionUtils.signAndMint(repository, registerNameTransactionData, alice); + + // Set difficulty to 1 + FieldUtils.writeField(ArbitraryDataManager.getInstance(), "powDifficulty", 1, true); + + // Create PUT transaction, with a fee that is too low. Also, don't compute a nonce. + Path path1 = ArbitraryUtils.generateRandomDataPath(dataLength); + long fee = 9999999; // insufficient + + ArbitraryDataTransactionBuilder txnBuilder = new ArbitraryDataTransactionBuilder( + repository, publicKey58, fee, path1, name, ArbitraryTransactionData.Method.PUT, service, identifier, null, null, null, null); + + txnBuilder.setChunkSize(chunkSize); + txnBuilder.build(); + ArbitraryTransactionData transactionData = txnBuilder.getArbitraryTransactionData(); + Transaction.ValidationResult result = TransactionUtils.signAndImport(repository, transactionData, alice); + + // Transaction should be invalid due to an insufficient fee + assertEquals(Transaction.ValidationResult.INSUFFICIENT_FEE, result); + } + } + + @Test + public void testZeroFeeNoNonce() throws IllegalAccessException, DataException, IOException { + try (final Repository repository = RepositoryManager.getRepository()) { + PrivateKeyAccount alice = Common.getTestAccount(repository, "alice"); + String publicKey58 = Base58.encode(alice.getPublicKey()); + String name = "TEST"; // Can be anything for this test + String identifier = null; // Not used for this test + Service service = Service.ARBITRARY_DATA; + int chunkSize = 100; + int dataLength = 900; // Actual data length will be longer due to encryption + + // Register the name to Alice + RegisterNameTransactionData registerNameTransactionData = new RegisterNameTransactionData(TestTransaction.generateBase(alice), name, ""); + registerNameTransactionData.setFee(new RegisterNameTransaction(null, null).getUnitFee(registerNameTransactionData.getTimestamp())); + TransactionUtils.signAndMint(repository, registerNameTransactionData, alice); + + // Set difficulty to 1 + FieldUtils.writeField(ArbitraryDataManager.getInstance(), "powDifficulty", 1, true); + + // Create PUT transaction, with a fee that is too low. Also, don't compute a nonce. + Path path1 = ArbitraryUtils.generateRandomDataPath(dataLength); + long fee = 0L; + + ArbitraryDataTransactionBuilder txnBuilder = new ArbitraryDataTransactionBuilder( + repository, publicKey58, fee, path1, name, ArbitraryTransactionData.Method.PUT, service, identifier, null, null, null, null); + + txnBuilder.setChunkSize(chunkSize); + txnBuilder.build(); + ArbitraryTransactionData transactionData = txnBuilder.getArbitraryTransactionData(); + ArbitraryTransaction arbitraryTransaction = new ArbitraryTransaction(repository, transactionData); + + // Transaction should be invalid + assertFalse(arbitraryTransaction.isSignatureValid()); + } + } + + @Test + public void testNonceAndFeeBeforeFeatureTrigger() throws IllegalAccessException, DataException, IOException { + // Use v2-minting settings, as these are pre-feature-trigger + Common.useSettings("test-settings-v2-minting.json"); + + try (final Repository repository = RepositoryManager.getRepository()) { + PrivateKeyAccount alice = Common.getTestAccount(repository, "alice"); + String publicKey58 = Base58.encode(alice.getPublicKey()); + String name = "TEST"; // Can be anything for this test + String identifier = null; // Not used for this test + Service service = Service.ARBITRARY_DATA; + int chunkSize = 100; + int dataLength = 900; // Actual data length will be longer due to encryption + + // Register the name to Alice + RegisterNameTransactionData registerNameTransactionData = new RegisterNameTransactionData(TestTransaction.generateBase(alice), name, ""); + registerNameTransactionData.setFee(new RegisterNameTransaction(null, null).getUnitFee(registerNameTransactionData.getTimestamp())); + TransactionUtils.signAndMint(repository, registerNameTransactionData, alice); + + // Set difficulty to 1 + FieldUtils.writeField(ArbitraryDataManager.getInstance(), "powDifficulty", 1, true); + + // Create PUT transaction, with a fee + Path path1 = ArbitraryUtils.generateRandomDataPath(dataLength); + long fee = 10000000; // sufficient + boolean computeNonce = true; + ArbitraryDataFile arbitraryDataFile = ArbitraryUtils.createAndMintTxn(repository, publicKey58, path1, name, identifier, ArbitraryTransactionData.Method.PUT, service, alice, chunkSize, fee, computeNonce, null, null, null, null); + + // Check that nonce validation succeeds + byte[] signature = arbitraryDataFile.getSignature(); + TransactionData transactionData = repository.getTransactionRepository().fromSignature(signature); + ArbitraryTransaction transaction = new ArbitraryTransaction(repository, transactionData); + assertTrue(transaction.isSignatureValid()); + + // Increase difficulty to 15 + FieldUtils.writeField(ArbitraryDataManager.getInstance(), "powDifficulty", 15, true); + + // Make sure the nonce validation fails, as we aren't allowing a fee to replace a nonce yet. + // Note: there is a very tiny chance this could succeed due to being extremely lucky + // and finding a high difficulty nonce in the first couple of cycles. It will be rare + // enough that we shouldn't need to account for it. + assertFalse(transaction.isSignatureValid()); + + // Reduce difficulty back to 1, to double check + FieldUtils.writeField(ArbitraryDataManager.getInstance(), "powDifficulty", 1, true); + assertTrue(transaction.isSignatureValid()); + } + } + + @Test + public void testNonceAndInsufficientFeeBeforeFeatureTrigger() throws IllegalAccessException, DataException, IOException { + // Use v2-minting settings, as these are pre-feature-trigger + Common.useSettings("test-settings-v2-minting.json"); + + try (final Repository repository = RepositoryManager.getRepository()) { + PrivateKeyAccount alice = Common.getTestAccount(repository, "alice"); + String publicKey58 = Base58.encode(alice.getPublicKey()); + String name = "TEST"; // Can be anything for this test + String identifier = null; // Not used for this test + Service service = Service.ARBITRARY_DATA; + int chunkSize = 100; + int dataLength = 900; // Actual data length will be longer due to encryption + + // Register the name to Alice + RegisterNameTransactionData registerNameTransactionData = new RegisterNameTransactionData(TestTransaction.generateBase(alice), name, ""); + registerNameTransactionData.setFee(new RegisterNameTransaction(null, null).getUnitFee(registerNameTransactionData.getTimestamp())); + TransactionUtils.signAndMint(repository, registerNameTransactionData, alice); + + // Set difficulty to 1 + FieldUtils.writeField(ArbitraryDataManager.getInstance(), "powDifficulty", 1, true); + + // Create PUT transaction, with a fee + Path path1 = ArbitraryUtils.generateRandomDataPath(dataLength); + long fee = 9999999; // insufficient + boolean computeNonce = true; + ArbitraryDataFile arbitraryDataFile = ArbitraryUtils.createAndMintTxn(repository, publicKey58, path1, name, identifier, ArbitraryTransactionData.Method.PUT, service, alice, chunkSize, fee, computeNonce, null, null, null, null); + + // Check that nonce validation succeeds + byte[] signature = arbitraryDataFile.getSignature(); + TransactionData transactionData = repository.getTransactionRepository().fromSignature(signature); + ArbitraryTransaction transaction = new ArbitraryTransaction(repository, transactionData); + assertTrue(transaction.isSignatureValid()); + + // The transaction should be valid because we don't care about the fee (before the feature trigger) + assertEquals(Transaction.ValidationResult.OK, transaction.isValidUnconfirmed()); + + // Increase difficulty to 15 + FieldUtils.writeField(ArbitraryDataManager.getInstance(), "powDifficulty", 15, true); + + // Make sure the nonce validation fails, as we aren't allowing a fee to replace a nonce yet (and it was insufficient anyway) + // Note: there is a very tiny chance this could succeed due to being extremely lucky + // and finding a high difficulty nonce in the first couple of cycles. It will be rare + // enough that we shouldn't need to account for it. + assertFalse(transaction.isSignatureValid()); + + // Reduce difficulty back to 1, to double check + FieldUtils.writeField(ArbitraryDataManager.getInstance(), "powDifficulty", 1, true); + assertTrue(transaction.isSignatureValid()); + } + } + + @Test + public void testNonceAndZeroFeeBeforeFeatureTrigger() throws IllegalAccessException, DataException, IOException { + // Use v2-minting settings, as these are pre-feature-trigger + Common.useSettings("test-settings-v2-minting.json"); + + try (final Repository repository = RepositoryManager.getRepository()) { + PrivateKeyAccount alice = Common.getTestAccount(repository, "alice"); + String publicKey58 = Base58.encode(alice.getPublicKey()); + String name = "TEST"; // Can be anything for this test + String identifier = null; // Not used for this test + Service service = Service.ARBITRARY_DATA; + int chunkSize = 100; + int dataLength = 900; // Actual data length will be longer due to encryption + + // Register the name to Alice + RegisterNameTransactionData registerNameTransactionData = new RegisterNameTransactionData(TestTransaction.generateBase(alice), name, ""); + registerNameTransactionData.setFee(new RegisterNameTransaction(null, null).getUnitFee(registerNameTransactionData.getTimestamp())); + TransactionUtils.signAndMint(repository, registerNameTransactionData, alice); + + // Set difficulty to 1 + FieldUtils.writeField(ArbitraryDataManager.getInstance(), "powDifficulty", 1, true); + + // Create PUT transaction, with a fee + Path path1 = ArbitraryUtils.generateRandomDataPath(dataLength); + long fee = 0L; + boolean computeNonce = true; + ArbitraryDataFile arbitraryDataFile = ArbitraryUtils.createAndMintTxn(repository, publicKey58, path1, name, identifier, ArbitraryTransactionData.Method.PUT, service, alice, chunkSize, fee, computeNonce, null, null, null, null); + + // Check that nonce validation succeeds + byte[] signature = arbitraryDataFile.getSignature(); + TransactionData transactionData = repository.getTransactionRepository().fromSignature(signature); + ArbitraryTransaction transaction = new ArbitraryTransaction(repository, transactionData); + assertTrue(transaction.isSignatureValid()); + + // The transaction should be valid because we don't care about the fee (before the feature trigger) + assertEquals(Transaction.ValidationResult.OK, transaction.isValidUnconfirmed()); + + // Increase difficulty to 15 + FieldUtils.writeField(ArbitraryDataManager.getInstance(), "powDifficulty", 15, true); + + // Make sure the nonce validation fails, as we aren't allowing a fee to replace a nonce yet (and it was insufficient anyway) + // Note: there is a very tiny chance this could succeed due to being extremely lucky + // and finding a high difficulty nonce in the first couple of cycles. It will be rare + // enough that we shouldn't need to account for it. + assertFalse(transaction.isSignatureValid()); + + // Reduce difficulty back to 1, to double check + FieldUtils.writeField(ArbitraryDataManager.getInstance(), "powDifficulty", 1, true); + assertTrue(transaction.isSignatureValid()); + } + } } diff --git a/src/test/java/org/qortal/test/common/ArbitraryUtils.java b/src/test/java/org/qortal/test/common/ArbitraryUtils.java index 81abf47f..73dc8097 100644 --- a/src/test/java/org/qortal/test/common/ArbitraryUtils.java +++ b/src/test/java/org/qortal/test/common/ArbitraryUtils.java @@ -29,19 +29,22 @@ public class ArbitraryUtils { int chunkSize) throws DataException { return ArbitraryUtils.createAndMintTxn(repository, publicKey58, path, name, identifier, method, service, - account, chunkSize, null, null, null, null); + account, chunkSize, 0L, true, null, null, null, null); } public static ArbitraryDataFile createAndMintTxn(Repository repository, String publicKey58, Path path, String name, String identifier, ArbitraryTransactionData.Method method, Service service, PrivateKeyAccount account, - int chunkSize, String title, String description, List tags, Category category) throws DataException { + int chunkSize, long fee, boolean computeNonce, + String title, String description, List tags, Category category) throws DataException { ArbitraryDataTransactionBuilder txnBuilder = new ArbitraryDataTransactionBuilder( - repository, publicKey58, path, name, method, service, identifier, title, description, tags, category); + repository, publicKey58, fee, path, name, method, service, identifier, title, description, tags, category); txnBuilder.setChunkSize(chunkSize); txnBuilder.build(); - txnBuilder.computeNonce(); + if (computeNonce) { + txnBuilder.computeNonce(); + } ArbitraryTransactionData transactionData = txnBuilder.getArbitraryTransactionData(); Transaction.ValidationResult result = TransactionUtils.signAndImport(repository, transactionData, account); assertEquals(Transaction.ValidationResult.OK, result); diff --git a/src/test/resources/test-chain-v2-block-timestamps.json b/src/test/resources/test-chain-v2-block-timestamps.json index 8c2e0503..3b4de702 100644 --- a/src/test/resources/test-chain-v2-block-timestamps.json +++ b/src/test/resources/test-chain-v2-block-timestamps.json @@ -75,7 +75,8 @@ "onlineAccountMinterLevelValidationHeight": 0, "selfSponsorshipAlgoV1Height": 999999999, "feeValidationFixTimestamp": 0, - "chatReferenceTimestamp": 0 + "chatReferenceTimestamp": 0, + "arbitraryOptionalFeeTimestamp": 0 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-disable-reference.json b/src/test/resources/test-chain-v2-disable-reference.json index f7f8e7d8..c93fbb78 100644 --- a/src/test/resources/test-chain-v2-disable-reference.json +++ b/src/test/resources/test-chain-v2-disable-reference.json @@ -78,7 +78,8 @@ "onlineAccountMinterLevelValidationHeight": 0, "selfSponsorshipAlgoV1Height": 999999999, "feeValidationFixTimestamp": 0, - "chatReferenceTimestamp": 0 + "chatReferenceTimestamp": 0, + "arbitraryOptionalFeeTimestamp": 0 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-founder-rewards.json b/src/test/resources/test-chain-v2-founder-rewards.json index 20d10233..1b068932 100644 --- a/src/test/resources/test-chain-v2-founder-rewards.json +++ b/src/test/resources/test-chain-v2-founder-rewards.json @@ -79,7 +79,8 @@ "onlineAccountMinterLevelValidationHeight": 0, "selfSponsorshipAlgoV1Height": 999999999, "feeValidationFixTimestamp": 0, - "chatReferenceTimestamp": 0 + "chatReferenceTimestamp": 0, + "arbitraryOptionalFeeTimestamp": 0 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-leftover-reward.json b/src/test/resources/test-chain-v2-leftover-reward.json index e71ebab6..aef76cc2 100644 --- a/src/test/resources/test-chain-v2-leftover-reward.json +++ b/src/test/resources/test-chain-v2-leftover-reward.json @@ -79,7 +79,8 @@ "onlineAccountMinterLevelValidationHeight": 0, "selfSponsorshipAlgoV1Height": 999999999, "feeValidationFixTimestamp": 0, - "chatReferenceTimestamp": 0 + "chatReferenceTimestamp": 0, + "arbitraryOptionalFeeTimestamp": 0 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-minting.json b/src/test/resources/test-chain-v2-minting.json index 2a388e1f..db6d8a0b 100644 --- a/src/test/resources/test-chain-v2-minting.json +++ b/src/test/resources/test-chain-v2-minting.json @@ -74,12 +74,13 @@ "calcChainWeightTimestamp": 0, "transactionV5Timestamp": 0, "transactionV6Timestamp": 0, - "disableReferenceTimestamp": 9999999999999, + "disableReferenceTimestamp": 0, "increaseOnlineAccountsDifficultyTimestamp": 9999999999999, "onlineAccountMinterLevelValidationHeight": 0, "selfSponsorshipAlgoV1Height": 999999999, "feeValidationFixTimestamp": 0, - "chatReferenceTimestamp": 0 + "chatReferenceTimestamp": 0, + "arbitraryOptionalFeeTimestamp": 9999999999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-qora-holder-extremes.json b/src/test/resources/test-chain-v2-qora-holder-extremes.json index cface0e7..2452d4d2 100644 --- a/src/test/resources/test-chain-v2-qora-holder-extremes.json +++ b/src/test/resources/test-chain-v2-qora-holder-extremes.json @@ -79,7 +79,8 @@ "onlineAccountMinterLevelValidationHeight": 0, "selfSponsorshipAlgoV1Height": 999999999, "feeValidationFixTimestamp": 0, - "chatReferenceTimestamp": 0 + "chatReferenceTimestamp": 0, + "arbitraryOptionalFeeTimestamp": 0 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-qora-holder-reduction.json b/src/test/resources/test-chain-v2-qora-holder-reduction.json index f233680b..23193729 100644 --- a/src/test/resources/test-chain-v2-qora-holder-reduction.json +++ b/src/test/resources/test-chain-v2-qora-holder-reduction.json @@ -80,7 +80,8 @@ "onlineAccountMinterLevelValidationHeight": 0, "selfSponsorshipAlgoV1Height": 999999999, "feeValidationFixTimestamp": 0, - "chatReferenceTimestamp": 0 + "chatReferenceTimestamp": 0, + "arbitraryOptionalFeeTimestamp": 0 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-qora-holder.json b/src/test/resources/test-chain-v2-qora-holder.json index 4ea82290..9d81632b 100644 --- a/src/test/resources/test-chain-v2-qora-holder.json +++ b/src/test/resources/test-chain-v2-qora-holder.json @@ -79,7 +79,8 @@ "onlineAccountMinterLevelValidationHeight": 0, "selfSponsorshipAlgoV1Height": 999999999, "feeValidationFixTimestamp": 0, - "chatReferenceTimestamp": 0 + "chatReferenceTimestamp": 0, + "arbitraryOptionalFeeTimestamp": 0 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-reward-levels.json b/src/test/resources/test-chain-v2-reward-levels.json index 5de8d9ff..81609595 100644 --- a/src/test/resources/test-chain-v2-reward-levels.json +++ b/src/test/resources/test-chain-v2-reward-levels.json @@ -79,7 +79,8 @@ "onlineAccountMinterLevelValidationHeight": 0, "selfSponsorshipAlgoV1Height": 999999999, "feeValidationFixTimestamp": 0, - "chatReferenceTimestamp": 0 + "chatReferenceTimestamp": 0, + "arbitraryOptionalFeeTimestamp": 0 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-reward-scaling.json b/src/test/resources/test-chain-v2-reward-scaling.json index c008ed42..21a5b7a7 100644 --- a/src/test/resources/test-chain-v2-reward-scaling.json +++ b/src/test/resources/test-chain-v2-reward-scaling.json @@ -79,7 +79,8 @@ "onlineAccountMinterLevelValidationHeight": 0, "selfSponsorshipAlgoV1Height": 999999999, "feeValidationFixTimestamp": 0, - "chatReferenceTimestamp": 0 + "chatReferenceTimestamp": 0, + "arbitraryOptionalFeeTimestamp": 0 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-reward-shares.json b/src/test/resources/test-chain-v2-reward-shares.json index 2fc0151f..6119ac48 100644 --- a/src/test/resources/test-chain-v2-reward-shares.json +++ b/src/test/resources/test-chain-v2-reward-shares.json @@ -79,7 +79,8 @@ "onlineAccountMinterLevelValidationHeight": 0, "selfSponsorshipAlgoV1Height": 999999999, "feeValidationFixTimestamp": 0, - "chatReferenceTimestamp": 0 + "chatReferenceTimestamp": 0, + "arbitraryOptionalFeeTimestamp": 0 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-self-sponsorship-algo.json b/src/test/resources/test-chain-v2-self-sponsorship-algo.json index 68b33cc3..dc5f3961 100644 --- a/src/test/resources/test-chain-v2-self-sponsorship-algo.json +++ b/src/test/resources/test-chain-v2-self-sponsorship-algo.json @@ -79,7 +79,8 @@ "onlineAccountMinterLevelValidationHeight": 0, "selfSponsorshipAlgoV1Height": 20, "feeValidationFixTimestamp": 0, - "chatReferenceTimestamp": 0 + "chatReferenceTimestamp": 0, + "arbitraryOptionalFeeTimestamp": 0 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2.json b/src/test/resources/test-chain-v2.json index 63abc695..d0c460df 100644 --- a/src/test/resources/test-chain-v2.json +++ b/src/test/resources/test-chain-v2.json @@ -79,7 +79,8 @@ "onlineAccountMinterLevelValidationHeight": 0, "selfSponsorshipAlgoV1Height": 999999999, "feeValidationFixTimestamp": 0, - "chatReferenceTimestamp": 0 + "chatReferenceTimestamp": 0, + "arbitraryOptionalFeeTimestamp": 0 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-settings-v2-block-archive.json b/src/test/resources/test-settings-v2-block-archive.json index c5ed1aa8..209ce92d 100644 --- a/src/test/resources/test-settings-v2-block-archive.json +++ b/src/test/resources/test-settings-v2-block-archive.json @@ -9,5 +9,6 @@ "testNtpOffset": 0, "minPeers": 0, "pruneBlockLimit": 100, - "repositoryPath": "dbtest" + "repositoryPath": "dbtest", + "defaultArchiveVersion": 1 } diff --git a/TestNets.md b/testnet/README.md similarity index 91% rename from TestNets.md rename to testnet/README.md index b4b9feed..2973f2e2 100644 --- a/TestNets.md +++ b/testnet/README.md @@ -2,9 +2,10 @@ ## Create testnet blockchain config -- You can begin by copying the mainnet blockchain config `src/main/resources/blockchain.json` +- The simplest option is to use the testchain.json included in this folder. +- Alternatively, you can create one by copying the mainnet blockchain config `src/main/resources/blockchain.json` - Insert `"isTestChain": true,` after the opening `{` -- Modify testnet genesis block +- Modify testnet genesis block, feature triggers etc ### Testnet genesis block @@ -97,6 +98,10 @@ Your options are: { "isTestNet": true, "bitcoinNet": "TEST3", + "litecoinNet": "TEST3", + "dogecoinNet": "TEST3", + "digibyteNet": "TEST3", + "ravencoinNet": "TEST3", "repositoryPath": "db-testnet", "blockchainConfig": "testchain.json", "minBlockchainPeers": 1, @@ -112,7 +117,7 @@ Your options are: ## Quick start Here are some steps to quickly get a single node testnet up and running with a generic minting account: -1. Start with template `settings-test.json`, and create a `testchain.json` based on mainnet's blockchain.json (or obtain one from Qortal developers). These should be in the same directory as the jar. +1. Start with template `settings-test.json`, and `testchain.json` which can be found in this folder. Copy/move them to the same directory as the jar. 2. Make sure feature triggers and other timestamp/height activations are correctly set. Generally these would be `0` so that they are enabled from the start. 3. Set a recent genesis `timestamp` in testchain.json, and add this reward share entry: `{ "type": "REWARD_SHARE", "minterPublicKey": "DwcUnhxjamqppgfXCLgbYRx8H9XFPUc2qYRy3CEvQWEw", "recipient": "QbTDMss7NtRxxQaSqBZtSLSNdSYgvGaqFf", "rewardSharePublicKey": "CRvQXxFfUMfr4q3o1PcUZPA4aPCiubBsXkk47GzRo754", "sharePercent": 0 },` diff --git a/testnet/settings-test.json b/testnet/settings-test.json new file mode 100755 index 00000000..e49368f8 --- /dev/null +++ b/testnet/settings-test.json @@ -0,0 +1,18 @@ +{ + "isTestNet": true, + "bitcoinNet": "TEST3", + "litecoinNet": "TEST3", + "dogecoinNet": "TEST3", + "digibyteNet": "TEST3", + "ravencoinNet": "TEST3", + "repositoryPath": "db-testnet", + "blockchainConfig": "testchain.json", + "minBlockchainPeers": 1, + "apiDocumentationEnabled": true, + "apiRestricted": false, + "bootstrap": false, + "maxPeerConnectionTime": 999999999, + "localAuthBypassEnabled": true, + "singleNodeTestnet": false, + "recoveryModeTimeout": 0 +} diff --git a/testnet/testchain.json b/testnet/testchain.json new file mode 100644 index 00000000..aef9ed9a --- /dev/null +++ b/testnet/testchain.json @@ -0,0 +1,2661 @@ +{ + "isTestChain": true, + "blockTimestampMargin": 2000, + "transactionExpiryPeriod": 86400000, + "maxBlockSize": 2097152, + "maxBytesPerUnitFee": 1024, + "unitFee": "0.001", + "nameRegistrationUnitFees": [ + { "timestamp": 0, "fee": "1.25" } + ], + "useBrokenMD160ForAddresses": false, + "requireGroupForApproval": false, + "defaultGroupId": 0, + "oneNamePerAccount": true, + "minAccountLevelToMint": 1, + "minAccountLevelForBlockSubmissions": 1, + "minAccountLevelToRewardShare": 2, + "maxRewardSharesPerFounderMintingAccount": 10, + "maxRewardSharesByTimestamp": [ + { "timestamp": 0, "maxShares": 10 } + ], + "founderEffectiveMintingLevel": 10, + "onlineAccountSignaturesMinLifetime": 43200000, + "onlineAccountSignaturesMaxLifetime": 86400000, + "onlineAccountsModulusV2Timestamp": 0, + "selfSponsorshipAlgoV1SnapshotTimestamp": 9999999999999, + "rewardsByHeight": [ + { "height": 1, "reward": 5.00 }, + { "height": 259201, "reward": 4.75 }, + { "height": 518401, "reward": 4.50 }, + { "height": 777601, "reward": 4.25 }, + { "height": 1036801, "reward": 4.00 }, + { "height": 1296001, "reward": 3.75 }, + { "height": 1555201, "reward": 3.50 }, + { "height": 1814401, "reward": 3.25 }, + { "height": 2073601, "reward": 3.00 }, + { "height": 2332801, "reward": 2.75 }, + { "height": 2592001, "reward": 2.50 }, + { "height": 2851201, "reward": 2.25 }, + { "height": 3110401, "reward": 2.00 } + ], + "sharesByLevelV1": [ + { "id": 1, "levels": [ 1, 2 ], "share": 0.05 }, + { "id": 2, "levels": [ 3, 4 ], "share": 0.10 }, + { "id": 3, "levels": [ 5, 6 ], "share": 0.15 }, + { "id": 4, "levels": [ 7, 8 ], "share": 0.20 }, + { "id": 5, "levels": [ 9, 10 ], "share": 0.25 } + ], + "sharesByLevelV2": [ + { "id": 1, "levels": [ 1, 2 ], "share": 0.06 }, + { "id": 2, "levels": [ 3, 4 ], "share": 0.13 }, + { "id": 3, "levels": [ 5, 6 ], "share": 0.19 }, + { "id": 4, "levels": [ 7, 8 ], "share": 0.26 }, + { "id": 5, "levels": [ 9, 10 ], "share": 0.32 } + ], + "qoraHoldersShareByHeight": [ + { "height": 1, "share": 0.20 }, + { "height": 1010000, "share": 0.01 } + ], + "qoraPerQortReward": 250, + "minAccountsToActivateShareBin": 30, + "shareBinActivationMinLevel": 7, + "blocksNeededByLevel": [ 50, 64800, 129600, 172800, 244000, 345600, 518400, 691200, 864000, 1036800 ], + "blockTimingsByHeight": [ + { "height": 1, "target": 60000, "deviation": 30000, "power": 0.2 } + ], + "ciyamAtSettings": { + "feePerStep": "0.00000001", + "maxStepsPerRound": 500, + "stepsPerFunctionCall": 10, + "minutesPerBlock": 1 + }, + "featureTriggers": { + "atFindNextTransactionFix": 0, + "newBlockSigHeight": 0, + "shareBinFix": 0, + "sharesByLevelV2Height": 0, + "rewardShareLimitTimestamp": 0, + "calcChainWeightTimestamp": 0, + "transactionV5Timestamp": 0, + "transactionV6Timestamp": 9999999999999, + "disableReferenceTimestamp": 0, + "aggregateSignatureTimestamp": 0, + "increaseOnlineAccountsDifficultyTimestamp": 9999999999999, + "onlineAccountMinterLevelValidationHeight": 0, + "selfSponsorshipAlgoV1Height": 9999999, + "feeValidationFixTimestamp": 0, + "chatReferenceTimestamp": 0, + "arbitraryOptionalFeeTimestamp": 1678622400000 + }, + "genesisInfo": { + "version": 4, + "timestamp": "1677572542000", + "transactions": [ + { "type": "ISSUE_ASSET", "assetName": "QORT", "description": "QORTAL coin", "quantity": 0, "isDivisible": true, "data": "{}" }, + { "type": "ISSUE_ASSET", "assetName": "Legacy-QORA", "description": "Representative legacy QORA", "quantity": 0, "isDivisible": true, "data": "{}", "isUnspendable": true }, + { "type": "ISSUE_ASSET", "assetName": "QORT-from-QORA", "description": "QORT gained from holding legacy QORA", "quantity": 0, "isDivisible": true, "data": "{}", "isUnspendable": true }, + + { "type": "REWARD_SHARE", "minterPublicKey": "HFDmuc4HAAoVs9Siea3MugjBHasbotgVz2gsRDuLAAcB", "recipient": "QY82MasqEH6ChwXaETH4piMtE8Pk4NBWD3", "rewardSharePublicKey": "F35TbQXmgzz32cALj29jxzpdYSUKQvssqThLsZSabSXx", "sharePercent": 0 }, + { "type": "REWARD_SHARE", "minterPublicKey": "HmViWJ2SMRVTYNuMvNYFBX7DitXcEB2gBZasAN3uheJL", "recipient": "Qi3N6fNRrs15EHmkxYyWHyh4z3Dp2rVU2i", "rewardSharePublicKey": "8dsLkxj2C19iK2wob9YNDdQ2mdzyV9X6aQzfHdG1sWrp", "sharePercent": 0 }, + { "type": "REWARD_SHARE", "minterPublicKey": "79THiqG9Cftu7RFEA3SvW9G4YUim7qojhbyepb68trH4", "recipient": "QS7K9EsSDeCdb7T8kzZaFNGLomNmmET2Dr", "rewardSharePublicKey": "BuKWPsnu1sxxsFT2wNGCgcicm48ch4hhvQq9585P2pth", "sharePercent": 0 }, + { "type": "REWARD_SHARE", "minterPublicKey": "KBStPrMw84Fr84YJG5UQEZkeEzbCfRhKtvhq1kmhNJU", "recipient": "QP9y1CmZRyw3oKNSTTm7Q74FxWp2mEHc26", "rewardSharePublicKey": "6eW63qGsiz6JGfH4ga8wZStsYpU2H3w7qijHXr2JADFv", "sharePercent": 0 }, + { "type": "REWARD_SHARE", "minterPublicKey": "C9iuYc8GB9cVNNPr28v7pjY1macmsroFYX65CTVPjXLn", "recipient": "QNxfUZ9xgMYs3Gw6jG9Hqsg957yBJz2YEt", "rewardSharePublicKey": "4LvsURDbDhkR3f9zvnZun53GEtwERPsXLZas5CA4mBPH", "sharePercent": 0 }, + { "type": "REWARD_SHARE", "minterPublicKey": "DwcUnhxjamqppgfXCLgbYRx8H9XFPUc2qYRy3CEvQWEw", "recipient": "QbTDMss7NtRxxQaSqBZtSLSNdSYgvGaqFf", "rewardSharePublicKey": "CRvQXxFfUMfr4q3o1PcUZPA4aPCiubBsXkk47GzRo754", "sharePercent": 0 }, + { "type": "REWARD_SHARE", "minterPublicKey": "8ZHT347rPzCY8Jmk9R2MTEm1c2t6zLGjSU8nKQh4JgBt", "recipient": "QiTygNmENd8bjyiaK1WwgeX9EF1H8Kapfq", "rewardSharePublicKey": "BSatVDRBBzeSMwXfDU7ngjVLhUFfS3CTpdmBWb2wCSU", "sharePercent": 0 }, + { "type": "REWARD_SHARE", "minterPublicKey": "BqWV8eMDUxAJ7FEcjQZzCsNKi6TggwYd7yQHWtmYJLWd", "recipient": "QScfgds57u1zEPWyjL3GyKsZQ6PRbuVv2G", "rewardSharePublicKey": "AZBGQ6pVcH8KHBRuqNyBZSkFRedida8GdjoPJvDbgXtn", "sharePercent": 0 }, + { "type": "REWARD_SHARE", "minterPublicKey": "ELt8dgskQ9zfwF9dwVYwjq2zXFExstRJoPD4gCC4991d", "recipient": "QZm6GbBJuLJnTbftJAaJtw2ZJqXiDTu2pD", "rewardSharePublicKey": "C6aVBbUHy8nAS3wYQo6jdWFTBagmqrh3JhRo8VH5k1Bx", "sharePercent": 0 }, + { "type": "REWARD_SHARE", "minterPublicKey": "Btqz7ug1XEMMun8hXZHVZWctRZxMKYeExsax7ohgzGNE", "recipient": "Qb5rprTsoSoKaMcdwLFL7jP3eyhK3LGqNm", "rewardSharePublicKey": "CdVq4RwirHMjaRkM38PAtMvLNkokqYCiu2srQ3qf7znq", "sharePercent": 0 }, + + { "type": "ACCOUNT_FLAGS", "target": "QY82MasqEH6ChwXaETH4piMtE8Pk4NBWD3", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "Qi3N6fNRrs15EHmkxYyWHyh4z3Dp2rVU2i", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QPsjHoKhugEADrtSQP5xjFgsaQPn9WmE3Y", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QbmBdAbvmXqCya8bia8WaD5izumKkC9BrY", "andMask": -1, "orMask": 0, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QhPXuFFRa9s91Q2qYKpSN5LVCUTqYkgRLz", "andMask": -1, "orMask": 0, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QPFM4xX2826MuBEhMtdReW1QR3vRYrQff3", "andMask": -1, "orMask": 0, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QSJ5cDLWivGcn9ym21azufBfiqeuGH1maq", "andMask": -1, "orMask": 0, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QTx98gU8ErigXkViWkvRH5JfaMpk8b3bHe", "andMask": -1, "orMask": 0, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QY82MasqEH6ChwXaETH4piMtE8Pk4NBWD3", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QcPro2T97Q8cAfcVM4Pn4fv71Za4T6oeFD", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QbJqEntoBFps7XECQkTDFzXNCdz9R2qmkB", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "Qc5sZS1Vb1ujj8qvL5uXV5y5yQPq6pw2GC", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QceNmCiZxxLdvL85huifVcnk64udcJ47Jr", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "Qd453ewoyESrEgUab6dTFe2pufWkD94Tsm", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QfjoMGib4trpZHzxUSMdmtiRnsrLNf74zp", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "Qgfh143pRJyxpS92JoazjXNMH1uZueQBZ2", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "Qi3N6fNRrs15EHmkxYyWHyh4z3Dp2rVU2i", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QicRwDhfk8M2CGNvpMEmYzQEjESvF7WrFY", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QLwMaXmDDUvh7aN5MdpY28rqTKE8U1Cepc", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QP3J3GHgjqP69neTAprpYe4co33eKQiQpS", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QPsjHoKhugEADrtSQP5xjFgsaQPn9WmE3Y", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QRt11DVBnLaSDxr2KHvx92LdPrjhbhJtkj", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QRTygRGv8XxTeP34cgQqwfCeYBGu3bMCz1", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QSbHwxaBh5P7wXDurk2KCb8d1sCVN4JpMf", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QTE6b4xF8ecQTdphXn2BrptPVgRWCkzMQC", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QTKKxJXRWWqNNTgaMmvw22Jb3F5ttriSah", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QUxh6PNsKhwJ12qGaM3AC1xZjwxy4hk1RG", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QS7K9EsSDeCdb7T8kzZaFNGLomNmmET2Dr", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QLxHu4ZFEQek3eZ3ucWRwT6MHQnr1RTqV3", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "Qe3DW43uTQfeTbo4knfW5aUCwvFnyGzdVe", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QNxfUZ9xgMYs3Gw6jG9Hqsg957yBJz2YEt", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QQXSKG4qSYSdPqP4rFV7V3oA9ihzEgj4Wt", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QMH5Sm2yr3y81VKZuLDtP5UbmoxUtNW5p1", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QRKAjXDQDv3dVFihag8DZhqffh3W3VPQvo", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QXQYR1oJVR7oK5wzbXFHWgMjY6pDy2wAhB", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QNyhH8dutdNhUaZqnkRu5mmR7ivmjhX118", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "Qj1bLXBtZP3NVcVcD1dpwvgbVD3i1x2TkU", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QjNN6JLqzPGUuhw6GVpivLXaeGJEWB1VZV", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QbgesZq44ZgkEfVWbCo3jiMfdy4qytdKwU", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QgyvE9afaS3P8ssqFhqJwuR1sjsxvazdw5", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QRt2PKGpBDF8ZiUgELhBphn5YhwEwpqWME", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QRZYD67yxnaTuFMdREjiSh3SkQPrFFdodS", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QieDZVeiPAyoUYyhGZUS8VPBF3cFiFDEPw", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QV3cEwL4NQ3ioc2Jzduu9B8tzJjCwPkzaj", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QNfkC17dPezMhDch7dEMhTgeBJQ1ckgXk8", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QcdpBcZisrDzXK7FekRwphpjAvZaXzcAZr", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QbTDMss7NtRxxQaSqBZtSLSNdSYgvGaqFf", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "Qaj7VFnofTx7mFWo4Yfo1nzRtX2k32USJq", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QRchdiiPr3eyhurpwmVWnZecBBRp79pGJU", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QemRYQ3NzNNVJddKQGn3frfab79ZBw15rS", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QW7qQMDQwpT498YZVJE8o4QxHCsLzxrA5S", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QM2cyKX6gZqWhtVaVy4MKMD9SyjzzZ4h5w", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "Qfa8ioviZnN5K8dosMGuxp3SuV7QJyH23t", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QS9wFXVtBC4ad9cnenjMaXom6HAZRdb5bJ", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QSRpUMfK1tcF6ySGCsjeTtYk16B9PrqpuH", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "Qez3PAwBEjLDoer8V7b6JFd1CQZiVgqaBu", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QP5bhm92HCEeLwEV3T3ySSdkpTz1ERkSUL", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QZDQGCCHgcSkRfgUqfG2LsPSLDLZ888THh", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QN3gqz7wfqaEsqz5bv4eVgw9vKGth1EjG3", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QeskJAik9pSeV3Ka4L58V7YWHJd1dBe455", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QXm93Bs7hyciXxZMuCU9maMiY6371MCu1x", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QWTZiST8EuP2ix9MgX19ZziKAhRK8C96pd", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QcNpKq2SY7BqDXthSeRV7vikEEedpbPkgg", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QhX25kdPgTg5c2UrPNsbPryuj7bL8YF3hC", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "Qcx8Za7HK42vRP9b8woAo9escmcxZsqgfe", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QjgsYfuqRzWjXFEagqAmaPSVxcXr5A4DmQ", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QXca8P4Z6cHF1YwNcmPToWWx363Dv9okqj", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QjQcgaPLxU7qBW6DP7UyhJhJbLoSFvGM2H", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QjaJVb8V8Surt8G2Wu4yrKfjvoBXQGyDHX", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QgioyTpZKGADu6TBUYxsPVepxTG7VThXEK", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QcmyM7fzGjM3X7VpHybbp4UzVVEcMVdLkR", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QiqfL6z7yeFEJuDgbX4EbkLbCv7aZXafsp", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QM3amnq8GaXUXfDJWrzsHhAzSmioTP5HX4", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QWu1vLngtTUMcPoRx5u16QXCSdsRqwRfuH", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "Qi2taKC6qdm9NBSAaBAshiia8TXRWhxWyR", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QZko7f8rnuUEp8zv7nrJyQfkeYaWfYMffH", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QcJfVM3dmpBMvDbsKVFsx32ahZ6MFH58Mq", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QVfdY59hk6gKUtYoqjCdG7MfnQFSw2WvnE", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "Qhkp6r56t9GL3bNgxvyKfMnfZo6eQqERBQ", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QjZ9v7AcchaJpNqJv5b7dC5Wjsi2JLSJeV", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QWnd9iPWkCTh7UnWPDYhD9h8PXThW5RZgJ", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QdKJo8SPLqtrvc1UgRok4fV9b1CrSgJiY7", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QcHHkSKpnCmZydkDNxcFJL1aDQXPkniGNb", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QjaDRfCXWByCrxS9QkynuxDL2tvDiC6x74", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QS4tnqqR9aU7iCNmc2wYa5YMNbHvh8wmZR", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QiwE9h1CCighEpR8Epzv6fxpjXtahTN6sn", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QRub4MuhmYAmU8bSkSWSRVcYwwmcNwRLsy", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QLitmzEnWVexkwcXbUTaovJrRoDvRMzW32", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QUnKiReHwhg1CeQd2PdpXvU2FdtR9XDkZ4", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QcSJuQNcGMrDhS6Jb2tRQEWLmUbvt5d7Gc", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QQQFM1XuM8nSQSJKAq5t6KWdDPb6uPgiki", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QWnoDUJwt6DRWygNQQSNciHFbN6uehuZhB", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QZppLAZ4JJ3FgU1GXPdrbGDgXEajSk86bh", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QNHocuE5hr64z1RHbfXUQKpHwUv3DG4on4", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QS5SMHzAyjicAkMdK7hnBkiGVmwwBey1kQ", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QhauobwGUVNT8UkK41k2aJVcfMdkpDBwVb", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "Qh31pAfL5dk7jDcUKCpAurkZTTu27D9dGp", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QM1CCBbcTG2S6H1dBVJXTUHxhfasfTR6XF", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QQ5zUwBwfGBru68FsaiawC5vjzigKYzwDs", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QWmFjyqsHkXfXwUvixzXfFh8AX5mwhvD7b", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QTJ8pBwaXUZ1C7rX4Mb9NWbprh88LeUsju", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QMLDPdpscAoTevAHpe3BQLuJdBggsawGLC", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QaboRcMGnxJgfZDkEpqUe8HXsxFY6JdnFw", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QVUTAqofenqSuGC9Mjw9tnEVzxVLfaF6PH", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QVCDS2qjjKSytiSS2S6ZxLcNTnpBB9qEvS", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QfEtw43SfViaC2BEU7xRyR4cJqPdFuc547", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "Qf9EA2o8gMxbMH59JmYPm8buVasBCTrEco", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QddoeVG1N97ui2s9LhMpMCvScvPjf2DmhR", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QajjSZXwp33Zybm9zQ62DdMiYLCic4FHWH", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QZVs7y4Ysb62NHetDEwH7nVvhSqbzF3TsF", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QP6eci8SRs7C6i1CTEBsc7BkLiMdJ7jrvL", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QgUkTPpwsdyes7KxgYzXXWJ1TnjUFViy9R", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QVVUs58P3UimAjoLG3pga2UtbnVhPHqzop", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QYVhnvxEQM3sNbkN5VDkRBuTY3ZEjGP2Y6", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "Qgfcck7VX4ki9m7Haer3WSt9a6sEW7DwKm", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "Qdwd54nUp5moiKVTQ7ESuzdLnwQ9L7oT37", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QiPTyt2VgN7sJyK2rCfy24PQhoL1VwvAUs", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QXNABfSfAFRDF2ZCca4tf1PyA3ARyLUEUK", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QZJjUVgjoacvHmdjfqUDq3Dh6q3eTyNh2y", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QWHzcbXSrEg7AiVDLBhsR1zUBnWUneSkUp", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QLgjnrRRCkQt7g7pWQGAXg99ZxAC8abLGk", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QPmFGR56aQ586ot61Yt1LX79gdgBYGNeUN", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QQb493uqAUrWe2YoNR8MmhhxjNYgcf3XS6", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QV3UDtxFyXCsKdmnVWstWQc1ZMSAPp1WNE", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QV527xbvZNT1529LsDBKn22cNP9YJ6i3HF", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QQAbKyRGv8RUytDyr1D6QzELzMvNmGnuhZ", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QP2xZTDDu6oVvAaRjTNW7fBEm9fcjmyjAF", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QRH9E99H893PS8hFmzPGinAQgbMmoYxRKj", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QRtqR9AqsaE4TKdH4tJPCwUgJtKXkrzumk", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QaEyGRLnR7o85PCRoCq2x4kmsj1ZuVM3eo", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QUZSHjxYNfa6nF8MSyiCm5JKbiRnBy6LZd", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QXUozAco8vrZgc3LZDok4ziQdUb1F2WNiv", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QZF252FDKhrjdXUiXf16Kjju3q23aNfXWk", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "Qj1odhqTstQweB9NosXVzY6Lvzis24AQXP", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QTaiJKCnV9bfbEbfbuKnxzNU8QEnYgv4Xu", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QYLdKUKoKvBAFigiX2H7j1VcL8QaPny1XX", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QaEfP6nFkNrDuzUbcHWj9casn9ekRJCtrg", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QcbQcC2BZP9AipqSDFThm3KWfycn9jweVj", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QfGLmDwWUHhpHFebwCfFibdXFcMZhZWepX", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QMkUwfBU1HKUius1HrEiphapMjDBsFrJEd", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "Qab7N4CYsATCmy8T3VTSnG8oK3Uw3GSe6x", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QdJirbcRUTZ4M6fBAmKGgsvC7DVpEqQLrt", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QSPVSpKZueM1V9xc8HD9Qfte5gFrFJ61Xv", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QcuAciBq8QjDS2EMDAMGi9asP8oaob7UFs", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QNwDgR34mYsw1t9hzyumm5j7siy8AMDjST", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "Qf5RGjWtSn8NSpYeLxKbamogxGST3iX3QY", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QYrytjgXZmWsGarsC3qAAVYdth8qpEjjni", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QbHqojw2kSmcsdcVaRUAcWF2svr9VPh1Lf", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QiTygNmENd8bjyiaK1WwgeX9EF1H8Kapfq", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QScfgds57u1zEPWyjL3GyKsZQ6PRbuVv2G", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QZm6GbBJuLJnTbftJAaJtw2ZJqXiDTu2pD", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "Qb5rprTsoSoKaMcdwLFL7jP3eyhK3LGqNm", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QbpZL12Lh7K2y6xPZure4pix5jH6ViVrF2", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QUZbH7hV8sdLSum74bdqyrLgvN5YTPHUW5", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QiNKXRfnX9mTodSed1yRQexhL1HA42RHHo", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "ACCOUNT_FLAGS", "target": "QT4zHex8JEULmBhYmKd5UhpiNA46T5wUko", "andMask": -1, "orMask": 1, "xorMask": 0 }, + + { "type": "ACCOUNT_LEVEL", "target": "QXsrAcNz93naQsBcyGTECMiB3heKmbZZNT", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QN4NnUvf4UwCKz9U66NUEs6cQJtZiHzpsB", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QRXzd5xi7nPdqZg5ugkoNnttAMEMAS7Zgp", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QZmFAL7D719HQkV72MnvP2CEsnBUyktYEX", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QT7uWcs2dacGGfLzVDRXAWAY5nbgGjczSq", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QYhu1Yvx4wEcMZPF7UhRNNfcHFqWKU9y8U", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QeEY7UgPBDeyQnnir53weJYtTvDZvfEPM4", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QQszFsHkwEf1cxmZkq2Sjd7MmkpKvud9Rc", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "Qi8AKfUEZb6tFiua3D7NMPLGEd8ouyAp99", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QYMortQDHVwAa44bfZhtoz8NALW3iE9bqm", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QMptfhifsYG7LzV9woEmPKvaALLkFQdND4", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QR48czk5GXWj8nUkhzHr1MmV9Xvn7xsyMJ", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QRmrBWDmcRz1c5q63oYKPsJvW5uVvXUrkt", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QR24APnqsTaPCS5WFVEEZevk7oE1TZdTXy", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QPUgbXEj1TfgLQng6yHDMnV4RE4fkzxneP", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QhZH9dcBwJXRHTMUeMnnaFBtzyNEmeEu95", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QeALW9oLFARexJSA5VEPAZR1hkUGRoYCpJ", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "Qgxx7Xr4Ta9RBkkc5BHqr6Yqvb38dsfUrT", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QcqiXKsCnUst4qZdpooe4AuFZp6qLJbH1E", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QQLd58skeFGRzW9JBYfeRNXBEF6BbxuRcL", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QfBvQKMgWjix4oXPZrmU9zJDv8iCT4bAuv", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QamJduVxVwqkUugkeyVwcEqHSSmPNiNt4G", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QeYPPuzXey13V2nRZAS1zhBvsxD9Jww8br", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QiKu8wuB5rZ4ZvUGkdP4jTQWBdMZWQb4Ev", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QhhhQhVeJ1GL3oMyG2ssTx7XLNhPSDhSTs", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QPfi9t9CAPVHu3FGxRGvUb723vYFUYQEv6", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QWH9V5WBEvVkJnJPMXkULX9UaDwHGVoMi6", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QYWoBSTXCRmYQq1yJ3HHjYrxC4KUdVLpmw", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QftjmqLYfjS4jwBukVGbiDLxNE5Hv5SFkA", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QMAJ2jt377iFtALB3UvuXgg21vx9i3ASe9", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QaP9FzoAQAXrvSYpiR9nQU6NewagTBZDuB", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QZpWpi8Lp7zPm63GxU9z2Xiwh6QmD4qfy2", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QPNtFMjoMWwDngH94PAsizhhn3sPFhzDm6", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QTkdeWxc34v5w47SDJYC9QFz9t4DRZwBEy", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QSSpbcy65aoSpC3q5XwEjSKg15LG868eUe", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QhcfCJ6nW4A6PztJ5NXQW2cUo67k2t4HHB", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QYqv8RVp57C9gaH8o1Fez3ofSW24RAfuju", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QVgLvwFNNjHAUwE8h2PcfKRns1EebHDX4B", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QSv5ZY5mW7aGbYA7gqkj4xyPq4AECd7EL8", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QgyQ9HX5JRbdKxFTXgsoq2cnZD89NwxinT", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QTEpaAMni8SpKY8fd8AF7qXEtTode1LoaW", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QeKBjbwctfydGS6mLvDSm8dULcvLUaorwX", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QhfG4EVSd8iZ8H1piRvdRC8MDJ3Jz1WcN9", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QjXYs5HWfda3mgTBqveKatTWHnahv2oX22", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "Qh1iJg1BEdoK4q4hjXcSkNE4qv9oYsHoF4", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QPBcSVqzpB3QhiwMkiq9rMHe7Mx5NynXnD", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QUgVsyMPFxjiS2o5y81FoXoiWHiAwfbq94", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QNH3ebZTv6GeWwjwhjhGg7doia6ZJjqQXG", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QXXeoduLPuhfURibgkfEfSSQ2Rom9SELtL", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QcKnXTjEaTBr91PQY7AkCxvChNpkqU6r1t", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QhWNbSmPAoAg8bXirPeNyGVuoSk84rfnHu", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QdivX7dtJKosr83EmLTViz7PkFC4FQqeH4", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QUB6fPHDTrpYyU6wJmAqV6TUBZiWLrTPuz", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QiG69VVGp13oCiryF4vpDu3a2kEEHi7HDm", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QS4dJJhwCheoMB3Z8Mk8wNZFfSu4FkW9Vv", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "Qb6peGujesgEH9aHd19NfKvR5vTmsb2oHM", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "Qh5tovSQykjFNJGV1P7tGtfmfnJXQQNLr7", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QS1vPBzGLu8ZskZtapcYzUCr8pEjVxtFgu", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QUJmfReuva7PmyzFBr7M35QuYZcAoeWPyT", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QLfYVnUtR4RVcthhzYc7U76vmK6LkyUky4", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QfeNQecGDhdHSdoTDAKAaAdpmgGBfJjQw6", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QiPHkz2YVDhsJPdkD7qxizFFEu7m3g3zA7", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QSmmCGNkGbqwGGvdeBtkHBPa4pXXEG2vkf", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QNjN51iZaZb3ZnfNiLdm1xtUZ4DKLj9X7e", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QjFocrHNieQ8rDYifrZTWtYgejjih6mmS1", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QSNDFgL3bfX7Pe9FaD7p1G1rtJe5v9aYsV", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QWf8uFUXCahEXLV2cjJjunimCJdnvsN3JM", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QSzVqpvkjfFAC6sJcyefyouP1zYZycvwpm", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QX3zQTmhnm89PrW1nfs6YJDfiAkegzpD1S", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "Qg6kovZCzF2GKNyMoeJSaUArvzKJJH56L1", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QhP2ND6q5Sptsy5pQUo18AuTgKMBfF4aPr", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QT3Cu76gET1ezemDVCojoP3SLMY4xNDH7k", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QdsqubwFQ1hChYwzpHvKAiLF9JMWWEwXhp", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QXE9M12CjPHBSFTS8DFUWjab4Z7F1JeRw1", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "Qa5e8Pz4sM7RSAbwvM2N9m5NyYAgm2Fo3J", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QjoNujTmVCDVoR5M99NMBrGwuJCVZUSWJ2", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QMmVSM2dmfhRjGMCZaLeBGU7kXGGPeiRZn", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QYh1Ht5c278CPs56khy4iH2YxXZrtdMGXo", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "Qb3m52qr4jcsidw6DTPJUC62b51rM61VFj", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QTC76DrGsCJuT4ybDiDTFaTxjXTPUJcpUi", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QRqBqahzem4MpJarmGYh1jyaFHYxufssY3", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QZpoY1W7MJvu5uJwdJRbKwWBhVhYPRAgag", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QPfvtXRAWazxK8CrSRvDoCtRG6Hy3ujCx4", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QgJ8Ud1qJHfdC6wyaUNcigUHJ65Udd2jYh", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QRQtHawUKGY7g68yabnneKo88BFv35ddMD", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QYFKaYFjRe8iYDbwUBTWjmPGosjcgBtC3Y", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "Qc3HUdiKbHaaFK83p44WVicewmZip1TnAj", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QYwkYWDsoJAWHPN1dHttMZ8QPABbriRMov", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QVNwVTRnJNL7HYpHZ7wppApTv8H3FxvPXU", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QaxHEi7urRTZbGmcpyCcJr6zQZbDAnbfJt", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QPqG2UHH3ueqsjm2HMUuQj6GQW99VVXJry", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "Qc5LxN2SQCQfJLVatuSMtmJtAihjapL3Qg", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QgMgsYiwyRiUYMHKCdB5tLJxuCroEbJnq8", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QS5NyYUUPuPvkkvazYyYjTT9ef7eZU8of8", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QfNd6YADJq1M4SbwBxLKQ3AD7GEpTpAJi7", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QZfGRwx8K1AyYwPUXHa9Tn16KP2h54iwfr", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QNB1kaRHYBrmDRHepqxad5DYxQPbjVG4As", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QTpjvRCrvWjXoBzSG379ZsEwW2F5xoLSiP", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QZhnNK5FfX3FjTwwYwbewUQGE64Vts7qXP", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QNFmGsWLr7Y4qngz1maq4ptzhcUAJdjDU1", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QR3hH2cxYz9MgDBq3vthEbdnFVMJvprzyV", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QjjDaHSiAaPP8p3CRM3STeBc4VD9SCY4TP", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QRppWy5shqf6TPZfh6CAfjPB25aLWPiNub", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "Qgaszp8eniCvsFiVHaBNNDToaVVYjLdLeB", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QbdHAJur3Vg9MYCPcgsz4dNW9gDGp1f727", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QTxt6nMZmyZCJVLcsxZmwt4sUv1bFkLLRi", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QVbpnTE83PfopgvXY9TD92aYWQrTgvGN3Q", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QPdfyB2zwWt77X5iHeAKr8MTEHFMHE3Ww3", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QRUgU6YptQd85VWiSvLUDRoyxnTBPGRHdx", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QRLDb39eQWwiqttkoYxDB5f5Bu8Bt6tu8P", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QUB67e2qPecWexgCB98gr3oHqMN2ZVay9j", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QhK3xN3Ut6W1B5pg9MJdTLyHLAGLjcP7ma", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "Qai9X8cd9FdZufFH5rcKYodp6s4AQqH2XF", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QX2YaXwfrEDNzUAFWRc3D17hDaLAXw42NQ", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QMUMUzgWeXhUJsWxa7DWVaXDzJFrtpuPCn", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "Qg8hVCdNiRy7Tqs2EHqLWtydqp1wzYc7Ny", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QXG8YWRehGa3aLTnnMupmBrXeXS93YuwmE", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "Qadt3251BYugMm2MjkmzCjrzGp2MfkJicH", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QaiosSXjrXXca8vLpNwKh8qijdh1rd23L3", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QP5tVLY8CQqQgzMuTPrxz2XpP2KDL9neNV", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "Qjeebj5TZqG3y8yGwWT7oamPxEncaf5fC4", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QMM6TbkySGcRkxdpjnmeRcYgL1oC5JKR7X", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QQAFHDRg2PyR6UMR87T2DkQfizMR5VhStM", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QQcXsQRpHtPjECVp55Weu4ohoJK6pK81vu", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QSrT7WTzjs6jnwZpDmcD6NvD2V3i4H5tq5", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QWAagG61SiQvfSbWS4vQnvmJbyCJ7GSXiy", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QQP64bevncP8kZ9bxVP5Brp8moK1rsPsBk", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QUuGEuWwQyjMgtxzAhcvmsQhE8VzsA3vjt", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "Qa7iysVRdxo3KzYSi6JAqAYf4NFfFDjWLj", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QcQdJHRGgvL3AoR9LSRSjVNdczukw7PKQe", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QedHYrn1QkrRZBkRu5kkajgqh5bcD8xZkt", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QUChBcWdxZX1VFHGwrUjRJbqbXjRdPNyki", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QNW6zHWRyzaMPbb6JbKciobqbxtuQSZgw4", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QPFA5p13WYzzhpvHCGDoHtiA2oKAxPeKhU", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QS2ekPtGMR2obKdFKqFAcJQ3rbZmrzBSRz", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QSpVwNfiKEh3NiBXduS8TnJXwgyHYmfFqH", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QYm6g3WqAKnhotVwSLjqzorpVhzn2LgctL", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QSfifb4e9W8C1K2uaAcwvjzqN33fmMcVwR", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QYrLivTTHat8xFeJKkzrJXSyHeWkuBhWVA", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QTxcZ3kMi7msQCkViFwWLdhkShhNNVa5Wv", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QNS4HmJen6qDVqSAYszeHKfaf1j1662tj6", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QPBri2D8WYjxVZYd2oKgwvXg94FKweytBQ", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QbeujwVbYFLx5uQBmkYs1a6cZRAopeB4cD", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QWQUSSqBRQBiNnDu3ZGNGTXJyAfbLf5MxK", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QPt5bnE51SzA6VES5kpdvpNHiFeHHMKWc8", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "Qdu3N57EXxaZ8TXRfHbEa8QuqbYW2sot1t", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QU29ppZiJ9Vzw4tQBrXdPJZToWhpu9Dp9Q", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QZbrkBLFcmRUA21u5QsrPBpzrDH2wXpK7V", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QP544WzvAVh72cCVGr2WKFMzpicaH1wqAY", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QgKUwvnhj8tHWbNb59s9nkHQdapgWNcgAy", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QSCminTT9z7qmx3zEvGZ221B5rVNvjBsK4", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QaSrZL9TyKNUMfge6YiDatURrT2QHxNX1R", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QYg2fLR5jXjStMhzUSq7QJ5uEbTrvRXRYt", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QUWZa7s85qeLC6uWKTsMXnJ4BQbMiBddZB", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QbUSdFauEMKMHq2kAfX7BaLknVME6FpJhj", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QRXMXw7CT1NahXwj19t8wHHAuUFAMYm6NK", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QWr5TR1trHvVh1JzQbRARKqjJaMiywYzgr", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QSjVVpSLeaaFcV1XacFJUXpBoBB3paFVPY", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QQaDSZPWWFcFPGj38g63aP2gngvcgJnmsa", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QcKk4AGz4FwYA56C7wAZW9Ep5Fimf4c1Mo", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QQJnvY3h86m56EGfWKzaVZnFthNDAUdYFo", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QSY6Ps3vxs1XEyFugvAWnv8a7sd1WuZkA8", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QjGbYagnZyc38Sm2M7gbg7wNX4Tfp6kTSs", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QikfKyFmSWN12cMHVzEurCrfS4KEywessZ", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QZRnbiNgLsGjd4pCrWntwSaGU3Ex4sZfLE", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QTyUpPTd4n3Qk9k6k6ifKnB79XHueE4M4X", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QftHwRjwREQ3goEzehhF59rZUtrqrBGH7P", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "Qhy15ZCfvjcDiQt97YcipgwK3paNQWfSAT", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QfhGGYFr8ANfCg32VcvULCqcofUybRbHYJ", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QMZqtWiJjH1JUqy7roNi95ByGvzFThxDXy", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QR17PHMYpHsfhQ8NXPVSVzXG3puMn99YfU", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QVJKdAoPLfnShJFk1cxcu8h7z1SvPTaVyg", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QPByWaTGBToyDNhGMMBgGGRtLPD9V4h5Vv", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QVNWqbd7ERjn9dcqBGwmUcseoiwQCehey7", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QUQiDpv4PzjHLz8bYk8FJBnzrmjKYc6bsr", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QXtNoe9v7bsfW6w8uJweXpo4JESHoxWium", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QfPfxADaYrQUrKySf6tJBtMHA8cNG7VtNe", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QQjtX9bro4bRkS1B3FyfAihyk3vZkQm8hZ", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "Qidvt5WQVMqgcchxwGdCd2jp4cCdGioA4H", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QhfLqEaDKmbynhKYK95BQJtseH3cqEEURD", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QYyyAFBUXB9F91KwHCQNuFDGuw7L38fi4x", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QbMdmYjG4d71FUjk6L7pEoszoC9EQH1zUN", "level": 1 }, + + { "type": "ACCOUNT_LEVEL", "target": "QWxFeuRWE5GZXNfZ2tYqW3GmAC3FAz5Qrc", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QZbG62vQnBrtYJ2VwuJSzfA8NXMj36FYbb", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QLoV9cxAUkPn2DaQKnqDVJq6jMN3k21JAM", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QcsBjck2WTR7J3PmQ9RXHxsPewPkbxzCtp", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "Qj29EdPyW7MhZ15XDgvGZwXrmsP84KM5ff", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QUTg3JNn6JGtHy25XTgdNu5APzp5cAg79v", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QU1C597JwXXBbR2ysX4fKGr9DTqbn1bPxE", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QgboEdXscGVZ3pFyUq7x9ufaRmDseeb4dC", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QNWtJX7SDYBQxsEqmjsLbhVQoAYV3QkynD", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QY1KfMNNtBe1q6JxGzGimxM3vpCoqzQCNX", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QYp7DknXc9PbdF52vTozrh1ZEfM7wZBhFG", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QfshJREL1rFXcBDYTZQcj8mGLpQh3ZWC6t", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QNLBihtJXLo3HVjzLGgdbgbHacTgMt3USC", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QZkKsgF78HsiDef87g7dGLGKsoTSH2ekWT", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QWv4gyJ4N1WxCLvAmWKLtx5mmBYAqXHTXD", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QSp5oQ65SWNbfampnxzgBuEymJLVkarPBV", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QLddFbuRfbkrMQnpHA3gvBtYERfqwRdJsC", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QMHWrDejEvBVuzQyUhnVqnSaKKMHyCosyF", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QVwFkDM51dcvCfmvYUBjjQg87JteNis7f6", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QTvu4zok2UGnB45s1Luj6v3AzMRUEP1zmd", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QYh6BPhuScCt9ENbnAcp16mCZLsYnukMWY", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QYH3WNEknRKSFViWuZzmN43q8wkAGpzKXu", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QZwweWZAURCtoLM8K1ouA7McNyHNjyDcBi", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QQ5RBZkiqGhvCnQvCPPZar8RqhtwDonDBi", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QWpt9ZPYks3PE8nHLyKkoLogD3doMumrK6", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "Qdds3wCmA2P4kkMXHJCi1JuQVMLJayskQu", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QYkkDoVQCHZQM3KJQC1J8qFVZmXi3T7JZe", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QM44Ks8EALor7MNhQGHpUpqu484VeUYRAL", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QeBeZzP6xxSk1hem3tRzchzAAMgRKb3fkg", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QThNX1VbEGbAE31sjZKZYBBg4CNX5JkbRr", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QQiz1NcVPECxicoDXQ1p6h5yU6KozLYFhj", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QP5h7AugR5sY2U9YLHjmTTkuoZFWoomar1", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QY69G6HF2SCnqEPJwwHrnBrXn6UwccfSGa", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QhPFgRDmwGdjexK1nEA2r4caPXG4SRVXCD", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QQrjQEssGwc6ixp9N76b42By1sFbEKDTDZ", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "Qgnzw5Drcj1LvipRbcCPS9rG1PSyXF91nn", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QeLgbgD74BgbBpoPE2jJuNQN5GqyBYNRev", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QVPE6V1xpZpVz2Zhu3SNkKf7TgWPAqRo4x", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QY7NTMeAq2Wt9BZYf4BCwj3eJG5aMYADRu", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QVj9GHBnU1T9yseTTR3j4PST8aaLGNPpm9", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QVVvANL8ML3RaMbF34aoxL3z1bSoznTSC5", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QfxrJXCBbnvGqCSztwDzrNzDaBYQK8Lejr", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QZKQViyTqY2D9zQN1k6pwmKaKE1ooaf4UZ", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QSv8WNg5HwfU68NcGyMEJ3G9pQLGVpHwFk", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QR6QPuyzBtPFB66SheLhiUp8sqgyvrXoVs", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QNPSKjSd8BdKV9y8w3CuU8str4t6AtS2aA", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QT2GRgCRBJTBCWVsoxax2kNFi4eGq8DZ7Q", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QfNphDAZBZPDmtakni5PThJxdbi3xufDr2", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QZoLPzXLePhs7VcLMGRZ9qJxCb9rzqCJmK", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QiDq33pUvSHi2pEZ3cGEPVtiw1i6FzV9ai", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QUNGLbMWTQELBUQN4XUkNtZQehvyZaDmAC", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QZtiZnjjATzg8dEoAikrbQfdjhgGcCTxsT", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QgAt6xyNojsoDpJvcsUPkdmpz5TDp7gZh3", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QYwUGeqXJZDrtMh6QyUT4SubuPqm3nXkYe", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QYdqgA8uYhcec88NxVr7wg3WReUQqGVHzn", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QhpbiBSUcTUu2Ex5pTyTS3SodSyfKmtzyx", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QiTpmEJEstonzSsvuCvkmBQpf7jaNuAuq8", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QSTUkD8xB9rkYNzAhZFdSAxan5Y5KqirtW", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QS5q7B665QkuJtJzNnSnPuHTeDxqAPFJzk", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QfzpWw6tMMWgX76cMZvorPRLPnpxmr1j2X", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QWQdAWwYPMFCRCAc2bDqjJoRx4crZVn1Vh", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QScrEuDdqGHfixHcjyHFkbg5LdeyGexbkS", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QSfDW3KC9P5KQxBRYf4gjJUXSf1DZQwufm", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QZLFJLReUT98wGdaieoA8iLSY6e9pDtkuh", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QRgC1RbtDyvka7UH6RTqSNvJD8vTNkdsNv", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QfCfuAxSbNeHbF8Y2GNuFmJfmexqVH131K", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QQDfTzNLz8NwmPJ1PTiL7zAtWdz7o3LQX7", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QdmfM8nzDfi6U22ze6kaEceED2sb2yYW4x", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QYMpwvQHyny3zKM68SKFUPssSkoNwC5vZt", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QPbsQYN1rpJwV1GbPNJBUkCyx2YWPuLJZd", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QSofobEjrtD2KntRYg5PLdFDdGuf3mdAyc", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QbShL174ecJPLU8nRSjtMwbrudCjzPRqFe", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QgMCRwAr5JoZvth1ESUo5n3Z9ycrfhCofo", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QMyhFtK7iNHUe98nzEXdkN6toAa2RttST5", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "Qh7LXNX79eJoFSUtdppQtAt7Si1R1wbaJX", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QWvVuQKy9165r1osQM98eUnAhfe2HiFEmN", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QbUzPNzbB1McDTWBDJdhpFsVUQhi1hP9NQ", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QggkvYpWRuqPjcMLLGG1R9ZXJAoE83xj2U", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QXS1p29dEQV1JtHj1Mv55SEWfDuHe47AX6", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QUfTY7fh8we4nYPVAXL2jsXSm3hRLGL3uc", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "Qc6HfpXNWjeWQ1JsXRZScit9neymb3tsBV", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "Qe3LcdQpecf8jMiYdMcs9pG7yQiaL4v3dK", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QiJC1E8sA1RVTuRXBFgqzY2zmfJ2eXMgtv", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QeFinpTR23Ryh8Xh2qeX9kHnezQniEx2JT", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QevoCTEHo3PWAKMKgwjv2ziYdeWDJLXsUk", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QNsPF3iZ6RExncd7NCWHzAuofRD56nhP1J", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QQuFcmg7wsdHpEZjTXpbJAEmCxJaZpScfi", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QcgryWoPDdmNbJ7XXnFbhmXVpNopio26VQ", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QjuVB3x6CcH8k6aoQfckdTHP2thnEkeeLM", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "Qe11ExJhNtsH55zAwEuE7RuHBdWhKNHVX6", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "Qb9d7XrcJEB94Lthk1mzTfm7gMt7XjVCPr", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QfA2r9SJogxx5h4Do1rMSEQuJCkeMhL37n", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QUVbFEYn4SUz5eAdum1NHL9i3CvBkvdcpM", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QRDKcbobLECBD7yKCfzcaBAHM3DScRpccL", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QSVTLdnvnJiF9r5P9aEYFobjj9Urv48iyJ", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "Qhb9upVqQLzJfWGzALSVAZNwk7nnkGqctC", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QPMs22gnWYuCxeq133aQ8hezvfo2ukZjBV", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QYfxnLX6sxv2nKaemdR3UG7AFMfwSpWktA", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QeSb4PYhWYzrfvDF47EL8fEQ2tj89hszet", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QiGDtjHbYSvCutyDP4FwB65AaMys26bgk6", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QMefivZuDRcohdW6fKbMUYozLpG3Q5Q6LM", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QMGfUDRXUU2ZFaZDkFgRvCADqf572WvXEU", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QTyeCwFefj24wSMwipWdcDNZonbCmUEExb", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QSfYaHUJcrSFy6DUF4TTdhdxw48A9mRE6m", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QTXbWbc63NFBBU6uT3f95htmVE5tamM5GN", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QW5yn7VbKkRLm5Aaowv3aKCja8VqqiGyCX", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QWPigqprwrci7LCZjuoXWkVnd195gQyBYS", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "Qa6pGoGsm6zEYLaBjV85Nhd6p7aMbCUy9A", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QNNrN2VtgfdGKSQJq3Z8AXuA9iMPddif3H", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QW9HHiZhURbqJVpjuwraujZPoDCsMPdjYS", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QRob3sEQHX7PNW9tJEd2iaXc2LuT8MFPhe", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QgUCStZkxC1b8AbTSDcEMTNj2txDKedN9z", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QRJceDy9e5NEGKPZ3aEsKfQfpP5e97hvkE", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QZc9DBWrEADDnrnTV2DzGJvMJydgteH2YS", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QbgQ7mZH6JqNXno8rL89LqMoTsE7N3QKQa", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QZ1TnT3hF7MHhSCWLSJ8TeZXFMDZD4FY7b", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QYCyEsBMT6o53RTuFtmPUTJYDFsCEQbxAZ", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QeYkt8Kc9zXS5s1FHGkW8iqZowABUJhgEd", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QSXhmKQBB33AoZvw3K8bzQeomcpDTSV8be", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QVDMMeYvQxmHeTe8Nw2of4Z6AUm86Eyn3X", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QMrMeYPa1FPzQbH7F4hpsAxXGMi1cqhVwU", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QP3Vfwt5qAUW4JxBtCRbyY3qAYraLrJFcN", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "Qc1pJ7rYLbUhTZXvdSvnD6JiKXrHHMSGa7", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QNU2RHKDRs5MVueLfZ5DyZQz2V89v197Cw", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QT5rNcBcKR6uHxXkwntscbxHuUpSqAkJ2Q", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QTrJVPcMcisEfBBPqEiwy4UXHdQWWG59yo", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QMqVRK51WYgwCAXXHsVBw7zWom8LngFt5w", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "Qfge3zy6Q1FeqKQfBB1ALqFqZfgZyWJ2Mz", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QTirUpjh93fmAjZa4Ax8PxwuTxAj5uWgug", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QSwkodPybgHBaerTABByNBRnBeWT7oxUgD", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QaLM4cLhjYtex3JUXPzevefKhruWhL2AFU", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QUSryCrEDXRwv5iKZPDdhufa9WSP7NRr2J", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QbzqqkeRZtFDp1UCtsXByvkpWTVtShP8nn", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QfcpK6LtUNCdTjxkh3b2JLU5HWGim9utF3", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QiWFSfVYCBdTJLDNDnZSHwqKf7Wrymw4y1", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QfgvJceEk3UMkQeFc5h7n2V2zhNuanGqC3", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "Qc2gx4tsFiJSea3jYUfrGyQJWkpZfZ3FfX", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QjogZjZwQHrXeDsguP1AMW8o6ehcYNX1h1", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QQ8i9kKbWni9L1ZQf37vjfL9wdRqQYMjt4", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QRyMhM2WPk2yg8GDRCHzGZzgqK6a3QXUtA", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QRLvMoLehvw9gK7w4HW6nUn7EGk1F83Ekv", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QVqvXtRsofKyXjwXieiqEpwRrN3cykue2z", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "Qjr86JYPa2ge6eRxvCbuorhQ7Qvf3T7fve", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QfdrQRjpYvMo5FgctABoBZA1accY9GpnGo", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QMJnn9QY3ZwuGesxrwjQu5CdoirQ634HmM", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "Qd5aSucZtsGUpkk1A4nk6VHKHLN7SQ6bsM", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QNmLqbetUxdMgzvMBr5fFgVuxrMuKvdRca", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QTNphesPV41FeTqzBpR7qQgz1k6WjVLkfq", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QMkq9TSQbn6Tbf1dyUMmuZE7Dgk9EKi638", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QeBSM5kEQdcVfA5xB2wyWX7sJiHhm1eQxj", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QUUFvC2LtMGMoDoQmBjG1fVGhfauFQcg3x", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QWmctuu3wzZ1ySvPANMRHtcR2WqzGDiuLM", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QMVtRvd3r3hRLSy1xsj8q53kE1PfqyJqJ8", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QVeC4LsXkUvd67okfGXdYXHsaq91TEMzda", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QQXPGZnC3BPZ5ApnQvfTZfXYaXsZZNzzxV", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "Qa9SdiUgkGU8xxCLYF9W6D4XtWpagRk2p4", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QVsJzxKLR3StSb55GQEBKRLDUhWQvdu4mW", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QgoqYLgYjAg9Sovw3UrwNZr1uYLbdZBKjo", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QN8LhGeJiDjidBNUwrRjyXrZW282RDin9J", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QhR3ygFfHKr4MyUj2b5bBkowgCND8RqMJ9", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QiQwmW6cybhHYSrDfM2DYyJeCQJMJ7dzG9", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "Qg3sfP7bu2StVvDxELCZyEFMcCZ19pwSnp", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QXzGnAFwuwN3uqztJ1ARPk8AkSCRKWddrY", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QeLPwH4xD5CRx5wMJ3zU52P1yPw35GL95v", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QdgbvSACGz5uWTjMBcC5MBMRi6gAU4xBg7", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QQgyrjSUxb1gGoG6qiteuuqfRTPVQxHw4q", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "Qbc1f6SL5AdKmg2xxTcuswEe7FP8Kv241g", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QZMqoWSLEtTz3rDAiuPigkgpdwbGqFeA4Q", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QXkrrTfHCdqhHodX5ZYmR4pZ99bykeFqKe", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QjFKeSTEdusbqF2S4xFQURKsHMy6m6QjbK", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QY9U7czTSvqgi77fRhuuwmVrWBZYxCqzQ2", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QXAyhHovPqEDmdUgRtjnrC6UZMVWE9P9qS", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QUJxJyYzxgukWBNc4Aghs67DaWoN5UFFn5", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QdpYgDsun4TwoNjz1ZDsyed7GEGXchNw8f", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QZeYrnArdbNUW8bgLxaJuWRyXRmrueor9a", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QYYocaRuwxoZzv1JWr8egZkGZVgNAkd7o5", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QNT3JwAF2cQ3CUCfX52x4WFGgksH4731wA", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QLsdr3KVacCYGuufGkyNerzHgCyNS9EBiw", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "Qj3mCSgWqMECNaSWUDnXbz3a6sQ5SRdXb9", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QYjxtRJXiDHRaP3urEd8MX5nUV9fbgb8Gq", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QjgNuzEGvBEotvHo7xynD3h31mntp7PnSs", "level": 2 }, + { "type": "ACCOUNT_LEVEL", "target": "QZ6Ur9DWGZVzzppkWcZupGAbU6jND8mN2A", "level": 2 }, + + { "type": "ACCOUNT_LEVEL", "target": "QZsDt43LLsYoif7KSHmyUXcUxhWgQfz51E", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qezvnvta62kW8ZNdiio3h3Eded7sDG89ao", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QcBuTqxNmsg3QotEnW8ZCf1EyWHwqBc3w5", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QT94EE7rzSgazh15xpzhjhuqKFE88cHHgY", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QcBqZ4ozxs6JPcvCT3beYzki5Na8pwiEPt", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QZo9xY1NqYwr8XxoiNBVHicHsQDRPDvanM", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QU6DVbLkztW8oS1Q17j8QEcxisSbxnTZzf", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QgqdeTtYTKnLAoCH5x3mh8EL4bRixSAoB5", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QhyRtUUohmkbDzSjZw422cLeXBUBK1Rygw", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QecZdcfkyFbKqTXGn8i5s1iG7Rfz6mAtAS", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QeVSYP9juB5gfwL9QMz3NgYgNj1FLJ9u2x", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QXVoRnk8DKFU6AjqPAcx3RwDnzDnknxwf5", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qcc3iyh3ektfySjbxgJbQ2g457k7KdF2hH", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QbLxPwNiMmdaRPYywjuMeu98RDAYaZPXQp", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qi2DAZBWbia4KeE52Qt1PVvzuSEAHQAmyh", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QgFyAZ2mUp1879ZNpKb8zHFCsYDnHhVCmR", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QawWJdQGTNHk9VQUwF617GRCBpk2zL3Q7m", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QiYaG6TMPjtqQwFz1KeWp2ZX86JCJtaDcp", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QNvmjT2ZpBSL66SqSEUPPmPK7pddcxauub", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QMJshnWZZsr7NRTuJuwHY24UKMHkGorRqU", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qgu8a7dGNaMLudiF7LAKGA33BSzEa3Jdwm", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QbrtqmUoEDdLiwnCWtvNwXaccaSpCKo8uS", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QQPwgGCF3Bp28VBiDWFku42wDYpf1sMxQe", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qd2iY8utUL8wcshE5MCfBR9SVBmKbyHU4F", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QamEfYzNmdo1BEzSbfQSqqSrHbA9AJCaeW", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QcQ6gNFN3b8uHEhCuG9sSgk9LeXjaHKF8f", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QNtqkq5KtkKKF1jYQ3GaNFHALANh1gZ1Qt", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QaWzzJ5XGtKefyCvZ4wCMW56JnJpL8XWYs", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QfeFfrbAL1pxC5jZSUum1BYnbToo4u5EhW", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QaRd3tTjcroAPYXvYR8zmojcXPHL9DZxd5", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qeq1BV4i6gN69DmQ9AgkaPmizo17YuGKA6", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qhcc4R9wJ6mbxB8jCgA7gxsonqGaex7hq1", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QfSa6ivpmWjcTZKw5Mz7sLKX4S6NgPFrFU", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qe3LntnKWfJLkkVcJRqkRqSzqjcJZLrCoa", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QS5P7zuFKFineYRY4Wej2USv2A38GVDbZv", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QbB1tCEKriy5wRnEVetWZmByjYLUyFkg4g", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QXBXg6c1jNYZ9PeAKGLsBiuMY9MVyYVNgz", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qfp2xKR2hiWS29oy8GYJgRANCQyHsSzXMf", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qj8yVKdxvUxBe4E9TvvKcjZ2UxUpa68ZP1", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QZTGHpZ5cyqGBBpiHMTPSGngmqgmh5LB2b", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QR5SGcLtFAxk6mAQZiAMMRUyZLovDaQnQf", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QcTPM3qZFXsArex2Tcjq8KzJmZeTL6LG6A", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qi5o9RHLN8menSyT9ATAv3A8ge3vu94KGM", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QNNRCNBotwc4Z4dyYTwhdCz28EBPHUqgng", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QZ5xduv5rwt4f54jicU5KB6TkNZQJZDgRp", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QQrvmCEHwQR5dzvLTxy8edXBzHJ9Uwde1W", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qbi3FU8dMLEZHJT7DdZWu5rpXnWT2GTGF9", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qi5PGoa9H5zBmfva62SgbyJ5bo2qYo2uKG", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QUpM5bugMgiZ4AqDiT4aiy6mLJQ7Y9GeRU", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QQJJE79CuahqQHSJ4xVVcxANHfE1YHMUoi", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QaddFd123JhgyyZo4SqDzRxkD4v7wyfDxu", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QbuBHgF86E1WHKtiGswiGpWZxtFRg7L7z4", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QdDqQ6rBJLrW1DhPuQnw2Nh2pLbHoXB38k", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QNtb3aiA92Gd9egNvhK7a7uwZY1tDHVSCy", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QPV8fxpCPPqv972Pn77hR735rQ1h6dzAue", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qb2ampydMe4iTvTfh7jtuUbcAuH1xJUpHm", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QWEGkXDJvwyjHppad4JVvCa6jvttn7aPJN", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QPHTv62t8XcdkRjnzU6qmN3yqi95o4F4An", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QY5NwDSwvBFNhu7M2WxUDvyvDPmExQXryz", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QiA6aEE1mq9PPkNTAU55crqkuHycdS1Kf3", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QeabFZdH5srqgfjN9rACGbqkSLdnPHc5Ym", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QhKHv48KUL4spnjx8JppAdraah368VHa3D", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QRC7iB3Ce2vwSfFexT2gipP5VfFBkzYG3K", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QaHF7gJzo1i4yqFqp85QxoQ7WGRuzhm9kL", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QNxE3CV5AMfqgpKUrLWPYkVjWeJj8FGvZL", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QbBvBr2gheZkKiR1nJNfzhA17rnFpPeiXr", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QUe1jYckxbSTYddnQDqa93xJh1Q13pbgwi", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QaKWS4aJHWPee1mGLK4NKfYsHoLym4qcT3", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QWU1HEMTbvMKMgjVmRN91ooaAi2TX45XzQ", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QQxVZ98CxWA79KWer8tBtgbbZ5vbdRfTuu", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QNDHBHKpVz4Lr3EBDkSJ4ZoiSxG34VjTMH", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QY4E9pEXcEFH3Eh8KL4vuXZZEQMsCRjJLw", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QSdyWsbqYkFupwWdxt9AbiQoP4cq9ymPgX", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QhR7nJGFMV9bhj34Ldb9SYiTLMiJWnA2N2", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QVCFSYhWMLTCmPj6mDnLq8JQ9fDTaPDCDY", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QVp2aMAFAjcFQe7Mev2XrxsTCYUcbGfsZx", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QTred1oVKR9QSeuzZ6BudnkK4EUsojwHsb", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QS51FHhmDJHrJ5jxDVTPXbxe27hoU3aJ7k", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QerB77uXd93h64KuMXT1TGuDinYGyBz7Vp", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QUBx7ioCLLbFuMdYCtxmxLpiG4EoBCtxDF", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QYexbcwSivr8tvr8K7P5vkWV6wU2Up211G", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QVY6jD33ykTCVLjwaL3bnuUupzSVKnLVyc", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QTDSpCk1BwrfUhFrnJb5jo4u5ce9mYrQtq", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QWKFaTrMDsBrWB2fbD2GZ5j2y8mt9ofmqN", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qj4Y13T7YnRRnZoDEQcSvPHgDz6dHPFzUH", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QMr2cySkP9ACj9T3pzhSZkPsCeasiLTuuF", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QPocRpr4MzdpHRfjXDdp1PAbjDVBKMCEax", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QP48VJk4UK3XSafgV6b3dLmsJfnDvNX5pD", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QS8SYFNeDzyiNRL4tJBLQauGMBXkATgFHE", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QdfAyJ2fGxnzmyXR3J5ekG1LbjD2nhUJZf", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qah57SitxbUZDeAiCFj26k4hvNFjX5cQSJ", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QfRZsM88kdbi8a26SmrZdusR4pVTCLCHmd", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QgtS5U8K89Ax2mmc2JKCWBHQNVZ7tLwCJn", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QVgD467m4gCe8y25X14xsMchFvzbeNMay3", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QWScc4dvcbgPmAQSAUZsfpqCRPE3nivGsU", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QUBhMg3yy4FtiW6h5136CfQqqHDxr3SUtg", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qj54QTsNtZ2HtTt7tPaKMVZdSQtfdNbrGL", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QVX7DzY5oCJydHWdmEuZMpuAFLpVYwmHzK", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QLi4GUiww4bKQH6ouEFFEmyHMXgPDvtko1", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QiEUfeoo8eAKUgFad1qsMziJWw6ZenUxMd", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QMGeYbe4aXs6CTnstGib3zZd7k6UvTvZsr", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QWeYhaXNW94WAY1YPm83pXaZfak46AWaKe", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QZMUskZQiycMLrcCmRAE1xDDLCyTCAVZrf", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QfVRtTXq5ft8L8CA6XpUKYK7v1Zea8WJvi", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QeWSpRvWQ5fW4Deac9fhy2KogSYJzrFyKf", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QTnFhyTywaTZcxQsHuKYXoT4x5DMJ6zM7u", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QepQfSL7yZQAKFxsbpnqxiWc12FnrC7jtv", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QNSGkxLdJwqztSbHRP1a9FV1o48YkYAgGy", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qgnt93E7MQRUmisXR8anK81D9SdmCxBVob", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QbfLajkHMLZxNTcK2p5B5AKJhVbWSYohog", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qce4cfhZcTbV6FyAfGfzwpP58qpeDF1Cci", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QQ8wsBG98Q7HxCwvCUUVfdXo9CX3PcEpTX", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qa6dNeXGkMdooTd8SxFicZYxbxPGCwLx8s", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QMU5izcUpRNk8CRzy7VL6CuP1DS4XYnNeP", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QibWhLgP23xahRe4cDQ8JmdSavEA2RAbH9", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QWn5gL9aBWNArVF4e4MRgP8YkUKee39W2y", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QfgiHy7s2jPJFe6zvHQTcZWwV8ojLyKvrs", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QQvXhppxwTDQrhs58Gb51BM3aUrFevPH5j", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QbNB37Qtoh2i8Pj6MtzGANVUZerzG3Zb2N", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QabS4XAyJpXzPHZyiuUhurnpuHZpACNuny", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QMkuFWrxs2Rhwt9KuhVghX3CAhcSXTmN7W", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QSrPzymXJwqDbDpmEi14pRjtrrdehZpGyc", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QexNnLLCdxJjci43j1FytfzoaDD5RmvoXE", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QMf8KFSxAsyTdGrNQnFdXQkE2fcQrrVWQ2", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QVfMdKX45x5FdnRTdKAURPCkymYJRyJgRX", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qdo67QsSrDhf4oL8D5jC2efGgUknAKrEWK", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qcb5niZq3fapBq6YHcSFmpPdK7zKAyVqMo", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QSwnihvcSfvePUZJUKZPuTr2WQb5BiyW1D", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QgjEEYEAPWSwS4jEVZcYdJSvLfwoywCyvZ", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QbyC9ue1BEDbSafF4u9EuhuBvpMvm8rTAq", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QUKzxTDD9AzthoukedkqSYDEHRTFjRFnfm", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QhTn6DXvAatHbqcz32NJ6Am8nyNDc2ZMQM", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QTZHY3vX6aLVGWe8A9QjW3uHMGhd1pMAPa", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QUmfeSj9Ae9NsESzHKsgyF5i7sw3riWbCJ", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QTc149rVuzoJ2kLLDi6TLQ5QQfU45B4VFk", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QfX1sfG3Z1ix5mm2mdVDkEr7fTnq5HYRCW", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QfMeaYEra3ZP4576eWgBYwyHX9gbRcHE8x", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qg65672zycKy7Tb5SZYxXPNBvh3vPwdKdy", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QVF8uodXcVdnvU7DbRg4FJBR6dfYNK1vSa", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QiA92XRA1Sf28iAsrQvZNsYTDJpUAsyZCc", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QfEuD1CtcefSu7jMYpwDhZHupBwmhaCTsz", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QacH68BmZyMkB8dufjzTjGWMYkvUHUwFut", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qb1KRviQaL1j93c7CWb36KS6pvfQdUSLzk", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QbUuHMMxwbbnRZZCNRTcSK4gZ5fSha55Ed", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QdGQppMtF7LKj5uNBCQU5LQzvwiwXeP9Uy", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QVt2cpiE8HLsofz1iEyFcrJg9g7MbGQZTk", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QPc8yZZztKDmF8SCKBKHcMVEXqyWypmaoU", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QbjPhMwdXdkFY1sPrE7jMWeWBcSRTZweN6", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qgc3Q1ZRWc1LKX51GqPtaYzXyLn6SyoobB", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QS3AQ7DD1RZ6M81XcGdrKibhNgvKFnNwjY", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QdGfF78c8kwmGFD7DWhtZMGvxG35nT7tZW", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QVdh3tLLkAZdYKPAMz4CGaSqp7RvRmE1wc", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QRqjcSqiGWADnD8Z6cF2949PYWwRAsdWd5", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QiVfxu5mgUkfiUjdwxvnxBJEsZuUaL2nM6", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QQR6WaNVF8y72Extb6Ndb6bqEDabCUiXs3", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qhim4KT9VkcxbE6a61ECZ4nq5dHUtb9okx", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qh5GLNHyNt9Zx4umjoBkbsaPViJ8xKiVDi", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QV1FEkzd4nsDZPddG3sWBdxWCELMkZ6HFk", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QfrwyMsGvF9Vo6SMyPyKSuveEFikx5fgvc", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QQ2rRvcqCr6nj5kkxwBDT9ZTfN2akMGv1z", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QepQTxuer8cnS69aYf7EDAoWQw6GMPLibW", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QbdB5TN8P2mDRrBi7kXWu6U8vNkMyh7RJ6", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QjEsV1pxjcHPNPV8m3oCC163w6t9PZZF6p", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qc7yMoMRrA2fXmQ77JuxSfVdXyfPdcnNwp", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QUbAAYiv8P1oACxGDp4jGWD66t7siiqTtp", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QQsYuc5XBWaUsoR2QAVs4AVKBmY9FCSrQ4", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QXo7EkKEDCE1SeReojKyqVUFVQ1sriN1WH", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QaAo87qyhKXU26y1YR1FTvrLHv2uav8KsE", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QNJT34EthEvwgonu2vUVHNmosGRRxZhSHh", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QhTQDuBcjfnhqHu8mfRJAYn6VyFj7YjrHP", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QQpoQWccsb6UVWnstdZzyMZZjBuWLxSgaV", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QWQ6MUMNQKiJFnF2iKsFakeVvH4TBogxki", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QRXZA3wdXpu8phg8KJFe7RNQhs8D2P3DLq", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qd5WLbqdcUcbi5ZyY1rsDTBpBG7X6YAS9r", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QYAk7XFu2bG5cKTVApjey95YRtie4Ed13N", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QbPqWcpXcNGuGhYZ2hvLNQ6XhyfudvCbi6", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "Qajx9YjYHukNF2fxq2UbGniGdpQL6jzy5t", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QiPKz6cwzu6HiWU7ayBjPhW9i63f93K2Gk", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QPmCwzYeToHypmcosysxkSu2hnzEPkZ3Kq", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QfFs5G1TPzDzsa4UUB5PmypRnEFTyS3674", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QT5Te5Ya15tV3vSmdy2pPpZdrnztAAZeUL", "level": 3 }, + { "type": "ACCOUNT_LEVEL", "target": "QeiMYN7pcPJY5GUvZo2tYMHvDvRYx1cNak", "level": 3 }, + + { "type": "ACCOUNT_LEVEL", "target": "QY4NuorvFU9AUhonC5owihgNdRork8oo1E", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QSDWB7bKAoH5sHRVsUNmTPe9xDkvX2phom", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QNBQQ29UH2SA97MLDdnTy7ExxZxLLpfZwU", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QhP12VMSCpC4PcV55Fx4aFfT2c6RSsMs42", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QgS64v2deiY1Z1AiLkrRxQKzJSMCNXVgrD", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QZ2vjwzV4Y5JCGzkwJPDgWysNMB6rFVgrK", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QWmWNDLYdKkDwy5kRbyRe654wksS8r2nUX", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QcwaxY5RRmoa3fSntzJXZLrwLmfrjqtFNu", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QaoJPWKxmGRq4rWNfo4232yVX5WPBuoKqC", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QSJHRs8N3dbPwYbhbj1L8jFWBzrq7L3duY", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QWRzfuzym3kfZzuoA5ASpnEvmgeHE18hF6", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QQUUAxnYkmMPs9WWQcgjwUMVPGpKnQPeYc", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QYqZN2qwT4zfE8XkAfTnvpQV4ws3JbCMxU", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QSx29CwBhQsJbQ9hVQoAFEXQR2VYz7KjMK", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QRnJfCXxGrdEUDVdHDCw9DDV3gKgRu5vVQ", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QgWKwKe9mZLgTu2NeyeDsfuPVE9Ku4Zt2s", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "Qcj8jG5E9KtEYK12hVmWdo6cdUKven9z7f", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QUMJtgeL4xEBWBT4NZdjqvMWGyfdagQ2pB", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QdPxohH7LJTdUSXXnTb99qhuMSqJFCxc3s", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QbW5AkBDfr1cLZHtMFANoMKB9ta86CAYD1", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QPgKTyPyj8DMv2nLZumJYYYwSD7iF3Lw3U", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QLzWPFyLvezHjzdwnNR5n1jUHpHjdjQ3R7", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "Qgcf647FFAFZ1JP7bEv4sa5rw4qr54uTQW", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QjuQLSjRyDTVhDgMxzUjLJFbnYdUeXyH23", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QbwcDH8PDbr5Kyr5jwBZ9Ys7hzg1A5QpMA", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QQfhecXaev1FYq2UgMhpzZa4oayc9k1nnQ", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QfpiA1rowLYMDVPf6oe7E9R7WNGQwAKfir", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QQCcSHJspqeYhfxbK8UH1UhjHeGzmnQEHQ", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QPUtaNb6ANbWHLJCGMs1o74yeb6pYmHNcG", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QYrLYW646AtMjd6Nn3e4qzeKkMCzhtBkG9", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QNfyujwtGFucVnjkaDEhdRprnixYfV2wz8", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QSFxD72vCMra8P9ohh895NuuPHvof9b7qc", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QbVAUHJsqRY9JNn9aBV8VEowQQ2BbP9uyv", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QXtM9SWWqqJGS36qDq6S4MnMt3dnUb4kNp", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QQCr9Aj6XtEVQXbz4D9fHSDDwn8ANbQd7B", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QSqyNKEktA4iXb7cWWTSUMkkc58vCiCJCH", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "Qeek2544Smo4zkMHvbQ2tVJhKv1gDAp1if", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QQUm5WQs1jzN19X7Ls9NY5q9G1BmtbKK3U", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QenuGzurgCPaeh9xDxRwoPRjNivgX6h68s", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QihN1use3mN5BshhSrSS3hF1iMmwPFcdog", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "Qbu1Si8WLZeXpwiHXzPsSkdBMDV1BFLkEU", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QRkubxXBe8ABtsWFpdB498EhBy16FNiPMo", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QVa9VbF2aGbXNh3LfNxnFJ9p8cqSmFnymi", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QYqQHwpJMPR8aa4PWKEXxmc8uB2AybcRt5", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QPHyxSLBx92izt17oifcsBqh2WYDTWcgpo", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "Qg3QXvRPXayBGqsGzfvS1a1Eh1WDHowBLM", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QjJu5DiC3xVkFca2wznFCei4HBbvCRPoJS", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QbcDt7uDJok9ka4FaVtXaT7LYR1sQMENyL", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QPR3NwdDuZuZGXW1UZjoZhHKWreLw7iZVi", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QaoWao3UJjZpwbwj6YgrdWgS1dDvR2vEFK", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QVX7YLBES6rJGtTeLespEspCxi9oDYxGQ4", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QRpsUCr13shNTDo78B3r4UthkXa3E5FgFr", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QREUmhn4Pty6mjnJxJH7RxnrwN1RvbD7fe", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QPdzGiWdyHjbBhtCMvpd6QacfozzMPpfNa", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QMriaRPNU6RZJmipSuZcRi1WVj63wb6GrL", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QiW6Kd22LCJjCpp5EBotFDeCKjCC7t8vSY", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QN5GSskzBjKQ7ZnwMMqgko1M3KWKCVqwh8", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QWwra8uA9M4pvabK41561mgFd2o79thQdT", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QcQSX8HPRpNDGgQH41U1QV5FJ1TgK9q5Fr", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QcTrX5Qzbe2djro29T3wKDq9MA8m86HqUH", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QWpLWkuZ2pMiiPXRM4jupQe3vBp7GiRtvA", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QdLHqfBmfKG7mnXCUALfgQvKW4S5igrDSV", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QTBiyoSuy3ZF4yLJzjqUY2imVPsUULFbG1", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QTEFHfLoXohdbT1FFdHVJeEL22qmMypTJ7", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QdRwRvbTfT43sHjyG7q4f38PaGvwiDyrWj", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QijECkb9URmgXD1oAtvYEe59dPmU4A4fHP", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "Qeh73yn3ngvB5yX3beKJArFuCJks5i5r7B", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QNWzHrRGoZtYhEUznjdxCmMi22LqGa1ndN", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QgNjGNiAKViM1Mzd9pGHieNJk6CRSFrZKt", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QVrGMZ8NBLEvEcWXfKkCWXDvUCWF4z4yXC", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "Qe3camytysJJ2BnfqGmw7BUegZXJTvkeeJ", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QfVUkFvVNPxQCKgRFWzFQVk6oFCbuyzyRW", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QP86kJ98hxBi6rzAJFkoCuwkQXh3DvAGcw", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QXxMKghXxEKx8RopT2rdiCrBFvoyN1mZMS", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QdtUw5FRmaKAfJ1Ttu4bUagfX13cTHCpFw", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QXuHgMUN9FWFVFjbquFqkDw5NKRToVd2t8", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QjSZxZZJ2MRB3118i1VmSuzamBJNCnUFaR", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QUWURY2qbSM29to4uuZ1CQXh2VgWp5AJsT", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QXbg7o4ufCFjeA5uSWDSMB28vAc9XeRSH3", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "Qdmf9fZDUFWxjXZU2hrhTZmKiiMuy6AEyC", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QWJgQDygXYBXuweFXPTzte1eDMg3CnRUxS", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QgZJ17ZXdrJEqcAPM4Bnj3NJimpCupDs2x", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QiZRd7wFASi2jaQfiWSMFS8Qcfrp3MCDxo", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QZuxbXpcWbPNHoU4yEps383E4rTKkkTdBH", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QUigfC2QABH3RMuStStggx9YiZ49VdtWTw", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QVQepwPCzSosioi85mzfCxVMPR3f8mGBjP", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QWBTMtHSCRrHTabkzf38tqhe5xSB8wtTN4", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QRY5mhkq1fV9MZ8rtrR1j3MnCidqfstKCX", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QTnnKbBSqDGHKiD1Qo7yb8ry33mzxZDs4E", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QTtyKRb2fSeuhH44cvenzahXSKWiGfV5K5", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QSbg4JJCm9oZkESD9obePZpGK49gWbmGsc", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QRtARSe5ppL7WpNaMaWeboWbVcL4Ua3nxo", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QaQs8c2ccbjPGhpAYdaJRLGyBTWTkDKfmh", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QRVotWtKboC5APg8YxhjdJuV9JioWFydiC", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QjXB8Mac8ityiVMWHkXPbi7qgKMuCjKdbW", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QXLtbT3ru6WfPjTMZ35q2f29kuNh5v3X8s", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QisDJUYKUnv4sEW3RfVhNywxVWcHFg21Rq", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QVpbg3oMF4MAUD8QVQbSfK49YfUYAijEPf", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QVYPrrnPsn3D3AbiXsCk6wb3EERhTQbauT", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QdjJKpJt95jGgyQK3HR4qTYQuwAYdYTM5X", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QcUths9zcKzhmWxpQjdoPkf7ZCrvPqqHum", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QfErd2q9pvzPGuoH1NRSUgXxZtz2oyWX6C", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "Qg8zWrXTiAk2r1gFLrh8e2vSen7DdbYU6X", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QNMF4gGKyQxKBHxC9weivsiGwJ8JFAswgi", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QWNik2tj86KQh5zGCoskz4Rhcd9K1Qv2gL", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QdxqwnjHC2qy1j11YMZP9KF9dm8AbyGMby", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QSVYtX9qPuCxejLZtUxabTJ4urKFMcbwsb", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "Qj6ykh2hXy5jiYRgrmt7D4H2KvMX5oPWac", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QNyT6h7qK1zS6GeqXfoMJUf15pyush94yg", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QdnRL1yDRGhoE2695SCLpPdCzzp5xZLMDc", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QX8FkJYYLTjXSwdJBAwHtTvHiZWCmAVmCY", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QXqHgue5R4qJNvPEsxZvbYMpsCRmD7YmRf", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QTUArhyERXNN76q33wdcxJzVxZoo4YUQk8", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QZHKbDYdSjS6FF3Mz41xowpjHF3fh6BvFb", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "Qf73yQjcdH2hFndu5f7xcb6NDt19TP9DoB", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QMxU2uvzikxgzj53sE7cTe6iri94z4FuXv", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QX2gQw3y5xuKD3shthn4cQ2mZ8b6XLysjk", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QNtoFtG7gBXeocAGwDVvC2JX81qs6gSPHU", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QUHZiok3byKWVjdp1U1LcVhsqcF5ARHT1q", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QMZ7Vnq9P9TcB6LK4WLZstuf7ozSUBJSTQ", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QPy3imHu9bFEkNPF28vidDQTZtLGdgpWqC", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QWMoMkXwPv6f5s8PxRfiy6u3nYfVMpyGve", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QRYAgyuRWrLVg7VaB87vBVWm7kUyYFJ71w", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QX6PwuE3VRToyWd1Y5jiUsByFvppDeha2U", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QfoPk8G5fiBXJ2S4Yk8PpcktDj8AZnShvT", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "Qdihq99B7ZnAtqru71PAGQhjhjtAJdAX5k", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QTGMkcxHVmxv1JkDw8DSWtdB19hTJLG7zd", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QXgeaEWieLL93jvT6QigYr9JGcJdnFXByP", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QSSKJUY33kdbz1vkiEooiY45VKiZkD2Dka", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "Qg7TbPrg1q2ydVdNLqJoQtC3RLBUo3t2uD", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QgcVr77TfcVmb9iSgsSRPeQqejqfKAvgQy", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QYs3NV1EsGc2GaBYC1jPAPBsZRGfYfwopn", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QjDgJmv1gnz3VSJHziY3quBHE51qEAj9b2", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QMoUYGYfYXdVUxAGvxkisHfgzwvf1psMLB", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QNTdKEnSyyUFfp9SPnbUSgbbnHi73LZ4py", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "Qf4NBSfFKmjQBuuL3ti4xUFLt9cutKrHDw", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QfjrwPMPQTdkc7rdu1qyUGGmy8uyXB5BH3", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QPxbzCsTxCsafRUWp1oBHfbqRva6sHyxTk", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QSKnXn18fM83HS4J96BvSHmYi5CfvZYgWn", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QN2yfuEHpZqZDZREXUUTp7JDzzAnzD26S5", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QjCL939qc9yuNuP7KvEnpX3Ykj6vWtU5Xi", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QMkmZBSS6CqiUZrL6HkgL6NeEAbz4VYgKt", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QVRxJWg5jsbNcuMFSzEbrQ6ZCWL9qqiQBc", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QSKeBHV5ndQNEwZf7BMT8YMY63wJPXHUDg", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QM6nHqVPpe9eXvpeshH3fzKS7vok9ykN2c", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QZ5HVfecMcnxnUbxhNPk1HV2GMUTqUF5uB", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QNDN31DNB3cu6E6hKT7YQRv5P5wzbvm8gR", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QaDVaEtetDZk2SQUcEwrv7srTKVi5nKMXk", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QcnYqcsiJ5bJnyKGMHRQA3LjB8EP6kbRxs", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QVg5c7fQ7AjQx3Vtf1esfbNeMjuJ7HSxnS", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QMG7Q4CQfS8uWRFVNZCkMq9EMeKQMyo8hA", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QWeVdu8Q6UtPCA7oxcw1vN8V4BYJ2UTLuT", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QZNRfr4Q2M3GCgUiCrffn4rr1fcNLMLuDo", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QXhvKsfnptbBhkbyThihqZyU9QESPfATbP", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "Qeho5fUhWEb58qFoZdMB9LggSnbaQh9vRs", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "Qe8DdBX1a6dzMyX6kA7BXHmJz3hPWB1y7X", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QSAejnaEvm4pSS8oXEh3b9XYqmKuHhqLVb", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "Qhidz4HLjm1kVrLTd8EPyJEELnoFVqnATQ", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QRtmedUHNdfwaNwBWX8tAK88mwTWa2z8Fe", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QQa4sXFp5jq7ntE25pvz7xVU3rUWs4eiiQ", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QSz9ksffuikfBjBwFRQJW51wQ5CbSc8HUV", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QVHXvLjCrNXgcRu5nw2KFNsaZ4SUkcod64", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QWnXShDuAWiCmmKsLtRUWrbovhoXafU5sP", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "Qj3PMPgJbk5nYi9wZxpyoNwNPaPAjBfKa5", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QbG8iHnYMCEt5Gv4gbXT2sTiafwnwy6SWh", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QTkzizg6HmDCNjA2XoUSJK79dgYTAFdNEg", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QfmqayQUFTY8YTqrw8odoQ8P3RwyWo777F", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QWNkvkThhZXJQ23AidJ26bUQXiNCNfeNMv", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QWmJ1XpdQSmZLG4vDS8EoB5w6UrwYzUFNC", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QQT6fRGwyxAS1uuayVJvetBHBhdKpBvgFt", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QWbqaN8TxsvxDihfkUUBRobujVbxsbzoTA", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QdtRTY7sfe2xQKR4jFRWMpFyyP4EoPnvDJ", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QgyC28vh1ri8U1UCkjwQuCinjJS6xmLE11", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QLnMwxfVJf82MovsG4i5GPvkny5JNBTQup", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QYF6MLarj9k1VPKyog2YHDBboeFngmUnTK", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QeXgozDEv5NhxmNzbV1HEugcceLoye2b2y", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QLrGfcLXyTWmA8CPUZkPM3WywzTAHVuz7x", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QcfiV9f1vUbBLrTRPLJsyhVgKzKT7uuHKi", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "Qgxgpn2J8c5LzC2aUkPqixnVkRmd4fjBUm", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QUmr9efCkGUt1qMNer2vt1xtcy8S9wTtAL", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QienqdWpCiDvk5q99F8pt1JYTZsSn6qLrD", "level": 4 }, + { "type": "ACCOUNT_LEVEL", "target": "QUMip9ykZ66AP3Gbg8pGP1ewoZwoTZBtba", "level": 4 }, + + { "type": "ACCOUNT_LEVEL", "target": "QgYWsGqKjL7MrJdQmsHXMhtKxJqW6vWyTw", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QQMiJaCGrw57PsF4hWmqtnbmyWVLPkq1s7", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QPSfVkCtF3NJYyhPNN8yNAQY8pgRbFirgW", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QNrY4iAmR4TQtB77hMrM3u2XXYX2st3wxD", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QgCQoTy5Y5RNrBjeycXthX7t5HX7oEzz19", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QiczLg5bJZsut7zqwka8E7y9Hi6qPh4Jqv", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QQW5QPRbWBFQpdPa9x9x8AxejhgSTUGTwJ", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QTEDEPGWU1pED5VMo6dPYrN9a7CQe1zWtS", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QZDN32a1tDV1mZ2jMZekaHiQq8QTfoaJ6a", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QRBJVtRZGb99SosM9y5YJ7ogsMdVxXdPu9", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QifaDahrcETU3Jc5HEQJVUQdSXVvRYXUTi", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QaXsvTkVCcfXYBod3LLnT4yBbVyxAcSK6V", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QTJq4Q8ie25z7QdfzeXoSJYqkG4pYQDU6J", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QdUDcf7Ey61TxGtfdW8BLTZjBJ7zKGgk9s", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QgwhdGRUuSKm4xqpT61xB5iiP29wKFkTXr", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QSftyUsD8B3F5nkW2YjEikmcUvLoGHjUL1", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QP7NckFrHLgGKbM8aNYwbGCk4YjsmgeKT2", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QYwvyiFoaoK74dw54N2xt7UmWH7hwUeCzb", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QdssSgnCVg8M66bacZqFaYCDXRGCpb3ze9", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QQTrDiZhETEoAimcJFfFT63rzqBy6RNA34", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qfi42mfbpxRE2KnqH4TGQzX5dEuSGaTABT", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QRYgWAEXBJ21AN8ncvWYN1NhQm4iQV1n6m", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QYu45h5kp5TAx5R53mMk7XUE1YgkEym2H8", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QVX3JsK9vcyLBLjoWY4WwDLF3MoL3tSDMk", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QMHcurZGnyzPAmdNurcacm1GNCUHRRZ8jf", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QVkpbCGEwfdkEjkkXPjZJGGqPG4F5YxoD7", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qj3Fdad5SPJuMFFAmndBRe9AGumWxvJmZr", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QRJjhxgFEepMD1Mb3Bzgmd1t2WuSRKxrge", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QifSzfbmba5KHi2HyUwdm5C9evXqXENgZk", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QZbs49mBzkHtoKouBUAD9atYUz6RBH9pQ2", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QcBREkh5tkffuFLT78SLPJZCzVWXhnweoR", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QbPcRUYCLY1WssipaRygKeEBm1LHBPZnuR", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QfypvmTWiTHo2GgpBA9CrGvr9ke5Pi1dvG", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QUEviSVKeHCwfBm2cpVHzx5aV4uETjARNh", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QdhGpQJJDuVbZrVdNUS2ec3gNq2D4Tu9pF", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QZEKMgog8epbcSKGaH3stvFX6mc6EH611J", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qiq3xFZgSv8hiTmMs2inxf5T5tDfarPU4x", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QZSS1LoXwHpPNzgW6schoQgUNoKoCA3iVF", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QXaaXiBDAiL5nwVsPhGwabjoEaV11q3DzG", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QSUBoFU5hhcHduACBiz7kD4UAf8jo8zsTb", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qani4X4UGeXamvzHc8X4RXzA8jWSmH8cAW", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QSTzv5G8YEhtHpGoUDNFVW9LMNke77kLye", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QNneGgUVdTAMkQ9hoY1XbezGZ4joa3Thnp", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QcNxuwspRac1sGRjotUTZrsNAX5rYr9fM1", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QTuZoN8Rcm4pLUNP6HXR1t3tU9Z4Jwiu2T", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QdvieSs2Lnr8j76TMaZVwiN26kTzsF7mFD", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QdSppgA8ZA4ojEPdNNj9akBbgDPvnTQH8A", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QgSLWX4QEgujL8vB1btx2feZa7Nyueyv8k", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QSoV8SFqxoEweZ1rJSsWtM5wJJnrbT2LGH", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QPpr5vJcjoJY8f7Wv4wrQMAyfPx4eB9Kk6", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QjHyEgbcJaYmmABWCMTcDiQAHsmYZ2ZkMQ", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QadBi4yLoKjC6XHKGmrVJsVZReR7PzHgmo", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QcAkNCK6bF9sjZYsroSAwRRygVrq5Lqjbg", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qb2vVR5Jq6AmCDXhZutKdLU6fKi8weGPzT", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QcgtjvYfx4BnV1mmA5FXWtXavXWkqJaYXo", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QTK2wbbs3LzideTS2UpXLwKduVaFg3aZ6h", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QhRPSTf9z5nELnH5otVyyRN2iHLJGM5gxH", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QPqdmoZnmPKCwugnbtURKgVMv4LCN51Mra", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qhz2Enzj62kVerEnscLa1oCmJXYRk1b9rY", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QY37v4nnj2JdnwxvZRyQKok89PkXNy2DRG", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QXZrPLnA2yjCrbFkk1TJ4rGVunXDTcUCiH", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QWae72VAzeus4aVbUYJmtqgPhAYvEWrrAD", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QRzCnx48eJtqm6gUKhdSEZPVE4PoD9cezH", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QYFZoo4jcSDgrPxQ7rc8FhPb8fcNgBvrhu", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QZbh5t9UiQGeR12cTMaEreo8pBQCEUodwm", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QPiMqnsBRRwGQFJgzNK51siFqUGppfH1cY", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QURar6EGNcaXr6TZf2X3gHCMkGBhGQLBZN", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QgHdmfvGfiGx5kSn3GdRn72pWafGey6Jia", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QbRktBVQovHF9Cc59M98VedTAFwgqg3jHJ", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QU8mm9JDdtgHpwWEA6Snou1qvBgwVqQjio", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QRPVT5h6VuNWyXWhtL1nMMTi7bGmw3yMDX", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QVbmnrrGqe9RjwX4EHU7w17AY2mUrJ9y37", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QgBLAB1HtEU8nuuSEso6413ir8bv7y9NNY", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QV7LARZvy2Psz5kLfsD52uEeQwHuM4VYtn", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QbEJfhEUV4nqBeGsDUYiiJyHW2a7LHzX1q", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QLeJ8R9FKeyhVivaLuvTt3vcszKDxEBWXk", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QWazYjG28fWUvGCoxvVCwhz47hty7VgHdt", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QP15D6KGREk1eGZ8Pjb3LP8jw9oaywHRCH", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QSVQDZsQSvsd3BFiAS45WjA6gquH7mKp3s", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qee9GheZLwpyYPEbGci65Cu9ywmfUpiUtA", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QVYGSLnspzWNtGCDBxtF26JMY1PRR9E8Mr", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QjQCea9aLKuXQNH6iqADfC7yngwVTdA5A2", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QXZJY8MgKXviC4xeuMoZ6zaYSm7dJqZYaA", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qfv2jWMD3EC6sAGxKx8hRBSQVAt4YmtTvX", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QSVzQVQCzL3AC8bAHGkbTCiy3xgeWGfsfR", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qd31D4nhiCMnPFHoKdjeszqbNP914JZ8ro", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QfgfpEia92nL94vxwRiSJp7ee5ZophKhJ9", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QQdJscTibkMvWkbZitYzrWLtnTxhgt7K7U", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QR5WMxJWgaBPUiDhyYvbgYfiNXMjvqg6UA", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QTJKN4HYcMBw1BCxEPB79peKqyBE2o8pfz", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QQBRiZmS55ZEJNPj1VQBCQC7FVvafVdRBF", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QVyrsn9hn3evAQFm8ECjhRYeAqhDZgwiz7", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QaYtyv8etaQF7gQP2YKzeLqKyzrp8jrJpv", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QStvmZNCzqNeyfzzeKrq5xQh83P1F6ERpt", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qe6XX4Eghqm3psn3jSzwcsJ8N9yaaE6qXJ", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qhy3Zg5D95QWrprgRyWL1Hta6JmMarP2TN", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QVG8Qdgn2yBsNRQDV7oW54r1whSEwvUk7M", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QVsBXTUPszNJrdaT11rDSRewSdUjMQd5cs", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QPmFVFFkB72o8Th9D2wJxgZaz6unt9HwW7", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QRA1jykbch853CAsXXt9sEGBjsp835v3P2", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QSXfJsEHYTcwmcsJ9yoekCD4HULQpxeCBd", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QZhb63HLT4RFyczAXhvviLHvkQUi9q6mTX", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QUHuwaoxNusHj7ZUyTYjRFP9EETt2hixkV", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QRyvShLAW3tZEaydKZxLAA7R2GmErJFdn5", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qf4FAqg7uo9sDZVwSyRctiGgHNfyr77HGD", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QcxYc7fFZjMCtE3GAdr6YduTcPzWXux7kV", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QRwYWNYRYpP42uucjSMiSmrpteCyJuaatT", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QUw5tEoXvnGKK7bUKye9zGLyuumhJxE8ZY", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QYw5c1Ufeu3Xs6X4wDtEW3rY6mvJdyiV69", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QZfcnG7M1KLuNVHFoAz75Q9axCPeZGvmnK", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QSWBNaUoWQtkDioGsRQVMevrNjMBNhFA9m", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qfmyojs61pnVshq3AMb3SueZQJmZWGS6P5", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QbakZPnxpoFvUUA2ikFXEMfupnzL2g1Hpe", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QgYwhNYcrYXEVL5vu6xgtB5egYpspHu8Qr", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QLtzQ3BiNMDJr6UtibNGKNY5q1Lek22mbw", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QTxsroYE6NqWJEfCYRTN2kXFpvc1L6dywo", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QauYtokfSq8oZC7MQJkkRUCHwV9RCJXfop", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QiLH8NVybYU3gfwXqmApeeLoebMmdxsvy2", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QboQVDYaeYEWoxxuq638FGFwFZwVbv3wZd", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QTTMNosEkAGiFXLUVMczcmKA12Uj77Dm3G", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qbo2JRDzV3DFruTjznyhzF2arhrKuNuz8C", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QdbbfH115EuQzAcEPfV4adEVKEhq2rQE7P", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QUQYqyWTkyXvnUxM3caZuEtDEDSbfJYpwd", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QdwmWF5FRsXNwn9aDh4SKWfhEuamnAXokH", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QNTqdLMtm1k6Q4iYpnvc5BcH9NBxanMkYC", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qi7J6Wzb6pSgaeyGXYmbNo6a3J7csQncYW", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QMaJeJ5MmK4UG3Zto9JgLhJ26JaPKSp6ha", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QeCmhsUEgUe7ddLqCMHcX2be72BPFkQWd8", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QWTdjKcTE8DpSopLJsy1H6CsqupZSU3ZGB", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QeDrfr1wmu7okNMRZmbJ2EwZMFesEv9zMV", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QizC1Qtg7UUDu4bDKibiTKEMhmGqP7C1Qb", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QZPQfSTVKjRYJ3r5P6orJsYaz6ZcG87ktd", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qjt3WY2Je4xSBFA97ptGQBZfSpJb4jgxR4", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QTPUBwrW6aRQLHQpPrw4e2bDXR3gRWq3kF", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QZLRzY7RZy3h6pE5CAk57RUvR48HH2joWi", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QNAN8iRgrqKwPqrCojJQjBpEiEov5tirL2", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QiygUw8uXTLzDFJ2E7HBKHMHqiuFWCa6GB", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QaZpSiB9Nj8WdbL3MHvUzZBXeFSqEMiD7T", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QgaJRHFpD7WQEpPKVkUSNzxae4hSUyeJvh", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QeN8j74amkd8GFyoRcxBaVrkHns2WxKjmS", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QLmQGf4imhLzZVAbX97MR9JFZik8JQ48B8", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QY81xXYuMaewGHHcrYNdxJzhi6dNqu2JRY", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QiVm5E2rvGb5VVfWTAMA1VUAd34k7Gqr1q", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QhGHn89LXfEj7y4CjSLtadvn8ezL6cAScQ", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QSCP8xGYg88n963nN9ejiDJeiNggwLRLpE", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QdzyigNad6fXJxykm46yWRH5tN8uDq4beF", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QQJQfXRwypwuD6oRHjcdRCKeUhdrCsDs8k", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QPCYAstwUstQDESpFbPBB1U28LEoRcPq1J", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QU4xvi1HzuxYEqQrxhKYnQ2D8hDmRimE14", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QVgLeZ8poUf7CJJ2vUGUEwUiKJ1sgszTzE", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QcU5kKi3mX1VJzne44LZLpr3htebQtn7xy", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QdkxvWwbkLDnovvksuNDwyDHP3634CnSCU", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qf9XqVqSSKDBG5F6AP7nUv1LpUMU6bmRnK", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QNfqTKfSU3E8RWoJtJgnKxwJDkzfXb18cW", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QSpEUGYR2rveDE4ryRPVjizHtRKnMRh5fN", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qd1GMBYjor3X8AL1WzHFi7egejb45XtLzY", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qbbzcfy5WjRejf5tHJLG14P3uvK23ywozr", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QWUSHC2Bpdr9PUNB8Hj9S7HF5iagWPWNEa", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QcftPPiBPU8Y1XuCzdAH6vduXHR5V7YFhv", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QR6rz7SHGgDC7QnNzWBCo6idbcxcXiLfBz", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QhgTuLEhWnxFCqCCADVP7Fh2oXXG9j3Dj9", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QTzaaunU9vbdibBHKqg5ZpVH1jcu4rCCm6", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QNCas5mqJLgeJHB5jQKXuCVBhqPfRHdYMF", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QhqWZL5643Y5C3RwvBSJpv3W6FA8GbFWJC", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QaVBebFHbsbhBcmrX9ocbnwEMJgzkHvMZQ", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qdbj1tS7ZGrNdKXqEKfnt9EnwbCLLzyoCY", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qjn22uhkomiP9H95G7XAbEVZFjKiGPfezV", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qj3QnnhKZeUbjUtxGLJ8jQVb7XohfDy1Eq", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QLqNGEMTT6GGi3dChtp56ocae6XxkakTkf", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QZHLChVNfNNp5rsZQQKRRxkPGriUAyhK5s", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qjrgs36ajjTFgrKUMvsDSW8xiNmDG1L2be", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qbriz3o7KWJZCafQCt4ftJAAEh8Pvg8o8v", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QgPQSW3FVHbEKf4UBZh1WwVhLo4eTSXa44", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QSchsxiHAmhvA59HBy4M9y2JobH7nwi5Xf", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QYEbJEiXbPjqKFpUWkbXBcFFUU1PbppZnw", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QNG95Qwbb5P4DGedLHv2kmYvMjG3GxbCEP", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QSFj8r42yFpaPQNwKWwSVQKVdozTniCk8G", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QM4JVyX65WbLUYTyptAMea2MHsefGvUcR5", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QRey3hPPGc2ewP1Ztw4SFG1fyU1xiqLjCP", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QZ8cte5J5R21uypoaoCvAALzBkYSePZHDF", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QcCRjkP1XeD1dvwU4umQ9cFWv8d3hJqjK6", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QUH61i6hsZehnXNJF5VefvLQcRCsNg3NPr", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QagyUZdmnKJA9LyEqcxJFFf2ehmcqVZsKb", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QcCYuXos5xBXXHbRg1RTfSdxiZEkGa3N2P", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qg3TKLhPvn7bKVrT9x37wJiJ7YZ4jBuqQW", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QiQUssukhoo1ft4G9Mxa8JpViqFW4PdBjJ", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QTVLRwoopfg7qSG9CMfCPJz3UydnT3jDxD", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QV2HChYd7opM1r6oYaX7KA5VUoKdiUuagg", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QV4f2XGsEFNgzabewhSPn1Gv3ZHNNps9fa", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QVhboSLD1VmX2YvAnfAXkbzvsmXkDJZTNR", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QVxGkDgXt4nHj4MAd1afV9AxT1XCUVLGja", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QXqkdj36XNHviKSyvmYgcKX1rb7HyXCxPZ", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QXZPc1JxDRWq2ruxuhVzirLqeb16rjpCc3", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QatMo1UEJwRoLMsV5PdYYXLV9RPGCiBMvU", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QbYEcWjKDLTA9tRVkkNbvVT5924rBjwVSm", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QMyn4hgtgCqpBTvXfhs4CWGmeKr8TzWkHA", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QS4HpYpif8xWe2EVcK6rexii2bK8NqsiDs", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qf5SRxnRThmY6eUoCVJhfK7vdsWP4fqEBR", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QaKT7xuHznaWqN1RdiU2WhNJCWtuDX7Brq", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qd5NuuHK5tqTk8jNUF9mkR4zaLRbh2vUGj", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QWW9iuy79tcFbHChCsZ28NDoxMAqMpPXhW", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QP9y1CmZRyw3oKNSTTm7Q74FxWp2mEHc26", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QZLJV7wbaFyxaoZQsjm6rb9MWMiDzWsqM2", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qe2ZksqXbXgJQ5kSErszCunbAEp7q5BBEB", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QhQLJ1w8ChxuqpdCMqB5cB9YUfsnMGKQrC", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QSUkFbuPdM11iN6LHTSyoc2XR3vir6CHSb", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QdWhwJckVbZCjCMDhLwsFuzAvwJv7y4r34", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QMEL3mfTcS4NwMsR2hx9tx1HaqmjsFiji4", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QXWCbFQ4fDdUVtcivCDySZmhbqSUw5CWKj", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QYvML3UWBSwpx9SSQprJo12R2ZjLKXHY5e", "level": 5 }, + + { "type": "ACCOUNT_LEVEL", "target": "Qbzgu32EF5nPsanMMXXsMNz1rQ4hcmnGZA", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QSCYGst9SJb4gz2H21Vq3DXquxzY73VWm2", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "Qh9Mx3kaTcWfoYJDgeQuDJ487K8EEwTtDo", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QRQ7875Nwp9osH7GScPREnfLPX5RczZZ46", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QjBn4bLZEeau7hx3Wae6ZWVtc7yCC79xEU", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QMG32pXpVopiMA6HLoawMi9x4WmwZBpotK", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "Qa8uuqfKV9yZekwTNU2JWnj8rnZc2RRmco", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QhRiACrq2Xgw491jZovDL5UqvmVDGXQfdG", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QZXGVbvKEp2G4c3dBHbTxtZKmu1x3k4Urx", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QX1oGefhKHCchNSUqycfzPjZp5NnwBoAGK", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QSw5SHLYZLe5NKT2ebMLAr6BbYJNQ6rWrd", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QQsUPNpkB2iERBFqVHJomgPvBEookzGgFP", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QSqw9dxfGhQJTstNgkxJmig9YTxVFaTo3i", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QjFpwBMrZKsGDmi8tGgXp1m9P7xxcr758T", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "Qa64xQ1Qqmc13H3W8KB6Z5rRPsoRztKZuM", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QRpCadQWjcJHeieoUnXTiSpqydRbYcA6qh", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QiG86w5cMT9iv7pekuRohJmFXUwkvjvMXm", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QgAUczBPFQz7UpVeukv8tEPGEtu4TkMAgv", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QRjAxvFYSsXSuwTgDQFAxFo1Vy8ntmij9w", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QMc2ogsdyB9HUS6gka1XvJst6iWV6XDd1y", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "Qjf73NRcLF18taDgZvrDXUNysViHiP81j8", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QLsnsdVELRJDkr355QCJXzzR29whaxbP3m", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QgocHNWrSPTrUGp6oiSg9gwsvAHD8pYVHi", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QbmbTWgUEH57JXHzdgUAy8H9HZD1Bzu2T5", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QNXG4iaaPiqd2RLA28FJwCk6csUU7Mh6rZ", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QhsWKPi65qKKLVkn7DgopCn4h3f2W1FMvd", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "Qe2TzQdF5MGsfFbytqEosFkmWA24i4YaQM", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QULHofsgHS3B3whoFNXPHrNMJZDv4YUc96", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QTwx66zP3H7PxNJjtX41BZZB6nEEpXGTV8", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QgjfghHZfQtNjjetUUNC5cHza4JebSAeyB", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QitLt9FeT84swMehxuWnLqKrtfhaaW8nzm", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QdLxR3bofPLP2ZkwHKuhW1KzetRNyFeW35", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QSkzC9kNFxZnKFiMaiGsdVoAGKjfBBZwcz", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QZ4z5mEXUDQMqBXGQg5Cp2SvGMDTEZaXLD", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QTJfNxUJvvnX9zRCxAFrMFz1YB1cYShNLv", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QQnyuF6J5AN7MvxZdxLL4r6qjYFmBpf6qd", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QTJ5tQZCqh8KJmhbWKsx2uwUYXYbjyzUxz", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "Qb6k1h4VvfoRsQeEnDSvsBe9PfJnsaRcax", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QNjTDHtHXdVtfcRf8qTqSZgXLDiFBADBqX", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QMnrK51UipWbtiA3ogm24mhe7WRAJ17BmM", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QNdQuxwAjHcojdxYfkxnnkMNMDZ2Ym6sH2", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QN7HMxm2qCxHNTei5wmBfxFMr4cbb6xBAF", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "Qfb3KNCYWsEzj7npPJxiNnQKw97Ly3BpEW", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "Qg36i5Z5f12EYBR5PUZaf59Ub8KeEkYovh", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QNy6RzB1xWykv3Yb6uUDQ9VgLTRGoFPLKT", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "Qf8cCCvv57r14pN4oJFVbLym4WWMERkA8H", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QV4VZbbdmuYtZKE1LXjQsojbb4nTJSw3wR", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QReEeUBRRnsXUd4iMtgHAt6pfHZfVYD66H", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QThtnUYKiXtx9ga7LtT9qftafdiVDZs2tQ", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QbADUiFmkLpvyTZ6ug8kkE9j8aDcDm8W7o", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QYYpvHzcUP4s9jSZzaNn1mqZDM4u26yAfT", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QQKCYjczFAKAgjYhRL1jjGcA6khh35Fu9F", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QSa3xN2kdAwc6PBQw8UmFpK245cK34Aa8Q", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QYuLzGnHLSvLtrDndk9GGPQnGU5MW2MtYE", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QN7zXUcHfBhn28qopFZ1R7pej4i8ndPibm", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QedfstymDM3KpQPuNwARywnTniwFekBD56", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QTJMjw4LikMSf9LJ2Sfp6QrDZFVhtRauEj", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QRE5pZcGwZ7bSEWh7oXAS9Pb8wxcBLwQdJ", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QaeYRDhR9UagFPGQuhjmahtmmEqj8Fscf3", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QUyubWVyz5PLPcvCTxe9YgVfRsPhU5PKwH", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QdxGiYrxV4Hr4P3hNT988cCo8CqjyNNtN2", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QY3jWQe5QbqQSMyLwf8JiMAbY2HRdAUQQ7", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QbTS7CNqoqhQW79MwDMZRDKoA4U3XuQedT", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QY8AQrKf1KE7MCKCWG1Lvh7q2mEWWqjnCh", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QZtRisdwd1o2raPA7KhCnF88msVJoyc3uZ", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QdRio67LD8QCPmzXiwimvnNgSuXhdHy6hM", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "Qd6RrfCKZX3nx8wRCtJ6jJA9VJ4o7quuEe", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QiUbpcT8Uibzua79RRzqbLqA3MUkWG1Q3W", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QXKBimE8Vbat755M9zmcKiiV4gkSLc6vfB", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QUC5EMMVav2Qt4TDe9Af39reYoFnamxUkn", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QjEaoBWyAP4Ff29dGUZtGsYdRvHKf8HKb2", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QS11w9zba8LPhicybuvxkTZCmTLMCt3HZ1", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QW2LGY6cQwmGycv5ELE23z38WqXFzsuTFx", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QcL5p8mwKk9g6xpwCXTiHpJWwRUKqUkgKc", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QPHLQxDwymECG1deHhhxNkEM8jTH3rfmvA", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QTR34yKDT59X1YJR4Y4HAnHJXXjwVHi1BM", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QR9EUCjXzD7hQETjnZrKTsQ9XQAWjZtN3d", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QQQUNMU47F6LbMjC7wVhaPgw34ytetgbLT", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QUuugD6cTY5p7RFGnMrV78dfmEBrAAYx1N", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QQktyzttrEtkN1iHQNAR3TfS1T5Xse9REv", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QPaWULDvmSr1cwhNiYzU59fnZkQmLQafWe", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QSvTyX62mGPTGLKA8TvmYcuct878LaLrsp", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QMKunzBtoEQ2Ab8emix8KCXQR9dcfN7gca", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QZezsFhUeN3ayGjJ2QnPJpG8tHqfutnKxq", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QNBe19N5gNvgK1R4PvaYEinsAGTcbaQiNR", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QVkLgL3tx7aizRF64PAWnLn6VKTY4jGGXC", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QRsi8YiWAQKrBVNHyEAdcKy9P82NRK66pu", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QiktanAj2ACcLhcCLWSAf3oboZdrkvWkcu", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QXKXL8hen7hM8W1fFHUAfKbPxZqqiimTnD", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QP2NiMK9iATLo2bNRER3yuEk38VP4SC5jL", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QNkZHXusJXpreoxyo5ULyvPXZjkxA3UvEw", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "Qca4vfeoNVbtbHzJa5F3v8sWqZh51Fz5mR", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QiNYuBjPpwDo3b1iETYPZnZwtfQnpQGouR", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QV3sZ8AtdRr8YTEPnmxE9tMt7wxX4ruG8U", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QYkPYG6CEwpkxq5s3Sy6PHnn3SDXqvPSvb", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QhGkgG7EtqwuRYQ599DNn1jMfyzkNeZhKk", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QdHk2qSAMeiPqYRACaNyy1jpAVYzTLrdyv", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QTrtqtdN1Kxiu8YDumczZd4QvyRwAzk7FS", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QWxcJFLecFjrmejcCToGVRJpXueAZJgiEu", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QgU2udWFXJpDatHhmXWqFLxYCkYGSDUGLD", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QhT1YEHJpbuFrTqkRCyeAn5QdeJsNzjX6p", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QjuZxHoptE264839GsNhjcWgrCAzcbDQQL", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QP9m28hRAd3Qz96CvBnwipR8J319b2sjzY", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QawVhDFeqEd6aGfgRxHsLN7SnrhGqweSHC", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QVwpXi2jMj5aMVjZmXbfDiQwhKY3FJyiPk", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QZBRV9a8UBbdKaz63JqTnY3w2R62W1phiN", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QhQDb2NkMXo5TALywQwJm4jp5CxydPsrqf", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QVjGMUHTBkimNLGuDvctX8VPq1NkMAWJfc", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QYCd9YsdNpFeabaQVzoYUYAbUkXkERZNSZ", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QbcacPWfXdQe4HpDr5ddbFBuuURLaaS1Dr", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QbSToBjt9g75sCM2SUEgJNb6uskeTyzPbb", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QeToG5yenFa8TfHJUE17898D2RVZ76tYiT", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QNBHmU7jgD3HyfD7qFzKAMcgdw7Pr3FTBm", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QeFMFEzN6nEtC42MdffLBB2RbyUKMq9BPf", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QQmVTLRTBBQ8c2syo379Koydj1RNCAhUw5", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QWWKVymgzeYECUwomWkaxioMAmpmotUh62", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QM8xDvrXzLRo41SjkNeMTYoP3tKsaLcQze", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QRkhzEqETQczL8xHV8P98rwu84755SDbWP", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QLiSBYE3QzNsWijsF8BTNzziLfyVB6nV4q", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QcS9jgiG6AptzioTUfUJr5oXJYQES275xU", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QfkPYKpTfotYzN5BhKXENDgt1f3vo8LTSp", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QQ9NUxhdgtvvxTSZqYY6k9qxHziqSQ5jcK", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QZ94CoMHUyNGxtef6QHMUNRd8D3NNUgM5V", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "Qce4PQd34icYvN463Smi9ahVGxznoax9Wi", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QR3MXpsu8ig4PJHJEfKsnDuxrSDLrDzLd8", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QXHQEBm9CtVTY9RNdCDxju7yr61DW3K8JL", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QhFG2as3oZVYSubieisTPHco58pgw2nr5E", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QY3dGvuVkQADmQYndkKv7sLBG6JeduhVbz", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QMSx3vQagdw6QD4D9SiiDRMhDrNFGjhUpd", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QVBktFMtw31ye88qjR2LTkfFGgoRkXyf7w", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QPr17q2iYVQ5kMEtmUmEBN3WpMF6DjzR2x", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QZituXHq3AzDdi9PDhtA5jySAC4VBUk6UJ", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QYaVmr36tGTH4g5iTCeB5tZu3u81yp6M1G", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "Qa51wH3pbN1bDpDWwpDDRrccwVmZo4CdXc", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QbQB5hSA7P2ssdYXzxWcbDePL6SDDBUpgQ", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QeKHm4Rg7ANF6RBfphgS9gkYhLEboJUP8v", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QSpjpN64bYczYNsKsgmNmNDAFiKUg9orJA", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QdmwboMpKVpnvdYZgiaEXpuEnygDRxyywc", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QLnRWFKRGRtQAmX2aGM1F5vXvEb7naUUBG", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "Qaqb6saKN4YuHVKJ2HEDgKWAzGhJQ43sic", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QadBYsejVVWyFneDMpCffjbBpxgF9AEatD", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "Qh6K3QdnKBkb4u5Z3wD73C4sTjvcBTgiFC", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "Qa7td7KrALcVXpMcv5GzvrtGMAPKHUUECb", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QaqNZLJBCJTas5Frp43jzxEYvEoWdgYeXJ", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QUJoDzJ8WDG62MSpMfzxUDH1pwJ6aRWZL4", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QeVt9GFpDSdg73XQbVdCU4LHgMp9eysYa1", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QgzD9PSp1P5WVkyifGxCcoV7TXzLWL4GgN", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QWDtjA76XhCfXw6gvYfo3MFcbKCX2ZEyLJ", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QM9wXFKoAYkmDwCkz1Vdsn9vyMeRRKRCzy", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QWyp8eCTuCnT32vYQEj5rywCXWxYm36dov", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QSGJrJSGub71GrjGSXJSZMFUtHEn7C5TUW", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QNhPdmMHBUPJL6yvghnTFnRajMBmdqddZd", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QZaZctoQRrR2g1bhAfzb5Z5ZMANGVkBG5u", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QUhct2oBCmaU6kYguDNcbU6HQss9QELpLJ", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QSwQUg1aWMQ7kQcR6WMWa5SHxarGdG3DgW", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QdQmZTpA8a2YnrZAykVhNpGhk4kVmjnwRL", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QiVTD43EpJ4iFXKJwnofocwcopw1iYo1TP", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QeXsnu3X1FsmLMRPYPJcsfJBVrTtwW4qrR", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QVTgyvvRGrd56BrFLvQoaF3DAYBXaobwef", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QczCL1E9G6fpifK2pFgDQiV2N5M7X54vAV", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QYQs34RxFv7rtYAx9mErUabnJDvCfBe8gY", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QanakqWSmEB6oQkrWVDRArG4wTHPs3zw4T", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QNiGHSk13xXy54KuCqQ5PQZBQa13DhPb84", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QemRZy1gnzY1j5czckXAoBqW2Ae32onBPn", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QNzqkJgXKy4Gi22hGgyMMThFeG6KSYUwEb", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QZ3cnhqAJVyCwYBZmgjnvDz76bKyJCXa1d", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "Qa4ZKZEgKNRDNADY97aB95VYQMa2CUYV7y", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QWceBxyxTA9AUocwwennBg3eLb97W5K7E4", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QaX4UkVvH27H3RkMtKebMoBvJCcEbDiUjq", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QjJnJQfaPYJdcRsKHABNKL9VYKbQBJ4Jkk", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QhqaWQkLXTzotnRoUnT8T6sQneiwnR4nkM", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QQwemW9rxyyZRv428hr374p92KLhk3qjKP", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QaeT4E1ihqYKa5jTxByN9n33v5aP6f8s9C", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QUaiuJWKnNr9ZZBzGWd2jSKoS2W6nTFGuM", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QiVQroJR4kUYmvexsCZGxUD3noQ3JSStS4", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QPcDkEHxDKmJBnXoVE5rPmkgm5jX2wBX3Z", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QfSgCJLRfEWixHQ2nF5Nqz2T7rnNsy7uWS", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QU7EUWDZz7qJVPih3wL9RKTHRfPFy4ASHC", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QiTygNmENd8bjyiaK1WwgeX9EF1H8Kapfq", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QScfgds57u1zEPWyjL3GyKsZQ6PRbuVv2G", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QZm6GbBJuLJnTbftJAaJtw2ZJqXiDTu2pD", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "Qb5rprTsoSoKaMcdwLFL7jP3eyhK3LGqNm", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QbpZL12Lh7K2y6xPZure4pix5jH6ViVrF2", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QUZbH7hV8sdLSum74bdqyrLgvN5YTPHUW5", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QiNKXRfnX9mTodSed1yRQexhL1HA42RHHo", "level": 6 }, + { "type": "ACCOUNT_LEVEL", "target": "QT4zHex8JEULmBhYmKd5UhpiNA46T5wUko", "level": 6 }, + + { "type": "CREATE_GROUP", "creatorPublicKey": "CVancqfgb2vWLXHjqZF8LtoQyB7Y5HtZUrFKvtwrTkNW", "owner": "QbmBdAbvmXqCya8bia8WaD5izumKkC9BrY", "groupName": "dev-group", "description": "developer group", "isOpen": true, "approvalThreshold": "PCT40", "minimumBlockDelay": 10, "maximumBlockDelay": 1440 }, + + { "type": "JOIN_GROUP", "joinerPublicKey": "2qRDBEKrarZGvePqWM8djfAsa8LMw3WCcG7UmGni42Rk", "groupId": 1 }, + { "type": "ADD_GROUP_ADMIN", "ownerPublicKey": "CVancqfgb2vWLXHjqZF8LtoQyB7Y5HtZUrFKvtwrTkNW", "groupId": 1, "member": "QhQLJ1w8ChxuqpdCMqB5cB9YUfsnMGKQrC" }, + + { "type": "JOIN_GROUP", "joinerPublicKey": "A5RNKWchwQisV89MXBsD36mXEYJYUoCqtMenhHRaWNt7", "groupId": 1 }, + { "type": "ADD_GROUP_ADMIN", "ownerPublicKey": "CVancqfgb2vWLXHjqZF8LtoQyB7Y5HtZUrFKvtwrTkNW", "groupId": 1, "member": "QSUkFbuPdM11iN6LHTSyoc2XR3vir6CHSb" }, + + { "type": "JOIN_GROUP", "joinerPublicKey": "B4Yvir9qMK1SHoqffiyTj96ke9ZAKzvpybwURjy4LxsR", "groupId": 1 }, + { "type": "ADD_GROUP_ADMIN", "ownerPublicKey": "CVancqfgb2vWLXHjqZF8LtoQyB7Y5HtZUrFKvtwrTkNW", "groupId": 1, "member": "QdWhwJckVbZCjCMDhLwsFuzAvwJv7y4r34" }, + + { "type": "JOIN_GROUP", "joinerPublicKey": "4MqhFijJJPjrLQVaUaAMPBpRhQH7uPKNDkgVMXdZSbVh", "groupId": 1 }, + { "type": "ADD_GROUP_ADMIN", "ownerPublicKey": "CVancqfgb2vWLXHjqZF8LtoQyB7Y5HtZUrFKvtwrTkNW", "groupId": 1, "member": "QMEL3mfTcS4NwMsR2hx9tx1HaqmjsFiji4" }, + + { "type": "JOIN_GROUP", "joinerPublicKey": "FmSzBdj3kj8Uyin3pUzBNDHTfZ3dMKYFEJJkjeP2sDxq", "groupId": 1 }, + { "type": "ADD_GROUP_ADMIN", "ownerPublicKey": "CVancqfgb2vWLXHjqZF8LtoQyB7Y5HtZUrFKvtwrTkNW", "groupId": 1, "member": "QXWCbFQ4fDdUVtcivCDySZmhbqSUw5CWKj" }, + + { "type": "JOIN_GROUP", "joinerPublicKey": "2qRDBEKrarZGvePqWM8djfAsa8LMw3WCcG7UmGni42Rk", "groupId": 1 }, + { "type": "ADD_GROUP_ADMIN", "ownerPublicKey": "CVancqfgb2vWLXHjqZF8LtoQyB7Y5HtZUrFKvtwrTkNW", "groupId": 1, "member": "QYvML3UWBSwpx9SSQprJo12R2ZjLKXHY5e" }, + + { "type": "UPDATE_GROUP", "ownerPublicKey": "CVancqfgb2vWLXHjqZF8LtoQyB7Y5HtZUrFKvtwrTkNW", "groupId": 1, "newOwner": "QdSnUy6sUiEnaN87dWmE92g1uQjrvPgrWG", "newDescription": "developer group", "newIsOpen": false, "newApprovalThreshold": "ONE", "newMinimumBlockDelay": 10, "newMaximumBlockDelay": 1440 }, + + { "type": "JOIN_GROUP", "joinerPublicKey": "8q7oSa8YQqTSvPP7aC3P9TrSpXbqp7zdYxbiGCHzv5Wb", "groupId": 1 }, + { "type": "GROUP_INVITE", "adminPublicKey": "CVancqfgb2vWLXHjqZF8LtoQyB7Y5HtZUrFKvtwrTkNW", "invitee": "Qe2ZksqXbXgJQ5kSErszCunbAEp7q5BBEB", "groupId": 1 }, + + { "type": "GENESIS", "recipient": "Qe2ZksqXbXgJQ5kSErszCunbAEp7q5BBEB", "amount": 10000000000 }, + { "type": "GENESIS", "recipient": "QhQLJ1w8ChxuqpdCMqB5cB9YUfsnMGKQrC", "amount": 10000000000 }, + { "type": "GENESIS", "recipient": "QSUkFbuPdM11iN6LHTSyoc2XR3vir6CHSb", "amount": 10000000000 }, + { "type": "GENESIS", "recipient": "QdWhwJckVbZCjCMDhLwsFuzAvwJv7y4r34", "amount": 10000000000 }, + { "type": "GENESIS", "recipient": "QMEL3mfTcS4NwMsR2hx9tx1HaqmjsFiji4", "amount": 10000000000 }, + { "type": "GENESIS", "recipient": "QXWCbFQ4fDdUVtcivCDySZmhbqSUw5CWKj", "amount": 10000000000 }, + { "type": "GENESIS", "recipient": "QYvML3UWBSwpx9SSQprJo12R2ZjLKXHY5e", "amount": 10000000000 }, + + { "type": "GENESIS", "recipient": "QY82MasqEH6ChwXaETH4piMtE8Pk4NBWD3", "amount": 1000 }, + { "type": "GENESIS", "recipient": "Qi3N6fNRrs15EHmkxYyWHyh4z3Dp2rVU2i", "amount": 1000 }, + { "type": "GENESIS", "recipient": "QPFM4xX2826MuBEhMtdReW1QR3vRYrQff3", "amount": 1000 }, + { "type": "GENESIS", "recipient": "QbmBdAbvmXqCya8bia8WaD5izumKkC9BrY", "amount": 1000 }, + { "type": "GENESIS", "recipient": "QPsjHoKhugEADrtSQP5xjFgsaQPn9WmE3Y", "amount": 1000 }, + { "type": "GENESIS", "recipient": "QdV7La52WsJz1Fr7N8wuRyKz6NbZGEQvhX", "amount": 1000 }, + { "type": "GENESIS", "recipient": "QSJ5cDLWivGcn9ym21azufBfiqeuGH1maq", "amount": 1000 }, + { "type": "GENESIS", "recipient": "Qfbyw8g4uMnwqinozQsbrXF1WisFt1NmbZ", "amount": 1000 }, + { "type": "GENESIS", "recipient": "QbbbBLembrrYy8kA1GEnSUTRRX74nKFVVv", "amount": 1000 }, + { "type": "GENESIS", "recipient": "QdddDvehhYdd67vRyTznA8McMYriNVJV9J", "amount": 1000 }, + { "type": "GENESIS", "recipient": "QS7K9EsSDeCdb7T8kzZaFNGLomNmmET2Dr", "amount": 1000 }, + { "type": "GENESIS", "recipient": "QWW9iuy79tcFbHChCsZ28NDoxMAqMpPXhW", "amount": 1000 }, + { "type": "GENESIS", "recipient": "QiTygNmENd8bjyiaK1WwgeX9EF1H8Kapfq", "amount": 1000 }, + { "type": "GENESIS", "recipient": "QScfgds57u1zEPWyjL3GyKsZQ6PRbuVv2G", "amount": 1000 }, + { "type": "GENESIS", "recipient": "QZm6GbBJuLJnTbftJAaJtw2ZJqXiDTu2pD", "amount": 1000 }, + { "type": "GENESIS", "recipient": "Qb5rprTsoSoKaMcdwLFL7jP3eyhK3LGqNm", "amount": 1000 }, + { "type": "GENESIS", "recipient": "QbpZL12Lh7K2y6xPZure4pix5jH6ViVrF2", "amount": 1000 }, + { "type": "GENESIS", "recipient": "QUZbH7hV8sdLSum74bdqyrLgvN5YTPHUW5", "amount": 1000 }, + { "type": "GENESIS", "recipient": "QiNKXRfnX9mTodSed1yRQexhL1HA42RHHo", "amount": 1000 }, + { "type": "GENESIS", "recipient": "QT4zHex8JEULmBhYmKd5UhpiNA46T5wUko", "amount": 1000 }, + + { "type": "GENESIS", "recipient": "QLxHu4ZFEQek3eZ3ucWRwT6MHQnr1RTqV3", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qe3DW43uTQfeTbo4knfW5aUCwvFnyGzdVe", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNxfUZ9xgMYs3Gw6jG9Hqsg957yBJz2YEt", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQXSKG4qSYSdPqP4rFV7V3oA9ihzEgj4Wt", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMH5Sm2yr3y81VKZuLDtP5UbmoxUtNW5p1", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRKAjXDQDv3dVFihag8DZhqffh3W3VPQvo", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXQYR1oJVR7oK5wzbXFHWgMjY6pDy2wAhB", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNyhH8dutdNhUaZqnkRu5mmR7ivmjhX118", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qj1bLXBtZP3NVcVcD1dpwvgbVD3i1x2TkU", "amount": 10 }, + { "type": "GENESIS", "recipient": "QjNN6JLqzPGUuhw6GVpivLXaeGJEWB1VZV", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbgesZq44ZgkEfVWbCo3jiMfdy4qytdKwU", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgyvE9afaS3P8ssqFhqJwuR1sjsxvazdw5", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRt2PKGpBDF8ZiUgELhBphn5YhwEwpqWME", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRZYD67yxnaTuFMdREjiSh3SkQPrFFdodS", "amount": 10 }, + { "type": "GENESIS", "recipient": "QieDZVeiPAyoUYyhGZUS8VPBF3cFiFDEPw", "amount": 10 }, + { "type": "GENESIS", "recipient": "QV3cEwL4NQ3ioc2Jzduu9B8tzJjCwPkzaj", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNfkC17dPezMhDch7dEMhTgeBJQ1ckgXk8", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcdpBcZisrDzXK7FekRwphpjAvZaXzcAZr", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbTDMss7NtRxxQaSqBZtSLSNdSYgvGaqFf", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qaj7VFnofTx7mFWo4Yfo1nzRtX2k32USJq", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRchdiiPr3eyhurpwmVWnZecBBRp79pGJU", "amount": 10 }, + { "type": "GENESIS", "recipient": "QemRYQ3NzNNVJddKQGn3frfab79ZBw15rS", "amount": 10 }, + { "type": "GENESIS", "recipient": "QW7qQMDQwpT498YZVJE8o4QxHCsLzxrA5S", "amount": 10 }, + { "type": "GENESIS", "recipient": "QM2cyKX6gZqWhtVaVy4MKMD9SyjzzZ4h5w", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qfa8ioviZnN5K8dosMGuxp3SuV7QJyH23t", "amount": 10 }, + { "type": "GENESIS", "recipient": "QS9wFXVtBC4ad9cnenjMaXom6HAZRdb5bJ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSRpUMfK1tcF6ySGCsjeTtYk16B9PrqpuH", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qez3PAwBEjLDoer8V7b6JFd1CQZiVgqaBu", "amount": 10 }, + { "type": "GENESIS", "recipient": "QP5bhm92HCEeLwEV3T3ySSdkpTz1ERkSUL", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZDQGCCHgcSkRfgUqfG2LsPSLDLZ888THh", "amount": 10 }, + { "type": "GENESIS", "recipient": "QN3gqz7wfqaEsqz5bv4eVgw9vKGth1EjG3", "amount": 10 }, + { "type": "GENESIS", "recipient": "QeskJAik9pSeV3Ka4L58V7YWHJd1dBe455", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXm93Bs7hyciXxZMuCU9maMiY6371MCu1x", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWTZiST8EuP2ix9MgX19ZziKAhRK8C96pd", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcNpKq2SY7BqDXthSeRV7vikEEedpbPkgg", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhX25kdPgTg5c2UrPNsbPryuj7bL8YF3hC", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qcx8Za7HK42vRP9b8woAo9escmcxZsqgfe", "amount": 10 }, + { "type": "GENESIS", "recipient": "QjgsYfuqRzWjXFEagqAmaPSVxcXr5A4DmQ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXca8P4Z6cHF1YwNcmPToWWx363Dv9okqj", "amount": 10 }, + { "type": "GENESIS", "recipient": "QjQcgaPLxU7qBW6DP7UyhJhJbLoSFvGM2H", "amount": 10 }, + { "type": "GENESIS", "recipient": "QjaJVb8V8Surt8G2Wu4yrKfjvoBXQGyDHX", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgioyTpZKGADu6TBUYxsPVepxTG7VThXEK", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcmyM7fzGjM3X7VpHybbp4UzVVEcMVdLkR", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiqfL6z7yeFEJuDgbX4EbkLbCv7aZXafsp", "amount": 10 }, + { "type": "GENESIS", "recipient": "QM3amnq8GaXUXfDJWrzsHhAzSmioTP5HX4", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWu1vLngtTUMcPoRx5u16QXCSdsRqwRfuH", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qi2taKC6qdm9NBSAaBAshiia8TXRWhxWyR", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZko7f8rnuUEp8zv7nrJyQfkeYaWfYMffH", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcJfVM3dmpBMvDbsKVFsx32ahZ6MFH58Mq", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVfdY59hk6gKUtYoqjCdG7MfnQFSw2WvnE", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qhkp6r56t9GL3bNgxvyKfMnfZo6eQqERBQ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QjZ9v7AcchaJpNqJv5b7dC5Wjsi2JLSJeV", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWnd9iPWkCTh7UnWPDYhD9h8PXThW5RZgJ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdKJo8SPLqtrvc1UgRok4fV9b1CrSgJiY7", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcHHkSKpnCmZydkDNxcFJL1aDQXPkniGNb", "amount": 10 }, + { "type": "GENESIS", "recipient": "QjaDRfCXWByCrxS9QkynuxDL2tvDiC6x74", "amount": 10 }, + { "type": "GENESIS", "recipient": "QS4tnqqR9aU7iCNmc2wYa5YMNbHvh8wmZR", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiwE9h1CCighEpR8Epzv6fxpjXtahTN6sn", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRub4MuhmYAmU8bSkSWSRVcYwwmcNwRLsy", "amount": 10 }, + { "type": "GENESIS", "recipient": "QLitmzEnWVexkwcXbUTaovJrRoDvRMzW32", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUnKiReHwhg1CeQd2PdpXvU2FdtR9XDkZ4", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcSJuQNcGMrDhS6Jb2tRQEWLmUbvt5d7Gc", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQQFM1XuM8nSQSJKAq5t6KWdDPb6uPgiki", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWnoDUJwt6DRWygNQQSNciHFbN6uehuZhB", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZppLAZ4JJ3FgU1GXPdrbGDgXEajSk86bh", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNHocuE5hr64z1RHbfXUQKpHwUv3DG4on4", "amount": 10 }, + { "type": "GENESIS", "recipient": "QS5SMHzAyjicAkMdK7hnBkiGVmwwBey1kQ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhauobwGUVNT8UkK41k2aJVcfMdkpDBwVb", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qh31pAfL5dk7jDcUKCpAurkZTTu27D9dGp", "amount": 10 }, + { "type": "GENESIS", "recipient": "QM1CCBbcTG2S6H1dBVJXTUHxhfasfTR6XF", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQ5zUwBwfGBru68FsaiawC5vjzigKYzwDs", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWmFjyqsHkXfXwUvixzXfFh8AX5mwhvD7b", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTJ8pBwaXUZ1C7rX4Mb9NWbprh88LeUsju", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMLDPdpscAoTevAHpe3BQLuJdBggsawGLC", "amount": 10 }, + { "type": "GENESIS", "recipient": "QaboRcMGnxJgfZDkEpqUe8HXsxFY6JdnFw", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVUTAqofenqSuGC9Mjw9tnEVzxVLfaF6PH", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVCDS2qjjKSytiSS2S6ZxLcNTnpBB9qEvS", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfEtw43SfViaC2BEU7xRyR4cJqPdFuc547", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qf9EA2o8gMxbMH59JmYPm8buVasBCTrEco", "amount": 10 }, + { "type": "GENESIS", "recipient": "QddoeVG1N97ui2s9LhMpMCvScvPjf2DmhR", "amount": 10 }, + { "type": "GENESIS", "recipient": "QajjSZXwp33Zybm9zQ62DdMiYLCic4FHWH", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZVs7y4Ysb62NHetDEwH7nVvhSqbzF3TsF", "amount": 10 }, + { "type": "GENESIS", "recipient": "QP6eci8SRs7C6i1CTEBsc7BkLiMdJ7jrvL", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgUkTPpwsdyes7KxgYzXXWJ1TnjUFViy9R", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVVUs58P3UimAjoLG3pga2UtbnVhPHqzop", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYVhnvxEQM3sNbkN5VDkRBuTY3ZEjGP2Y6", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qgfcck7VX4ki9m7Haer3WSt9a6sEW7DwKm", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qdwd54nUp5moiKVTQ7ESuzdLnwQ9L7oT37", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiPTyt2VgN7sJyK2rCfy24PQhoL1VwvAUs", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXNABfSfAFRDF2ZCca4tf1PyA3ARyLUEUK", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZJjUVgjoacvHmdjfqUDq3Dh6q3eTyNh2y", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWHzcbXSrEg7AiVDLBhsR1zUBnWUneSkUp", "amount": 10 }, + { "type": "GENESIS", "recipient": "QLgjnrRRCkQt7g7pWQGAXg99ZxAC8abLGk", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPmFGR56aQ586ot61Yt1LX79gdgBYGNeUN", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQb493uqAUrWe2YoNR8MmhhxjNYgcf3XS6", "amount": 10 }, + { "type": "GENESIS", "recipient": "QV3UDtxFyXCsKdmnVWstWQc1ZMSAPp1WNE", "amount": 10 }, + { "type": "GENESIS", "recipient": "QV527xbvZNT1529LsDBKn22cNP9YJ6i3HF", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQAbKyRGv8RUytDyr1D6QzELzMvNmGnuhZ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QP2xZTDDu6oVvAaRjTNW7fBEm9fcjmyjAF", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRH9E99H893PS8hFmzPGinAQgbMmoYxRKj", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRtqR9AqsaE4TKdH4tJPCwUgJtKXkrzumk", "amount": 10 }, + { "type": "GENESIS", "recipient": "QaEyGRLnR7o85PCRoCq2x4kmsj1ZuVM3eo", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUZSHjxYNfa6nF8MSyiCm5JKbiRnBy6LZd", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXUozAco8vrZgc3LZDok4ziQdUb1F2WNiv", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZF252FDKhrjdXUiXf16Kjju3q23aNfXWk", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qj1odhqTstQweB9NosXVzY6Lvzis24AQXP", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTaiJKCnV9bfbEbfbuKnxzNU8QEnYgv4Xu", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYLdKUKoKvBAFigiX2H7j1VcL8QaPny1XX", "amount": 10 }, + { "type": "GENESIS", "recipient": "QaEfP6nFkNrDuzUbcHWj9casn9ekRJCtrg", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcbQcC2BZP9AipqSDFThm3KWfycn9jweVj", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfGLmDwWUHhpHFebwCfFibdXFcMZhZWepX", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMkUwfBU1HKUius1HrEiphapMjDBsFrJEd", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qab7N4CYsATCmy8T3VTSnG8oK3Uw3GSe6x", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdJirbcRUTZ4M6fBAmKGgsvC7DVpEqQLrt", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSPVSpKZueM1V9xc8HD9Qfte5gFrFJ61Xv", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcuAciBq8QjDS2EMDAMGi9asP8oaob7UFs", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNwDgR34mYsw1t9hzyumm5j7siy8AMDjST", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qf5RGjWtSn8NSpYeLxKbamogxGST3iX3QY", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYrytjgXZmWsGarsC3qAAVYdth8qpEjjni", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbHqojw2kSmcsdcVaRUAcWF2svr9VPh1Lf", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXsrAcNz93naQsBcyGTECMiB3heKmbZZNT", "amount": 10 }, + { "type": "GENESIS", "recipient": "QN4NnUvf4UwCKz9U66NUEs6cQJtZiHzpsB", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRXzd5xi7nPdqZg5ugkoNnttAMEMAS7Zgp", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZmFAL7D719HQkV72MnvP2CEsnBUyktYEX", "amount": 10 }, + { "type": "GENESIS", "recipient": "QT7uWcs2dacGGfLzVDRXAWAY5nbgGjczSq", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYhu1Yvx4wEcMZPF7UhRNNfcHFqWKU9y8U", "amount": 10 }, + { "type": "GENESIS", "recipient": "QeEY7UgPBDeyQnnir53weJYtTvDZvfEPM4", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQszFsHkwEf1cxmZkq2Sjd7MmkpKvud9Rc", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qi8AKfUEZb6tFiua3D7NMPLGEd8ouyAp99", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYMortQDHVwAa44bfZhtoz8NALW3iE9bqm", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMptfhifsYG7LzV9woEmPKvaALLkFQdND4", "amount": 10 }, + { "type": "GENESIS", "recipient": "QR48czk5GXWj8nUkhzHr1MmV9Xvn7xsyMJ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRmrBWDmcRz1c5q63oYKPsJvW5uVvXUrkt", "amount": 10 }, + { "type": "GENESIS", "recipient": "QR24APnqsTaPCS5WFVEEZevk7oE1TZdTXy", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPUgbXEj1TfgLQng6yHDMnV4RE4fkzxneP", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhZH9dcBwJXRHTMUeMnnaFBtzyNEmeEu95", "amount": 10 }, + { "type": "GENESIS", "recipient": "QeALW9oLFARexJSA5VEPAZR1hkUGRoYCpJ", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qgxx7Xr4Ta9RBkkc5BHqr6Yqvb38dsfUrT", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcqiXKsCnUst4qZdpooe4AuFZp6qLJbH1E", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQLd58skeFGRzW9JBYfeRNXBEF6BbxuRcL", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfBvQKMgWjix4oXPZrmU9zJDv8iCT4bAuv", "amount": 10 }, + { "type": "GENESIS", "recipient": "QamJduVxVwqkUugkeyVwcEqHSSmPNiNt4G", "amount": 10 }, + { "type": "GENESIS", "recipient": "QeYPPuzXey13V2nRZAS1zhBvsxD9Jww8br", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiKu8wuB5rZ4ZvUGkdP4jTQWBdMZWQb4Ev", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhhhQhVeJ1GL3oMyG2ssTx7XLNhPSDhSTs", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPfi9t9CAPVHu3FGxRGvUb723vYFUYQEv6", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWH9V5WBEvVkJnJPMXkULX9UaDwHGVoMi6", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYWoBSTXCRmYQq1yJ3HHjYrxC4KUdVLpmw", "amount": 10 }, + { "type": "GENESIS", "recipient": "QftjmqLYfjS4jwBukVGbiDLxNE5Hv5SFkA", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMAJ2jt377iFtALB3UvuXgg21vx9i3ASe9", "amount": 10 }, + { "type": "GENESIS", "recipient": "QaP9FzoAQAXrvSYpiR9nQU6NewagTBZDuB", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZpWpi8Lp7zPm63GxU9z2Xiwh6QmD4qfy2", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPNtFMjoMWwDngH94PAsizhhn3sPFhzDm6", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTkdeWxc34v5w47SDJYC9QFz9t4DRZwBEy", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSSpbcy65aoSpC3q5XwEjSKg15LG868eUe", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhcfCJ6nW4A6PztJ5NXQW2cUo67k2t4HHB", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYqv8RVp57C9gaH8o1Fez3ofSW24RAfuju", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVgLvwFNNjHAUwE8h2PcfKRns1EebHDX4B", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSv5ZY5mW7aGbYA7gqkj4xyPq4AECd7EL8", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgyQ9HX5JRbdKxFTXgsoq2cnZD89NwxinT", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTEpaAMni8SpKY8fd8AF7qXEtTode1LoaW", "amount": 10 }, + { "type": "GENESIS", "recipient": "QeKBjbwctfydGS6mLvDSm8dULcvLUaorwX", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhfG4EVSd8iZ8H1piRvdRC8MDJ3Jz1WcN9", "amount": 10 }, + { "type": "GENESIS", "recipient": "QjXYs5HWfda3mgTBqveKatTWHnahv2oX22", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qh1iJg1BEdoK4q4hjXcSkNE4qv9oYsHoF4", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPBcSVqzpB3QhiwMkiq9rMHe7Mx5NynXnD", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUgVsyMPFxjiS2o5y81FoXoiWHiAwfbq94", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNH3ebZTv6GeWwjwhjhGg7doia6ZJjqQXG", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXXeoduLPuhfURibgkfEfSSQ2Rom9SELtL", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcKnXTjEaTBr91PQY7AkCxvChNpkqU6r1t", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhWNbSmPAoAg8bXirPeNyGVuoSk84rfnHu", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdivX7dtJKosr83EmLTViz7PkFC4FQqeH4", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUB6fPHDTrpYyU6wJmAqV6TUBZiWLrTPuz", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiG69VVGp13oCiryF4vpDu3a2kEEHi7HDm", "amount": 10 }, + { "type": "GENESIS", "recipient": "QS4dJJhwCheoMB3Z8Mk8wNZFfSu4FkW9Vv", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qb6peGujesgEH9aHd19NfKvR5vTmsb2oHM", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qh5tovSQykjFNJGV1P7tGtfmfnJXQQNLr7", "amount": 10 }, + { "type": "GENESIS", "recipient": "QS1vPBzGLu8ZskZtapcYzUCr8pEjVxtFgu", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUJmfReuva7PmyzFBr7M35QuYZcAoeWPyT", "amount": 10 }, + { "type": "GENESIS", "recipient": "QLfYVnUtR4RVcthhzYc7U76vmK6LkyUky4", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfeNQecGDhdHSdoTDAKAaAdpmgGBfJjQw6", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiPHkz2YVDhsJPdkD7qxizFFEu7m3g3zA7", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSmmCGNkGbqwGGvdeBtkHBPa4pXXEG2vkf", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNjN51iZaZb3ZnfNiLdm1xtUZ4DKLj9X7e", "amount": 10 }, + { "type": "GENESIS", "recipient": "QjFocrHNieQ8rDYifrZTWtYgejjih6mmS1", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSNDFgL3bfX7Pe9FaD7p1G1rtJe5v9aYsV", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWf8uFUXCahEXLV2cjJjunimCJdnvsN3JM", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSzVqpvkjfFAC6sJcyefyouP1zYZycvwpm", "amount": 10 }, + { "type": "GENESIS", "recipient": "QX3zQTmhnm89PrW1nfs6YJDfiAkegzpD1S", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qg6kovZCzF2GKNyMoeJSaUArvzKJJH56L1", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhP2ND6q5Sptsy5pQUo18AuTgKMBfF4aPr", "amount": 10 }, + { "type": "GENESIS", "recipient": "QT3Cu76gET1ezemDVCojoP3SLMY4xNDH7k", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdsqubwFQ1hChYwzpHvKAiLF9JMWWEwXhp", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXE9M12CjPHBSFTS8DFUWjab4Z7F1JeRw1", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qa5e8Pz4sM7RSAbwvM2N9m5NyYAgm2Fo3J", "amount": 10 }, + { "type": "GENESIS", "recipient": "QjoNujTmVCDVoR5M99NMBrGwuJCVZUSWJ2", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMmVSM2dmfhRjGMCZaLeBGU7kXGGPeiRZn", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYh1Ht5c278CPs56khy4iH2YxXZrtdMGXo", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qb3m52qr4jcsidw6DTPJUC62b51rM61VFj", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTC76DrGsCJuT4ybDiDTFaTxjXTPUJcpUi", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRqBqahzem4MpJarmGYh1jyaFHYxufssY3", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZpoY1W7MJvu5uJwdJRbKwWBhVhYPRAgag", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPfvtXRAWazxK8CrSRvDoCtRG6Hy3ujCx4", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgJ8Ud1qJHfdC6wyaUNcigUHJ65Udd2jYh", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRQtHawUKGY7g68yabnneKo88BFv35ddMD", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYFKaYFjRe8iYDbwUBTWjmPGosjcgBtC3Y", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qc3HUdiKbHaaFK83p44WVicewmZip1TnAj", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYwkYWDsoJAWHPN1dHttMZ8QPABbriRMov", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVNwVTRnJNL7HYpHZ7wppApTv8H3FxvPXU", "amount": 10 }, + { "type": "GENESIS", "recipient": "QaxHEi7urRTZbGmcpyCcJr6zQZbDAnbfJt", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPqG2UHH3ueqsjm2HMUuQj6GQW99VVXJry", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qc5LxN2SQCQfJLVatuSMtmJtAihjapL3Qg", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgMgsYiwyRiUYMHKCdB5tLJxuCroEbJnq8", "amount": 10 }, + { "type": "GENESIS", "recipient": "QS5NyYUUPuPvkkvazYyYjTT9ef7eZU8of8", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfNd6YADJq1M4SbwBxLKQ3AD7GEpTpAJi7", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZfGRwx8K1AyYwPUXHa9Tn16KP2h54iwfr", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNB1kaRHYBrmDRHepqxad5DYxQPbjVG4As", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTpjvRCrvWjXoBzSG379ZsEwW2F5xoLSiP", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZhnNK5FfX3FjTwwYwbewUQGE64Vts7qXP", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNFmGsWLr7Y4qngz1maq4ptzhcUAJdjDU1", "amount": 10 }, + { "type": "GENESIS", "recipient": "QR3hH2cxYz9MgDBq3vthEbdnFVMJvprzyV", "amount": 10 }, + { "type": "GENESIS", "recipient": "QjjDaHSiAaPP8p3CRM3STeBc4VD9SCY4TP", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRppWy5shqf6TPZfh6CAfjPB25aLWPiNub", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qgaszp8eniCvsFiVHaBNNDToaVVYjLdLeB", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbdHAJur3Vg9MYCPcgsz4dNW9gDGp1f727", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTxt6nMZmyZCJVLcsxZmwt4sUv1bFkLLRi", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVbpnTE83PfopgvXY9TD92aYWQrTgvGN3Q", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPdfyB2zwWt77X5iHeAKr8MTEHFMHE3Ww3", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRUgU6YptQd85VWiSvLUDRoyxnTBPGRHdx", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRLDb39eQWwiqttkoYxDB5f5Bu8Bt6tu8P", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUB67e2qPecWexgCB98gr3oHqMN2ZVay9j", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhK3xN3Ut6W1B5pg9MJdTLyHLAGLjcP7ma", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qai9X8cd9FdZufFH5rcKYodp6s4AQqH2XF", "amount": 10 }, + { "type": "GENESIS", "recipient": "QX2YaXwfrEDNzUAFWRc3D17hDaLAXw42NQ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMUMUzgWeXhUJsWxa7DWVaXDzJFrtpuPCn", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qg8hVCdNiRy7Tqs2EHqLWtydqp1wzYc7Ny", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXG8YWRehGa3aLTnnMupmBrXeXS93YuwmE", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qadt3251BYugMm2MjkmzCjrzGp2MfkJicH", "amount": 10 }, + { "type": "GENESIS", "recipient": "QaiosSXjrXXca8vLpNwKh8qijdh1rd23L3", "amount": 10 }, + { "type": "GENESIS", "recipient": "QP5tVLY8CQqQgzMuTPrxz2XpP2KDL9neNV", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qjeebj5TZqG3y8yGwWT7oamPxEncaf5fC4", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMM6TbkySGcRkxdpjnmeRcYgL1oC5JKR7X", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQAFHDRg2PyR6UMR87T2DkQfizMR5VhStM", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQcXsQRpHtPjECVp55Weu4ohoJK6pK81vu", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSrT7WTzjs6jnwZpDmcD6NvD2V3i4H5tq5", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWAagG61SiQvfSbWS4vQnvmJbyCJ7GSXiy", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQP64bevncP8kZ9bxVP5Brp8moK1rsPsBk", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUuGEuWwQyjMgtxzAhcvmsQhE8VzsA3vjt", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qa7iysVRdxo3KzYSi6JAqAYf4NFfFDjWLj", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcQdJHRGgvL3AoR9LSRSjVNdczukw7PKQe", "amount": 10 }, + { "type": "GENESIS", "recipient": "QedHYrn1QkrRZBkRu5kkajgqh5bcD8xZkt", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUChBcWdxZX1VFHGwrUjRJbqbXjRdPNyki", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNW6zHWRyzaMPbb6JbKciobqbxtuQSZgw4", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPFA5p13WYzzhpvHCGDoHtiA2oKAxPeKhU", "amount": 10 }, + { "type": "GENESIS", "recipient": "QS2ekPtGMR2obKdFKqFAcJQ3rbZmrzBSRz", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSpVwNfiKEh3NiBXduS8TnJXwgyHYmfFqH", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYm6g3WqAKnhotVwSLjqzorpVhzn2LgctL", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSfifb4e9W8C1K2uaAcwvjzqN33fmMcVwR", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYrLivTTHat8xFeJKkzrJXSyHeWkuBhWVA", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTxcZ3kMi7msQCkViFwWLdhkShhNNVa5Wv", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNS4HmJen6qDVqSAYszeHKfaf1j1662tj6", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPBri2D8WYjxVZYd2oKgwvXg94FKweytBQ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbeujwVbYFLx5uQBmkYs1a6cZRAopeB4cD", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWQUSSqBRQBiNnDu3ZGNGTXJyAfbLf5MxK", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPt5bnE51SzA6VES5kpdvpNHiFeHHMKWc8", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qdu3N57EXxaZ8TXRfHbEa8QuqbYW2sot1t", "amount": 10 }, + { "type": "GENESIS", "recipient": "QU29ppZiJ9Vzw4tQBrXdPJZToWhpu9Dp9Q", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZbrkBLFcmRUA21u5QsrPBpzrDH2wXpK7V", "amount": 10 }, + { "type": "GENESIS", "recipient": "QP544WzvAVh72cCVGr2WKFMzpicaH1wqAY", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgKUwvnhj8tHWbNb59s9nkHQdapgWNcgAy", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSCminTT9z7qmx3zEvGZ221B5rVNvjBsK4", "amount": 10 }, + { "type": "GENESIS", "recipient": "QaSrZL9TyKNUMfge6YiDatURrT2QHxNX1R", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYg2fLR5jXjStMhzUSq7QJ5uEbTrvRXRYt", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUWZa7s85qeLC6uWKTsMXnJ4BQbMiBddZB", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbUSdFauEMKMHq2kAfX7BaLknVME6FpJhj", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRXMXw7CT1NahXwj19t8wHHAuUFAMYm6NK", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWr5TR1trHvVh1JzQbRARKqjJaMiywYzgr", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSjVVpSLeaaFcV1XacFJUXpBoBB3paFVPY", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQaDSZPWWFcFPGj38g63aP2gngvcgJnmsa", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcKk4AGz4FwYA56C7wAZW9Ep5Fimf4c1Mo", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQJnvY3h86m56EGfWKzaVZnFthNDAUdYFo", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSY6Ps3vxs1XEyFugvAWnv8a7sd1WuZkA8", "amount": 10 }, + { "type": "GENESIS", "recipient": "QjGbYagnZyc38Sm2M7gbg7wNX4Tfp6kTSs", "amount": 10 }, + { "type": "GENESIS", "recipient": "QikfKyFmSWN12cMHVzEurCrfS4KEywessZ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZRnbiNgLsGjd4pCrWntwSaGU3Ex4sZfLE", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTyUpPTd4n3Qk9k6k6ifKnB79XHueE4M4X", "amount": 10 }, + { "type": "GENESIS", "recipient": "QftHwRjwREQ3goEzehhF59rZUtrqrBGH7P", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qhy15ZCfvjcDiQt97YcipgwK3paNQWfSAT", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfhGGYFr8ANfCg32VcvULCqcofUybRbHYJ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMZqtWiJjH1JUqy7roNi95ByGvzFThxDXy", "amount": 10 }, + { "type": "GENESIS", "recipient": "QR17PHMYpHsfhQ8NXPVSVzXG3puMn99YfU", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVJKdAoPLfnShJFk1cxcu8h7z1SvPTaVyg", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPByWaTGBToyDNhGMMBgGGRtLPD9V4h5Vv", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVNWqbd7ERjn9dcqBGwmUcseoiwQCehey7", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUQiDpv4PzjHLz8bYk8FJBnzrmjKYc6bsr", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXtNoe9v7bsfW6w8uJweXpo4JESHoxWium", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfPfxADaYrQUrKySf6tJBtMHA8cNG7VtNe", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQjtX9bro4bRkS1B3FyfAihyk3vZkQm8hZ", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qidvt5WQVMqgcchxwGdCd2jp4cCdGioA4H", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhfLqEaDKmbynhKYK95BQJtseH3cqEEURD", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYyyAFBUXB9F91KwHCQNuFDGuw7L38fi4x", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbMdmYjG4d71FUjk6L7pEoszoC9EQH1zUN", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWxFeuRWE5GZXNfZ2tYqW3GmAC3FAz5Qrc", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZbG62vQnBrtYJ2VwuJSzfA8NXMj36FYbb", "amount": 10 }, + { "type": "GENESIS", "recipient": "QLoV9cxAUkPn2DaQKnqDVJq6jMN3k21JAM", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcsBjck2WTR7J3PmQ9RXHxsPewPkbxzCtp", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qj29EdPyW7MhZ15XDgvGZwXrmsP84KM5ff", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUTg3JNn6JGtHy25XTgdNu5APzp5cAg79v", "amount": 10 }, + { "type": "GENESIS", "recipient": "QU1C597JwXXBbR2ysX4fKGr9DTqbn1bPxE", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgboEdXscGVZ3pFyUq7x9ufaRmDseeb4dC", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNWtJX7SDYBQxsEqmjsLbhVQoAYV3QkynD", "amount": 10 }, + { "type": "GENESIS", "recipient": "QY1KfMNNtBe1q6JxGzGimxM3vpCoqzQCNX", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYp7DknXc9PbdF52vTozrh1ZEfM7wZBhFG", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfshJREL1rFXcBDYTZQcj8mGLpQh3ZWC6t", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNLBihtJXLo3HVjzLGgdbgbHacTgMt3USC", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZkKsgF78HsiDef87g7dGLGKsoTSH2ekWT", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWv4gyJ4N1WxCLvAmWKLtx5mmBYAqXHTXD", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSp5oQ65SWNbfampnxzgBuEymJLVkarPBV", "amount": 10 }, + { "type": "GENESIS", "recipient": "QLddFbuRfbkrMQnpHA3gvBtYERfqwRdJsC", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMHWrDejEvBVuzQyUhnVqnSaKKMHyCosyF", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVwFkDM51dcvCfmvYUBjjQg87JteNis7f6", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTvu4zok2UGnB45s1Luj6v3AzMRUEP1zmd", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYh6BPhuScCt9ENbnAcp16mCZLsYnukMWY", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYH3WNEknRKSFViWuZzmN43q8wkAGpzKXu", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZwweWZAURCtoLM8K1ouA7McNyHNjyDcBi", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQ5RBZkiqGhvCnQvCPPZar8RqhtwDonDBi", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWpt9ZPYks3PE8nHLyKkoLogD3doMumrK6", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qdds3wCmA2P4kkMXHJCi1JuQVMLJayskQu", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYkkDoVQCHZQM3KJQC1J8qFVZmXi3T7JZe", "amount": 10 }, + { "type": "GENESIS", "recipient": "QM44Ks8EALor7MNhQGHpUpqu484VeUYRAL", "amount": 10 }, + { "type": "GENESIS", "recipient": "QeBeZzP6xxSk1hem3tRzchzAAMgRKb3fkg", "amount": 10 }, + { "type": "GENESIS", "recipient": "QThNX1VbEGbAE31sjZKZYBBg4CNX5JkbRr", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQiz1NcVPECxicoDXQ1p6h5yU6KozLYFhj", "amount": 10 }, + { "type": "GENESIS", "recipient": "QP5h7AugR5sY2U9YLHjmTTkuoZFWoomar1", "amount": 10 }, + { "type": "GENESIS", "recipient": "QY69G6HF2SCnqEPJwwHrnBrXn6UwccfSGa", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhPFgRDmwGdjexK1nEA2r4caPXG4SRVXCD", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQrjQEssGwc6ixp9N76b42By1sFbEKDTDZ", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qgnzw5Drcj1LvipRbcCPS9rG1PSyXF91nn", "amount": 10 }, + { "type": "GENESIS", "recipient": "QeLgbgD74BgbBpoPE2jJuNQN5GqyBYNRev", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVPE6V1xpZpVz2Zhu3SNkKf7TgWPAqRo4x", "amount": 10 }, + { "type": "GENESIS", "recipient": "QY7NTMeAq2Wt9BZYf4BCwj3eJG5aMYADRu", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVj9GHBnU1T9yseTTR3j4PST8aaLGNPpm9", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVVvANL8ML3RaMbF34aoxL3z1bSoznTSC5", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfxrJXCBbnvGqCSztwDzrNzDaBYQK8Lejr", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZKQViyTqY2D9zQN1k6pwmKaKE1ooaf4UZ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSv8WNg5HwfU68NcGyMEJ3G9pQLGVpHwFk", "amount": 10 }, + { "type": "GENESIS", "recipient": "QR6QPuyzBtPFB66SheLhiUp8sqgyvrXoVs", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNPSKjSd8BdKV9y8w3CuU8str4t6AtS2aA", "amount": 10 }, + { "type": "GENESIS", "recipient": "QT2GRgCRBJTBCWVsoxax2kNFi4eGq8DZ7Q", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfNphDAZBZPDmtakni5PThJxdbi3xufDr2", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZoLPzXLePhs7VcLMGRZ9qJxCb9rzqCJmK", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiDq33pUvSHi2pEZ3cGEPVtiw1i6FzV9ai", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUNGLbMWTQELBUQN4XUkNtZQehvyZaDmAC", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZtiZnjjATzg8dEoAikrbQfdjhgGcCTxsT", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgAt6xyNojsoDpJvcsUPkdmpz5TDp7gZh3", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYwUGeqXJZDrtMh6QyUT4SubuPqm3nXkYe", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYdqgA8uYhcec88NxVr7wg3WReUQqGVHzn", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhpbiBSUcTUu2Ex5pTyTS3SodSyfKmtzyx", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiTpmEJEstonzSsvuCvkmBQpf7jaNuAuq8", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSTUkD8xB9rkYNzAhZFdSAxan5Y5KqirtW", "amount": 10 }, + { "type": "GENESIS", "recipient": "QS5q7B665QkuJtJzNnSnPuHTeDxqAPFJzk", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfzpWw6tMMWgX76cMZvorPRLPnpxmr1j2X", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWQdAWwYPMFCRCAc2bDqjJoRx4crZVn1Vh", "amount": 10 }, + { "type": "GENESIS", "recipient": "QScrEuDdqGHfixHcjyHFkbg5LdeyGexbkS", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSfDW3KC9P5KQxBRYf4gjJUXSf1DZQwufm", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZLFJLReUT98wGdaieoA8iLSY6e9pDtkuh", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRgC1RbtDyvka7UH6RTqSNvJD8vTNkdsNv", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfCfuAxSbNeHbF8Y2GNuFmJfmexqVH131K", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQDfTzNLz8NwmPJ1PTiL7zAtWdz7o3LQX7", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdmfM8nzDfi6U22ze6kaEceED2sb2yYW4x", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYMpwvQHyny3zKM68SKFUPssSkoNwC5vZt", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPbsQYN1rpJwV1GbPNJBUkCyx2YWPuLJZd", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSofobEjrtD2KntRYg5PLdFDdGuf3mdAyc", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbShL174ecJPLU8nRSjtMwbrudCjzPRqFe", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgMCRwAr5JoZvth1ESUo5n3Z9ycrfhCofo", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMyhFtK7iNHUe98nzEXdkN6toAa2RttST5", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qh7LXNX79eJoFSUtdppQtAt7Si1R1wbaJX", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWvVuQKy9165r1osQM98eUnAhfe2HiFEmN", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbUzPNzbB1McDTWBDJdhpFsVUQhi1hP9NQ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QggkvYpWRuqPjcMLLGG1R9ZXJAoE83xj2U", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXS1p29dEQV1JtHj1Mv55SEWfDuHe47AX6", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUfTY7fh8we4nYPVAXL2jsXSm3hRLGL3uc", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qc6HfpXNWjeWQ1JsXRZScit9neymb3tsBV", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qe3LcdQpecf8jMiYdMcs9pG7yQiaL4v3dK", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiJC1E8sA1RVTuRXBFgqzY2zmfJ2eXMgtv", "amount": 10 }, + { "type": "GENESIS", "recipient": "QeFinpTR23Ryh8Xh2qeX9kHnezQniEx2JT", "amount": 10 }, + { "type": "GENESIS", "recipient": "QevoCTEHo3PWAKMKgwjv2ziYdeWDJLXsUk", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNsPF3iZ6RExncd7NCWHzAuofRD56nhP1J", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQuFcmg7wsdHpEZjTXpbJAEmCxJaZpScfi", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcgryWoPDdmNbJ7XXnFbhmXVpNopio26VQ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QjuVB3x6CcH8k6aoQfckdTHP2thnEkeeLM", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qe11ExJhNtsH55zAwEuE7RuHBdWhKNHVX6", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qb9d7XrcJEB94Lthk1mzTfm7gMt7XjVCPr", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfA2r9SJogxx5h4Do1rMSEQuJCkeMhL37n", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUVbFEYn4SUz5eAdum1NHL9i3CvBkvdcpM", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRDKcbobLECBD7yKCfzcaBAHM3DScRpccL", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSVTLdnvnJiF9r5P9aEYFobjj9Urv48iyJ", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qhb9upVqQLzJfWGzALSVAZNwk7nnkGqctC", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPMs22gnWYuCxeq133aQ8hezvfo2ukZjBV", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYfxnLX6sxv2nKaemdR3UG7AFMfwSpWktA", "amount": 10 }, + { "type": "GENESIS", "recipient": "QeSb4PYhWYzrfvDF47EL8fEQ2tj89hszet", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiGDtjHbYSvCutyDP4FwB65AaMys26bgk6", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMefivZuDRcohdW6fKbMUYozLpG3Q5Q6LM", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMGfUDRXUU2ZFaZDkFgRvCADqf572WvXEU", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTyeCwFefj24wSMwipWdcDNZonbCmUEExb", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSfYaHUJcrSFy6DUF4TTdhdxw48A9mRE6m", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTXbWbc63NFBBU6uT3f95htmVE5tamM5GN", "amount": 10 }, + { "type": "GENESIS", "recipient": "QW5yn7VbKkRLm5Aaowv3aKCja8VqqiGyCX", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWPigqprwrci7LCZjuoXWkVnd195gQyBYS", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qa6pGoGsm6zEYLaBjV85Nhd6p7aMbCUy9A", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNNrN2VtgfdGKSQJq3Z8AXuA9iMPddif3H", "amount": 10 }, + { "type": "GENESIS", "recipient": "QW9HHiZhURbqJVpjuwraujZPoDCsMPdjYS", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRob3sEQHX7PNW9tJEd2iaXc2LuT8MFPhe", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgUCStZkxC1b8AbTSDcEMTNj2txDKedN9z", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRJceDy9e5NEGKPZ3aEsKfQfpP5e97hvkE", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZc9DBWrEADDnrnTV2DzGJvMJydgteH2YS", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbgQ7mZH6JqNXno8rL89LqMoTsE7N3QKQa", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZ1TnT3hF7MHhSCWLSJ8TeZXFMDZD4FY7b", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYCyEsBMT6o53RTuFtmPUTJYDFsCEQbxAZ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QeYkt8Kc9zXS5s1FHGkW8iqZowABUJhgEd", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSXhmKQBB33AoZvw3K8bzQeomcpDTSV8be", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVDMMeYvQxmHeTe8Nw2of4Z6AUm86Eyn3X", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMrMeYPa1FPzQbH7F4hpsAxXGMi1cqhVwU", "amount": 10 }, + { "type": "GENESIS", "recipient": "QP3Vfwt5qAUW4JxBtCRbyY3qAYraLrJFcN", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qc1pJ7rYLbUhTZXvdSvnD6JiKXrHHMSGa7", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNU2RHKDRs5MVueLfZ5DyZQz2V89v197Cw", "amount": 10 }, + { "type": "GENESIS", "recipient": "QT5rNcBcKR6uHxXkwntscbxHuUpSqAkJ2Q", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTrJVPcMcisEfBBPqEiwy4UXHdQWWG59yo", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMqVRK51WYgwCAXXHsVBw7zWom8LngFt5w", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qfge3zy6Q1FeqKQfBB1ALqFqZfgZyWJ2Mz", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTirUpjh93fmAjZa4Ax8PxwuTxAj5uWgug", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSwkodPybgHBaerTABByNBRnBeWT7oxUgD", "amount": 10 }, + { "type": "GENESIS", "recipient": "QaLM4cLhjYtex3JUXPzevefKhruWhL2AFU", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUSryCrEDXRwv5iKZPDdhufa9WSP7NRr2J", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbzqqkeRZtFDp1UCtsXByvkpWTVtShP8nn", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfcpK6LtUNCdTjxkh3b2JLU5HWGim9utF3", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiWFSfVYCBdTJLDNDnZSHwqKf7Wrymw4y1", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfgvJceEk3UMkQeFc5h7n2V2zhNuanGqC3", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qc2gx4tsFiJSea3jYUfrGyQJWkpZfZ3FfX", "amount": 10 }, + { "type": "GENESIS", "recipient": "QjogZjZwQHrXeDsguP1AMW8o6ehcYNX1h1", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQ8i9kKbWni9L1ZQf37vjfL9wdRqQYMjt4", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRyMhM2WPk2yg8GDRCHzGZzgqK6a3QXUtA", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRLvMoLehvw9gK7w4HW6nUn7EGk1F83Ekv", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVqvXtRsofKyXjwXieiqEpwRrN3cykue2z", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qjr86JYPa2ge6eRxvCbuorhQ7Qvf3T7fve", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfdrQRjpYvMo5FgctABoBZA1accY9GpnGo", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMJnn9QY3ZwuGesxrwjQu5CdoirQ634HmM", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qd5aSucZtsGUpkk1A4nk6VHKHLN7SQ6bsM", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNmLqbetUxdMgzvMBr5fFgVuxrMuKvdRca", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTNphesPV41FeTqzBpR7qQgz1k6WjVLkfq", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMkq9TSQbn6Tbf1dyUMmuZE7Dgk9EKi638", "amount": 10 }, + { "type": "GENESIS", "recipient": "QeBSM5kEQdcVfA5xB2wyWX7sJiHhm1eQxj", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUUFvC2LtMGMoDoQmBjG1fVGhfauFQcg3x", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWmctuu3wzZ1ySvPANMRHtcR2WqzGDiuLM", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMVtRvd3r3hRLSy1xsj8q53kE1PfqyJqJ8", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVeC4LsXkUvd67okfGXdYXHsaq91TEMzda", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQXPGZnC3BPZ5ApnQvfTZfXYaXsZZNzzxV", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qa9SdiUgkGU8xxCLYF9W6D4XtWpagRk2p4", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVsJzxKLR3StSb55GQEBKRLDUhWQvdu4mW", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgoqYLgYjAg9Sovw3UrwNZr1uYLbdZBKjo", "amount": 10 }, + { "type": "GENESIS", "recipient": "QN8LhGeJiDjidBNUwrRjyXrZW282RDin9J", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhR3ygFfHKr4MyUj2b5bBkowgCND8RqMJ9", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiQwmW6cybhHYSrDfM2DYyJeCQJMJ7dzG9", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qg3sfP7bu2StVvDxELCZyEFMcCZ19pwSnp", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXzGnAFwuwN3uqztJ1ARPk8AkSCRKWddrY", "amount": 10 }, + { "type": "GENESIS", "recipient": "QeLPwH4xD5CRx5wMJ3zU52P1yPw35GL95v", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdgbvSACGz5uWTjMBcC5MBMRi6gAU4xBg7", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQgyrjSUxb1gGoG6qiteuuqfRTPVQxHw4q", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qbc1f6SL5AdKmg2xxTcuswEe7FP8Kv241g", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZMqoWSLEtTz3rDAiuPigkgpdwbGqFeA4Q", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXkrrTfHCdqhHodX5ZYmR4pZ99bykeFqKe", "amount": 10 }, + { "type": "GENESIS", "recipient": "QjFKeSTEdusbqF2S4xFQURKsHMy6m6QjbK", "amount": 10 }, + { "type": "GENESIS", "recipient": "QY9U7czTSvqgi77fRhuuwmVrWBZYxCqzQ2", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXAyhHovPqEDmdUgRtjnrC6UZMVWE9P9qS", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUJxJyYzxgukWBNc4Aghs67DaWoN5UFFn5", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdpYgDsun4TwoNjz1ZDsyed7GEGXchNw8f", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZeYrnArdbNUW8bgLxaJuWRyXRmrueor9a", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYYocaRuwxoZzv1JWr8egZkGZVgNAkd7o5", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNT3JwAF2cQ3CUCfX52x4WFGgksH4731wA", "amount": 10 }, + { "type": "GENESIS", "recipient": "QLsdr3KVacCYGuufGkyNerzHgCyNS9EBiw", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qj3mCSgWqMECNaSWUDnXbz3a6sQ5SRdXb9", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYjxtRJXiDHRaP3urEd8MX5nUV9fbgb8Gq", "amount": 10 }, + { "type": "GENESIS", "recipient": "QjgNuzEGvBEotvHo7xynD3h31mntp7PnSs", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZ6Ur9DWGZVzzppkWcZupGAbU6jND8mN2A", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZsDt43LLsYoif7KSHmyUXcUxhWgQfz51E", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qezvnvta62kW8ZNdiio3h3Eded7sDG89ao", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcBuTqxNmsg3QotEnW8ZCf1EyWHwqBc3w5", "amount": 10 }, + { "type": "GENESIS", "recipient": "QT94EE7rzSgazh15xpzhjhuqKFE88cHHgY", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcBqZ4ozxs6JPcvCT3beYzki5Na8pwiEPt", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZo9xY1NqYwr8XxoiNBVHicHsQDRPDvanM", "amount": 10 }, + { "type": "GENESIS", "recipient": "QU6DVbLkztW8oS1Q17j8QEcxisSbxnTZzf", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgqdeTtYTKnLAoCH5x3mh8EL4bRixSAoB5", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhyRtUUohmkbDzSjZw422cLeXBUBK1Rygw", "amount": 10 }, + { "type": "GENESIS", "recipient": "QecZdcfkyFbKqTXGn8i5s1iG7Rfz6mAtAS", "amount": 10 }, + { "type": "GENESIS", "recipient": "QeVSYP9juB5gfwL9QMz3NgYgNj1FLJ9u2x", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXVoRnk8DKFU6AjqPAcx3RwDnzDnknxwf5", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qcc3iyh3ektfySjbxgJbQ2g457k7KdF2hH", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbLxPwNiMmdaRPYywjuMeu98RDAYaZPXQp", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qi2DAZBWbia4KeE52Qt1PVvzuSEAHQAmyh", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgFyAZ2mUp1879ZNpKb8zHFCsYDnHhVCmR", "amount": 10 }, + { "type": "GENESIS", "recipient": "QawWJdQGTNHk9VQUwF617GRCBpk2zL3Q7m", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiYaG6TMPjtqQwFz1KeWp2ZX86JCJtaDcp", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNvmjT2ZpBSL66SqSEUPPmPK7pddcxauub", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMJshnWZZsr7NRTuJuwHY24UKMHkGorRqU", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qgu8a7dGNaMLudiF7LAKGA33BSzEa3Jdwm", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbrtqmUoEDdLiwnCWtvNwXaccaSpCKo8uS", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQPwgGCF3Bp28VBiDWFku42wDYpf1sMxQe", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qd2iY8utUL8wcshE5MCfBR9SVBmKbyHU4F", "amount": 10 }, + { "type": "GENESIS", "recipient": "QamEfYzNmdo1BEzSbfQSqqSrHbA9AJCaeW", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcQ6gNFN3b8uHEhCuG9sSgk9LeXjaHKF8f", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNtqkq5KtkKKF1jYQ3GaNFHALANh1gZ1Qt", "amount": 10 }, + { "type": "GENESIS", "recipient": "QaWzzJ5XGtKefyCvZ4wCMW56JnJpL8XWYs", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfeFfrbAL1pxC5jZSUum1BYnbToo4u5EhW", "amount": 10 }, + { "type": "GENESIS", "recipient": "QaRd3tTjcroAPYXvYR8zmojcXPHL9DZxd5", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qeq1BV4i6gN69DmQ9AgkaPmizo17YuGKA6", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qhcc4R9wJ6mbxB8jCgA7gxsonqGaex7hq1", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfSa6ivpmWjcTZKw5Mz7sLKX4S6NgPFrFU", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qe3LntnKWfJLkkVcJRqkRqSzqjcJZLrCoa", "amount": 10 }, + { "type": "GENESIS", "recipient": "QS5P7zuFKFineYRY4Wej2USv2A38GVDbZv", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbB1tCEKriy5wRnEVetWZmByjYLUyFkg4g", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXBXg6c1jNYZ9PeAKGLsBiuMY9MVyYVNgz", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qfp2xKR2hiWS29oy8GYJgRANCQyHsSzXMf", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qj8yVKdxvUxBe4E9TvvKcjZ2UxUpa68ZP1", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZTGHpZ5cyqGBBpiHMTPSGngmqgmh5LB2b", "amount": 10 }, + { "type": "GENESIS", "recipient": "QR5SGcLtFAxk6mAQZiAMMRUyZLovDaQnQf", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcTPM3qZFXsArex2Tcjq8KzJmZeTL6LG6A", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qi5o9RHLN8menSyT9ATAv3A8ge3vu94KGM", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNNRCNBotwc4Z4dyYTwhdCz28EBPHUqgng", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZ5xduv5rwt4f54jicU5KB6TkNZQJZDgRp", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQrvmCEHwQR5dzvLTxy8edXBzHJ9Uwde1W", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qbi3FU8dMLEZHJT7DdZWu5rpXnWT2GTGF9", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qi5PGoa9H5zBmfva62SgbyJ5bo2qYo2uKG", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUpM5bugMgiZ4AqDiT4aiy6mLJQ7Y9GeRU", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQJJE79CuahqQHSJ4xVVcxANHfE1YHMUoi", "amount": 10 }, + { "type": "GENESIS", "recipient": "QaddFd123JhgyyZo4SqDzRxkD4v7wyfDxu", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbuBHgF86E1WHKtiGswiGpWZxtFRg7L7z4", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdDqQ6rBJLrW1DhPuQnw2Nh2pLbHoXB38k", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNtb3aiA92Gd9egNvhK7a7uwZY1tDHVSCy", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPV8fxpCPPqv972Pn77hR735rQ1h6dzAue", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qb2ampydMe4iTvTfh7jtuUbcAuH1xJUpHm", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWEGkXDJvwyjHppad4JVvCa6jvttn7aPJN", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPHTv62t8XcdkRjnzU6qmN3yqi95o4F4An", "amount": 10 }, + { "type": "GENESIS", "recipient": "QY5NwDSwvBFNhu7M2WxUDvyvDPmExQXryz", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiA6aEE1mq9PPkNTAU55crqkuHycdS1Kf3", "amount": 10 }, + { "type": "GENESIS", "recipient": "QeabFZdH5srqgfjN9rACGbqkSLdnPHc5Ym", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhKHv48KUL4spnjx8JppAdraah368VHa3D", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRC7iB3Ce2vwSfFexT2gipP5VfFBkzYG3K", "amount": 10 }, + { "type": "GENESIS", "recipient": "QaHF7gJzo1i4yqFqp85QxoQ7WGRuzhm9kL", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNxE3CV5AMfqgpKUrLWPYkVjWeJj8FGvZL", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbBvBr2gheZkKiR1nJNfzhA17rnFpPeiXr", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUe1jYckxbSTYddnQDqa93xJh1Q13pbgwi", "amount": 10 }, + { "type": "GENESIS", "recipient": "QaKWS4aJHWPee1mGLK4NKfYsHoLym4qcT3", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWU1HEMTbvMKMgjVmRN91ooaAi2TX45XzQ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQxVZ98CxWA79KWer8tBtgbbZ5vbdRfTuu", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNDHBHKpVz4Lr3EBDkSJ4ZoiSxG34VjTMH", "amount": 10 }, + { "type": "GENESIS", "recipient": "QY4E9pEXcEFH3Eh8KL4vuXZZEQMsCRjJLw", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSdyWsbqYkFupwWdxt9AbiQoP4cq9ymPgX", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhR7nJGFMV9bhj34Ldb9SYiTLMiJWnA2N2", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVCFSYhWMLTCmPj6mDnLq8JQ9fDTaPDCDY", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVp2aMAFAjcFQe7Mev2XrxsTCYUcbGfsZx", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTred1oVKR9QSeuzZ6BudnkK4EUsojwHsb", "amount": 10 }, + { "type": "GENESIS", "recipient": "QS51FHhmDJHrJ5jxDVTPXbxe27hoU3aJ7k", "amount": 10 }, + { "type": "GENESIS", "recipient": "QerB77uXd93h64KuMXT1TGuDinYGyBz7Vp", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUBx7ioCLLbFuMdYCtxmxLpiG4EoBCtxDF", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYexbcwSivr8tvr8K7P5vkWV6wU2Up211G", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVY6jD33ykTCVLjwaL3bnuUupzSVKnLVyc", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTDSpCk1BwrfUhFrnJb5jo4u5ce9mYrQtq", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWKFaTrMDsBrWB2fbD2GZ5j2y8mt9ofmqN", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qj4Y13T7YnRRnZoDEQcSvPHgDz6dHPFzUH", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMr2cySkP9ACj9T3pzhSZkPsCeasiLTuuF", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPocRpr4MzdpHRfjXDdp1PAbjDVBKMCEax", "amount": 10 }, + { "type": "GENESIS", "recipient": "QP48VJk4UK3XSafgV6b3dLmsJfnDvNX5pD", "amount": 10 }, + { "type": "GENESIS", "recipient": "QS8SYFNeDzyiNRL4tJBLQauGMBXkATgFHE", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdfAyJ2fGxnzmyXR3J5ekG1LbjD2nhUJZf", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qah57SitxbUZDeAiCFj26k4hvNFjX5cQSJ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfRZsM88kdbi8a26SmrZdusR4pVTCLCHmd", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgtS5U8K89Ax2mmc2JKCWBHQNVZ7tLwCJn", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVgD467m4gCe8y25X14xsMchFvzbeNMay3", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWScc4dvcbgPmAQSAUZsfpqCRPE3nivGsU", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUBhMg3yy4FtiW6h5136CfQqqHDxr3SUtg", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qj54QTsNtZ2HtTt7tPaKMVZdSQtfdNbrGL", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVX7DzY5oCJydHWdmEuZMpuAFLpVYwmHzK", "amount": 10 }, + { "type": "GENESIS", "recipient": "QLi4GUiww4bKQH6ouEFFEmyHMXgPDvtko1", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiEUfeoo8eAKUgFad1qsMziJWw6ZenUxMd", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMGeYbe4aXs6CTnstGib3zZd7k6UvTvZsr", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWeYhaXNW94WAY1YPm83pXaZfak46AWaKe", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZMUskZQiycMLrcCmRAE1xDDLCyTCAVZrf", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfVRtTXq5ft8L8CA6XpUKYK7v1Zea8WJvi", "amount": 10 }, + { "type": "GENESIS", "recipient": "QeWSpRvWQ5fW4Deac9fhy2KogSYJzrFyKf", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTnFhyTywaTZcxQsHuKYXoT4x5DMJ6zM7u", "amount": 10 }, + { "type": "GENESIS", "recipient": "QepQfSL7yZQAKFxsbpnqxiWc12FnrC7jtv", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNSGkxLdJwqztSbHRP1a9FV1o48YkYAgGy", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qgnt93E7MQRUmisXR8anK81D9SdmCxBVob", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbfLajkHMLZxNTcK2p5B5AKJhVbWSYohog", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qce4cfhZcTbV6FyAfGfzwpP58qpeDF1Cci", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQ8wsBG98Q7HxCwvCUUVfdXo9CX3PcEpTX", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qa6dNeXGkMdooTd8SxFicZYxbxPGCwLx8s", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMU5izcUpRNk8CRzy7VL6CuP1DS4XYnNeP", "amount": 10 }, + { "type": "GENESIS", "recipient": "QibWhLgP23xahRe4cDQ8JmdSavEA2RAbH9", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWn5gL9aBWNArVF4e4MRgP8YkUKee39W2y", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfgiHy7s2jPJFe6zvHQTcZWwV8ojLyKvrs", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQvXhppxwTDQrhs58Gb51BM3aUrFevPH5j", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbNB37Qtoh2i8Pj6MtzGANVUZerzG3Zb2N", "amount": 10 }, + { "type": "GENESIS", "recipient": "QabS4XAyJpXzPHZyiuUhurnpuHZpACNuny", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMkuFWrxs2Rhwt9KuhVghX3CAhcSXTmN7W", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSrPzymXJwqDbDpmEi14pRjtrrdehZpGyc", "amount": 10 }, + { "type": "GENESIS", "recipient": "QexNnLLCdxJjci43j1FytfzoaDD5RmvoXE", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMf8KFSxAsyTdGrNQnFdXQkE2fcQrrVWQ2", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVfMdKX45x5FdnRTdKAURPCkymYJRyJgRX", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qdo67QsSrDhf4oL8D5jC2efGgUknAKrEWK", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qcb5niZq3fapBq6YHcSFmpPdK7zKAyVqMo", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSwnihvcSfvePUZJUKZPuTr2WQb5BiyW1D", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgjEEYEAPWSwS4jEVZcYdJSvLfwoywCyvZ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbyC9ue1BEDbSafF4u9EuhuBvpMvm8rTAq", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUKzxTDD9AzthoukedkqSYDEHRTFjRFnfm", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhTn6DXvAatHbqcz32NJ6Am8nyNDc2ZMQM", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTZHY3vX6aLVGWe8A9QjW3uHMGhd1pMAPa", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUmfeSj9Ae9NsESzHKsgyF5i7sw3riWbCJ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTc149rVuzoJ2kLLDi6TLQ5QQfU45B4VFk", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfX1sfG3Z1ix5mm2mdVDkEr7fTnq5HYRCW", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfMeaYEra3ZP4576eWgBYwyHX9gbRcHE8x", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qg65672zycKy7Tb5SZYxXPNBvh3vPwdKdy", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVF8uodXcVdnvU7DbRg4FJBR6dfYNK1vSa", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiA92XRA1Sf28iAsrQvZNsYTDJpUAsyZCc", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfEuD1CtcefSu7jMYpwDhZHupBwmhaCTsz", "amount": 10 }, + { "type": "GENESIS", "recipient": "QacH68BmZyMkB8dufjzTjGWMYkvUHUwFut", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qb1KRviQaL1j93c7CWb36KS6pvfQdUSLzk", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbUuHMMxwbbnRZZCNRTcSK4gZ5fSha55Ed", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdGQppMtF7LKj5uNBCQU5LQzvwiwXeP9Uy", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVt2cpiE8HLsofz1iEyFcrJg9g7MbGQZTk", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPc8yZZztKDmF8SCKBKHcMVEXqyWypmaoU", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbjPhMwdXdkFY1sPrE7jMWeWBcSRTZweN6", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qgc3Q1ZRWc1LKX51GqPtaYzXyLn6SyoobB", "amount": 10 }, + { "type": "GENESIS", "recipient": "QS3AQ7DD1RZ6M81XcGdrKibhNgvKFnNwjY", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdGfF78c8kwmGFD7DWhtZMGvxG35nT7tZW", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVdh3tLLkAZdYKPAMz4CGaSqp7RvRmE1wc", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRqjcSqiGWADnD8Z6cF2949PYWwRAsdWd5", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiVfxu5mgUkfiUjdwxvnxBJEsZuUaL2nM6", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQR6WaNVF8y72Extb6Ndb6bqEDabCUiXs3", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qhim4KT9VkcxbE6a61ECZ4nq5dHUtb9okx", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qh5GLNHyNt9Zx4umjoBkbsaPViJ8xKiVDi", "amount": 10 }, + { "type": "GENESIS", "recipient": "QV1FEkzd4nsDZPddG3sWBdxWCELMkZ6HFk", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfrwyMsGvF9Vo6SMyPyKSuveEFikx5fgvc", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQ2rRvcqCr6nj5kkxwBDT9ZTfN2akMGv1z", "amount": 10 }, + { "type": "GENESIS", "recipient": "QepQTxuer8cnS69aYf7EDAoWQw6GMPLibW", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbdB5TN8P2mDRrBi7kXWu6U8vNkMyh7RJ6", "amount": 10 }, + { "type": "GENESIS", "recipient": "QjEsV1pxjcHPNPV8m3oCC163w6t9PZZF6p", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qc7yMoMRrA2fXmQ77JuxSfVdXyfPdcnNwp", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUbAAYiv8P1oACxGDp4jGWD66t7siiqTtp", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQsYuc5XBWaUsoR2QAVs4AVKBmY9FCSrQ4", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXo7EkKEDCE1SeReojKyqVUFVQ1sriN1WH", "amount": 10 }, + { "type": "GENESIS", "recipient": "QaAo87qyhKXU26y1YR1FTvrLHv2uav8KsE", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNJT34EthEvwgonu2vUVHNmosGRRxZhSHh", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhTQDuBcjfnhqHu8mfRJAYn6VyFj7YjrHP", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQpoQWccsb6UVWnstdZzyMZZjBuWLxSgaV", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWQ6MUMNQKiJFnF2iKsFakeVvH4TBogxki", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRXZA3wdXpu8phg8KJFe7RNQhs8D2P3DLq", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qd5WLbqdcUcbi5ZyY1rsDTBpBG7X6YAS9r", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYAk7XFu2bG5cKTVApjey95YRtie4Ed13N", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbPqWcpXcNGuGhYZ2hvLNQ6XhyfudvCbi6", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qajx9YjYHukNF2fxq2UbGniGdpQL6jzy5t", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiPKz6cwzu6HiWU7ayBjPhW9i63f93K2Gk", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPmCwzYeToHypmcosysxkSu2hnzEPkZ3Kq", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfFs5G1TPzDzsa4UUB5PmypRnEFTyS3674", "amount": 10 }, + { "type": "GENESIS", "recipient": "QT5Te5Ya15tV3vSmdy2pPpZdrnztAAZeUL", "amount": 10 }, + { "type": "GENESIS", "recipient": "QeiMYN7pcPJY5GUvZo2tYMHvDvRYx1cNak", "amount": 10 }, + { "type": "GENESIS", "recipient": "QY4NuorvFU9AUhonC5owihgNdRork8oo1E", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSDWB7bKAoH5sHRVsUNmTPe9xDkvX2phom", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNBQQ29UH2SA97MLDdnTy7ExxZxLLpfZwU", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhP12VMSCpC4PcV55Fx4aFfT2c6RSsMs42", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgS64v2deiY1Z1AiLkrRxQKzJSMCNXVgrD", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZ2vjwzV4Y5JCGzkwJPDgWysNMB6rFVgrK", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWmWNDLYdKkDwy5kRbyRe654wksS8r2nUX", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcwaxY5RRmoa3fSntzJXZLrwLmfrjqtFNu", "amount": 10 }, + { "type": "GENESIS", "recipient": "QaoJPWKxmGRq4rWNfo4232yVX5WPBuoKqC", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSJHRs8N3dbPwYbhbj1L8jFWBzrq7L3duY", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWRzfuzym3kfZzuoA5ASpnEvmgeHE18hF6", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQUUAxnYkmMPs9WWQcgjwUMVPGpKnQPeYc", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYqZN2qwT4zfE8XkAfTnvpQV4ws3JbCMxU", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSx29CwBhQsJbQ9hVQoAFEXQR2VYz7KjMK", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRnJfCXxGrdEUDVdHDCw9DDV3gKgRu5vVQ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgWKwKe9mZLgTu2NeyeDsfuPVE9Ku4Zt2s", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qcj8jG5E9KtEYK12hVmWdo6cdUKven9z7f", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUMJtgeL4xEBWBT4NZdjqvMWGyfdagQ2pB", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdPxohH7LJTdUSXXnTb99qhuMSqJFCxc3s", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbW5AkBDfr1cLZHtMFANoMKB9ta86CAYD1", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPgKTyPyj8DMv2nLZumJYYYwSD7iF3Lw3U", "amount": 10 }, + { "type": "GENESIS", "recipient": "QLzWPFyLvezHjzdwnNR5n1jUHpHjdjQ3R7", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qgcf647FFAFZ1JP7bEv4sa5rw4qr54uTQW", "amount": 10 }, + { "type": "GENESIS", "recipient": "QjuQLSjRyDTVhDgMxzUjLJFbnYdUeXyH23", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbwcDH8PDbr5Kyr5jwBZ9Ys7hzg1A5QpMA", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQfhecXaev1FYq2UgMhpzZa4oayc9k1nnQ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfpiA1rowLYMDVPf6oe7E9R7WNGQwAKfir", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQCcSHJspqeYhfxbK8UH1UhjHeGzmnQEHQ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPUtaNb6ANbWHLJCGMs1o74yeb6pYmHNcG", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYrLYW646AtMjd6Nn3e4qzeKkMCzhtBkG9", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNfyujwtGFucVnjkaDEhdRprnixYfV2wz8", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSFxD72vCMra8P9ohh895NuuPHvof9b7qc", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbVAUHJsqRY9JNn9aBV8VEowQQ2BbP9uyv", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXtM9SWWqqJGS36qDq6S4MnMt3dnUb4kNp", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQCr9Aj6XtEVQXbz4D9fHSDDwn8ANbQd7B", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSqyNKEktA4iXb7cWWTSUMkkc58vCiCJCH", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qeek2544Smo4zkMHvbQ2tVJhKv1gDAp1if", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQUm5WQs1jzN19X7Ls9NY5q9G1BmtbKK3U", "amount": 10 }, + { "type": "GENESIS", "recipient": "QenuGzurgCPaeh9xDxRwoPRjNivgX6h68s", "amount": 10 }, + { "type": "GENESIS", "recipient": "QihN1use3mN5BshhSrSS3hF1iMmwPFcdog", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qbu1Si8WLZeXpwiHXzPsSkdBMDV1BFLkEU", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRkubxXBe8ABtsWFpdB498EhBy16FNiPMo", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVa9VbF2aGbXNh3LfNxnFJ9p8cqSmFnymi", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYqQHwpJMPR8aa4PWKEXxmc8uB2AybcRt5", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPHyxSLBx92izt17oifcsBqh2WYDTWcgpo", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qg3QXvRPXayBGqsGzfvS1a1Eh1WDHowBLM", "amount": 10 }, + { "type": "GENESIS", "recipient": "QjJu5DiC3xVkFca2wznFCei4HBbvCRPoJS", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbcDt7uDJok9ka4FaVtXaT7LYR1sQMENyL", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPR3NwdDuZuZGXW1UZjoZhHKWreLw7iZVi", "amount": 10 }, + { "type": "GENESIS", "recipient": "QaoWao3UJjZpwbwj6YgrdWgS1dDvR2vEFK", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVX7YLBES6rJGtTeLespEspCxi9oDYxGQ4", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRpsUCr13shNTDo78B3r4UthkXa3E5FgFr", "amount": 10 }, + { "type": "GENESIS", "recipient": "QREUmhn4Pty6mjnJxJH7RxnrwN1RvbD7fe", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPdzGiWdyHjbBhtCMvpd6QacfozzMPpfNa", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMriaRPNU6RZJmipSuZcRi1WVj63wb6GrL", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiW6Kd22LCJjCpp5EBotFDeCKjCC7t8vSY", "amount": 10 }, + { "type": "GENESIS", "recipient": "QN5GSskzBjKQ7ZnwMMqgko1M3KWKCVqwh8", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWwra8uA9M4pvabK41561mgFd2o79thQdT", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcQSX8HPRpNDGgQH41U1QV5FJ1TgK9q5Fr", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcTrX5Qzbe2djro29T3wKDq9MA8m86HqUH", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWpLWkuZ2pMiiPXRM4jupQe3vBp7GiRtvA", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdLHqfBmfKG7mnXCUALfgQvKW4S5igrDSV", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTBiyoSuy3ZF4yLJzjqUY2imVPsUULFbG1", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTEFHfLoXohdbT1FFdHVJeEL22qmMypTJ7", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdRwRvbTfT43sHjyG7q4f38PaGvwiDyrWj", "amount": 10 }, + { "type": "GENESIS", "recipient": "QijECkb9URmgXD1oAtvYEe59dPmU4A4fHP", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qeh73yn3ngvB5yX3beKJArFuCJks5i5r7B", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNWzHrRGoZtYhEUznjdxCmMi22LqGa1ndN", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgNjGNiAKViM1Mzd9pGHieNJk6CRSFrZKt", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVrGMZ8NBLEvEcWXfKkCWXDvUCWF4z4yXC", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qe3camytysJJ2BnfqGmw7BUegZXJTvkeeJ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfVUkFvVNPxQCKgRFWzFQVk6oFCbuyzyRW", "amount": 10 }, + { "type": "GENESIS", "recipient": "QP86kJ98hxBi6rzAJFkoCuwkQXh3DvAGcw", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXxMKghXxEKx8RopT2rdiCrBFvoyN1mZMS", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdtUw5FRmaKAfJ1Ttu4bUagfX13cTHCpFw", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXuHgMUN9FWFVFjbquFqkDw5NKRToVd2t8", "amount": 10 }, + { "type": "GENESIS", "recipient": "QjSZxZZJ2MRB3118i1VmSuzamBJNCnUFaR", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUWURY2qbSM29to4uuZ1CQXh2VgWp5AJsT", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXbg7o4ufCFjeA5uSWDSMB28vAc9XeRSH3", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qdmf9fZDUFWxjXZU2hrhTZmKiiMuy6AEyC", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWJgQDygXYBXuweFXPTzte1eDMg3CnRUxS", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgZJ17ZXdrJEqcAPM4Bnj3NJimpCupDs2x", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiZRd7wFASi2jaQfiWSMFS8Qcfrp3MCDxo", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZuxbXpcWbPNHoU4yEps383E4rTKkkTdBH", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUigfC2QABH3RMuStStggx9YiZ49VdtWTw", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVQepwPCzSosioi85mzfCxVMPR3f8mGBjP", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWBTMtHSCRrHTabkzf38tqhe5xSB8wtTN4", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRY5mhkq1fV9MZ8rtrR1j3MnCidqfstKCX", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTnnKbBSqDGHKiD1Qo7yb8ry33mzxZDs4E", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTtyKRb2fSeuhH44cvenzahXSKWiGfV5K5", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSbg4JJCm9oZkESD9obePZpGK49gWbmGsc", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRtARSe5ppL7WpNaMaWeboWbVcL4Ua3nxo", "amount": 10 }, + { "type": "GENESIS", "recipient": "QaQs8c2ccbjPGhpAYdaJRLGyBTWTkDKfmh", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRVotWtKboC5APg8YxhjdJuV9JioWFydiC", "amount": 10 }, + { "type": "GENESIS", "recipient": "QjXB8Mac8ityiVMWHkXPbi7qgKMuCjKdbW", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXLtbT3ru6WfPjTMZ35q2f29kuNh5v3X8s", "amount": 10 }, + { "type": "GENESIS", "recipient": "QisDJUYKUnv4sEW3RfVhNywxVWcHFg21Rq", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVpbg3oMF4MAUD8QVQbSfK49YfUYAijEPf", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVYPrrnPsn3D3AbiXsCk6wb3EERhTQbauT", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdjJKpJt95jGgyQK3HR4qTYQuwAYdYTM5X", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcUths9zcKzhmWxpQjdoPkf7ZCrvPqqHum", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfErd2q9pvzPGuoH1NRSUgXxZtz2oyWX6C", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qg8zWrXTiAk2r1gFLrh8e2vSen7DdbYU6X", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNMF4gGKyQxKBHxC9weivsiGwJ8JFAswgi", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWNik2tj86KQh5zGCoskz4Rhcd9K1Qv2gL", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdxqwnjHC2qy1j11YMZP9KF9dm8AbyGMby", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSVYtX9qPuCxejLZtUxabTJ4urKFMcbwsb", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qj6ykh2hXy5jiYRgrmt7D4H2KvMX5oPWac", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNyT6h7qK1zS6GeqXfoMJUf15pyush94yg", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdnRL1yDRGhoE2695SCLpPdCzzp5xZLMDc", "amount": 10 }, + { "type": "GENESIS", "recipient": "QX8FkJYYLTjXSwdJBAwHtTvHiZWCmAVmCY", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXqHgue5R4qJNvPEsxZvbYMpsCRmD7YmRf", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTUArhyERXNN76q33wdcxJzVxZoo4YUQk8", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZHKbDYdSjS6FF3Mz41xowpjHF3fh6BvFb", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qf73yQjcdH2hFndu5f7xcb6NDt19TP9DoB", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMxU2uvzikxgzj53sE7cTe6iri94z4FuXv", "amount": 10 }, + { "type": "GENESIS", "recipient": "QX2gQw3y5xuKD3shthn4cQ2mZ8b6XLysjk", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNtoFtG7gBXeocAGwDVvC2JX81qs6gSPHU", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUHZiok3byKWVjdp1U1LcVhsqcF5ARHT1q", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMZ7Vnq9P9TcB6LK4WLZstuf7ozSUBJSTQ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPy3imHu9bFEkNPF28vidDQTZtLGdgpWqC", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWMoMkXwPv6f5s8PxRfiy6u3nYfVMpyGve", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRYAgyuRWrLVg7VaB87vBVWm7kUyYFJ71w", "amount": 10 }, + { "type": "GENESIS", "recipient": "QX6PwuE3VRToyWd1Y5jiUsByFvppDeha2U", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfoPk8G5fiBXJ2S4Yk8PpcktDj8AZnShvT", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qdihq99B7ZnAtqru71PAGQhjhjtAJdAX5k", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTGMkcxHVmxv1JkDw8DSWtdB19hTJLG7zd", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXgeaEWieLL93jvT6QigYr9JGcJdnFXByP", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSSKJUY33kdbz1vkiEooiY45VKiZkD2Dka", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qg7TbPrg1q2ydVdNLqJoQtC3RLBUo3t2uD", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgcVr77TfcVmb9iSgsSRPeQqejqfKAvgQy", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYs3NV1EsGc2GaBYC1jPAPBsZRGfYfwopn", "amount": 10 }, + { "type": "GENESIS", "recipient": "QjDgJmv1gnz3VSJHziY3quBHE51qEAj9b2", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMoUYGYfYXdVUxAGvxkisHfgzwvf1psMLB", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNTdKEnSyyUFfp9SPnbUSgbbnHi73LZ4py", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qf4NBSfFKmjQBuuL3ti4xUFLt9cutKrHDw", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfjrwPMPQTdkc7rdu1qyUGGmy8uyXB5BH3", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPxbzCsTxCsafRUWp1oBHfbqRva6sHyxTk", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSKnXn18fM83HS4J96BvSHmYi5CfvZYgWn", "amount": 10 }, + { "type": "GENESIS", "recipient": "QN2yfuEHpZqZDZREXUUTp7JDzzAnzD26S5", "amount": 10 }, + { "type": "GENESIS", "recipient": "QjCL939qc9yuNuP7KvEnpX3Ykj6vWtU5Xi", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMkmZBSS6CqiUZrL6HkgL6NeEAbz4VYgKt", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVRxJWg5jsbNcuMFSzEbrQ6ZCWL9qqiQBc", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSKeBHV5ndQNEwZf7BMT8YMY63wJPXHUDg", "amount": 10 }, + { "type": "GENESIS", "recipient": "QM6nHqVPpe9eXvpeshH3fzKS7vok9ykN2c", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZ5HVfecMcnxnUbxhNPk1HV2GMUTqUF5uB", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNDN31DNB3cu6E6hKT7YQRv5P5wzbvm8gR", "amount": 10 }, + { "type": "GENESIS", "recipient": "QaDVaEtetDZk2SQUcEwrv7srTKVi5nKMXk", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcnYqcsiJ5bJnyKGMHRQA3LjB8EP6kbRxs", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVg5c7fQ7AjQx3Vtf1esfbNeMjuJ7HSxnS", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMG7Q4CQfS8uWRFVNZCkMq9EMeKQMyo8hA", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWeVdu8Q6UtPCA7oxcw1vN8V4BYJ2UTLuT", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZNRfr4Q2M3GCgUiCrffn4rr1fcNLMLuDo", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXhvKsfnptbBhkbyThihqZyU9QESPfATbP", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qeho5fUhWEb58qFoZdMB9LggSnbaQh9vRs", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qe8DdBX1a6dzMyX6kA7BXHmJz3hPWB1y7X", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSAejnaEvm4pSS8oXEh3b9XYqmKuHhqLVb", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qhidz4HLjm1kVrLTd8EPyJEELnoFVqnATQ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRtmedUHNdfwaNwBWX8tAK88mwTWa2z8Fe", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQa4sXFp5jq7ntE25pvz7xVU3rUWs4eiiQ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSz9ksffuikfBjBwFRQJW51wQ5CbSc8HUV", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVHXvLjCrNXgcRu5nw2KFNsaZ4SUkcod64", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWnXShDuAWiCmmKsLtRUWrbovhoXafU5sP", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qj3PMPgJbk5nYi9wZxpyoNwNPaPAjBfKa5", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbG8iHnYMCEt5Gv4gbXT2sTiafwnwy6SWh", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTkzizg6HmDCNjA2XoUSJK79dgYTAFdNEg", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfmqayQUFTY8YTqrw8odoQ8P3RwyWo777F", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWNkvkThhZXJQ23AidJ26bUQXiNCNfeNMv", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWmJ1XpdQSmZLG4vDS8EoB5w6UrwYzUFNC", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQT6fRGwyxAS1uuayVJvetBHBhdKpBvgFt", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWbqaN8TxsvxDihfkUUBRobujVbxsbzoTA", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdtRTY7sfe2xQKR4jFRWMpFyyP4EoPnvDJ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgyC28vh1ri8U1UCkjwQuCinjJS6xmLE11", "amount": 10 }, + { "type": "GENESIS", "recipient": "QLnMwxfVJf82MovsG4i5GPvkny5JNBTQup", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYF6MLarj9k1VPKyog2YHDBboeFngmUnTK", "amount": 10 }, + { "type": "GENESIS", "recipient": "QeXgozDEv5NhxmNzbV1HEugcceLoye2b2y", "amount": 10 }, + { "type": "GENESIS", "recipient": "QLrGfcLXyTWmA8CPUZkPM3WywzTAHVuz7x", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcfiV9f1vUbBLrTRPLJsyhVgKzKT7uuHKi", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qgxgpn2J8c5LzC2aUkPqixnVkRmd4fjBUm", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUmr9efCkGUt1qMNer2vt1xtcy8S9wTtAL", "amount": 10 }, + { "type": "GENESIS", "recipient": "QienqdWpCiDvk5q99F8pt1JYTZsSn6qLrD", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUMip9ykZ66AP3Gbg8pGP1ewoZwoTZBtba", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgYWsGqKjL7MrJdQmsHXMhtKxJqW6vWyTw", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQMiJaCGrw57PsF4hWmqtnbmyWVLPkq1s7", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPSfVkCtF3NJYyhPNN8yNAQY8pgRbFirgW", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNrY4iAmR4TQtB77hMrM3u2XXYX2st3wxD", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgCQoTy5Y5RNrBjeycXthX7t5HX7oEzz19", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiczLg5bJZsut7zqwka8E7y9Hi6qPh4Jqv", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQW5QPRbWBFQpdPa9x9x8AxejhgSTUGTwJ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTEDEPGWU1pED5VMo6dPYrN9a7CQe1zWtS", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZDN32a1tDV1mZ2jMZekaHiQq8QTfoaJ6a", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRBJVtRZGb99SosM9y5YJ7ogsMdVxXdPu9", "amount": 10 }, + { "type": "GENESIS", "recipient": "QifaDahrcETU3Jc5HEQJVUQdSXVvRYXUTi", "amount": 10 }, + { "type": "GENESIS", "recipient": "QaXsvTkVCcfXYBod3LLnT4yBbVyxAcSK6V", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTJq4Q8ie25z7QdfzeXoSJYqkG4pYQDU6J", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdUDcf7Ey61TxGtfdW8BLTZjBJ7zKGgk9s", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgwhdGRUuSKm4xqpT61xB5iiP29wKFkTXr", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSftyUsD8B3F5nkW2YjEikmcUvLoGHjUL1", "amount": 10 }, + { "type": "GENESIS", "recipient": "QP7NckFrHLgGKbM8aNYwbGCk4YjsmgeKT2", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYwvyiFoaoK74dw54N2xt7UmWH7hwUeCzb", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdssSgnCVg8M66bacZqFaYCDXRGCpb3ze9", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQTrDiZhETEoAimcJFfFT63rzqBy6RNA34", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qfi42mfbpxRE2KnqH4TGQzX5dEuSGaTABT", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRYgWAEXBJ21AN8ncvWYN1NhQm4iQV1n6m", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYu45h5kp5TAx5R53mMk7XUE1YgkEym2H8", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVX3JsK9vcyLBLjoWY4WwDLF3MoL3tSDMk", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMHcurZGnyzPAmdNurcacm1GNCUHRRZ8jf", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVkpbCGEwfdkEjkkXPjZJGGqPG4F5YxoD7", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qj3Fdad5SPJuMFFAmndBRe9AGumWxvJmZr", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRJjhxgFEepMD1Mb3Bzgmd1t2WuSRKxrge", "amount": 10 }, + { "type": "GENESIS", "recipient": "QifSzfbmba5KHi2HyUwdm5C9evXqXENgZk", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZbs49mBzkHtoKouBUAD9atYUz6RBH9pQ2", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcBREkh5tkffuFLT78SLPJZCzVWXhnweoR", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbPcRUYCLY1WssipaRygKeEBm1LHBPZnuR", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfypvmTWiTHo2GgpBA9CrGvr9ke5Pi1dvG", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUEviSVKeHCwfBm2cpVHzx5aV4uETjARNh", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdhGpQJJDuVbZrVdNUS2ec3gNq2D4Tu9pF", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZEKMgog8epbcSKGaH3stvFX6mc6EH611J", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qiq3xFZgSv8hiTmMs2inxf5T5tDfarPU4x", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZSS1LoXwHpPNzgW6schoQgUNoKoCA3iVF", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXaaXiBDAiL5nwVsPhGwabjoEaV11q3DzG", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSUBoFU5hhcHduACBiz7kD4UAf8jo8zsTb", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qani4X4UGeXamvzHc8X4RXzA8jWSmH8cAW", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSTzv5G8YEhtHpGoUDNFVW9LMNke77kLye", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNneGgUVdTAMkQ9hoY1XbezGZ4joa3Thnp", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcNxuwspRac1sGRjotUTZrsNAX5rYr9fM1", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTuZoN8Rcm4pLUNP6HXR1t3tU9Z4Jwiu2T", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdvieSs2Lnr8j76TMaZVwiN26kTzsF7mFD", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdSppgA8ZA4ojEPdNNj9akBbgDPvnTQH8A", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgSLWX4QEgujL8vB1btx2feZa7Nyueyv8k", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSoV8SFqxoEweZ1rJSsWtM5wJJnrbT2LGH", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPpr5vJcjoJY8f7Wv4wrQMAyfPx4eB9Kk6", "amount": 10 }, + { "type": "GENESIS", "recipient": "QjHyEgbcJaYmmABWCMTcDiQAHsmYZ2ZkMQ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QadBi4yLoKjC6XHKGmrVJsVZReR7PzHgmo", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcAkNCK6bF9sjZYsroSAwRRygVrq5Lqjbg", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qb2vVR5Jq6AmCDXhZutKdLU6fKi8weGPzT", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcgtjvYfx4BnV1mmA5FXWtXavXWkqJaYXo", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTK2wbbs3LzideTS2UpXLwKduVaFg3aZ6h", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhRPSTf9z5nELnH5otVyyRN2iHLJGM5gxH", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPqdmoZnmPKCwugnbtURKgVMv4LCN51Mra", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qhz2Enzj62kVerEnscLa1oCmJXYRk1b9rY", "amount": 10 }, + { "type": "GENESIS", "recipient": "QY37v4nnj2JdnwxvZRyQKok89PkXNy2DRG", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXZrPLnA2yjCrbFkk1TJ4rGVunXDTcUCiH", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWae72VAzeus4aVbUYJmtqgPhAYvEWrrAD", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRzCnx48eJtqm6gUKhdSEZPVE4PoD9cezH", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYFZoo4jcSDgrPxQ7rc8FhPb8fcNgBvrhu", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZbh5t9UiQGeR12cTMaEreo8pBQCEUodwm", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPiMqnsBRRwGQFJgzNK51siFqUGppfH1cY", "amount": 10 }, + { "type": "GENESIS", "recipient": "QURar6EGNcaXr6TZf2X3gHCMkGBhGQLBZN", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgHdmfvGfiGx5kSn3GdRn72pWafGey6Jia", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbRktBVQovHF9Cc59M98VedTAFwgqg3jHJ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QU8mm9JDdtgHpwWEA6Snou1qvBgwVqQjio", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRPVT5h6VuNWyXWhtL1nMMTi7bGmw3yMDX", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVbmnrrGqe9RjwX4EHU7w17AY2mUrJ9y37", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgBLAB1HtEU8nuuSEso6413ir8bv7y9NNY", "amount": 10 }, + { "type": "GENESIS", "recipient": "QV7LARZvy2Psz5kLfsD52uEeQwHuM4VYtn", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbEJfhEUV4nqBeGsDUYiiJyHW2a7LHzX1q", "amount": 10 }, + { "type": "GENESIS", "recipient": "QLeJ8R9FKeyhVivaLuvTt3vcszKDxEBWXk", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWazYjG28fWUvGCoxvVCwhz47hty7VgHdt", "amount": 10 }, + { "type": "GENESIS", "recipient": "QP15D6KGREk1eGZ8Pjb3LP8jw9oaywHRCH", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSVQDZsQSvsd3BFiAS45WjA6gquH7mKp3s", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qee9GheZLwpyYPEbGci65Cu9ywmfUpiUtA", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVYGSLnspzWNtGCDBxtF26JMY1PRR9E8Mr", "amount": 10 }, + { "type": "GENESIS", "recipient": "QjQCea9aLKuXQNH6iqADfC7yngwVTdA5A2", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXZJY8MgKXviC4xeuMoZ6zaYSm7dJqZYaA", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qfv2jWMD3EC6sAGxKx8hRBSQVAt4YmtTvX", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSVzQVQCzL3AC8bAHGkbTCiy3xgeWGfsfR", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qd31D4nhiCMnPFHoKdjeszqbNP914JZ8ro", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfgfpEia92nL94vxwRiSJp7ee5ZophKhJ9", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQdJscTibkMvWkbZitYzrWLtnTxhgt7K7U", "amount": 10 }, + { "type": "GENESIS", "recipient": "QR5WMxJWgaBPUiDhyYvbgYfiNXMjvqg6UA", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTJKN4HYcMBw1BCxEPB79peKqyBE2o8pfz", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQBRiZmS55ZEJNPj1VQBCQC7FVvafVdRBF", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVyrsn9hn3evAQFm8ECjhRYeAqhDZgwiz7", "amount": 10 }, + { "type": "GENESIS", "recipient": "QaYtyv8etaQF7gQP2YKzeLqKyzrp8jrJpv", "amount": 10 }, + { "type": "GENESIS", "recipient": "QStvmZNCzqNeyfzzeKrq5xQh83P1F6ERpt", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qe6XX4Eghqm3psn3jSzwcsJ8N9yaaE6qXJ", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qhy3Zg5D95QWrprgRyWL1Hta6JmMarP2TN", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVG8Qdgn2yBsNRQDV7oW54r1whSEwvUk7M", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVsBXTUPszNJrdaT11rDSRewSdUjMQd5cs", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPmFVFFkB72o8Th9D2wJxgZaz6unt9HwW7", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRA1jykbch853CAsXXt9sEGBjsp835v3P2", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSXfJsEHYTcwmcsJ9yoekCD4HULQpxeCBd", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZhb63HLT4RFyczAXhvviLHvkQUi9q6mTX", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUHuwaoxNusHj7ZUyTYjRFP9EETt2hixkV", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRyvShLAW3tZEaydKZxLAA7R2GmErJFdn5", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qf4FAqg7uo9sDZVwSyRctiGgHNfyr77HGD", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcxYc7fFZjMCtE3GAdr6YduTcPzWXux7kV", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRwYWNYRYpP42uucjSMiSmrpteCyJuaatT", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUw5tEoXvnGKK7bUKye9zGLyuumhJxE8ZY", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYw5c1Ufeu3Xs6X4wDtEW3rY6mvJdyiV69", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZfcnG7M1KLuNVHFoAz75Q9axCPeZGvmnK", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSWBNaUoWQtkDioGsRQVMevrNjMBNhFA9m", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qfmyojs61pnVshq3AMb3SueZQJmZWGS6P5", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbakZPnxpoFvUUA2ikFXEMfupnzL2g1Hpe", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgYwhNYcrYXEVL5vu6xgtB5egYpspHu8Qr", "amount": 10 }, + { "type": "GENESIS", "recipient": "QLtzQ3BiNMDJr6UtibNGKNY5q1Lek22mbw", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTxsroYE6NqWJEfCYRTN2kXFpvc1L6dywo", "amount": 10 }, + { "type": "GENESIS", "recipient": "QauYtokfSq8oZC7MQJkkRUCHwV9RCJXfop", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiLH8NVybYU3gfwXqmApeeLoebMmdxsvy2", "amount": 10 }, + { "type": "GENESIS", "recipient": "QboQVDYaeYEWoxxuq638FGFwFZwVbv3wZd", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTTMNosEkAGiFXLUVMczcmKA12Uj77Dm3G", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qbo2JRDzV3DFruTjznyhzF2arhrKuNuz8C", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdbbfH115EuQzAcEPfV4adEVKEhq2rQE7P", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUQYqyWTkyXvnUxM3caZuEtDEDSbfJYpwd", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdwmWF5FRsXNwn9aDh4SKWfhEuamnAXokH", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNTqdLMtm1k6Q4iYpnvc5BcH9NBxanMkYC", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qi7J6Wzb6pSgaeyGXYmbNo6a3J7csQncYW", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMaJeJ5MmK4UG3Zto9JgLhJ26JaPKSp6ha", "amount": 10 }, + { "type": "GENESIS", "recipient": "QeCmhsUEgUe7ddLqCMHcX2be72BPFkQWd8", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWTdjKcTE8DpSopLJsy1H6CsqupZSU3ZGB", "amount": 10 }, + { "type": "GENESIS", "recipient": "QeDrfr1wmu7okNMRZmbJ2EwZMFesEv9zMV", "amount": 10 }, + { "type": "GENESIS", "recipient": "QizC1Qtg7UUDu4bDKibiTKEMhmGqP7C1Qb", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZPQfSTVKjRYJ3r5P6orJsYaz6ZcG87ktd", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qjt3WY2Je4xSBFA97ptGQBZfSpJb4jgxR4", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTPUBwrW6aRQLHQpPrw4e2bDXR3gRWq3kF", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZLRzY7RZy3h6pE5CAk57RUvR48HH2joWi", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNAN8iRgrqKwPqrCojJQjBpEiEov5tirL2", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiygUw8uXTLzDFJ2E7HBKHMHqiuFWCa6GB", "amount": 10 }, + { "type": "GENESIS", "recipient": "QaZpSiB9Nj8WdbL3MHvUzZBXeFSqEMiD7T", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgaJRHFpD7WQEpPKVkUSNzxae4hSUyeJvh", "amount": 10 }, + { "type": "GENESIS", "recipient": "QeN8j74amkd8GFyoRcxBaVrkHns2WxKjmS", "amount": 10 }, + { "type": "GENESIS", "recipient": "QLmQGf4imhLzZVAbX97MR9JFZik8JQ48B8", "amount": 10 }, + { "type": "GENESIS", "recipient": "QY81xXYuMaewGHHcrYNdxJzhi6dNqu2JRY", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiVm5E2rvGb5VVfWTAMA1VUAd34k7Gqr1q", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhGHn89LXfEj7y4CjSLtadvn8ezL6cAScQ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSCP8xGYg88n963nN9ejiDJeiNggwLRLpE", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdzyigNad6fXJxykm46yWRH5tN8uDq4beF", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQJQfXRwypwuD6oRHjcdRCKeUhdrCsDs8k", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPCYAstwUstQDESpFbPBB1U28LEoRcPq1J", "amount": 10 }, + { "type": "GENESIS", "recipient": "QU4xvi1HzuxYEqQrxhKYnQ2D8hDmRimE14", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVgLeZ8poUf7CJJ2vUGUEwUiKJ1sgszTzE", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcU5kKi3mX1VJzne44LZLpr3htebQtn7xy", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdkxvWwbkLDnovvksuNDwyDHP3634CnSCU", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qf9XqVqSSKDBG5F6AP7nUv1LpUMU6bmRnK", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNfqTKfSU3E8RWoJtJgnKxwJDkzfXb18cW", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSpEUGYR2rveDE4ryRPVjizHtRKnMRh5fN", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qd1GMBYjor3X8AL1WzHFi7egejb45XtLzY", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qbbzcfy5WjRejf5tHJLG14P3uvK23ywozr", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWUSHC2Bpdr9PUNB8Hj9S7HF5iagWPWNEa", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcftPPiBPU8Y1XuCzdAH6vduXHR5V7YFhv", "amount": 10 }, + { "type": "GENESIS", "recipient": "QR6rz7SHGgDC7QnNzWBCo6idbcxcXiLfBz", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhgTuLEhWnxFCqCCADVP7Fh2oXXG9j3Dj9", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTzaaunU9vbdibBHKqg5ZpVH1jcu4rCCm6", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNCas5mqJLgeJHB5jQKXuCVBhqPfRHdYMF", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhqWZL5643Y5C3RwvBSJpv3W6FA8GbFWJC", "amount": 10 }, + { "type": "GENESIS", "recipient": "QaVBebFHbsbhBcmrX9ocbnwEMJgzkHvMZQ", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qdbj1tS7ZGrNdKXqEKfnt9EnwbCLLzyoCY", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qjn22uhkomiP9H95G7XAbEVZFjKiGPfezV", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qj3QnnhKZeUbjUtxGLJ8jQVb7XohfDy1Eq", "amount": 10 }, + { "type": "GENESIS", "recipient": "QLqNGEMTT6GGi3dChtp56ocae6XxkakTkf", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZHLChVNfNNp5rsZQQKRRxkPGriUAyhK5s", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qjrgs36ajjTFgrKUMvsDSW8xiNmDG1L2be", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qbriz3o7KWJZCafQCt4ftJAAEh8Pvg8o8v", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgPQSW3FVHbEKf4UBZh1WwVhLo4eTSXa44", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSchsxiHAmhvA59HBy4M9y2JobH7nwi5Xf", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYEbJEiXbPjqKFpUWkbXBcFFUU1PbppZnw", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNG95Qwbb5P4DGedLHv2kmYvMjG3GxbCEP", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSFj8r42yFpaPQNwKWwSVQKVdozTniCk8G", "amount": 10 }, + { "type": "GENESIS", "recipient": "QM4JVyX65WbLUYTyptAMea2MHsefGvUcR5", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRey3hPPGc2ewP1Ztw4SFG1fyU1xiqLjCP", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZ8cte5J5R21uypoaoCvAALzBkYSePZHDF", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcCRjkP1XeD1dvwU4umQ9cFWv8d3hJqjK6", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUH61i6hsZehnXNJF5VefvLQcRCsNg3NPr", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qbzgu32EF5nPsanMMXXsMNz1rQ4hcmnGZA", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSCYGst9SJb4gz2H21Vq3DXquxzY73VWm2", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qh9Mx3kaTcWfoYJDgeQuDJ487K8EEwTtDo", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRQ7875Nwp9osH7GScPREnfLPX5RczZZ46", "amount": 10 }, + { "type": "GENESIS", "recipient": "QjBn4bLZEeau7hx3Wae6ZWVtc7yCC79xEU", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMG32pXpVopiMA6HLoawMi9x4WmwZBpotK", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qa8uuqfKV9yZekwTNU2JWnj8rnZc2RRmco", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhRiACrq2Xgw491jZovDL5UqvmVDGXQfdG", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZXGVbvKEp2G4c3dBHbTxtZKmu1x3k4Urx", "amount": 10 }, + { "type": "GENESIS", "recipient": "QX1oGefhKHCchNSUqycfzPjZp5NnwBoAGK", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSw5SHLYZLe5NKT2ebMLAr6BbYJNQ6rWrd", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQsUPNpkB2iERBFqVHJomgPvBEookzGgFP", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSqw9dxfGhQJTstNgkxJmig9YTxVFaTo3i", "amount": 10 }, + { "type": "GENESIS", "recipient": "QjFpwBMrZKsGDmi8tGgXp1m9P7xxcr758T", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qa64xQ1Qqmc13H3W8KB6Z5rRPsoRztKZuM", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRpCadQWjcJHeieoUnXTiSpqydRbYcA6qh", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiG86w5cMT9iv7pekuRohJmFXUwkvjvMXm", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgAUczBPFQz7UpVeukv8tEPGEtu4TkMAgv", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRjAxvFYSsXSuwTgDQFAxFo1Vy8ntmij9w", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMc2ogsdyB9HUS6gka1XvJst6iWV6XDd1y", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qjf73NRcLF18taDgZvrDXUNysViHiP81j8", "amount": 10 }, + { "type": "GENESIS", "recipient": "QLsnsdVELRJDkr355QCJXzzR29whaxbP3m", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgocHNWrSPTrUGp6oiSg9gwsvAHD8pYVHi", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbmbTWgUEH57JXHzdgUAy8H9HZD1Bzu2T5", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNXG4iaaPiqd2RLA28FJwCk6csUU7Mh6rZ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhsWKPi65qKKLVkn7DgopCn4h3f2W1FMvd", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qe2TzQdF5MGsfFbytqEosFkmWA24i4YaQM", "amount": 10 }, + { "type": "GENESIS", "recipient": "QULHofsgHS3B3whoFNXPHrNMJZDv4YUc96", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTwx66zP3H7PxNJjtX41BZZB6nEEpXGTV8", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgjfghHZfQtNjjetUUNC5cHza4JebSAeyB", "amount": 10 }, + { "type": "GENESIS", "recipient": "QitLt9FeT84swMehxuWnLqKrtfhaaW8nzm", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdLxR3bofPLP2ZkwHKuhW1KzetRNyFeW35", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSkzC9kNFxZnKFiMaiGsdVoAGKjfBBZwcz", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZ4z5mEXUDQMqBXGQg5Cp2SvGMDTEZaXLD", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTJfNxUJvvnX9zRCxAFrMFz1YB1cYShNLv", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQnyuF6J5AN7MvxZdxLL4r6qjYFmBpf6qd", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTJ5tQZCqh8KJmhbWKsx2uwUYXYbjyzUxz", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qb6k1h4VvfoRsQeEnDSvsBe9PfJnsaRcax", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNjTDHtHXdVtfcRf8qTqSZgXLDiFBADBqX", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMnrK51UipWbtiA3ogm24mhe7WRAJ17BmM", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNdQuxwAjHcojdxYfkxnnkMNMDZ2Ym6sH2", "amount": 10 }, + { "type": "GENESIS", "recipient": "QN7HMxm2qCxHNTei5wmBfxFMr4cbb6xBAF", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qfb3KNCYWsEzj7npPJxiNnQKw97Ly3BpEW", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qg36i5Z5f12EYBR5PUZaf59Ub8KeEkYovh", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNy6RzB1xWykv3Yb6uUDQ9VgLTRGoFPLKT", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qf8cCCvv57r14pN4oJFVbLym4WWMERkA8H", "amount": 10 }, + { "type": "GENESIS", "recipient": "QV4VZbbdmuYtZKE1LXjQsojbb4nTJSw3wR", "amount": 10 }, + { "type": "GENESIS", "recipient": "QReEeUBRRnsXUd4iMtgHAt6pfHZfVYD66H", "amount": 10 }, + { "type": "GENESIS", "recipient": "QThtnUYKiXtx9ga7LtT9qftafdiVDZs2tQ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbADUiFmkLpvyTZ6ug8kkE9j8aDcDm8W7o", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYYpvHzcUP4s9jSZzaNn1mqZDM4u26yAfT", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQKCYjczFAKAgjYhRL1jjGcA6khh35Fu9F", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSa3xN2kdAwc6PBQw8UmFpK245cK34Aa8Q", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYuLzGnHLSvLtrDndk9GGPQnGU5MW2MtYE", "amount": 10 }, + { "type": "GENESIS", "recipient": "QN7zXUcHfBhn28qopFZ1R7pej4i8ndPibm", "amount": 10 }, + { "type": "GENESIS", "recipient": "QedfstymDM3KpQPuNwARywnTniwFekBD56", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTJMjw4LikMSf9LJ2Sfp6QrDZFVhtRauEj", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRE5pZcGwZ7bSEWh7oXAS9Pb8wxcBLwQdJ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QaeYRDhR9UagFPGQuhjmahtmmEqj8Fscf3", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUyubWVyz5PLPcvCTxe9YgVfRsPhU5PKwH", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdxGiYrxV4Hr4P3hNT988cCo8CqjyNNtN2", "amount": 10 }, + { "type": "GENESIS", "recipient": "QY3jWQe5QbqQSMyLwf8JiMAbY2HRdAUQQ7", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbTS7CNqoqhQW79MwDMZRDKoA4U3XuQedT", "amount": 10 }, + { "type": "GENESIS", "recipient": "QY8AQrKf1KE7MCKCWG1Lvh7q2mEWWqjnCh", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZtRisdwd1o2raPA7KhCnF88msVJoyc3uZ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdRio67LD8QCPmzXiwimvnNgSuXhdHy6hM", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qd6RrfCKZX3nx8wRCtJ6jJA9VJ4o7quuEe", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiUbpcT8Uibzua79RRzqbLqA3MUkWG1Q3W", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXKBimE8Vbat755M9zmcKiiV4gkSLc6vfB", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUC5EMMVav2Qt4TDe9Af39reYoFnamxUkn", "amount": 10 }, + { "type": "GENESIS", "recipient": "QjEaoBWyAP4Ff29dGUZtGsYdRvHKf8HKb2", "amount": 10 }, + { "type": "GENESIS", "recipient": "QS11w9zba8LPhicybuvxkTZCmTLMCt3HZ1", "amount": 10 }, + { "type": "GENESIS", "recipient": "QW2LGY6cQwmGycv5ELE23z38WqXFzsuTFx", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcL5p8mwKk9g6xpwCXTiHpJWwRUKqUkgKc", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPHLQxDwymECG1deHhhxNkEM8jTH3rfmvA", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTR34yKDT59X1YJR4Y4HAnHJXXjwVHi1BM", "amount": 10 }, + { "type": "GENESIS", "recipient": "QR9EUCjXzD7hQETjnZrKTsQ9XQAWjZtN3d", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQQUNMU47F6LbMjC7wVhaPgw34ytetgbLT", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUuugD6cTY5p7RFGnMrV78dfmEBrAAYx1N", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQktyzttrEtkN1iHQNAR3TfS1T5Xse9REv", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPaWULDvmSr1cwhNiYzU59fnZkQmLQafWe", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSvTyX62mGPTGLKA8TvmYcuct878LaLrsp", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMKunzBtoEQ2Ab8emix8KCXQR9dcfN7gca", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZezsFhUeN3ayGjJ2QnPJpG8tHqfutnKxq", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNBe19N5gNvgK1R4PvaYEinsAGTcbaQiNR", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVkLgL3tx7aizRF64PAWnLn6VKTY4jGGXC", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRsi8YiWAQKrBVNHyEAdcKy9P82NRK66pu", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiktanAj2ACcLhcCLWSAf3oboZdrkvWkcu", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXKXL8hen7hM8W1fFHUAfKbPxZqqiimTnD", "amount": 10 }, + { "type": "GENESIS", "recipient": "QP2NiMK9iATLo2bNRER3yuEk38VP4SC5jL", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNkZHXusJXpreoxyo5ULyvPXZjkxA3UvEw", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qca4vfeoNVbtbHzJa5F3v8sWqZh51Fz5mR", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiNYuBjPpwDo3b1iETYPZnZwtfQnpQGouR", "amount": 10 }, + { "type": "GENESIS", "recipient": "QV3sZ8AtdRr8YTEPnmxE9tMt7wxX4ruG8U", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYkPYG6CEwpkxq5s3Sy6PHnn3SDXqvPSvb", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhGkgG7EtqwuRYQ599DNn1jMfyzkNeZhKk", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdHk2qSAMeiPqYRACaNyy1jpAVYzTLrdyv", "amount": 10 }, + { "type": "GENESIS", "recipient": "QTrtqtdN1Kxiu8YDumczZd4QvyRwAzk7FS", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWxcJFLecFjrmejcCToGVRJpXueAZJgiEu", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgU2udWFXJpDatHhmXWqFLxYCkYGSDUGLD", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhT1YEHJpbuFrTqkRCyeAn5QdeJsNzjX6p", "amount": 10 }, + { "type": "GENESIS", "recipient": "QjuZxHoptE264839GsNhjcWgrCAzcbDQQL", "amount": 10 }, + { "type": "GENESIS", "recipient": "QP9m28hRAd3Qz96CvBnwipR8J319b2sjzY", "amount": 10 }, + { "type": "GENESIS", "recipient": "QawVhDFeqEd6aGfgRxHsLN7SnrhGqweSHC", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVwpXi2jMj5aMVjZmXbfDiQwhKY3FJyiPk", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZBRV9a8UBbdKaz63JqTnY3w2R62W1phiN", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhQDb2NkMXo5TALywQwJm4jp5CxydPsrqf", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVjGMUHTBkimNLGuDvctX8VPq1NkMAWJfc", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYCd9YsdNpFeabaQVzoYUYAbUkXkERZNSZ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbcacPWfXdQe4HpDr5ddbFBuuURLaaS1Dr", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbSToBjt9g75sCM2SUEgJNb6uskeTyzPbb", "amount": 10 }, + { "type": "GENESIS", "recipient": "QeToG5yenFa8TfHJUE17898D2RVZ76tYiT", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNBHmU7jgD3HyfD7qFzKAMcgdw7Pr3FTBm", "amount": 10 }, + { "type": "GENESIS", "recipient": "QeFMFEzN6nEtC42MdffLBB2RbyUKMq9BPf", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQmVTLRTBBQ8c2syo379Koydj1RNCAhUw5", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWWKVymgzeYECUwomWkaxioMAmpmotUh62", "amount": 10 }, + { "type": "GENESIS", "recipient": "QM8xDvrXzLRo41SjkNeMTYoP3tKsaLcQze", "amount": 10 }, + { "type": "GENESIS", "recipient": "QRkhzEqETQczL8xHV8P98rwu84755SDbWP", "amount": 10 }, + { "type": "GENESIS", "recipient": "QLiSBYE3QzNsWijsF8BTNzziLfyVB6nV4q", "amount": 10 }, + { "type": "GENESIS", "recipient": "QcS9jgiG6AptzioTUfUJr5oXJYQES275xU", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfkPYKpTfotYzN5BhKXENDgt1f3vo8LTSp", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQ9NUxhdgtvvxTSZqYY6k9qxHziqSQ5jcK", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZ94CoMHUyNGxtef6QHMUNRd8D3NNUgM5V", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qce4PQd34icYvN463Smi9ahVGxznoax9Wi", "amount": 10 }, + { "type": "GENESIS", "recipient": "QR3MXpsu8ig4PJHJEfKsnDuxrSDLrDzLd8", "amount": 10 }, + { "type": "GENESIS", "recipient": "QXHQEBm9CtVTY9RNdCDxju7yr61DW3K8JL", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhFG2as3oZVYSubieisTPHco58pgw2nr5E", "amount": 10 }, + { "type": "GENESIS", "recipient": "QY3dGvuVkQADmQYndkKv7sLBG6JeduhVbz", "amount": 10 }, + { "type": "GENESIS", "recipient": "QMSx3vQagdw6QD4D9SiiDRMhDrNFGjhUpd", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVBktFMtw31ye88qjR2LTkfFGgoRkXyf7w", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPr17q2iYVQ5kMEtmUmEBN3WpMF6DjzR2x", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZituXHq3AzDdi9PDhtA5jySAC4VBUk6UJ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYaVmr36tGTH4g5iTCeB5tZu3u81yp6M1G", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qa51wH3pbN1bDpDWwpDDRrccwVmZo4CdXc", "amount": 10 }, + { "type": "GENESIS", "recipient": "QbQB5hSA7P2ssdYXzxWcbDePL6SDDBUpgQ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QeKHm4Rg7ANF6RBfphgS9gkYhLEboJUP8v", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSpjpN64bYczYNsKsgmNmNDAFiKUg9orJA", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdmwboMpKVpnvdYZgiaEXpuEnygDRxyywc", "amount": 10 }, + { "type": "GENESIS", "recipient": "QLnRWFKRGRtQAmX2aGM1F5vXvEb7naUUBG", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qaqb6saKN4YuHVKJ2HEDgKWAzGhJQ43sic", "amount": 10 }, + { "type": "GENESIS", "recipient": "QadBYsejVVWyFneDMpCffjbBpxgF9AEatD", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qh6K3QdnKBkb4u5Z3wD73C4sTjvcBTgiFC", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qa7td7KrALcVXpMcv5GzvrtGMAPKHUUECb", "amount": 10 }, + { "type": "GENESIS", "recipient": "QaqNZLJBCJTas5Frp43jzxEYvEoWdgYeXJ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUJoDzJ8WDG62MSpMfzxUDH1pwJ6aRWZL4", "amount": 10 }, + { "type": "GENESIS", "recipient": "QeVt9GFpDSdg73XQbVdCU4LHgMp9eysYa1", "amount": 10 }, + { "type": "GENESIS", "recipient": "QgzD9PSp1P5WVkyifGxCcoV7TXzLWL4GgN", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWDtjA76XhCfXw6gvYfo3MFcbKCX2ZEyLJ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QM9wXFKoAYkmDwCkz1Vdsn9vyMeRRKRCzy", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWyp8eCTuCnT32vYQEj5rywCXWxYm36dov", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSGJrJSGub71GrjGSXJSZMFUtHEn7C5TUW", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNhPdmMHBUPJL6yvghnTFnRajMBmdqddZd", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZaZctoQRrR2g1bhAfzb5Z5ZMANGVkBG5u", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUhct2oBCmaU6kYguDNcbU6HQss9QELpLJ", "amount": 10 }, + { "type": "GENESIS", "recipient": "QSwQUg1aWMQ7kQcR6WMWa5SHxarGdG3DgW", "amount": 10 }, + { "type": "GENESIS", "recipient": "QdQmZTpA8a2YnrZAykVhNpGhk4kVmjnwRL", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiVTD43EpJ4iFXKJwnofocwcopw1iYo1TP", "amount": 10 }, + { "type": "GENESIS", "recipient": "QeXsnu3X1FsmLMRPYPJcsfJBVrTtwW4qrR", "amount": 10 }, + { "type": "GENESIS", "recipient": "QVTgyvvRGrd56BrFLvQoaF3DAYBXaobwef", "amount": 10 }, + { "type": "GENESIS", "recipient": "QczCL1E9G6fpifK2pFgDQiV2N5M7X54vAV", "amount": 10 }, + { "type": "GENESIS", "recipient": "QYQs34RxFv7rtYAx9mErUabnJDvCfBe8gY", "amount": 10 }, + { "type": "GENESIS", "recipient": "QanakqWSmEB6oQkrWVDRArG4wTHPs3zw4T", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNiGHSk13xXy54KuCqQ5PQZBQa13DhPb84", "amount": 10 }, + { "type": "GENESIS", "recipient": "QemRZy1gnzY1j5czckXAoBqW2Ae32onBPn", "amount": 10 }, + { "type": "GENESIS", "recipient": "QNzqkJgXKy4Gi22hGgyMMThFeG6KSYUwEb", "amount": 10 }, + { "type": "GENESIS", "recipient": "QZ3cnhqAJVyCwYBZmgjnvDz76bKyJCXa1d", "amount": 10 }, + { "type": "GENESIS", "recipient": "Qa4ZKZEgKNRDNADY97aB95VYQMa2CUYV7y", "amount": 10 }, + { "type": "GENESIS", "recipient": "QWceBxyxTA9AUocwwennBg3eLb97W5K7E4", "amount": 10 }, + { "type": "GENESIS", "recipient": "QaX4UkVvH27H3RkMtKebMoBvJCcEbDiUjq", "amount": 10 }, + { "type": "GENESIS", "recipient": "QjJnJQfaPYJdcRsKHABNKL9VYKbQBJ4Jkk", "amount": 10 }, + { "type": "GENESIS", "recipient": "QhqaWQkLXTzotnRoUnT8T6sQneiwnR4nkM", "amount": 10 }, + { "type": "GENESIS", "recipient": "QQwemW9rxyyZRv428hr374p92KLhk3qjKP", "amount": 10 }, + { "type": "GENESIS", "recipient": "QaeT4E1ihqYKa5jTxByN9n33v5aP6f8s9C", "amount": 10 }, + { "type": "GENESIS", "recipient": "QUaiuJWKnNr9ZZBzGWd2jSKoS2W6nTFGuM", "amount": 10 }, + { "type": "GENESIS", "recipient": "QiVQroJR4kUYmvexsCZGxUD3noQ3JSStS4", "amount": 10 }, + { "type": "GENESIS", "recipient": "QPcDkEHxDKmJBnXoVE5rPmkgm5jX2wBX3Z", "amount": 10 }, + { "type": "GENESIS", "recipient": "QfSgCJLRfEWixHQ2nF5Nqz2T7rnNsy7uWS", "amount": 10 }, + { "type": "GENESIS", "recipient": "QU7EUWDZz7qJVPih3wL9RKTHRfPFy4ASHC", "amount": 10 } + ] + } +} \ No newline at end of file